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

258 行
11KB

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