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.

259 líneas
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. $etablissement->slug = \common\helpers\Url::slugify($this->nom_magasin) ;
  150. // génération d'un code
  151. do {
  152. $code = Password::generate();
  153. $etablissement->code = $code;
  154. } while (Etablissement::findOne(['code' => $code]));
  155. $etablissement->save();
  156. // user
  157. $user->id_etablissement = $etablissement->id;
  158. $user->status = User::STATUS_BOULANGER;
  159. // envoi d'un email à l'administrateur pour le prévenir
  160. Yii::$app->mailer->compose(
  161. [
  162. 'html' => 'new-boulanger-html',
  163. 'text' => 'new-boulanger-text'
  164. ], [
  165. 'etablissement' => $etablissement
  166. ])
  167. ->setTo(Yii::$app->params['adminEmail'])
  168. ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
  169. ->setSubject('[La boîte à pain] Nouveau producteur')
  170. ->send();
  171. }
  172. $user->setPassword($this->password);
  173. $user->generateAuthKey();
  174. if ($user->save()) {
  175. // on ajoute l'établissement sélectionnée par l'user en favoris
  176. if ($this->option_client_boulanger == 'client') {
  177. if ($this->id_etablissement) {
  178. $etablissement = Etablissement::find()->where(['id' => $this->id_etablissement])->one();
  179. if ($etablissement) {
  180. $etab_user = new UserEtablissement;
  181. $etab_user->id_etablissement = $this->id_etablissement;
  182. $etab_user->id_user = $user->id;
  183. $etab_user->credit = 0;
  184. $etab_user->actif = 1;
  185. $etab_user->save();
  186. // envoi d'un email à l'utilisateur
  187. Yii::$app->mailer->compose(
  188. [
  189. 'html' => 'signup-html',
  190. 'text' => 'signup-text'
  191. ], [
  192. 'user' => $user,
  193. 'etablissement' => $etablissement
  194. ])
  195. ->setTo($user->email)
  196. ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
  197. ->setSubject('[La boîte à pain] Inscription')
  198. ->send();
  199. }
  200. }
  201. }
  202. if ($this->option_client_boulanger == 'boulanger') {
  203. $etab_user = new UserEtablissement;
  204. $etab_user->id_etablissement = $etablissement->id;
  205. $etab_user->id_user = $user->id;
  206. $etab_user->credit = 0;
  207. $etab_user->actif = 1;
  208. $etab_user->save();
  209. }
  210. return $user;
  211. }
  212. }
  213. return null;
  214. }
  215. public function attributeLabels() {
  216. return [
  217. 'id' => 'ID',
  218. 'username' => 'Identifiant',
  219. 'password' => 'Mot de passe',
  220. 'rememberMe' => 'Se souvenir de moi',
  221. 'prenom' => 'Prénom',
  222. 'telephone' => 'Téléphone',
  223. 'is_boulanger' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
  224. 'nom_magasin' => 'Nom de l\'établissement',
  225. 'siret' => 'Numéro SIRET',
  226. 'code_postal' => 'Code postal',
  227. 'ville' => 'Commune',
  228. 'id_etablissement' => 'Producteur',
  229. ];
  230. }
  231. }