You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
13KB

  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. class CommandeController extends \yii\web\Controller {
  17. public function behaviors() {
  18. return [
  19. 'access' => [
  20. 'class' => AccessControl::className(),
  21. 'rules' => [
  22. [
  23. 'allow' => true,
  24. 'roles' => ['@'],
  25. ]
  26. ],
  27. ],
  28. ];
  29. }
  30. public function actionInfosProduction($date) {
  31. $production = Production::find()->where(['date' => $date])->one();
  32. if ($production) {
  33. $produits_dispos = ProductionProduit::findProduits($production->id);
  34. return json_encode([
  35. 'produits_dispos' => $produits_dispos,
  36. 'livraison' => (int) $production->livraison
  37. ]);
  38. }
  39. return json_encode([]);
  40. }
  41. public static function initForm($commande = null) {
  42. // etablissements
  43. $etablissements = Yii::$app->user->identity->getEtablissementsFavoris() ;
  44. $id_etablissement = Yii::$app->request->get('id_etablissement', 0) ;
  45. $etablissement_paiement_ok = false ;
  46. if($id_etablissement)
  47. {
  48. $etablissement = Etablissement::findOne($id_etablissement);
  49. if($etablissement->etatPaiement() == Etablissement::PAIEMENT_OK || $etablissement->etatPaiement() == Etablissement::PAIEMENT_ESSAI)
  50. {
  51. $etablissement_paiement_ok = true ;
  52. }
  53. }
  54. // points de vente
  55. $points_vente = PointVente::find()
  56. ->where(['id_etablissement'=>$id_etablissement])
  57. ->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)')
  58. ->params([':id_user' => Yii::$app->user->identity->id])
  59. ->all();
  60. $arr_points_vente = $points_vente;
  61. // jours de production
  62. $heure_limite = 20 ;
  63. $date = date('Y-m-d') ;
  64. if(isset($etablissement))
  65. {
  66. $heure_limite = $etablissement->heure_limite_commande ;
  67. if (date('H') >= $heure_limite) {
  68. $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande)*(24*60*60) );
  69. } else {
  70. $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande - 1)*(24*60*60));
  71. }
  72. }
  73. $jours_production = Production::find()
  74. ->where(['actif' => 1])
  75. ->andWhere('date > :date')
  76. ->andWhere(['id_etablissement'=>$id_etablissement])
  77. ->addParams([':date' => $date])
  78. ->all();
  79. $arr_jours_production = array('' => '--');
  80. foreach ($jours_production as $j)
  81. $arr_jours_production[$j->id] = date('d/m/Y', strtotime($j->date));
  82. // produits
  83. $produits = Produit::find()
  84. ->where(['actif' => 1, 'id_etablissement' => $id_etablissement])
  85. ->andWhere('vrac IS NULL OR vrac = 0')
  86. ->orderBy('order ASC')->all();
  87. $arr_produits = array();
  88. foreach ($produits as $p)
  89. $arr_produits[] = $p;
  90. // produits vrac
  91. $produits_vrac = Produit::find()->where(['actif' => 1, 'vrac' => 1])->orderBy('order ASC')->all();
  92. // produits selec
  93. $posts = Yii::$app->request->post();
  94. $produits_selec = [];
  95. if (isset($posts['Produit'])) {
  96. foreach ($posts['Produit'] as $key => $quantity) {
  97. $key = (int) str_replace('produit_', '', $key);
  98. $p = Produit::find()->where(['id' => $key])->one();
  99. if ($p && $quantity)
  100. $produits_selec[$p->id] = (int) $quantity;
  101. }
  102. }
  103. elseif (!is_null($commande)) {
  104. $produits_commande = CommandeProduit::find()->where(['id_commande' => $commande->id])->all();
  105. foreach ($produits_commande as $pc) {
  106. $produits_selec[$pc->id_produit] = (int) $pc->quantite;
  107. }
  108. }
  109. $produits_dispos = [];
  110. $production = null;
  111. if (!is_null($commande) && $commande->id_production) {
  112. $produits_dispos = ProductionProduit::findProduits($commande->id_production);
  113. $production = Production::find()->where(['id' => $commande->id_production])->one();
  114. }
  115. $commandes = Commande::find()
  116. ->where(['id_user' => Yii::$app->user->identity->id])
  117. ->all();
  118. return [
  119. 'points_vente' => $arr_points_vente,
  120. 'jours_production' => $arr_jours_production,
  121. 'produits' => $produits,
  122. 'produits_selec' => $produits_selec,
  123. 'produits_dispos' => $produits_dispos,
  124. 'production' => $production,
  125. 'commandes_en_cours' => $commandes,
  126. 'produits_vrac' => $produits_vrac,
  127. 'etablissements' => $etablissements,
  128. 'id_etablissement' => $id_etablissement,
  129. 'etablissement_paiement_ok' => $etablissement_paiement_ok,
  130. ];
  131. }
  132. public function actionIndex() {
  133. $model_form_etablissement = new AddEtablissementForm() ;
  134. if($model_form_etablissement->load(Yii::$app->request->post())
  135. && $model_form_etablissement->validate())
  136. {
  137. $model_form_etablissement->add() ;
  138. $model_form_etablissement->code = '' ;
  139. }
  140. // liste des etablissements
  141. $etablissements = Yii::$app->user->identity->getEtablissementsFavoris();
  142. // liste des boulangeries disponibles
  143. $arr_etablissements = Etablissement::getEtablissementsPopulateDropdown() ;
  144. $data_etablissements_dispos = $arr_etablissements['data'] ;
  145. $options_etablissements_dispos = $arr_etablissements['options'] ;
  146. // liste des commandes
  147. $commandes = Commande::find()
  148. ->with('commandeProduits', 'pointVente')
  149. ->joinWith('production','production.etablissement')
  150. ->where(['id_user' => Yii::$app->user->id])
  151. //->andWhere('production.date < '.)
  152. ->orderBy('production.date DESC')
  153. ->limit(40)
  154. ->all();
  155. // initilisation commandes
  156. foreach ($commandes as $c)
  157. $c->init();
  158. return $this->render('index', [
  159. 'commandes' => $commandes,
  160. 'commande_ok' => Yii::$app->getRequest()->get('commande_ok', false),
  161. 'annule_ok' => Yii::$app->getRequest()->get('annule_ok', false),
  162. 'pate_deja_petrie' => Yii::$app->getRequest()->get('pate_deja_petrie', false),
  163. 'etablissements' => $etablissements,
  164. 'model_form_etablissement' => $model_form_etablissement,
  165. 'data_etablissements_dispos' => $data_etablissements_dispos,
  166. 'options_etablissements_dispos' => $options_etablissements_dispos,
  167. ]);
  168. }
  169. public function actionRemoveEtablissement($id = 0)
  170. {
  171. $user_etablissement = UserEtablissement::find()
  172. ->where(['id_etablissement'=>$id, 'id_user' => Yii::$app->user->identity->id])
  173. ->one() ;
  174. $user_etablissement->delete() ;
  175. $this->redirect(['commande/index']) ;
  176. }
  177. public function actionCreate() {
  178. $commande = new Commande;
  179. $posts = Yii::$app->request->post();
  180. if ($commande->load($posts)) {
  181. $commande = Commande::find()->where('id_production = ' . $posts['Commande']['id_production'])->andWhere('id_user = ' . Yii::$app->user->id)->one();
  182. if (!$commande) {
  183. $commande = new Commande;
  184. $commande->load(Yii::$app->request->post());
  185. $commande->id_user = Yii::$app->user->id;
  186. $commande->date = date('Y-m-d H:i:s');
  187. $commande->type = Commande::TYPE_USER ;
  188. }
  189. $this->gestionForm($commande);
  190. }
  191. return $this->render('create', array_merge(self::initForm($commande), [
  192. 'model' => $commande,
  193. ]));
  194. }
  195. public function actionUpdate($id) {
  196. $commande = Commande::find()->where(['id' => $id])->one();
  197. if ($commande && $commande->load(Yii::$app->request->post())) {
  198. $commande->date_update = date('Y-m-d H:i:s');
  199. $this->gestionForm($commande);
  200. }
  201. return $this->render('update', array_merge(self::initForm($commande), [
  202. 'model' => $commande,
  203. 'commande_introuvable' => !$commande,
  204. ]));
  205. }
  206. public function gestionForm($commande) {
  207. $posts = Yii::$app->request->post();
  208. $produits = array();
  209. $quantite_totale = 0;
  210. foreach ($posts['Produit'] as $key => $quantity) {
  211. $key = (int) str_replace('produit_', '', $key);
  212. $p = Produit::find()->where(['id' => $key])->one();
  213. $quantite_totale += $quantity;
  214. if ($p && $quantity)
  215. $produits[] = $p;
  216. }
  217. // nombre de produits
  218. $err_nb_produits = false;
  219. if (!Yii::$app->user->identity->confiance && $quantite_totale > 3) {
  220. $err_nb_produits = true;
  221. }
  222. // date
  223. $err_date = false;
  224. $pate_deja_petrie = false;
  225. if (isset($commande->id_production)) {
  226. // date de commande
  227. $production = Production::find()->where(['id' => $commande->id_production])->one();
  228. if (date('H') >= 20) {
  229. $date = date('Y-m-d', strtotime(date('Y-m-d')) + 60 * 60 * 24);
  230. } else {
  231. $date = date('Y-m-d');
  232. }
  233. if ($production->date < $date) {
  234. $err_date = true;
  235. }
  236. }
  237. if ($commande->validate() && count($produits) && !$err_nb_produits && !$err_date) {
  238. // sauvegarde de la commande
  239. $commande->save();
  240. // suppression de tous les enregistrements CommandeProduit
  241. if (!is_null($commande)) {
  242. CommandeProduit::deleteAll(['id_commande' => $commande->id]);
  243. }
  244. // produits dispos
  245. $produits_dispos = ProductionProduit::findProduits($production->id);
  246. // sauvegarde des produits
  247. foreach ($produits as $p) {
  248. // le produit doit etre dispo à la vente
  249. if (isset($produits_dispos[$p->id]) && $produits_dispos[$p->id]['actif']) {
  250. $commande_produit = new CommandeProduit();
  251. $commande_produit->id_commande = $commande->id;
  252. $commande_produit->id_produit = $p->id;
  253. $commande_produit->prix = $p->prix;
  254. $quantite_voulue = (int) $posts['Produit']['produit_' . $p->id];
  255. if ($quantite_voulue > $produits_dispos[$p->id]['quantite_restante'] && !$produits_dispos[$p->id]['vrac'])
  256. $quantite_voulue = $produits_dispos[$p->id]['quantite_restante'];
  257. $commande_produit->quantite = $quantite_voulue;
  258. $commande_produit->save();
  259. }
  260. }
  261. // redirection
  262. $this->redirect(Yii::$app->urlManager->createUrl(['commande/index', 'commande_ok' => true, 'pate_deja_petrie' => $pate_deja_petrie]));
  263. }
  264. else {
  265. if (!count($produits))
  266. Yii::$app->session->setFlash('error', "Vous n'avez choisi aucun produit");
  267. if ($err_nb_produits)
  268. Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander plus de 3 produits");
  269. if ($err_date)
  270. Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander pour cette date.");
  271. }
  272. }
  273. public function actionAnnuler($id) {
  274. $commande = Commande::find()->where(['id' => $id])->one();
  275. if ($commande && Yii::$app->user->id == $commande->id_user) {
  276. $commande->delete();
  277. CommandeProduit::deleteAll(['id_commande' => $commande->id]);
  278. }
  279. $this->redirect(Yii::$app->urlManager->createUrl(['commande/index', 'annule_ok' => true]));
  280. }
  281. }