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.

SignupForm.php 11KB

8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
8 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <?php
  2. namespace frontend\models;
  3. use Yii;
  4. use common\models\User;
  5. use common\models\Etablissement;
  6. use yii\base\Model;
  7. use common\models\UserEtablissement;
  8. use common\helpers\Password;
  9. /**
  10. * Signup form
  11. */
  12. class SignupForm extends Model {
  13. public $username;
  14. public $email;
  15. public $password;
  16. public $nom;
  17. public $prenom;
  18. public $telephone;
  19. public $is_boulanger;
  20. public $siret;
  21. public $nom_magasin;
  22. public $code_postal;
  23. public $ville;
  24. public $id_etablissement;
  25. public $option_client_boulanger;
  26. public $cgv;
  27. public $code;
  28. public $type;
  29. /**
  30. * @inheritdoc
  31. */
  32. public function rules() {
  33. return [
  34. ['email', 'filter', 'filter' => 'trim'],
  35. ['email', 'required', 'message' => 'Champs obligatoire'],
  36. ['email', 'email'],
  37. ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Cet email est déjà utilisé'],
  38. [['nom', 'prenom', 'telephone'], 'required', 'message' => 'Champs obligatoire'],
  39. [['nom', 'prenom', 'telephone', 'option_client_boulanger'], 'string', 'min' => 2, 'max' => 255],
  40. ['password', 'required', 'message' => 'Champs obligatoire'],
  41. ['password', 'string', 'min' => 6, 'tooShort' => 'Votre mot de passe doit contenir au moins 6 caractères'],
  42. ['is_boulanger', 'boolean'],
  43. ['cgv', 'boolean'],
  44. ['cgv', function($attribute, $params) {
  45. $cgv = $this->$attribute;
  46. if ($this->option_client_boulanger == 'boulanger' && !$cgv) {
  47. $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
  48. }
  49. }],
  50. ['code_postal', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  51. return $model->option_client_boulanger == 'boulanger';
  52. }, 'whenClient' => "function (attribute, value) {
  53. return $('#option-boulanger').prop('checked') ;
  54. }"],
  55. ['ville', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  56. return $model->option_client_boulanger == 'boulanger';
  57. }, 'whenClient' => "function (attribute, value) {
  58. return $('#option-boulanger').prop('checked') ;
  59. }"],
  60. ['nom_magasin', 'string'],
  61. ['nom_magasin', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  62. return $model->option_client_boulanger == 'boulanger';
  63. }, 'whenClient' => "function (attribute, value) {
  64. return $('#option-boulanger').prop('checked') ;
  65. }"],
  66. ['type', 'string'],
  67. ['type', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  68. return $model->option_client_boulanger == 'boulanger';
  69. }, 'whenClient' => "function (attribute, value) {
  70. return $('#option-boulanger').prop('checked') ;
  71. }"],
  72. ['siret', 'string'],
  73. ['siret', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  74. return $model->option_client_boulanger == 'boulanger';
  75. }, 'whenClient' => "function (attribute, value) {
  76. return $('#option-boulanger').prop('checked') ;
  77. }"],
  78. ['siret', function($attribute, $params) {
  79. $siret = $this->$attribute;
  80. $siret = str_replace(' ', '', $siret);
  81. if (strlen($siret) != 14) {
  82. $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
  83. return;
  84. }
  85. if (!is_numeric($siret)) {
  86. $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
  87. return;
  88. }
  89. // on prend chaque chiffre un par un
  90. // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
  91. // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
  92. // on ajoute cette valeur à la somme totale
  93. $sum = 0;
  94. for ($index = 0; $index < 14; $index ++) {
  95. $number = (int) $siret[$index];
  96. if (($index % 2) == 0) {
  97. if (($number *= 2) > 9)
  98. $number -= 9;
  99. }
  100. $sum += $number;
  101. }
  102. // le numéro est valide si la somme des chiffres est multiple de 10
  103. if (($sum % 10) != 0)
  104. $this->addError($attribute, 'Numéro SIRET invalide');
  105. }],
  106. ['id_etablissement', 'integer'],
  107. ['id_etablissement', function($attribute, $params) {
  108. if ($this->id_etablissement) {
  109. $etablissement = Etablissement::findOne($this->id_etablissement);
  110. if (!$etablissement) {
  111. $this->addError($attribute, 'Ce producteur n\'existe pas.');
  112. }
  113. }
  114. }],
  115. ['code', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  116. $etablissement = Etablissement::findOne($this->id_etablissement);
  117. if ($etablissement) {
  118. return strlen($etablissement->code);
  119. } else {
  120. return false;
  121. }
  122. }],
  123. ['code', function($attribute, $params) {
  124. $code = $this->$attribute;
  125. $etablissement = Etablissement::findOne($this->id_etablissement);
  126. if ($etablissement && strtolower(trim($code)) != strtolower(trim($etablissement->code))) {
  127. $this->addError($attribute, 'Code incorrect');
  128. }
  129. }],
  130. ];
  131. }
  132. /**
  133. * Signs user up.
  134. *
  135. * @return User|null the saved model or null if saving fails
  136. */
  137. public function signup() {
  138. if ($this->validate()) {
  139. $user = new User();
  140. $user->username = $this->email;
  141. $user->email = $this->email;
  142. $user->nom = $this->nom;
  143. $user->prenom = $this->prenom;
  144. $user->telephone = $this->telephone;
  145. $user->confiance = 1;
  146. if ($this->option_client_boulanger == 'boulanger') {
  147. // etablissement
  148. $etablissement = new Etablissement;
  149. $etablissement->nom = $this->nom_magasin;
  150. $etablissement->type = $this->type;
  151. $etablissement->siret = $this->siret;
  152. $etablissement->code_postal = $this->code_postal;
  153. $etablissement->ville = $this->ville;
  154. $etablissement->heure_limite_commande = 20;
  155. $etablissement->delai_commande = 1;
  156. $etablissement->gratuit = 1;
  157. $etablissement->slug = \common\helpers\Url::slugify($this->nom_magasin) ;
  158. // génération d'un code
  159. do {
  160. $code = Password::generate();
  161. $etablissement->code = $code;
  162. } while (Etablissement::findOne(['code' => $code]));
  163. $etablissement->save();
  164. // user
  165. $user->id_etablissement = $etablissement->id;
  166. $user->status = User::STATUS_BOULANGER;
  167. // envoi d'un email à l'administrateur pour le prévenir
  168. Yii::$app->mailer->compose(
  169. [
  170. 'html' => 'new-boulanger-html',
  171. 'text' => 'new-boulanger-text'
  172. ], [
  173. 'etablissement' => $etablissement
  174. ])
  175. ->setTo(Yii::$app->params['adminEmail'])
  176. ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
  177. ->setSubject('[La boîte à pain] Nouveau producteur')
  178. ->send();
  179. }
  180. $user->setPassword($this->password);
  181. $user->generateAuthKey();
  182. if ($user->save()) {
  183. // on ajoute l'établissement sélectionnée par l'user en favoris
  184. if ($this->option_client_boulanger == 'client') {
  185. if ($this->id_etablissement) {
  186. $etablissement = Etablissement::find()->where(['id' => $this->id_etablissement])->one();
  187. if ($etablissement) {
  188. Etablissement::addUser($user->id, $this->id_etablissement) ;
  189. // envoi d'un email à l'utilisateur
  190. Yii::$app->mailer->compose(
  191. [
  192. 'html' => 'signup-html',
  193. 'text' => 'signup-text'
  194. ],
  195. [
  196. 'user' => $user,
  197. 'etablissement' => $etablissement
  198. ])
  199. ->setTo($user->email)
  200. ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
  201. ->setSubject('[La boîte à pain] Inscription')
  202. ->send();
  203. }
  204. }
  205. }
  206. if ($this->option_client_boulanger == 'boulanger') {
  207. $etab_user = new UserEtablissement;
  208. $etab_user->id_etablissement = $etablissement->id;
  209. $etab_user->id_user = $user->id;
  210. $etab_user->credit = 0;
  211. $etab_user->actif = 1;
  212. $etab_user->save();
  213. }
  214. return $user;
  215. }
  216. }
  217. return null;
  218. }
  219. public function attributeLabels() {
  220. return [
  221. 'id' => 'ID',
  222. 'username' => 'Identifiant',
  223. 'password' => 'Mot de passe',
  224. 'rememberMe' => 'Se souvenir de moi',
  225. 'prenom' => 'Prénom',
  226. 'telephone' => 'Téléphone',
  227. 'is_boulanger' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
  228. 'nom_magasin' => 'Nom de l\'établissement',
  229. 'siret' => 'Numéro SIRET',
  230. 'code_postal' => 'Code postal',
  231. 'ville' => 'Commune',
  232. 'id_etablissement' => 'Producteur',
  233. 'type' => 'Type d\'établissement',
  234. ];
  235. }
  236. }