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.

1282 satır
49KB

  1. <?php
  2. namespace backend\controllers;
  3. use common\models\ProductionProduit;
  4. use Yii;
  5. use common\models\Production;
  6. use yii\filters\AccessControl;
  7. use yii\web\Controller;
  8. use common\models\LoginForm;
  9. use yii\filters\VerbFilter;
  10. use common\models\Commande;
  11. use common\models\CommandeProduit;
  12. use common\models\PointVente;
  13. use common\models\Produit;
  14. use common\helpers\CSV;
  15. use common\models\User;
  16. use kartik\mpdf\Pdf;
  17. use common\models\CommandeAutoForm ;
  18. use common\models\CommandeAuto ;
  19. use common\models\CreditHistorique;
  20. use common\models\UserEtablissement;
  21. use yii\helpers\Html ;
  22. use common\models\ProductionPointVente ;
  23. class CommandeController extends BackendController {
  24. var $enableCsrfValidation = false;
  25. public function behaviors() {
  26. return [
  27. 'access' => [
  28. 'class' => AccessControl::className(),
  29. 'rules' => [
  30. [
  31. 'actions' => ['report-cron'],
  32. 'allow' => true,
  33. 'roles' => ['?']
  34. ],
  35. [
  36. 'allow' => true,
  37. 'roles' => ['@'],
  38. 'matchCallback' => function ($rule, $action) {
  39. return Yii::$app->user->identity->status == USER::STATUS_ADMIN
  40. || Yii::$app->user->identity->status == USER::STATUS_BOULANGER;
  41. }
  42. ]
  43. ],
  44. ],
  45. ];
  46. }
  47. public function actionReportCron($date = '', $save = false, $id_etablissement = 0, $key = '')
  48. {
  49. if($key == '64ac0bdab7e9f5e48c4d991ec5201d57')
  50. {
  51. $this->actionReport($date, $save, $id_etablissement) ;
  52. }
  53. }
  54. public function actionReport($date = '', $save = false, $id_etablissement = 0)
  55. {
  56. if(!Yii::$app->user->isGuest)
  57. $id_etablissement = Yii::$app->user->identity->id_etablissement ;
  58. $commandes = Commande::find()
  59. ->with('commandeProduits', 'user', 'creditHistorique', 'pointVente')
  60. ->joinWith('production')
  61. ->where(['production.date' => $date])
  62. ->andWhere(['production.id_etablissement' => $id_etablissement])
  63. ->orderBy('date ASC')
  64. ->all();
  65. foreach ($commandes as $c)
  66. $c->init();
  67. $production = Production::find()
  68. ->where('date LIKE \'' . $date . '\'')
  69. ->one();
  70. if($production)
  71. {
  72. $produits_selec = ProductionProduit::findProduits($production->id);
  73. $points_vente = PointVente::find()->all();
  74. foreach ($points_vente as $pv)
  75. $pv->initCommandes($commandes);
  76. // produits
  77. $produits = Produit::find()
  78. ->where(['id_etablissement' => $id_etablissement])
  79. ->orderBy('order ASC')
  80. ->all();
  81. // get your HTML raw content without any layouts or scripts
  82. $content = $this->renderPartial('report',[
  83. 'production' => $production,
  84. 'produits_selec' => $produits_selec,
  85. 'points_vente' => $points_vente,
  86. 'date' => $date,
  87. 'produits' => $produits,
  88. 'commandes' => $commandes
  89. ]);
  90. $date_str = date('d/m/Y',strtotime($date)) ;
  91. if($save)
  92. {
  93. $destination = Pdf::DEST_FILE ;
  94. }
  95. else {
  96. $destination = Pdf::DEST_BROWSER ;
  97. }
  98. $pdf = new Pdf([
  99. // set to use core fonts only
  100. 'mode' => Pdf::MODE_UTF8,
  101. // A4 paper format
  102. 'format' => Pdf::FORMAT_A4,
  103. // portrait orientation
  104. 'orientation' => Pdf::ORIENT_LANDSCAPE,
  105. // stream to browser inline
  106. 'destination' => $destination,
  107. 'filename' => Yii::getAlias('@app/web/pdf/Commandes-'.$date.'-'.$id_etablissement.'.pdf'),
  108. // your html content input
  109. 'content' => $content,
  110. // format content from your own css file if needed or use the
  111. // enhanced bootstrap css built by Krajee for mPDF formatting
  112. //'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
  113. // any css to be embedded if required
  114. //'cssInline' => '.kv-heading-1{font-size:18px}',
  115. // set mPDF properties on the fly
  116. //'options' => ['title' => 'Krajee Report Title'],
  117. // call mPDF methods on the fly
  118. 'methods' => [
  119. 'SetHeader'=>['Commandes du '.$date_str],
  120. 'SetFooter'=>['{PAGENO}'],
  121. ]
  122. ]);
  123. // return the pdf output as per the destination setting
  124. return $pdf->render();
  125. }
  126. }
  127. public function actionDeleteCommande($date, $id_commande) {
  128. $commande = Commande::find()->where(['id' => $id_commande])->one();
  129. if ($commande) {
  130. $commande->delete();
  131. CommandeProduit::deleteAll(['id_commande' => $id_commande]);
  132. }
  133. $this->redirect(['index', 'date' => $date]);
  134. }
  135. public function gestionFormCommandes($production, $date, $points_vente, $produits, $users) {
  136. if ($date != '') {
  137. // commandes
  138. $commandes = Commande::find()
  139. ->with('commandeProduits', 'user')
  140. ->joinWith('production')
  141. ->where(['production.date' => $date])
  142. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  143. ->all();
  144. foreach ($commandes as $c)
  145. $c->init();
  146. foreach ($points_vente as $pv) {
  147. $pv->initCommandes($commandes);
  148. if (isset($_POST['submit_pv']) && $_POST['submit_pv']) {
  149. // modifs
  150. foreach ($pv->commandes as $c) {
  151. // suppression des commande_produit
  152. $commande_produits = CommandeProduit::find()->where(['id_commande' => $c->id])->all();
  153. foreach ($commande_produits as $cp)
  154. $cp->delete();
  155. // création des commande_produit modifiés
  156. foreach ($produits as $p) {
  157. $quantite = Yii::$app->getRequest()->post('produit_' . $c->id . '_' . $p->id, 0);
  158. if ($quantite) {
  159. $commande_produit = new CommandeProduit;
  160. $commande_produit->id_commande = $c->id;
  161. $commande_produit->id_produit = $p->id;
  162. $commande_produit->quantite = $quantite;
  163. $commande_produit->prix = $p->prix;
  164. $commande_produit->save();
  165. }
  166. }
  167. }
  168. // ajout
  169. //$id_client = Yii::$app->getRequest()->post('user_pv_'.$pv->id, 0) ;
  170. $username = Yii::$app->getRequest()->post('username_pv_' . $pv->id, 0);
  171. $date = Yii::$app->getRequest()->post('date_commande_pv_' . $pv->id, 0);
  172. $one_product = false;
  173. foreach ($produits as $p) {
  174. $quantite = Yii::$app->getRequest()->post('produit_pv_' . $pv->id . '_' . $p->id, 0);
  175. if ($quantite) {
  176. $one_product = true;
  177. }
  178. }
  179. if (strlen($username) && $date && $one_product) {
  180. $commande = new Commande;
  181. $commande->id_point_vente = $pv->id;
  182. $commande->id_production = $production->id;
  183. $commande->id_user = 0;
  184. $commande->username = $username;
  185. $tab_date = explode('/', $date);
  186. $commande->date = $tab_date[2] . '-' . $tab_date[1] . '-' . $tab_date[0] . ' 00:00:00';
  187. $commande->save();
  188. foreach ($produits as $p) {
  189. $quantite = Yii::$app->getRequest()->post('produit_pv_' . $pv->id . '_' . $p->id, 0);
  190. if ($quantite) {
  191. $commande_produit = new CommandeProduit;
  192. $commande_produit->id_commande = $commande->id;
  193. $commande_produit->id_produit = $p->id;
  194. $commande_produit->quantite = $quantite;
  195. $commande_produit->prix = $p->prix;
  196. $commande_produit->save();
  197. }
  198. }
  199. }
  200. }
  201. }
  202. }
  203. }
  204. public function actionIndex($date = '', $return_data = false) {
  205. $commandes = [];
  206. // users
  207. $arr_users = [0 => '--'];
  208. $users = User::find()->orderBy('prenom, nom ASC')->all();
  209. foreach ($users as $u) {
  210. $arr_users[$u->id] = $u->prenom . ' ' . $u->nom;
  211. }
  212. // création du jour de production
  213. $production = null;
  214. if ($date != '') {
  215. $production = Production::find()
  216. ->where(['date' => $date])
  217. ->andWhere(['id_etablissement'=>Yii::$app->user->identity->id_etablissement])
  218. ->one();
  219. if (!$production) {
  220. $production = new Production;
  221. $production->date = $date;
  222. $production->livraison = 1;
  223. $production->id_etablissement = Yii::$app->user->identity->id_etablissement ;
  224. $production->save();
  225. }
  226. }
  227. // production_point_vente à définir s'ils ne sont pas initialisés
  228. if($production && $production->actif) {
  229. $count_productions_point_vente = ProductionPointVente::find()->
  230. where([
  231. 'id_production' => $production->id
  232. ])
  233. ->count() ;
  234. if(!$count_productions_point_vente)
  235. {
  236. ProductionPointVente::setAll($production->id, true) ;
  237. }
  238. }
  239. // points de vente
  240. if($production)
  241. {
  242. $points_vente = PointVente::find()
  243. ->joinWith(['productionPointVente'=> function($q) use ($production) {
  244. $q->where(['id_production' => $production->id]) ;
  245. } ])
  246. ->where([
  247. 'id_etablissement' => Yii::$app->user->identity->id_etablissement,
  248. ])
  249. ->all();
  250. }
  251. else {
  252. $points_vente = PointVente::find()
  253. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement,])
  254. ->all();
  255. }
  256. // produits
  257. $produits = Produit::getAll() ;
  258. // gestion des commandes
  259. $this->gestionFormCommandes($production, $date, $points_vente, $produits, $users);
  260. // commandes
  261. $commandes = Commande::find()
  262. ->with('commandeProduits', 'user', 'creditHistorique')
  263. ->joinWith('production')
  264. ->where(['production.date' => $date])
  265. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  266. ->orderBy('date ASC')
  267. ->all();
  268. $recettes = 0;
  269. $recettes_pain = 0;
  270. $recettes_vrac = 0;
  271. $recettes_pain_livre = 0;
  272. $poids_pain = 0;
  273. $poids_vrac = 0;
  274. foreach ($commandes as $c) {
  275. $c->init();
  276. $recettes += $c->montant;
  277. $recettes_pain += $c->montant_pain;
  278. $recettes_vrac += $c->montant_vrac;
  279. if ($c->id_point_vente != 1)
  280. $recettes_pain_livre += $c->montant_pain;
  281. $poids_pain += $c->poids_pain;
  282. $poids_vrac += $c->poids_vrac;
  283. }
  284. $recettes = number_format($recettes, 2);
  285. $recettes_pain = number_format($recettes_pain, 2);
  286. $recettes_vrac = number_format($recettes_vrac, 2);
  287. // init commandes point de vente
  288. foreach ($points_vente as $pv) {
  289. $pv->initCommandes($commandes);
  290. $data_select_commandes = [] ;
  291. $data_options_commandes = [] ;
  292. foreach($pv->commandes as $c)
  293. {
  294. if($c->user)
  295. {
  296. $data_select_commandes[$c->id] = $c->user->nom.' '.$c->user->prenom ;
  297. }
  298. else {
  299. $data_select_commandes[$c->id] = $c->username;
  300. }
  301. $data_options_commandes[$c->id] = [] ;
  302. $array_options = [] ;
  303. $array_options[$c->id]['montant'] = $c->montant ;
  304. $array_options[$c->id]['str_montant'] = number_format($c->montant, 2, ',', '').' €' ;
  305. $array_options[$c->id]['montant_paye'] = $c->montant_paye ;
  306. $array_options[$c->id]['produits'] = [] ;
  307. $array_options[$c->id]['commentaire'] = Html::encode($c->commentaire) ;
  308. foreach($c->commandeProduits as $cp)
  309. {
  310. $array_options[$c->id]['produits'][$cp->id_produit] = $cp->quantite ;
  311. }
  312. $data_options_commandes[$c->id]['data-commande'] = json_encode($array_options[$c->id]) ;
  313. $data_options_commandes[$c->id]['value'] = $c->id ;
  314. }
  315. $pv->data_select_commandes = $data_select_commandes ;
  316. $pv->data_options_commandes = $data_options_commandes ;
  317. }
  318. // gestion produits selec
  319. if (isset($_POST['valider_produit_selec'])) {
  320. if (isset($_POST['Produit'])) {
  321. foreach ($produits as $p) {
  322. $produit_production = ProductionProduit::find()->where(['id_production' => $production->id, 'id_produit' => $p->id])->one();
  323. if (!$produit_production) {
  324. $produit_production = new ProductionProduit();
  325. $produit_production->id_production = $production->id;
  326. $produit_production->id_produit = $p->id;
  327. $produit_production->actif = 0;
  328. if (isset($p->quantite_max))
  329. $produit_production->quantite_max = $p->quantite_max;
  330. 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 ($day_production == 1 && $p->lundi)
  362. $pp->actif = 1;
  363. if ($day_production == 2 && $p->mardi)
  364. $pp->actif = 1;
  365. if ($day_production == 3 && $p->mercredi)
  366. $pp->actif = 1;
  367. if ($day_production == 4 && $p->jeudi)
  368. $pp->actif = 1;
  369. if ($day_production == 5 && $p->vendredi)
  370. $pp->actif = 1;
  371. if ($day_production == 6 && $p->samedi)
  372. $pp->actif = 1;
  373. if ($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(['date' => $date]) ;
  819. if(preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date) &&
  820. ($id_user || strlen($username)) &&
  821. $point_vente &&
  822. count($produits) &&
  823. $production)
  824. {
  825. $commande = new Commande ;
  826. $commande->date = date('Y-m-d H:i:s', strtotime($date.' '.date('H:i:s'))) ;
  827. $commande->id_point_vente = $id_pv ;
  828. $commande->id_production = $production->id ;
  829. $commande->type = Commande::TYPE_ADMIN ;
  830. $commande->commentaire = $commentaire ;
  831. if($id_user)
  832. {
  833. $commande->id_user = $id_user ;
  834. }
  835. else {
  836. $commande->username = $username ;
  837. $commande->id_user = 0 ;
  838. }
  839. $commande->save() ;
  840. foreach($produits as $key => $quantite)
  841. {
  842. $produit = Produit::findOne($key) ;
  843. if($produit)
  844. {
  845. $commande_produit = new CommandeProduit ;
  846. $commande_produit->id_commande = $commande->id ;
  847. $commande_produit->id_produit = $key ;
  848. $commande_produit->quantite = $quantite ;
  849. $commande_produit->prix = $produit->prix ;
  850. $commande_produit->save() ;
  851. }
  852. }
  853. // total point de vente
  854. $point_vente = PointVente::findOne($commande->id_point_vente) ;
  855. $commandes = Commande::find()
  856. ->with('commandeProduits', 'user')
  857. ->joinWith('production')
  858. ->where(['production.date' => $date])
  859. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  860. ->orderBy('date ASC')
  861. ->all();
  862. foreach($commandes as $c) $c->init() ;
  863. $point_vente->initCommandes($commandes) ;
  864. // json commande
  865. $commande = Commande::find()
  866. ->with('commandeProduits', 'user')
  867. ->where(['commande.id' => $commande->id])
  868. ->one();
  869. $commande->init() ;
  870. $produits = [] ;
  871. foreach($commande->commandeProduits as $cp)
  872. {
  873. $produits[$cp->id_produit] = $cp->quantite ;
  874. }
  875. $json_commande = json_encode(['montant' => number_format($commande->montant, 2), 'produits' => $produits]) ;
  876. $json_commande = $commande->getDataJson() ;
  877. $str_user = '' ;
  878. if($commande->user)
  879. $str_user = $commande->user->nom.' '.$commande->user->prenom ;
  880. else
  881. $str_user = $commande->username ;
  882. $str_commentaire = '' ;
  883. if(strlen($commande->commentaire))
  884. {
  885. $str_commentaire = ' <span class="glyphicon glyphicon-comment"></span>' ;
  886. }
  887. $str_label_type_commande = '';
  888. if($commande->type)
  889. {
  890. $str_label_type_commande = ' <span class="label label-warning">vous</span>' ;
  891. }
  892. echo json_encode([
  893. 'id_commande' => $commande->id,
  894. 'total_pv' => number_format($point_vente->recettes, 2).' €',
  895. 'commande' => '<li>'
  896. . '<a class="btn btn-default" href="javascript:void(0);" '
  897. . 'data-pv-id="'.$id_pv.'" '
  898. . 'data-id-commande="'.$commande->id.'" '
  899. . 'data-commande=\''.$json_commande.'\' '
  900. . 'data-date="'.date('d/m H:i', strtotime($commande->date)).'">'
  901. . '<span class="montant">'.number_format($commande->montant, 2).' €</span>'
  902. . '<span class="user">'.$str_label_type_commande.' '.$str_user.'</span>'
  903. . $str_commentaire
  904. . '</a></li>',
  905. ]) ;
  906. die() ;
  907. }
  908. }
  909. public function actionAjaxTotalCommandes($date)
  910. {
  911. $production = Production::find()
  912. ->where(['date' => $date])
  913. ->andWhere(['id_etablissement'=>Yii::$app->user->identity->id_etablissement])
  914. ->one();
  915. if($production)
  916. {
  917. // produits
  918. $produits = Produit::find()
  919. ->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement])
  920. ->orderBy('order ASC')
  921. ->all();
  922. // commandes
  923. $commandes = Commande::find()
  924. ->with('commandeProduits', 'user')
  925. ->joinWith('production')
  926. ->where(['production.date' => $date])
  927. ->andWhere(['production.id_etablissement' => Yii::$app->user->identity->id_etablissement])
  928. ->orderBy('date ASC')
  929. ->all();
  930. $recettes = 0 ;
  931. $poids_pain = 0 ;
  932. foreach ($commandes as $c)
  933. {
  934. $c->init();
  935. $recettes += $c->montant ;
  936. $poids_pain += $c->poids_pain;
  937. }
  938. // produits selec pour production
  939. $produits_selec = ProductionProduit::findProduits($production->id);
  940. $ca_potentiel = 0;
  941. $poids_total = 0;
  942. foreach ($produits_selec as $id_produit_selec => $produit_selec) {
  943. if ($produit_selec['actif']) {
  944. foreach ($produits as $produit) {
  945. if ($produit->id == $id_produit_selec) {
  946. $ca_potentiel += $produit_selec['quantite_max'] * $produit->prix;
  947. $poids_total += $produit_selec['quantite_max'] * $produit->poids/1000;
  948. }
  949. }
  950. }
  951. }
  952. $html_totaux = $this->renderPartial('_total_commandes.php',[
  953. 'produits' => $produits,
  954. 'commandes' => $commandes,
  955. 'produits_selec' => $produits_selec,
  956. 'recettes_pain' => $recettes,
  957. 'poids_total' => $poids_total,
  958. 'ca_potentiel' => $ca_potentiel,
  959. 'poids_pain' => $poids_pain,
  960. ]);
  961. echo json_encode([
  962. 'html_totaux' => $html_totaux,
  963. ]) ;
  964. }
  965. die() ;
  966. }
  967. public function actionAjaxPointVenteLivraison($id_production, $id_point_vente, $bool_livraison)
  968. {
  969. $production_point_vente = ProductionPointVente::find()
  970. ->where([
  971. 'id_production' => $id_production,
  972. 'id_point_vente' => $id_point_vente,
  973. ])
  974. ->one() ;
  975. if($production_point_vente)
  976. {
  977. $production_point_vente->livraison = $bool_livraison ;
  978. $production_point_vente->save() ;
  979. }
  980. die() ;
  981. }
  982. public function actionStatutPaiement($id_commande)
  983. {
  984. $commande = Commande::find()
  985. ->with('commandeProduits','production')
  986. ->where(['id' => $id_commande])
  987. ->one() ;
  988. if($commande)
  989. {
  990. $commande->init() ;
  991. $html = '' ;
  992. if($commande->id_user)
  993. {
  994. $user_etablissement = UserEtablissement::find()
  995. ->where([
  996. 'id_user' => $commande->id_user,
  997. 'id_etablissement' => $commande->production->id_etablissement
  998. ])
  999. ->one() ;
  1000. $montant_paye = $commande->getMontantPaye() ;
  1001. //$html .= $commande->montant.' | '.$montant_paye ;
  1002. if(abs($commande->montant - $montant_paye) < 0.0001)
  1003. {
  1004. $html .= '<span class="label label-success">Payé</span>' ;
  1005. $buttons_credit = Html::a('Rembourser '.$commande->getMontantFormat(), 'javascript:void(0);', ['class' => 'btn btn-default btn-xs rembourser','data-montant' => $commande->montant,'data-type' => 'remboursement']) ;
  1006. }
  1007. elseif($commande->montant > $montant_paye)
  1008. {
  1009. $montant_payer = $commande->montant - $montant_paye ;
  1010. $html .= '<span class="label label-danger">Non payé</span> reste <strong>'.number_format($montant_payer,2).' €</strong> à payer' ;
  1011. $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']) ;
  1012. }
  1013. elseif($commande->montant < $montant_paye)
  1014. {
  1015. $montant_rembourser = $montant_paye - $commande->montant ;
  1016. $html .= ' <span class="label label-success">Payé</span> <strong>'.number_format($montant_rembourser,2).' €</strong> à rembourser' ;
  1017. $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']) ;
  1018. }
  1019. $html .= '<span class="buttons-credit">'
  1020. . 'Crédit pain : <strong>'.number_format($user_etablissement->credit,2).' €</strong><br />'
  1021. . $buttons_credit
  1022. . '</span>' ;
  1023. // historique
  1024. $historique = CreditHistorique::find()
  1025. ->with('userAction')
  1026. ->where(['id_commande' => $id_commande])
  1027. ->all() ;
  1028. $html .= '<br /><br /><strong>Historique</strong><br /><table class="table table-condensed table-bordered">'
  1029. . '<thead><tr><th>Date</th><th>Utilisateur</th><th>Action</th><th>Montant</th></tr></thead>'
  1030. . '<tbody>' ;
  1031. if($historique && is_array($historique) && count($historique))
  1032. {
  1033. foreach($historique as $h)
  1034. {
  1035. $html .= '<tr>'
  1036. . '<td>'.date('d/m/Y H:i:s',strtotime($h->date)).'</td>'
  1037. . '<td>'.Html::encode($h->userAction->nom.' '.$h->userAction->prenom).'</td>'
  1038. . '<td>'.$h->getLibelleType().'</td>'
  1039. . '<td>'.number_format($h->montant,2).' €</td>'
  1040. . '</tr>' ;
  1041. }
  1042. }
  1043. else {
  1044. $html .= '<tr><td colspan="4">Aucun résultat</td></tr>' ;
  1045. }
  1046. $html .= '</tbody></table>' ;
  1047. }
  1048. else {
  1049. $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>' ;
  1050. }
  1051. echo json_encode([
  1052. 'html_statut_paiement' => $html,
  1053. 'json_commande' => $commande->getDataJson()
  1054. ]);
  1055. }
  1056. die() ;
  1057. }
  1058. public function actionPaiement($id_commande, $type, $montant)
  1059. {
  1060. $commande = Commande::findOne($id_commande) ;
  1061. if($commande)
  1062. {
  1063. $commande->creditHistorique(
  1064. $type,
  1065. $montant,
  1066. Yii::$app->user->identity->id_etablissement,
  1067. Yii::$app->user->identity->id
  1068. ) ;
  1069. }
  1070. return $this->actionStatutPaiement($id_commande) ;
  1071. }
  1072. }