Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

340 lines
12KB

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