選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

346 行
13KB

  1. <?php
  2. /**
  3. * Copyright Souke (2018)
  4. *
  5. * contact@souke.fr
  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\forms;
  38. use domain\Config\TaxRate\TaxRate;
  39. use domain\Producer\Producer\Producer;
  40. use domain\Producer\Producer\ProducerModule;
  41. use domain\User\User\User;
  42. use domain\User\User\UserModule;
  43. use domain\User\UserGroup\UserGroupModule;
  44. use yii\base\Model;
  45. /**
  46. * Signup form
  47. */
  48. class SignupForm extends Model
  49. {
  50. public $signup_producer_only = false;
  51. public $username;
  52. public $email;
  53. public $password;
  54. public $name;
  55. public $lastname;
  56. public $phone;
  57. public $is_producer;
  58. public $siret;
  59. public $name_producer;
  60. public $postcode;
  61. public $city;
  62. public $id_producer;
  63. public $option_user_producer;
  64. public $cgv;
  65. public $code;
  66. public $type;
  67. // public $free_price ;
  68. public $id_tax_rate_default;
  69. public $verifyCode;
  70. public $is_test;
  71. public $newsletter = false;
  72. public $newsletter_souke = false;
  73. public $sponsored_by = false;
  74. /**
  75. * @inheritdoc
  76. */
  77. public function rules()
  78. {
  79. return [
  80. ['email', 'filter', 'filter' => 'trim'],
  81. ['email', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  82. return !$model->signup_producer_only;
  83. }],
  84. ['email', 'email'],
  85. ['email', function ($attribute, $params) {
  86. $email = $this->$attribute;
  87. $userExist = User::searchOne([
  88. 'type' => 'individual',
  89. 'email' => $email
  90. ]);
  91. if ($userExist) {
  92. $this->addError($attribute, 'Cet email est déjà utilisé.');
  93. }
  94. }],
  95. [['name', 'lastname', 'phone'], 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  96. return !$model->signup_producer_only;
  97. }],
  98. [['name', 'lastname', 'phone', 'option_user_producer'], 'string', 'min' => 2, 'max' => 255],
  99. ['password', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  100. return !$model->signup_producer_only;
  101. }],
  102. ['password', 'string', 'min' => 6, 'tooShort' => 'Votre mot de passe doit contenir au moins 6 caractères'],
  103. [['is_producer', 'newsletter', 'newsletter_souke'], 'boolean'],
  104. ['cgv', 'boolean'],
  105. ['cgv', function ($attribute, $params) {
  106. $cgv = $this->$attribute;
  107. if ($this->option_user_producer == 'producer' && !$cgv) {
  108. $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
  109. }
  110. }],
  111. ['postcode', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  112. return $model->option_user_producer == 'producer';
  113. }],
  114. ['id_tax_rate_default', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  115. return $model->option_user_producer == 'producer';
  116. }],
  117. ['city', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  118. return $model->option_user_producer == 'producer';
  119. }],
  120. [['name_producer', 'type', 'siret', 'is_test'], 'string'],
  121. ['name_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  122. return $model->option_user_producer == 'producer';
  123. }],
  124. ['type', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  125. return $model->option_user_producer == 'producer';
  126. }],
  127. ['siret', function ($attribute, $params) {
  128. $siret = $this->$attribute;
  129. $siret = str_replace(' ', '', $siret);
  130. if (strlen($siret) != 14) {
  131. $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
  132. return;
  133. }
  134. if (!is_numeric($siret)) {
  135. $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
  136. return;
  137. }
  138. // on prend chaque chiffre un par un
  139. // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
  140. // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
  141. // on ajoute cette valeur à la somme totale
  142. $sum = 0;
  143. for ($index = 0; $index < 14; $index++) {
  144. $number = (int)$siret[$index];
  145. if (($index % 2) == 0) {
  146. if (($number *= 2) > 9)
  147. $number -= 9;
  148. }
  149. $sum += $number;
  150. }
  151. // le numéro est valide si la somme des chiffres est multiple de 10
  152. if (($sum % 10) != 0)
  153. $this->addError($attribute, 'Numéro SIRET invalide');
  154. }],
  155. ['id_producer', 'integer'],
  156. ['id_producer', function ($attribute, $params) {
  157. if ($this->id_producer) {
  158. $producer = Producer::findOne($this->id_producer);
  159. if (!$producer) {
  160. $this->addError($attribute, 'Ce producteur n\'existe pas.');
  161. }
  162. }
  163. }],
  164. ['id_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  165. return $this->option_user_producer == 'user';
  166. }],
  167. ['sponsored_by', 'safe'],
  168. ['code', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  169. $producer = Producer::findOne($this->id_producer);
  170. if ($producer) {
  171. return strlen($producer->code);
  172. } else {
  173. return false;
  174. }
  175. }],
  176. ['code', function ($attribute, $params) {
  177. $code = $this->$attribute;
  178. $producer = Producer::findOne($this->id_producer);
  179. if ($producer && strtolower(trim($code)) != strtolower(trim($producer->code))) {
  180. $this->addError($attribute, 'Code incorrect');
  181. }
  182. }],
  183. //['free_price', 'number'],
  184. ['id_tax_rate_default', 'exist',
  185. 'targetClass' => TaxRate::className(),
  186. 'targetAttribute' => ['id_tax_rate_default' => 'id']],
  187. ['verifyCode', 'captcha', 'message' => 'Veuillez recopier le code de vérification', 'when' => function($model) {
  188. return $model->is_test != 'isTest';
  189. }],
  190. ];
  191. }
  192. public function attributeLabels()
  193. {
  194. return [
  195. 'id' => 'ID',
  196. 'username' => 'Identifiant',
  197. 'password' => 'Mot de passe',
  198. 'rememberMe' => 'Se souvenir de moi',
  199. 'name' => 'Prénom',
  200. 'lastname' => 'Nom',
  201. 'phone' => 'Téléphone',
  202. 'is_producer' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
  203. 'name_producer' => 'Nom de votre structure',
  204. 'siret' => 'Numéro SIRET',
  205. 'postcode' => 'Code postal',
  206. 'city' => 'Commune',
  207. 'id_producer' => 'Producteur',
  208. 'type' => 'Type de producteur',
  209. 'id_tax_rate_default' => 'TVA par défaut',
  210. 'verifyCode' => 'Code de vérification',
  211. 'newsletter' => "S'abonner à l'infolettre de ce producteur",
  212. 'newsletter_souke' => "S'abonner à l'infolettre de Souke",
  213. ];
  214. }
  215. /**
  216. * Signs user up.
  217. *
  218. * @return User|null the saved model or null if saving fails
  219. */
  220. public function signup($user = null)
  221. {
  222. $userGroupModule = UserGroupModule::getInstance();
  223. $userModule = UserModule::getInstance();
  224. $producerModule = \Yii::$app->logic->getProducerModule();
  225. if ($this->validate()) {
  226. $sendEmailSignup = false;
  227. if(!$user) {
  228. $sendEmailSignup = true;
  229. $user = $userModule->instanciateUser(User::TYPE_INDIVIDUAL);
  230. $this->populateUser($user);
  231. }
  232. if ($this->isProducer()) {
  233. $producer = $this->processFormProducer($user);
  234. $idProducer = $producer->id;
  235. } else {
  236. $idProducer = $this->id_producer;
  237. }
  238. $producer = $producerModule->findOneProducerById($idProducer);
  239. if ($user->save() && $producer) {
  240. \Yii::$app->logic->setProducerContext($producer);
  241. if(!$this->isProducer()) {
  242. if($producer->id_user_group_default) {
  243. $userGroupDefault = $userGroupModule->getRepository()->findOneUserGroupById($producer->id_user_group_default);
  244. $userModule->getBuilder()->addUserGroup($user, $userGroupDefault);
  245. }
  246. }
  247. $producerModule->addUser($user, $producer, true, $this->newsletter);
  248. if($sendEmailSignup) {
  249. $userModule->sendEmailSignup($user, $producer);
  250. }
  251. return $user;
  252. }
  253. }
  254. return null;
  255. }
  256. public function isCustomer()
  257. {
  258. return $this->option_user_producer == 'user';
  259. }
  260. public function isProducer()
  261. {
  262. return $this->option_user_producer == 'producer';
  263. }
  264. public function processFormProducer($user)
  265. {
  266. $userModule = UserModule::getInstance();
  267. $producerModule = ProducerModule::getInstance();
  268. // Création du producteur
  269. $producer = $producerModule->instanciateProducer();
  270. $this->populateProducer($producer);
  271. $producerModule->initProducer($producer);
  272. $producer->save();
  273. // Parrainage
  274. if($this->sponsored_by) {
  275. $sponsorshipProducerSponsor = $producerModule->getRepository()->findOneProducerById($this->sponsored_by);
  276. if($sponsorshipProducerSponsor) {
  277. $producer->sponsored_by = $this->sponsored_by;
  278. $producer->save();
  279. }
  280. }
  281. /*
  282. * Envoi d'un email à l'administrateur pour le prévenir
  283. * qu'un nouveau producteur s'est inscrit
  284. */
  285. $producerModule->sendEmailNewProducer($producer);
  286. // Initialisation de l'utilisateur (statut et liaison au producteur)
  287. $userModule->initProducer($user, $producer);
  288. return $producer;
  289. }
  290. public function populateUser($user)
  291. {
  292. $userModule = UserModule::getInstance();
  293. $userModule->initPassword($user, $this->password);
  294. $user->username = $this->email;
  295. $user->email = $this->email;
  296. $user->name = $this->name;
  297. $user->lastname = $this->lastname;
  298. $user->phone = $this->phone;
  299. $user->newsletter_souke = $this->newsletter_souke;
  300. }
  301. public function populateProducer($producer)
  302. {
  303. $producer->name = $this->name_producer;
  304. $producer->type = $this->type;
  305. $producer->siret = $this->siret;
  306. $producer->postcode = $this->postcode;
  307. $producer->city = $this->city;
  308. $producer->id_tax_rate_default = $this->id_tax_rate_default;
  309. }
  310. }