Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

308 lines
10KB

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