No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

453 líneas
16KB

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