Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

497 Zeilen
19KB

  1. <?php
  2. namespace producer\controllers;
  3. class CommandeController extends ProducerBaseController {
  4. public function behaviors() {
  5. return [
  6. 'access' => [
  7. 'class' => AccessControl::className(),
  8. 'rules' => [
  9. [
  10. 'allow' => true,
  11. 'roles' => ['@'],
  12. ]
  13. ],
  14. ],
  15. ];
  16. }
  17. public function actionInfosProduction($id_production) {
  18. $production = Production::findOne($id_production);
  19. if ($production) {
  20. $arr = [];
  21. $produits_dispos = ProductionProduit::findProduits($production->id);
  22. $arr['produits_dispos'] = $produits_dispos;
  23. $points_vente = PointVente::find()
  24. ->joinWith(['productionPointVente' => function($q) use ($production) {
  25. $q->where(['id_production' => $production->id]);
  26. }])
  27. ->where([
  28. 'id_etablissement' => $production->id_etablissement,
  29. ])
  30. ->all();
  31. $arr['points_vente'] = [];
  32. foreach ($points_vente as $pv) {
  33. if (isset($pv->productionPointVente) &&
  34. isset($pv->productionPointVente[0])) {
  35. $arr['points_vente'][$pv->id] = $pv->productionPointVente[0]->livraison;
  36. } else {
  37. $arr['points_vente'][$pv->id] = false;
  38. }
  39. }
  40. return json_encode($arr);
  41. }
  42. return json_encode([]);
  43. }
  44. public function initForm($commande = null) {
  45. // etablissements
  46. $etablissements = Yii::$app->user->identity->getEtablissementsFavoris();
  47. $id_etablissement = $this->getProducer()->id;
  48. $etablissement_paiement_ok = false;
  49. if ($id_etablissement) {
  50. $etablissement = Etablissement::findOne($id_etablissement);
  51. if ($etablissement->etatPaiement() == Etablissement::PAIEMENT_OK || $etablissement->etatPaiement() == Etablissement::PAIEMENT_ESSAI) {
  52. $etablissement_paiement_ok = true;
  53. }
  54. }
  55. // etablissement
  56. $etablissement = Etablissement::findOne($id_etablissement);
  57. // points de vente
  58. $points_vente = PointVente::find()
  59. ->with('pointVenteUser')
  60. ->where(['id_etablissement' => $id_etablissement])
  61. ->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)')
  62. ->params([':id_user' => Yii::$app->user->identity->id])
  63. ->all();
  64. $arr_points_vente = $points_vente;
  65. // jours de production
  66. $heure_limite = 20;
  67. $date = date('Y-m-d');
  68. if (isset($etablissement)) {
  69. $heure_limite = $etablissement->heure_limite_commande;
  70. if (date('H') >= $heure_limite) {
  71. $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande) * (24 * 60 * 60));
  72. } else {
  73. $date = date('Y-m-d', strtotime(date('Y-m-d')) + ($etablissement->delai_commande - 1) * (24 * 60 * 60));
  74. }
  75. }
  76. $jours_production = Production::find()
  77. ->where(['actif' => 1])
  78. ->andWhere('date > :date')
  79. ->andWhere(['id_etablissement' => $id_etablissement])
  80. ->addParams([':date' => $date])
  81. ->all();
  82. $arr_jours_production = array('' => '--');
  83. foreach ($jours_production as $j)
  84. $arr_jours_production[$j->id] = date('d/m/Y', strtotime($j->date));
  85. // produits
  86. $produits = Produit::find()
  87. ->leftJoin('production_produit', 'produit.id = production_produit.id_produit')
  88. ->where(['produit.actif' => 1, 'id_etablissement' => $id_etablissement])
  89. ->andWhere('produit.vrac IS NULL OR produit.vrac = 0')
  90. ->orderBy('produit.order ASC')->all();
  91. $arr_produits = array();
  92. foreach ($produits as $p)
  93. $arr_produits[] = $p;
  94. // produits vrac
  95. $produits_vrac = Produit::find()->where(['actif' => 1, 'vrac' => 1])->orderBy('order ASC')->all();
  96. // produits selec
  97. $posts = Yii::$app->request->post();
  98. $produits_selec = [];
  99. if (isset($posts['Produit'])) {
  100. foreach ($posts['Produit'] as $key => $quantity) {
  101. $key = (int) str_replace('produit_', '', $key);
  102. $p = Produit::find()->where(['id' => $key])->one();
  103. if ($p && $quantity)
  104. $produits_selec[$p->id] = (int) $quantity;
  105. }
  106. }
  107. elseif (!is_null($commande)) {
  108. $produits_commande = CommandeProduit::find()->where(['id_commande' => $commande->id])->all();
  109. foreach ($produits_commande as $pc) {
  110. $produits_selec[$pc->id_produit] = (int) $pc->quantite;
  111. }
  112. }
  113. $produits_dispos = [];
  114. $production = null;
  115. if (!is_null($commande) && $commande->id_production) {
  116. $produits_dispos = ProductionProduit::findProduits($commande->id_production);
  117. $production = Production::find()->where(['id' => $commande->id_production])->one();
  118. }
  119. $commandes = Commande::find()
  120. ->where(['id_user' => Yii::$app->user->identity->id])
  121. ->all();
  122. if ($id_etablissement) {
  123. $user_etablissement = UserEtablissement::find()
  124. ->where([
  125. 'id_etablissement' => $id_etablissement,
  126. 'id_user' => Yii::$app->user->identity->id
  127. ])
  128. ->one();
  129. $credit = $user_etablissement->credit;
  130. } else {
  131. $credit = 0;
  132. }
  133. return [
  134. 'points_vente' => $arr_points_vente,
  135. 'jours_production' => $arr_jours_production,
  136. 'produits' => $produits,
  137. 'produits_selec' => $produits_selec,
  138. 'produits_dispos' => $produits_dispos,
  139. 'production' => $production,
  140. 'commandes_en_cours' => $commandes,
  141. 'produits_vrac' => $produits_vrac,
  142. 'etablissements' => $etablissements,
  143. 'id_etablissement' => $id_etablissement,
  144. 'etablissement' => $etablissement,
  145. 'etablissement_paiement_ok' => $etablissement_paiement_ok,
  146. 'credit' => $credit
  147. ];
  148. }
  149. public function actionHistorique() {
  150. $model_form_etablissement = new AddEtablissementForm();
  151. if ($model_form_etablissement->load(Yii::$app->request->post()) && $model_form_etablissement->validate()) {
  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 établissement 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('historique', [
  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. $user_etablissement = UserEtablissement::find()
  186. ->where(['id_etablissement' => $id, 'id_user' => Yii::$app->user->identity->id])
  187. ->one();
  188. $user_etablissement->actif = 0;
  189. $user_etablissement->save();
  190. $this->redirect(['commande/index']);
  191. }
  192. public function actionCreate() {
  193. $id_etablissement = $this->getProducer()->id ;
  194. $commande = new Commande;
  195. $posts = Yii::$app->request->post();
  196. if ($id_etablissement)
  197. $this->_verifEtablissementActif($id_etablissement);
  198. if ($commande->load($posts)) {
  199. $commande = Commande::find()->where('id_production = ' . $posts['Commande']['id_production'])->andWhere('id_user = ' . Yii::$app->user->id)->one();
  200. if (!$commande) {
  201. $commande = new Commande;
  202. $commande->load(Yii::$app->request->post());
  203. $commande->id_user = Yii::$app->user->id;
  204. $commande->date = date('Y-m-d H:i:s');
  205. $commande->type = Commande::TYPE_USER;
  206. }
  207. $this->gestionForm($commande);
  208. }
  209. return $this->render('create', array_merge($this->initForm($commande), [
  210. 'model' => $commande
  211. ]));
  212. }
  213. public function actionUpdate($id) {
  214. $commande = Commande::find()
  215. ->with('production')
  216. ->where(['id' => $id])
  217. ->one();
  218. if ($commande->getEtat() != Commande::ETAT_MODIFIABLE) {
  219. throw new UserException('Cette commande n\'est pas modifiable.');
  220. }
  221. $this->_verifEtablissementActif($commande->production->id_etablissement);
  222. if ($commande && $commande->load(Yii::$app->request->post())) {
  223. $commande->date_update = date('Y-m-d H:i:s');
  224. $this->gestionForm($commande);
  225. }
  226. return $this->render('update', array_merge($this->initForm($commande), [
  227. 'model' => $commande,
  228. 'commande_introuvable' => !$commande,
  229. ]));
  230. }
  231. public function _verifEtablissementActif($id_etablissement) {
  232. $etablissement = Etablissement::findOne($id_etablissement);
  233. if ($etablissement && !$etablissement->actif) {
  234. throw new NotFoundHttpException('Cet établissement est actuellement hors ligne.');
  235. }
  236. }
  237. public function gestionForm($commande) {
  238. $posts = Yii::$app->request->post();
  239. $produits = array();
  240. $quantite_totale = 0;
  241. foreach ($posts['Produit'] as $key => $quantity) {
  242. $key = (int) str_replace('produit_', '', $key);
  243. $p = Produit::find()->where(['id' => $key])->one();
  244. $quantite_totale += $quantity;
  245. if ($p && $quantity)
  246. $produits[] = $p;
  247. }
  248. // nombre de produits
  249. $err_nb_produits = false;
  250. if (!Yii::$app->user->identity->confiance && $quantite_totale > 3) {
  251. $err_nb_produits = true;
  252. }
  253. // date
  254. $err_date = false;
  255. $pate_deja_petrie = false;
  256. if (isset($commande->id_production)) {
  257. // date de commande
  258. $production = Production::find()->where(['id' => $commande->id_production])->one();
  259. if (date('H') >= 20) {
  260. $date = date('Y-m-d', strtotime(date('Y-m-d')) + 60 * 60 * 24);
  261. } else {
  262. $date = date('Y-m-d');
  263. }
  264. if ($production->date < $date) {
  265. $err_date = true;
  266. }
  267. }
  268. // point de vente
  269. $err_point_vente = false;
  270. if (isset($production) && $production) {
  271. $ppv = ProductionPointVente::find()
  272. ->where([
  273. 'id_production' => $production->id,
  274. 'id_point_vente' => $posts['Commande']['id_point_vente']
  275. ])
  276. ->one();
  277. if (!$ppv || !$ppv->livraison) {
  278. $err_point_vente = true;
  279. }
  280. $point_vente = PointVente::findOne($posts['Commande']['id_point_vente']);
  281. if ($point_vente) {
  282. if (strlen($point_vente->code) && !$point_vente->verifCode($posts['code_point_vente_' . $point_vente->id])) {
  283. $err_point_vente = true;
  284. }
  285. } else {
  286. $err_point_vente = true;
  287. }
  288. }
  289. if ($commande->validate() && count($produits) && !$err_nb_produits && !$err_date && !$err_point_vente) {
  290. // gestion point de vente
  291. $pv = PointVente::find()
  292. ->with('pointVenteUser')
  293. ->where(['id' => $commande->id_point_vente])
  294. ->one();
  295. if ($pv && strlen($pv->getCommentaire()))
  296. $commande->commentaire_point_vente = $pv->getCommentaire();
  297. else
  298. $commande->commentaire_point_vente = '';
  299. // sauvegarde de la commande
  300. $commande->save();
  301. // suppression de tous les enregistrements CommandeProduit
  302. if (!is_null($commande)) {
  303. CommandeProduit::deleteAll(['id_commande' => $commande->id]);
  304. }
  305. // produits dispos
  306. $produits_dispos = ProductionProduit::findProduits($production->id);
  307. // sauvegarde des produits
  308. foreach ($produits as $p) {
  309. // le produit doit etre dispo à la vente
  310. if (isset($produits_dispos[$p->id]) && $produits_dispos[$p->id]['actif']) {
  311. $commande_produit = new CommandeProduit();
  312. $commande_produit->id_commande = $commande->id;
  313. $commande_produit->id_produit = $p->id;
  314. $commande_produit->prix = $p->prix;
  315. $quantite_voulue = (int) $posts['Produit']['produit_' . $p->id];
  316. if ($produits_dispos[$p->id]['quantite_max'] && $quantite_voulue > $produits_dispos[$p->id]['quantite_restante'])
  317. $quantite_voulue = $produits_dispos[$p->id]['quantite_restante'];
  318. $commande_produit->quantite = $quantite_voulue;
  319. $commande_produit->save();
  320. }
  321. }
  322. // credit pain
  323. $credit_pain = isset($posts['credit_pain']) && $posts['credit_pain'];
  324. if ($credit_pain && ($pv->credit_pain || $commande->getMontantPaye())) {
  325. $commande = Commande::find()
  326. ->with('commandeProduits')
  327. ->where(['id' => $commande->id])
  328. ->one();
  329. $commande->init();
  330. $montant_paye = $commande->getMontantPaye();
  331. // à payer
  332. if ($commande->getStatutPaiement() == Commande::STATUT_IMPAYEE) {
  333. $montant_payer = $commande->montant - $montant_paye;
  334. $credit = Yii::$app->user->identity->getCredit($production->id_etablissement);
  335. if ($montant_payer > $credit) {
  336. $montant_payer = $credit;
  337. }
  338. if ($montant_payer > 0) {
  339. $commande->creditHistorique(
  340. CreditHistorique::TYPE_PAIEMENT,
  341. $montant_payer,
  342. $production->id_etablissement,
  343. Yii::$app->user->identity->id,
  344. Yii::$app->user->identity->id
  345. );
  346. }
  347. }
  348. // surplus à rembourser
  349. elseif ($commande->getStatutPaiement() == Commande::STATUT_SURPLUS) {
  350. $montant_rembourser = $montant_paye - $commande->montant;
  351. $commande->creditHistorique(
  352. CreditHistorique::TYPE_REMBOURSEMENT,
  353. $montant_rembourser,
  354. $production->id_etablissement,
  355. Yii::$app->user->identity->id,
  356. Yii::$app->user->identity->id
  357. );
  358. }
  359. }
  360. // redirection
  361. $this->redirect(Yii::$app->urlManager->createUrl(['commande/historique', 'commande_ok' => true, 'pate_deja_petrie' => $pate_deja_petrie]));
  362. } else {
  363. if (!count($produits))
  364. Yii::$app->session->setFlash('error', "Vous n'avez choisi aucun produit");
  365. if ($err_nb_produits)
  366. Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander plus de 3 produits");
  367. if ($err_date)
  368. Yii::$app->session->setFlash('error', "Vous ne pouvez pas commander pour cette date.");
  369. if ($err_point_vente)
  370. Yii::$app->session->setFlash('error', "Point de vente invalide.");
  371. }
  372. }
  373. public function actionAnnuler($id) {
  374. $commande = Commande::find()
  375. ->with('production', 'creditHistorique', 'commandeProduits')
  376. ->where(['id' => $id])
  377. ->one();
  378. if ($commande->getEtat() != Commande::ETAT_MODIFIABLE) {
  379. throw new UserException('Vous ne pouvez plus annuler cette commande.');
  380. }
  381. $commande->init();
  382. if ($commande && Yii::$app->user->id == $commande->id_user) {
  383. // remboursement
  384. if ($commande->getMontantPaye()) {
  385. $commande->creditHistorique(
  386. CreditHistorique::TYPE_REMBOURSEMENT,
  387. $commande->getMontantPaye(),
  388. $commande->production->id_etablissement,
  389. Yii::$app->user->identity->id,
  390. Yii::$app->user->identity->id
  391. );
  392. }
  393. // delete
  394. $commande->delete();
  395. CommandeProduit::deleteAll(['id_commande' => $commande->id]);
  396. }
  397. $this->redirect(Yii::$app->urlManager->createUrl(['commande/index', 'annule_ok' => true]));
  398. }
  399. public function actionVerifCodePointVente($id_point_vente, $code) {
  400. $point_vente = PointVente::findOne($id_point_vente);
  401. if ($point_vente) {
  402. if ($point_vente->verifCode($code)) {
  403. return true;
  404. }
  405. }
  406. return false;
  407. }
  408. }