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

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