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.

278 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. $etablissement->heure_limite_commande = 20 ;
  156. $etablissement->gratuit = 1 ;
  157. // génération d'un code
  158. do {
  159. $chaine = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789' ;
  160. $nb = strlen($chaine) - 1;
  161. $code = '';
  162. for($i=0; $i < 6; $i++)
  163. {
  164. $pos = mt_rand(0, $nb);
  165. $car = $chaine[$pos];
  166. $code .= $car;
  167. }
  168. $etablissement->code = $code ;
  169. } while(Etablissement::findOne(['code' => $code]));
  170. $etablissement->save() ;
  171. // user
  172. $user->id_etablissement = $etablissement->id ;
  173. $user->status = User::STATUS_BOULANGER ;
  174. }
  175. $user->setPassword($this->password);
  176. $user->generateAuthKey();
  177. if ($user->save()) {
  178. // envoi d'un mail de confirmation
  179. /*$message = "Bonjour,
  180. Votre inscription sur le site de la boîte à pain a bien été prise en compte !
  181. Ce compte vous permet de passer vos commandes directement sur le site internet.
  182. Si vous avez des questions, n'hésitez pas à me contacter.
  183. À bientôt,
  184. Guillaume" ;
  185. Yii::$app->mailer->compose()
  186. ->setTo($user->email)
  187. ->setFrom(['contact@laboiteapain.net' => 'Guillaume Bourgeois'])
  188. ->setSubject("Votre inscription sur la boîte à pain")
  189. ->setTextBody($message)
  190. ->send();*/
  191. // on ajoute la boulangerie sélectionnée par l'user en favoris
  192. if($this->option_client_boulanger == 'client')
  193. {
  194. if($this->id_etablissement)
  195. {
  196. $etablissement = Etablissement::find()->where(['id'=>$this->id_etablissement])->one() ;
  197. if($etablissement)
  198. {
  199. $etab_user = new UserEtablissement ;
  200. $etab_user->id_etablissement = $this->id_etablissement ;
  201. $etab_user->id_user = $user->id ;
  202. $etab_user->save() ;
  203. }
  204. }
  205. }
  206. if($this->option_client_boulanger == 'boulanger')
  207. {
  208. $etab_user = new UserEtablissement ;
  209. $etab_user->id_etablissement = $etablissement->id ;
  210. $etab_user->id_user = $user->id ;
  211. $etab_user->save() ;
  212. }
  213. return $user;
  214. }
  215. }
  216. return null;
  217. }
  218. public function attributeLabels()
  219. {
  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 de pain dans ma boulangerie",
  228. 'nom_magasin' => 'Nom de la boulangerie',
  229. 'siret' => 'Numéro SIRET',
  230. 'code_postal' => 'Code postal',
  231. 'ville' => 'Commune',
  232. 'id_etablissement' => 'Ma boulangerie',
  233. ];
  234. }
  235. }