No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

476 líneas
17KB

  1. <?php
  2. /**
  3. * Copyright distrib (2018)
  4. *
  5. * contact@opendistrib.net
  6. *
  7. * Ce logiciel est un programme informatique servant à aider les producteurs
  8. * à distribuer leur production en circuits courts.
  9. *
  10. * Ce logiciel est régi par la licence CeCILL soumise au droit français et
  11. * respectant les principes de diffusion des logiciels libres. Vous pouvez
  12. * utiliser, modifier et/ou redistribuer ce programme sous les conditions
  13. * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  14. * sur le site "http://www.cecill.info".
  15. *
  16. * En contrepartie de l'accessibilité au code source et des droits de copie,
  17. * de modification et de redistribution accordés par cette licence, il n'est
  18. * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  19. * seule une responsabilité restreinte pèse sur l'auteur du programme, le
  20. * titulaire des droits patrimoniaux et les concédants successifs.
  21. *
  22. * A cet égard l'attention de l'utilisateur est attirée sur les risques
  23. * associés au chargement, à l'utilisation, à la modification et/ou au
  24. * développement et à la reproduction du logiciel par l'utilisateur étant
  25. * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  26. * manipuler et qui le réserve donc à des développeurs et des professionnels
  27. * avertis possédant des connaissances informatiques approfondies. Les
  28. * utilisateurs sont donc invités à charger et tester l'adéquation du
  29. * logiciel à leurs besoins dans des conditions permettant d'assurer la
  30. * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  31. * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  32. *
  33. * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  34. * pris connaissance de la licence CeCILL, et que vous en avez accepté les
  35. * termes.
  36. */
  37. namespace frontend\controllers;
  38. use common\models\ProducerPriceRange;
  39. use Yii;
  40. use common\models\Product;
  41. use common\models\LoginForm;
  42. use common\models\Producer;
  43. use frontend\models\PasswordResetRequestForm;
  44. use frontend\models\ResetPasswordForm;
  45. use frontend\models\SignupForm;
  46. use common\models\ContactForm;
  47. use yii\base\InvalidParamException;
  48. use yii\data\ActiveDataProvider;
  49. use yii\web\BadRequestHttpException;
  50. use yii\web\Controller;
  51. use yii\filters\VerbFilter;
  52. use yii\filters\AccessControl;
  53. use yii\helpers\Html;
  54. use frontend\controllers\FrontendController;
  55. use common\models\UserProducer;
  56. use dosamigos\leaflet\types\LatLng;
  57. use dosamigos\leaflet\layers\Marker;
  58. use dosamigos\leaflet\layers\TileLayer;
  59. use dosamigos\leaflet\LeafLet;
  60. use dosamigos\leaflet\widgets\Map;
  61. /**
  62. * Site controller
  63. */
  64. class SiteController extends FrontendController
  65. {
  66. /**
  67. * @inheritdoc
  68. */
  69. public function behaviors()
  70. {
  71. return [
  72. 'access' => [
  73. 'class' => AccessControl::className(),
  74. 'only' => ['logout', 'signup'],
  75. 'rules' => [
  76. [
  77. 'actions' => ['signup'],
  78. 'allow' => true,
  79. 'roles' => ['?'],
  80. ],
  81. [
  82. 'actions' => ['logout'],
  83. 'allow' => true,
  84. 'roles' => ['@'],
  85. ],
  86. ],
  87. ],
  88. 'verbs' => [
  89. 'class' => VerbFilter::className(),
  90. 'actions' => [
  91. 'logout' => ['get'],
  92. ],
  93. ],
  94. ];
  95. }
  96. /**
  97. * @inheritdoc
  98. */
  99. public function actions()
  100. {
  101. return [
  102. 'captcha' => [
  103. 'class' => 'yii\captcha\CaptchaAction',
  104. 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
  105. ],
  106. ];
  107. }
  108. /**
  109. * Affiche la page d'erreur.
  110. *
  111. * @return mixed
  112. */
  113. public function actionError()
  114. {
  115. $exception = Yii::$app->errorHandler->exception;
  116. if ($exception->getMessage() == 'Producteur introuvable' || Yii::$app->getRequest()->getQueryParam('producer_not_found')) {
  117. return $this->render('error-404-producer', ['exception' => $exception]);
  118. }
  119. if ($exception !== null) {
  120. return $this->render('error', ['exception' => $exception]);
  121. }
  122. }
  123. /**
  124. * Affiche la page d'accueil.
  125. *
  126. * @return mixed
  127. */
  128. public function actionIndex()
  129. {
  130. return $this->render('index', [
  131. 'producerDemoAccount' => Producer::getDemoAccount(),
  132. 'dataProviderPrices' => $this->getDataProviderPrices()
  133. ]);
  134. }
  135. /**
  136. * Page de présentation des tarifs
  137. *
  138. * @return mixed
  139. */
  140. public function actionPrices()
  141. {
  142. return $this->render('prices', [
  143. 'dataProviderPrices' => $this->getDataProviderPrices()
  144. ]);
  145. }
  146. public function getDataProviderPrices(){
  147. return new ActiveDataProvider([
  148. 'query' => ProducerPriceRange::find()
  149. ->orderBy('id ASC'),
  150. 'pagination' => [
  151. 'pageSize' => 100,
  152. ],
  153. ]);
  154. }
  155. /**
  156. * Liste les producteurs utilisant la plateforme.
  157. *
  158. * @return mixed
  159. */
  160. public function actionProducers()
  161. {
  162. $dataProviderProducers = new ActiveDataProvider([
  163. 'query' => Producer::find()
  164. ->where([
  165. 'active' => true,
  166. ])
  167. ->orderBy('name ASC'),
  168. 'pagination' => [
  169. 'pageSize' => 100,
  170. ],
  171. ]);
  172. return $this->render('producers', [
  173. 'dataProviderProducers' => $dataProviderProducers
  174. ]);
  175. }
  176. /**
  177. * Affiche les mentions légales.
  178. *
  179. * @return mixed
  180. */
  181. public function actionMentions()
  182. {
  183. return $this->render('mentions');
  184. }
  185. /**
  186. * Affiche la page de connexion et traite le formulaire de connexion.
  187. *
  188. * @return mixed
  189. */
  190. public function actionLogin()
  191. {
  192. if (!\Yii::$app->user->isGuest) {
  193. return Yii::$app->getResponse()->redirect(['site/index']);
  194. }
  195. $model = new LoginForm();
  196. if ($model->load(Yii::$app->request->post()) && $model->login()) {
  197. $returnUrl = Yii::$app->request->get('return_url');
  198. if ($returnUrl) {
  199. return $this->redirect($returnUrl);
  200. } else {
  201. $userProducerArray = UserProducer::find()
  202. ->with(['producer'])
  203. ->where(['id_user' => User::getCurrentId(), 'active' => 1, 'bookmark' => 1])
  204. ->all();
  205. if ($userProducerArray && is_array($userProducerArray) && count($userProducerArray) == 1) {
  206. return $this->redirect(Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $userProducerArray[0]->producer->slug]));
  207. } else {
  208. return $this->goBack();
  209. }
  210. }
  211. } else {
  212. return $this->render('@frontend/views/site/login', [
  213. 'model' => $model,
  214. ]);
  215. }
  216. }
  217. /**
  218. * Déconnecte l'utilisateur.
  219. *
  220. * @return mixed
  221. */
  222. public function actionLogout()
  223. {
  224. Yii::$app->user->logout();
  225. return $this->goHome();
  226. }
  227. /**
  228. * Affiche la page de contact et traite le formulaire s'il est soumis.
  229. *
  230. * @return mixed
  231. */
  232. public function actionContact()
  233. {
  234. $model = new ContactForm();
  235. if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  236. if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
  237. Yii::$app->session->setFlash('success', 'Votre message a bien été envoyé. Nous vous répondrons dès que possible.');
  238. } else {
  239. Yii::$app->session->setFlash('error', 'Il y a eu une erreur lors de l\'envoi de votre message.');
  240. }
  241. return $this->refresh();
  242. } else {
  243. return $this->render('contact', [
  244. 'model' => $model,
  245. ]);
  246. }
  247. }
  248. /**
  249. * Affiche la page d'inscription et traite son formulaire.
  250. *
  251. * @return mixed
  252. */
  253. public function actionSignup()
  254. {
  255. $model = new SignupForm();
  256. if ($model->load(Yii::$app->request->post())) {
  257. $user = $model->signup();
  258. if ($user) {
  259. if (Yii::$app->getUser()->login($user)) {
  260. if ($model->option_user_producer == 'producer') {
  261. $this->redirect(Yii::$app->urlManagerBackend->createAbsoluteUrl(['site/index']));
  262. } else {
  263. $producer = Producer::findOne($model->id_producer);
  264. if ($producer) {
  265. $this->redirect(Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  266. } else {
  267. $this->redirect(['site/index']);
  268. }
  269. }
  270. }
  271. }
  272. }
  273. // liste des établissements disponibles
  274. $producersArray = Producer::getProducerPopulateDropdown();
  275. $dataProducers = $producersArray['data'];
  276. $optionsProducers = $producersArray['options'];
  277. return $this->render('signup', [
  278. 'model' => $model,
  279. 'dataProducers' => $dataProducers,
  280. 'dataProviderPrices' => $this->getDataProviderPrices(),
  281. 'optionsProducers' => $optionsProducers,
  282. ]);
  283. }
  284. /**
  285. * Affiche la page de demande de nouveau mot de passe.
  286. * Traitement du formulaire.
  287. *
  288. * @return mixed
  289. */
  290. public function actionRequestPasswordReset()
  291. {
  292. $model = new PasswordResetRequestForm();
  293. if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  294. if ($model->sendEmail()) {
  295. Yii::$app->getSession()->setFlash('success', 'Un lien vous permettant de réinitialiser votre mot de passe vient d\'être envoyé sur votre boîte mail.');
  296. return $this->goHome();
  297. } else {
  298. Yii::$app->getSession()->setFlash('error', 'Sorry, we are unable to reset password for email provided.');
  299. }
  300. }
  301. return $this->render('requestPasswordResetToken', [
  302. 'model' => $model,
  303. ]);
  304. }
  305. /**
  306. * Met à jour le mot de passe de l'utilisateur.
  307. *
  308. * @param string $token
  309. * @return mixed
  310. * @throws BadRequestHttpException
  311. */
  312. public function actionResetPassword($token)
  313. {
  314. try {
  315. $model = new ResetPasswordForm($token);
  316. } catch (InvalidParamException $e) {
  317. throw new BadRequestHttpException($e->getMessage());
  318. }
  319. if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
  320. Yii::$app->getSession()->setFlash('success', 'Votre nouveau mot de passe vient d\'être sauvegardé.');
  321. return $this->goHome();
  322. }
  323. return $this->render('resetPassword', [
  324. 'model' => $model,
  325. ]);
  326. }
  327. /**
  328. * Affiche les conditions générale de service.
  329. *
  330. * @return mixed
  331. */
  332. public function actionCgv()
  333. {
  334. return $this->render('cgv');
  335. }
  336. /**
  337. * Affiche les précisions concernant l'utilisation du crédit.
  338. *
  339. * @return string
  340. */
  341. public function actionCredit()
  342. {
  343. return $this->render('credit');
  344. }
  345. /**
  346. * Affiche le formulaire de demande de code pour accéder à certains
  347. * producteurs.
  348. *
  349. * @param integer $id
  350. * @return mixed
  351. * @throws \yii\web\HttpException
  352. */
  353. public function actionProducerCode($id)
  354. {
  355. $producer = Producer::findOne($id);
  356. if (!$producer) {
  357. throw new \yii\web\HttpException(404, 'Producteur introuvable');
  358. }
  359. $producerCodeForm = new ProducerCodeForm;
  360. $producerCodeForm->id_producer = $id;
  361. if ($producerCodeForm->load(Yii::$app->request->post()) && $producerCodeForm->validate()) {
  362. Producer::addUser(User::getCurrentId(), $id);
  363. $this->redirect(Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  364. }
  365. return $this->render('producer_code', [
  366. 'producer' => $producer,
  367. 'producerCodeForm' => $producerCodeForm,
  368. ]);
  369. }
  370. /**
  371. * Affiche la page de connexion / inscription pour accéder notamment au
  372. * formulaire de commande des producteirs.
  373. *
  374. * @param integer $id
  375. * @return mixed
  376. */
  377. public function actionProducer($id)
  378. {
  379. $loginForm = new LoginForm();
  380. $signupForm = new SignupForm();
  381. $producer = Producer::searchOne([
  382. 'id' => $id
  383. ]);
  384. $loginForm->id_producer = $id;
  385. $signupForm->id_producer = $id;
  386. $signupForm->option_user_producer = 'user';
  387. $returnUrl = Yii::$app->request->get('returnUrl', Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => $producer->slug]));
  388. if (Yii::$app->user->isGuest) {
  389. if ($loginForm->load(Yii::$app->request->post()) && $loginForm->login()) {
  390. if (!strlen($producer->code)) {
  391. Producer::addUser(User::getCurrentId(), $id);
  392. }
  393. $this->redirect($returnUrl);
  394. }
  395. if ($signupForm->load(Yii::$app->request->post())) {
  396. if ($user = $signupForm->signup()) {
  397. if (Yii::$app->getUser()->login($user)) {
  398. $this->redirect($returnUrl);
  399. }
  400. }
  401. }
  402. } else {
  403. $this->redirect($returnUrl);
  404. }
  405. return $this->render('producer', [
  406. 'loginForm' => $loginForm,
  407. 'signupForm' => $signupForm,
  408. 'producer' => $producer,
  409. ]);
  410. }
  411. /**
  412. * Indique à l'utilisateur que l'espace d'un producteur est hors ligne
  413. *
  414. * @param integer $id
  415. * @return mixed
  416. */
  417. public function actionProducerOffline($id)
  418. {
  419. $producer = Producer::searchOne([
  420. 'id' => $id
  421. ]);
  422. return $this->render('producer_offline', [
  423. 'producer' => $producer,
  424. ]);
  425. }
  426. }