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.

318 lines
9.0KB

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