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.

326 satır
12KB

  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\forms;
  38. use Yii;
  39. use common\models\UserModel;
  40. use common\models\Producer;
  41. use yii\base\Model;
  42. use common\models\UserProducerModel;
  43. use common\helpers\Password;
  44. /**
  45. * Signup form
  46. */
  47. class SignupForm extends Model
  48. {
  49. public $username;
  50. public $email;
  51. public $password;
  52. public $name;
  53. public $lastname;
  54. public $phone;
  55. public $is_producer;
  56. public $siret;
  57. public $name_producer;
  58. public $postcode;
  59. public $city;
  60. public $id_producer;
  61. public $option_user_producer;
  62. public $cgv;
  63. public $code;
  64. public $type;
  65. // public $free_price ;
  66. public $id_tax_rate_default;
  67. public $verifyCode;
  68. /**
  69. * @inheritdoc
  70. */
  71. public function rules()
  72. {
  73. return [
  74. ['email', 'filter', 'filter' => 'trim'],
  75. ['email', 'required', 'message' => 'Champs obligatoire'],
  76. ['email', 'email'],
  77. ['email', function ($attribute, $params) {
  78. $email = $this->$attribute;
  79. $userExist = UserModel::searchOne([
  80. 'type' => 'individual',
  81. 'email' => $email
  82. ]);
  83. if ($userExist) {
  84. $this->addError($attribute, 'Cet email est déjà utilisé.');
  85. }
  86. }],
  87. //['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Cet email est déjà utilisé'],
  88. [['name', 'lastname', 'phone'], 'required', 'message' => 'Champs obligatoire'],
  89. [['name', 'lastname', 'phone', 'option_user_producer'], 'string', 'min' => 2, 'max' => 255],
  90. ['password', 'required', 'message' => 'Champs obligatoire'],
  91. ['password', 'string', 'min' => 6, 'tooShort' => 'Votre mot de passe doit contenir au moins 6 caractères'],
  92. ['is_producer', 'boolean'],
  93. ['cgv', 'boolean'],
  94. ['cgv', function ($attribute, $params) {
  95. $cgv = $this->$attribute;
  96. if ($this->option_user_producer == 'producer' && !$cgv) {
  97. $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
  98. }
  99. }],
  100. ['postcode', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  101. return $model->option_user_producer == 'producer';
  102. }, 'whenClient' => "function (attribute, value) {
  103. return $('#option-producer').prop('checked') ;
  104. }"],
  105. ['id_tax_rate_default', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  106. return $model->option_user_producer == 'producer';
  107. }, 'whenClient' => "function (attribute, value) {
  108. return $('#option-producer').prop('checked') ;
  109. }"],
  110. ['city', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  111. return $model->option_user_producer == 'producer';
  112. }, 'whenClient' => "function (attribute, value) {
  113. return $('#option-producer').prop('checked') ;
  114. }"],
  115. ['name_producer', 'string'],
  116. ['name_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  117. return $model->option_user_producer == 'producer';
  118. }, 'whenClient' => "function (attribute, value) {
  119. return $('#option-producer').prop('checked') ;
  120. }"],
  121. ['type', 'string'],
  122. ['type', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  123. return $model->option_user_producer == 'producer';
  124. }, 'whenClient' => "function (attribute, value) {
  125. return $('#option-producer').prop('checked') ;
  126. }"],
  127. ['siret', 'string'],
  128. ['siret', function ($attribute, $params) {
  129. $siret = $this->$attribute;
  130. $siret = str_replace(' ', '', $siret);
  131. if (strlen($siret) != 14) {
  132. $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
  133. return;
  134. }
  135. if (!is_numeric($siret)) {
  136. $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
  137. return;
  138. }
  139. // on prend chaque chiffre un par un
  140. // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
  141. // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
  142. // on ajoute cette valeur à la somme totale
  143. $sum = 0;
  144. for ($index = 0; $index < 14; $index++) {
  145. $number = (int)$siret[$index];
  146. if (($index % 2) == 0) {
  147. if (($number *= 2) > 9)
  148. $number -= 9;
  149. }
  150. $sum += $number;
  151. }
  152. // le numéro est valide si la somme des chiffres est multiple de 10
  153. if (($sum % 10) != 0)
  154. $this->addError($attribute, 'Numéro SIRET invalide');
  155. }],
  156. ['id_producer', 'integer'],
  157. ['id_producer', function ($attribute, $params) {
  158. if ($this->id_producer) {
  159. $producer = Producer::findOne($this->id_producer);
  160. if (!$producer) {
  161. $this->addError($attribute, 'Ce producteur n\'existe pas.');
  162. }
  163. }
  164. }],
  165. ['id_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  166. return $this->option_user_producer == 'user';
  167. }],
  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'],
  188. ];
  189. }
  190. public function attributeLabels()
  191. {
  192. return [
  193. 'id' => 'ID',
  194. 'username' => 'Identifiant',
  195. 'password' => 'Mot de passe',
  196. 'rememberMe' => 'Se souvenir de moi',
  197. 'name' => 'Prénom',
  198. 'lastname' => 'Nom',
  199. 'phone' => 'Téléphone',
  200. 'is_producer' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
  201. 'name_producer' => 'Nom de votre structure',
  202. 'siret' => 'Numéro SIRET',
  203. 'postcode' => 'Code postal',
  204. 'city' => 'Commune',
  205. 'id_producer' => 'Producteur',
  206. 'type' => 'Type de producteur',
  207. // 'free_price' => 'Prix libre',
  208. 'id_tax_rate_default' => 'TVA par défaut',
  209. 'verifyCode' => 'Code de vérification',
  210. ];
  211. }
  212. /**
  213. * Signs user up.
  214. *
  215. * @return UserModel|null the saved model or null if saving fails
  216. */
  217. public function signup()
  218. {
  219. $userContainer = \Yii::$app->logic->getUserContainer();
  220. $producerContainer = \Yii::$app->logic->getProducerContainer();
  221. if ($this->validate()) {
  222. $user = $userContainer->getService()->createInstance();
  223. $this->populateUser($user);
  224. if ($this->isProducer()) {
  225. $producer = $this->processFormProducer($user);
  226. $idProducer = $producer->id;
  227. } else {
  228. $idProducer = $this->id_producer;
  229. }
  230. $producer = $producerContainer->getRepository()->getOneById($idProducer);
  231. if ($user->save() && $producer) {
  232. // Liaison User / Producer
  233. $producerContainer->getService()->addUser($user->id, $idProducer);
  234. // Envoi d'un email de bienvenue à l'utilisateur
  235. if ($this->isCustomer()) {
  236. $userContainer->getService()->sendEmailSignup($user, $producer);
  237. }
  238. return $user;
  239. }
  240. }
  241. return null;
  242. }
  243. public function isCustomer()
  244. {
  245. return $this->option_user_producer == 'user';
  246. }
  247. public function isProducer()
  248. {
  249. return $this->option_user_producer == 'producer';
  250. }
  251. public function processFormProducer($user)
  252. {
  253. $userContainer = \Yii::$app->logic->getUserContainer();
  254. $producerContainer = \Yii::$app->logic->getProducerContainer();
  255. // Création du producteur
  256. $producer = $producerContainer->getService()->createInstance();
  257. $this->populateProducer($producer);
  258. $producerContainer->getService()->init($producer);
  259. $producer->save();
  260. /*
  261. * Envoi d'un email à l'administrateur pour le prévenir
  262. * qu'un nouveau producteur s'est inscrit
  263. */
  264. $producerContainer->getService()->sendEmailNewProducer($producer);
  265. // Initialisation de l'utilisateur (statut et liaison au producteur)
  266. $userContainer->getService()->initProducer($user, $producer);
  267. return $producer;
  268. }
  269. public function populateUser($user)
  270. {
  271. $userContainer = \Yii::$app->logic->getUserContainer();
  272. $user->username = $this->email;
  273. $user->email = $this->email;
  274. $user->name = $this->name;
  275. $user->lastname = $this->lastname;
  276. $user->phone = $this->phone;
  277. $userContainer->getService()->initPassword($user, $this->password);
  278. }
  279. public function populateProducer($producer)
  280. {
  281. $producer->name = $this->name_producer;
  282. $producer->type = $this->type;
  283. $producer->siret = $this->siret;
  284. $producer->postcode = $this->postcode;
  285. $producer->city = $this->city;
  286. $producer->id_tax_rate_default = $this->id_tax_rate_default;
  287. }
  288. }