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.

288 line
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. {
  14. public $username;
  15. public $email;
  16. public $password;
  17. public $nom;
  18. public $prenom;
  19. public $telephone;
  20. public $is_boulanger;
  21. public $siret;
  22. public $nom_magasin;
  23. public $code_postal;
  24. public $ville;
  25. public $id_etablissement ;
  26. public $option_client_boulanger ;
  27. public $cgv ;
  28. public $code ;
  29. /**
  30. * @inheritdoc
  31. */
  32. public function rules()
  33. {
  34. return [
  35. ['email', 'filter', 'filter' => 'trim'],
  36. ['email', 'required','message'=>'Champs obligatoire'],
  37. ['email', 'email'],
  38. ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'Cet email est déjà utilisé'],
  39. [['nom', 'prenom', 'telephone'],'required','message'=>'Champs obligatoire'],
  40. [['nom', 'prenom', 'telephone', 'option_client_boulanger'], 'string', 'min' => 2, 'max' => 255],
  41. ['password', 'required','message'=>'Champs obligatoire'],
  42. ['password', 'string', 'min' => 6, 'tooShort' => 'Votre mot de passe doit contenir au moins 6 caractères'],
  43. ['is_boulanger', 'boolean'],
  44. ['cgv', 'boolean'],
  45. ['cgv', function($attribute, $params) {
  46. $cgv = $this->$attribute ;
  47. if($this->option_client_boulanger == 'boulanger' && !$cgv)
  48. {
  49. $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
  50. }
  51. }],
  52. ['code_postal', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  53. return $model->option_client_boulanger == 'boulanger' ;
  54. },'whenClient' => "function (attribute, value) {
  55. return $('#option-boulanger').prop('checked') ;
  56. }"],
  57. ['ville', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  58. return $model->option_client_boulanger == 'boulanger' ;
  59. },'whenClient' => "function (attribute, value) {
  60. return $('#option-boulanger').prop('checked') ;
  61. }"],
  62. ['nom_magasin', 'string'],
  63. ['nom_magasin', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  64. return $model->option_client_boulanger == 'boulanger' ;
  65. },'whenClient' => "function (attribute, value) {
  66. return $('#option-boulanger').prop('checked') ;
  67. }"],
  68. ['siret', 'string'],
  69. ['siret', 'required','message'=>'Champs obligatoire', 'when' => function($model) {
  70. return $model->option_client_boulanger == 'boulanger' ;
  71. },'whenClient' => "function (attribute, value) {
  72. return $('#option-boulanger').prop('checked') ;
  73. }"],
  74. ['siret', function($attribute, $params) {
  75. $siret = $this->$attribute ;
  76. $siret = str_replace(' ', '', $siret) ;
  77. if (strlen($siret) != 14)
  78. {
  79. $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
  80. return;
  81. }
  82. if (!is_numeric($siret))
  83. {
  84. $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
  85. return;
  86. }
  87. // on prend chaque chiffre un par un
  88. // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
  89. // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
  90. // on ajoute cette valeur à la somme totale
  91. $sum = 0 ;
  92. for ($index = 0; $index < 14; $index ++)
  93. {
  94. $number = (int) $siret[$index];
  95. if (($index % 2) == 0) { if (($number *= 2) > 9) $number -= 9; }
  96. $sum += $number;
  97. }
  98. // le numéro est valide si la somme des chiffres est multiple de 10
  99. if (($sum % 10) != 0)
  100. $this->addError($attribute, 'Numéro SIRET invalide');
  101. }],
  102. ['id_etablissement','integer'],
  103. ['id_etablissement', function($attribute, $params) {
  104. if($this->id_etablissement)
  105. {
  106. $etablissement = Etablissement::findOne($this->id_etablissement) ;
  107. if(!$etablissement)
  108. {
  109. $this->addError($attribute, 'Ce producteur n\'existe pas.') ;
  110. }
  111. }
  112. }],
  113. ['code', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
  114. $etablissement = Etablissement::findOne($this->id_etablissement) ;
  115. if($etablissement)
  116. {
  117. return strlen($etablissement->code) ;
  118. }
  119. else {
  120. return false ;
  121. }
  122. }],
  123. ['code', function($attribute, $params) {
  124. $code = $this->$attribute ;
  125. $etablissement = Etablissement::findOne($this->id_etablissement) ;
  126. if($etablissement && strtolower(trim($code)) != strtolower(trim($etablissement->code)))
  127. {
  128. $this->addError($attribute, 'Code incorrect');
  129. }
  130. }],
  131. ];
  132. }
  133. /**
  134. * Signs user up.
  135. *
  136. * @return User|null the saved model or null if saving fails
  137. */
  138. public function signup()
  139. {
  140. if ($this->validate()) {
  141. $user = new User();
  142. $user->username = $this->email;
  143. $user->email = $this->email;
  144. $user->nom = $this->nom ;
  145. $user->prenom = $this->prenom ;
  146. $user->telephone = $this->telephone ;
  147. $user->confiance = 1 ;
  148. if($this->option_client_boulanger == 'boulanger')
  149. {
  150. // etablissement
  151. $etablissement = new Etablissement ;
  152. $etablissement->nom = $this->nom_magasin ;
  153. $etablissement->siret = $this->siret;
  154. $etablissement->code_postal = $this->code_postal;
  155. $etablissement->ville = $this->ville;
  156. $etablissement->heure_limite_commande = 20 ;
  157. $etablissement->delai_commande = 1 ;
  158. $etablissement->gratuit = 1 ;
  159. // génération d'un code
  160. do {
  161. $code = Password::generate() ;
  162. $etablissement->code = $code ;
  163. } while(Etablissement::findOne(['code' => $code]));
  164. $etablissement->save() ;
  165. // user
  166. $user->id_etablissement = $etablissement->id ;
  167. $user->status = User::STATUS_BOULANGER ;
  168. // envoi d'un email à l'administrateur pour le prévenir
  169. Yii::$app->mailer->compose(
  170. [
  171. 'html' => 'new-boulanger-html',
  172. 'text' => 'new-boulanger-text'
  173. ],
  174. [
  175. 'etablissement' => $etablissement
  176. ])
  177. ->setTo(Yii::$app->params['adminEmail'])
  178. ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
  179. ->setSubject('[La boîte à pain] Nouveau producteur')
  180. ->send();
  181. }
  182. $user->setPassword($this->password);
  183. $user->generateAuthKey();
  184. if ($user->save()) {
  185. // on ajoute l'établissement sélectionnée par l'user en favoris
  186. if($this->option_client_boulanger == 'client')
  187. {
  188. if($this->id_etablissement)
  189. {
  190. $etablissement = Etablissement::find()->where(['id'=>$this->id_etablissement])->one() ;
  191. if($etablissement)
  192. {
  193. $etab_user = new UserEtablissement ;
  194. $etab_user->id_etablissement = $this->id_etablissement ;
  195. $etab_user->id_user = $user->id ;
  196. $etab_user->credit = 0 ;
  197. $etab_user->actif = 1 ;
  198. $etab_user->save() ;
  199. // envoi d'un email à l'utilisateur
  200. Yii::$app->mailer->compose(
  201. [
  202. 'html' => 'signup-html',
  203. 'text' => 'signup-text'
  204. ],
  205. [
  206. 'user' => $user,
  207. 'etablissement' => $etablissement
  208. ])
  209. ->setTo($user->email)
  210. ->setFrom([Yii::$app->params['adminEmail'] => 'La boîte à pain'])
  211. ->setSubject('[La boîte à pain] Inscription')
  212. ->send();
  213. }
  214. }
  215. }
  216. if($this->option_client_boulanger == 'boulanger')
  217. {
  218. $etab_user = new UserEtablissement ;
  219. $etab_user->id_etablissement = $etablissement->id ;
  220. $etab_user->id_user = $user->id ;
  221. $etab_user->credit = 0 ;
  222. $etab_user->actif = 1 ;
  223. $etab_user->save() ;
  224. }
  225. return $user;
  226. }
  227. }
  228. return null;
  229. }
  230. public function attributeLabels()
  231. {
  232. return [
  233. 'id' => 'ID',
  234. 'username' => 'Identifiant',
  235. 'password' => 'Mot de passe',
  236. 'rememberMe' => 'Se souvenir de moi',
  237. 'prenom' => 'Prénom',
  238. 'telephone' => 'Téléphone',
  239. 'is_boulanger' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
  240. 'nom_magasin' => 'Nom de l\'établissement',
  241. 'siret' => 'Numéro SIRET',
  242. 'code_postal' => 'Code postal',
  243. 'ville' => 'Commune',
  244. 'id_etablissement' => 'Producteur',
  245. ];
  246. }
  247. }