Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

540 lines
20KB

  1. <?php
  2. namespace frontend\controllers;
  3. use common\models\ProductionProduit;
  4. use common\models\CommandeProduit;
  5. use Yii;
  6. use yii\filters\AccessControl;
  7. use common\models\Commande;
  8. use common\models\PointVente;
  9. use common\models\Production;
  10. use common\models\Produit;
  11. use common\models\Etablissement;
  12. use common\helpers\Departements;
  13. use yii\helpers\Html;
  14. use frontend\models\AddEtablissementForm;
  15. use common\models\UserEtablissement;
  16. use common\models\CreditHistorique ;
  17. use yii\web\NotFoundHttpException ;
  18. use common\models\ProductionPointVente ;
  19. use yii\base\UserException ;
  20. use frontend\controllers\FrontendController;
  21. class CommandeController extends FrontendController {
  22. public function behaviors() {
  23. return [
  24. 'access' => [
  25. 'class' => AccessControl::className(),
  26. 'rules' => [
  27. [
  28. 'allow' => true,
  29. 'roles' => ['@'],
  30. ]
  31. ],
  32. ],
  33. ];
  34. }
  35. public function actionInfosProduction($id_production) {
  36. $production = Production::findOne($id_production);
  37. if ($production) {
  38. $arr = [] ;
  39. $produits_dispos = ProductionProduit::findProduits($production->id);
  40. $arr['produits_dispos'] = $produits_dispos ;
  41. $points_vente = PointVente::find()
  42. ->joinWith(['productionPointVente'=> function($q) use ($production) {
  43. $q->where(['id_production' => $production->id]) ;
  44. } ])
  45. ->where([
  46. 'id_etablissement' => $production->id_etablissement,
  47. ])
  48. ->all();
  49. $arr['points_vente'] = [] ;
  50. foreach($points_vente as $pv)
  51. {
  52. if(isset($pv->productionPointVente) &&
  53. isset($pv->productionPointVente[0]))
  54. {
  55. $arr['points_vente'][$pv->id] = $pv->productionPointVente[0]->livraison ;
  56. }
  57. else {
  58. $arr['points_vente'][$pv->id] = false ;
  59. }
  60. }
  61. return json_encode($arr);
  62. }
  63. return json_encode([]);
  64. }
  65. public static function initForm($commande = null) {
  66. // etablissements
  67. $etablissements = Yii::$app->user->identity->getEtablissementsFavoris() ;
  68. $id_etablissement = Yii::$app->request->get('id_etablissement', 0) ;
  69. $etablissement_paiement_ok = false ;
  70. if($id_etablissement)
  71. {
  72. $etablissement = Etablissement::findOne($id_etablissement);
  73. if($etablissement->etatPaiement() == Etablissement::PAIEMENT_OK || $etablissement->etatPaiement() == Etablissement::PAIEMENT_ESSAI)
  74. {
  75. $etablissement_paiement_ok = true ;
  76. }
  77. }
  78. // etablissement
  79. $etablissement = Etablissement::findOne($id_etablissement) ;
  80. // points de vente
  81. $points_vente = PointVente::find()
  82. ->with('pointVenteUser')
  83. ->where(['id_etablissement'=>$id_etablissement])
  84. ->andWhere('acces_restreint = 0 OR (acces_restreint = 1 AND (SELECT COUNT(*) FROM point_vente_user WHERE point_vente.id = point_vente_user.id_point_vente AND point_vente_user.id_user = :id_user) > 0)')
  85. ->params([':id_user' => Yii::$app->user->identity->id])
  86. ->all();
  87. $arr_points_vente = $points_vente;
  88. // jours de production
  89. $heure_limite = 20 ;
  90. $date = date('Y-m-d') ;
  91. if(isset($etablissement))
  92. {
  93. $heure_limite = $etablissement->heure_limite_commande ;
  94. if (date('H') >= $heure_limite) {
  95. $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande)*(24*60*60) );
  96. } else {
  97. $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande - 1)*(24*60*60));
  98. }
  99. }
  100. $jours_production = Production::find()
  101. ->where(['actif' => 1])
  102. ->andWhere('date > :date')
  103. ->andWhere(['id_etablissement'=>$id_etablissement])
  104. ->addParams([':date' => $date])
  105. ->all();
  106. $arr_jours_production = array('' => '--');
  107. foreach ($jours_production as $j)
  108. $arr_jours_production[$j->id] = date('d/m/Y', strtotime($j->date));
  109. // produits
  110. $produits = Produit::find()
  111. ->leftJoin('production_produit', 'produit.id = production_produit.id_produit')
  112. ->where(['produit.actif' => 1, 'id_etablissement' => $id_etablissement])
  113. ->andWhere('produit.vrac IS NULL OR produit.vrac = 0')
  114. ->orderBy('produit.order ASC')->all();
  115. $arr_produits = array();
  116. foreach ($produits as $p)
  117. $arr_produits[] = $p;
  118. // produits vrac
  119. $produits_vrac = Produit::find()->where(['actif' => 1, 'vrac' => 1])->orderBy('order ASC')->all();
  120. // produits selec
  121. $posts = Yii::$app->request->post();
  122. $produits_selec = [];
  123. if (isset($posts['Produit'])) {
  124. foreach ($posts['Produit'] as $key => $quantity) {
  125. $key = (int) str_replace('produit_', '', $key);
  126. $p = Produit::find()->where(['id' => $key])->one();
  127. if ($p && $quantity)
  128. $produits_selec[$p->id] = (int) $quantity;
  129. }
  130. }
  131. elseif (!is_null($commande)) {
  132. $produits_commande = CommandeProduit::find()->where(['id_commande' => $commande->id])->all();
  133. foreach ($produits_commande as $pc) {
  134. $produits_selec[$pc->id_produit] = (int) $pc->quantite;
  135. }
  136. }
  137. $produits_dispos = [];
  138. $production = null;
  139. if (!is_null($commande) && $commande->id_production) {
  140. $produits_dispos = ProductionProduit::findProduits($commande->id_production);
  141. $production = Production::find()->where(['id' => $commande->id_production])->one();
  142. }
  143. $commandes = Commande::find()
  144. ->where(['id_user' => Yii::$app->user->identity->id])
  145. ->all();
  146. if($id_etablissement)
  147. {
  148. $user_etablissement = UserEtablissement::find()
  149. ->where([
  150. 'id_etablissement' => $id_etablissement,
  151. 'id_user' => Yii::$app->user->identity->id
  152. ])
  153. ->one() ;
  154. $credit = $user_etablissement->credit ;
  155. }
  156. else {
  157. $credit = 0 ;
  158. }
  159. return [
  160. 'points_vente' => $arr_points_vente,
  161. 'jours_production' => $arr_jours_production,
  162. 'produits' => $produits,
  163. 'produits_selec' => $produits_selec,
  164. 'produits_dispos' => $produits_dispos,
  165. 'production' => $production,
  166. 'commandes_en_cours' => $commandes,
  167. 'produits_vrac' => $produits_vrac,
  168. 'etablissements' => $etablissements,
  169. 'id_etablissement' => $id_etablissement,
  170. 'etablissement' => $etablissement,
  171. 'etablissement_paiement_ok' => $etablissement_paiement_ok,
  172. 'credit' => $credit
  173. ];
  174. }
  175. public function actionIndex() {
  176. $model_form_etablissement = new AddEtablissementForm() ;
  177. if($model_form_etablissement->load(Yii::$app->request->post())
  178. && $model_form_etablissement->validate())
  179. {
  180. $model_form_etablissement->add() ;
  181. $model_form_etablissement->code = '' ;
  182. }
  183. // liste des etablissements
  184. $etablissements = Yii::$app->user->identity->getEtablissementsFavoris();
  185. // liste des établissement disponibles
  186. $arr_etablissements = Etablissement::getEtablissementsPopulateDropdown() ;
  187. $data_etablissements_dispos = $arr_etablissements['data'] ;
  188. $options_etablissements_dispos = $arr_etablissements['options'] ;
  189. // liste des commandes
  190. $commandes = Commande::find()
  191. ->with('commandeProduits', 'pointVente', 'creditHistorique')
  192. ->joinWith('production','production.etablissement')
  193. ->where(['id_user' => Yii::$app->user->id])
  194. //->andWhere('production.date < '.)
  195. ->orderBy('production.date DESC')
  196. ->limit(40)
  197. ->all();
  198. // initilisation commandes
  199. foreach ($commandes as $c)
  200. $c->init();
  201. return $this->render('index', [
  202. 'commandes' => $commandes,
  203. 'commande_ok' => Yii::$app->getRequest()->get('commande_ok', false),
  204. 'annule_ok' => Yii::$app->getRequest()->get('annule_ok', false),
  205. 'pate_deja_petrie' => Yii::$app->getRequest()->get('pate_deja_petrie', false),
  206. 'etablissements' => $etablissements,
  207. 'model_form_etablissement' => $model_form_etablissement,
  208. 'data_etablissements_dispos' => $data_etablissements_dispos,
  209. 'options_etablissements_dispos' => $options_etablissements_dispos,
  210. ]);
  211. }
  212. public function actionRemoveEtablissement($id = 0)
  213. {
  214. $user_etablissement = UserEtablissement::find()
  215. ->where(['id_etablissement'=>$id, 'id_user' => Yii::$app->user->identity->id])
  216. ->one() ;
  217. $user_etablissement->actif = 0 ;
  218. $user_etablissement->save() ;
  219. $this->redirect(['commande/index']) ;
  220. }
  221. public function actionCreate($id_etablissement = 0) {
  222. $commande = new Commande;
  223. $posts = Yii::$app->request->post();
  224. if($id_etablissement)
  225. $this->_verifEtablissementActif($id_etablissement) ;
  226. if ($commande->load($posts)) {
  227. $commande = Commande::find()->where('id_production = ' . $posts['Commande']['id_production'])->andWhere('id_user = ' . Yii::$app->user->id)->one();
  228. if (!$commande) {
  229. $commande = new Commande;
  230. $commande->load(Yii::$app->request->post());
  231. $commande->id_user = Yii::$app->user->id;
  232. $commande->date = date('Y-m-d H:i:s');
  233. $commande->type = Commande::TYPE_USER ;
  234. }
  235. $this->gestionForm($commande);
  236. }
  237. return $this->render('create', array_merge(self::initForm($commande), [
  238. 'model' => $commande
  239. ]));
  240. }
  241. public function actionUpdate($id) {
  242. $commande = Commande::find()
  243. ->with('production')
  244. ->where(['id' => $id])
  245. ->one();
  246. if($commande->getEtat() != Commande::ETAT_MODIFIABLE)
  247. {
  248. throw new UserException('Cette commande n\'est pas modifiable.') ;
  249. }
  250. $this->_verifEtablissementActif($commande->production->id_etablissement) ;
  251. if ($commande && $commande->load(Yii::$app->request->post()))
  252. {
  253. $commande->date_update = date('Y-m-d H:i:s');
  254. $this->gestionForm($commande);
  255. }
  256. return $this->render('update', array_merge(self::initForm($commande), [
  257. 'model' => $commande,
  258. 'commande_introuvable' => !$commande,
  259. ]));
  260. }
  261. public function _verifEtablissementActif($id_etablissement)
  262. {
  263. $etablissement = Etablissement::findOne($id_etablissement) ;
  264. if($etablissement && !$etablissement->actif)
  265. {
  266. throw new NotFoundHttpException('Cet établissement est actuellement hors ligne.');
  267. }
  268. }
  269. public function gestionForm($commande) {
  270. $posts = Yii::$app->request->post();
  271. $produits = array();
  272. $quantite_totale = 0;
  273. foreach ($posts['Produit'] as $key => $quantity) {
  274. $key = (int) str_replace('produit_', '', $key);
  275. $p = Produit::find()->where(['id' => $key])->one();
  276. $quantite_totale += $quantity;
  277. if ($p && $quantity)
  278. $produits[] = $p;
  279. }
  280. // nombre de produits
  281. $err_nb_produits = false;
  282. if (!Yii::$app->user->identity->confiance && $quantite_totale > 3) {
  283. $err_nb_produits = true;
  284. }
  285. // date
  286. $err_date = false;
  287. $pate_deja_petrie = false;
  288. if (isset($commande->id_production)) {
  289. // date de commande
  290. $production = Production::find()->where(['id' => $commande->id_production])->one();
  291. if (date('H') >= 20) {
  292. $date = date('Y-m-d', strtotime(date('Y-m-d')) + 60 * 60 * 24);
  293. } else {
  294. $date = date('Y-m-d');
  295. }
  296. if ($production->date < $date) {
  297. $err_date = true;
  298. }
  299. }
  300. // point de vente
  301. $err_point_vente = false ;
  302. if(isset($production) && $production)
  303. {
  304. $ppv = ProductionPointVente::find()
  305. ->where([
  306. 'id_production' => $production->id,
  307. 'id_point_vente' => $posts['Commande']['id_point_vente']
  308. ])
  309. ->one() ;
  310. if(!$ppv || !$ppv->livraison)
  311. {
  312. $err_point_vente = true ;
  313. }
  314. $point_vente = PointVente::findOne($posts['Commande']['id_point_vente']) ;
  315. if($point_vente)
  316. {
  317. if(strlen($point_vente->code) && !$point_vente->verifCode($posts['code_point_vente_'.$point_vente->id]))
  318. {
  319. $err_point_vente = true ;
  320. }
  321. }
  322. else {
  323. $err_point_vente = true ;
  324. }
  325. }
  326. if ($commande->validate() && count($produits) && !$err_nb_produits && !$err_date && !$err_point_vente) {
  327. // gestion point de vente
  328. $pv = PointVente::find()
  329. ->with('pointVenteUser')
  330. ->where(['id' => $commande->id_point_vente])
  331. ->one() ;
  332. if($pv && strlen($pv->getCommentaire()))
  333. $commande->commentaire_point_vente = $pv->getCommentaire() ;
  334. else
  335. $commande->commentaire_point_vente = '' ;
  336. // sauvegarde de la commande
  337. $commande->save();
  338. // suppression de tous les enregistrements CommandeProduit
  339. if (!is_null($commande)) {
  340. CommandeProduit::deleteAll(['id_commande' => $commande->id]);
  341. }
  342. // produits dispos
  343. $produits_dispos = ProductionProduit::findProduits($production->id);
  344. // sauvegarde des produits
  345. foreach ($produits as $p) {
  346. // le produit doit etre dispo à la vente
  347. if (isset($produits_dispos[$p->id]) && $produits_dispos[$p->id]['actif']) {
  348. $commande_produit = new CommandeProduit();
  349. $commande_produit->id_commande = $commande->id;
  350. $commande_produit->id_produit = $p->id;
  351. $commande_produit->prix = $p->prix;
  352. $quantite_voulue = (int) $posts['Produit']['produit_' . $p->id];
  353. if ($produits_dispos[$p->id]['quantite_max'] && $quantite_voulue > $produits_dispos[$p->id]['quantite_restante'])
  354. $quantite_voulue = $produits_dispos[$p->id]['quantite_restante'];
  355. $commande_produit->quantite = $quantite_voulue;
  356. $commande_produit->save();
  357. }
  358. }
  359. // credit pain
  360. $credit_pain = isset($posts['credit_pain']) && $posts['credit_pain'] ;
  361. if($credit_pain && ($pv->credit_pain || $commande->getMontantPaye()))
  362. {
  363. $commande = Commande::find()
  364. ->with('commandeProduits')
  365. ->where(['id' => $commande->id])
  366. ->one() ;
  367. $commande->init() ;
  368. $montant_paye = $commande->getMontantPaye() ;
  369. // à payer
  370. if($commande->getStatutPaiement() == Commande::STATUT_IMPAYEE)
  371. {
  372. $montant_payer = $commande->montant - $montant_paye ;
  373. $credit = Yii::$app->user->identity->getCredit($production->id_etablissement) ;
  374. if($montant_payer > $credit)
  375. {
  376. $montant_payer = $credit ;
  377. }
  378. $commande->creditHistorique(
  379. CreditHistorique::TYPE_PAIEMENT,
  380. $montant_payer,
  381. $production->id_etablissement,
  382. Yii::$app->user->identity->id
  383. ) ;
  384. }
  385. // surplus à rembourser
  386. elseif($commande->getStatutPaiement() == Commande::STATUT_SURPLUS)
  387. {
  388. $montant_rembourser = $montant_paye - $commande->montant ;
  389. $commande->creditHistorique(
  390. CreditHistorique::TYPE_REMBOURSEMENT,
  391. $montant_rembourser,
  392. $production->id_etablissement,
  393. Yii::$app->user->identity->id
  394. ) ;
  395. }
  396. }
  397. // redirection
  398. $this->redirect(Yii::$app->urlManager->createUrl(['commande/index', 'commande_ok' => true, 'pate_deja_petrie' => $pate_deja_petrie]));
  399. }
  400. else {
  401. if (!count($produits))
  402. Yii::$app->session->setFlash('error', "Vous n'avez choisi aucun produit");
  403. if ($err_nb_produits)
  404. Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander plus de 3 produits");
  405. if ($err_date)
  406. Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander pour cette date.");
  407. if($err_point_vente)
  408. Yii::$app->session->setFlash('error', "Point de vente invalide.");
  409. }
  410. }
  411. public function actionAnnuler($id) {
  412. $commande = Commande::find()
  413. ->with('production','creditHistorique','commandeProduits')
  414. ->where(['id' => $id])
  415. ->one();
  416. if($commande->getEtat() != Commande::ETAT_MODIFIABLE)
  417. {
  418. throw new UserException('Vous ne pouvez plus annuler cette commande.') ;
  419. }
  420. $commande->init() ;
  421. if ($commande && Yii::$app->user->id == $commande->id_user) {
  422. // remboursement
  423. if($commande->getMontantPaye())
  424. {
  425. $commande->creditHistorique(
  426. CreditHistorique::TYPE_REMBOURSEMENT,
  427. $commande->getMontantPaye(),
  428. $commande->production->id_etablissement,
  429. Yii::$app->user->identity->id
  430. ) ;
  431. }
  432. // delete
  433. $commande->delete();
  434. CommandeProduit::deleteAll(['id_commande' => $commande->id]);
  435. }
  436. $this->redirect(Yii::$app->urlManager->createUrl(['commande/index', 'annule_ok' => true]));
  437. }
  438. public function actionVerifCodePointVente($id_point_vente, $code)
  439. {
  440. $point_vente = PointVente::findOne($id_point_vente) ;
  441. if($point_vente)
  442. {
  443. if($point_vente->verifCode($code))
  444. {
  445. return true ;
  446. }
  447. }
  448. return false ;
  449. }
  450. }