Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

245 lines
8.8KB

  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. /**
  9. * Signup form
  10. */
  11. class SignupForm extends Model
  12. {
  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. {
  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. ['id_etablissement', 'integer'],
  44. ['code', 'string'],
  45. ['cgv', 'boolean'],
  46. ['cgv', function($attribute, $params) {
  47. $cgv = $this->$attribute ;
  48. if($this->option_client_boulanger == 'boulanger' && !$cgv)
  49. {
  50. $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
  51. }
  52. }],
  53. ['code_postal', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  54. return $model->option_client_boulanger == 'boulanger' ;
  55. },'whenClient' => "function (attribute, value) {
  56. return $('#option-boulanger').prop('checked') ;
  57. }"],
  58. ['ville', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  59. return $model->option_client_boulanger == 'boulanger' ;
  60. },'whenClient' => "function (attribute, value) {
  61. return $('#option-boulanger').prop('checked') ;
  62. }"],
  63. ['nom_magasin', 'string'],
  64. ['nom_magasin', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  65. return $model->option_client_boulanger == 'boulanger' ;
  66. },'whenClient' => "function (attribute, value) {
  67. return $('#option-boulanger').prop('checked') ;
  68. }"],
  69. ['siret', 'string'],
  70. ['siret', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  71. return $model->option_client_boulanger == 'boulanger' ;
  72. },'whenClient' => "function (attribute, value) {
  73. return $('#option-boulanger').prop('checked') ;
  74. }"],
  75. ['siret', function($attribute, $params) {
  76. $siret = $this->$attribute ;
  77. $siret = str_replace(' ', '', $siret) ;
  78. if (strlen($siret) != 14)
  79. {
  80. $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
  81. return;
  82. }
  83. if (!is_numeric($siret))
  84. {
  85. $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
  86. return;
  87. }
  88. // on prend chaque chiffre un par un
  89. // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
  90. // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
  91. // on ajoute cette valeur à la somme totale
  92. $sum = 0 ;
  93. for ($index = 0; $index < 14; $index ++)
  94. {
  95. $number = (int) $siret[$index];
  96. if (($index % 2) == 0) { if (($number *= 2) > 9) $number -= 9; }
  97. $sum += $number;
  98. }
  99. // le numéro est valide si la somme des chiffres est multiple de 10
  100. if (($sum % 10) != 0)
  101. $this->addError($attribute, 'Numéro SIRET invalide');
  102. }],
  103. ];
  104. }
  105. /**
  106. * Signs user up.
  107. *
  108. * @return User|null the saved model or null if saving fails
  109. */
  110. public function signup()
  111. {
  112. if ($this->validate()) {
  113. $user = new User();
  114. $user->username = $this->email;
  115. $user->email = $this->email;
  116. $user->nom = $this->nom ;
  117. $user->prenom = $this->prenom ;
  118. $user->telephone = $this->telephone ;
  119. $user->confiance = 1 ;
  120. if($this->option_client_boulanger == 'boulanger')
  121. {
  122. // etablissement
  123. $etablissement = new Etablissement ;
  124. $etablissement->nom = $this->nom_magasin ;
  125. $etablissement->siret = $this->siret;
  126. $etablissement->code_postal = $this->code_postal;
  127. $etablissement->ville = $this->ville;
  128. // génération d'un code
  129. do {
  130. $chaine = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789' ;
  131. $nb = strlen($chaine) - 1;
  132. $code = '';
  133. for($i=0; $i < 6; $i++)
  134. {
  135. $pos = mt_rand(0, $nb);
  136. $car = $chaine[$pos];
  137. $code .= $car;
  138. }
  139. $etablissement->code = $code ;
  140. } while(Etablissement::findOne(['code' => $code]));
  141. $etablissement->save() ;
  142. // user
  143. $user->id_etablissement = $etablissement->id ;
  144. $user->status = User::STATUS_BOULANGER ;
  145. }
  146. $user->setPassword($this->password);
  147. $user->generateAuthKey();
  148. if ($user->save()) {
  149. // envoi d'un mail de confirmation
  150. /*$message = "Bonjour,
  151. Votre inscription sur le site de la boîte à pain a bien été prise en compte !
  152. Ce compte vous permet de passer vos commandes directement sur le site internet.
  153. Si vous avez des questions, n'hésitez pas à me contacter.
  154. À bientôt,
  155. Guillaume" ;
  156. Yii::$app->mailer->compose()
  157. ->setTo($user->email)
  158. ->setFrom(['contact@laboiteapain.net' => 'Guillaume Bourgeois'])
  159. ->setSubject("Votre inscription sur la boîte à pain")
  160. ->setTextBody($message)
  161. ->send();*/
  162. // on ajoute la boulangerie sélectionnée par l'user en favoris
  163. if($this->option_client_boulanger == 'client')
  164. {
  165. if($this->id_etablissement)
  166. {
  167. $etablissement = Etablissement::find()->where(['id'=>$this->id_etablissement])->one() ;
  168. if($etablissement)
  169. {
  170. $etab_user = new UserEtablissement ;
  171. $etab_user->id_etablissement = $this->id_etablissement ;
  172. $etab_user->id_user = $user->id ;
  173. $etab_user->save() ;
  174. }
  175. }
  176. }
  177. if($this->option_client_boulanger == 'boulanger')
  178. {
  179. $etab_user = new UserEtablissement ;
  180. $etab_user->id_etablissement = $etablissement->id ;
  181. $etab_user->id_user = $user->id ;
  182. $etab_user->save() ;
  183. }
  184. return $user;
  185. }
  186. }
  187. return null;
  188. }
  189. public function attributeLabels()
  190. {
  191. return [
  192. 'id' => 'ID',
  193. 'username' => 'Identifiant',
  194. 'password' => 'Mot de passe',
  195. 'rememberMe' => 'Se souvenir de moi',
  196. 'prenom' => 'Prénom',
  197. 'telephone' => 'Téléphone',
  198. 'is_boulanger' => "Je suis professionnel et souhaite mettre en place un système de réservation de pain dans ma boulangerie",
  199. 'nom_magasin' => 'Nom de la boulangerie',
  200. 'siret' => 'Numéro SIRET',
  201. 'code_postal' => 'Code postal',
  202. 'ville' => 'Commune',
  203. 'id_etablissement' => 'Ma boulangerie',
  204. ];
  205. }
  206. }