You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

515 line
19KB

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