Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

CommandeController.php 49KB

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