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.

276 lines
10KB

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