選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

1315 行
50KB

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