您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

CommandeController.php 15KB

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