Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
pirms 8 gadiem
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?php
  2. /**
  3. * Copyright distrib (2018)
  4. *
  5. * contact@opendistrib.net
  6. *
  7. * Ce logiciel est un programme informatique servant à aider les producteurs
  8. * à distribuer leur production en circuits courts.
  9. *
  10. * Ce logiciel est régi par la licence CeCILL soumise au droit français et
  11. * respectant les principes de diffusion des logiciels libres. Vous pouvez
  12. * utiliser, modifier et/ou redistribuer ce programme sous les conditions
  13. * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  14. * sur le site "http://www.cecill.info".
  15. *
  16. * En contrepartie de l'accessibilité au code source et des droits de copie,
  17. * de modification et de redistribution accordés par cette licence, il n'est
  18. * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  19. * seule une responsabilité restreinte pèse sur l'auteur du programme, le
  20. * titulaire des droits patrimoniaux et les concédants successifs.
  21. *
  22. * A cet égard l'attention de l'utilisateur est attirée sur les risques
  23. * associés au chargement, à l'utilisation, à la modification et/ou au
  24. * développement et à la reproduction du logiciel par l'utilisateur étant
  25. * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  26. * manipuler et qui le réserve donc à des développeurs et des professionnels
  27. * avertis possédant des connaissances informatiques approfondies. Les
  28. * utilisateurs sont donc invités à charger et tester l'adéquation du
  29. * logiciel à leurs besoins dans des conditions permettant d'assurer la
  30. * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  31. * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  32. *
  33. * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  34. * pris connaissance de la licence CeCILL, et que vous en avez accepté les
  35. * termes.
  36. */
  37. namespace frontend\forms;
  38. use common\logic\Producer\Producer\Producer;
  39. use common\logic\User\User\User;
  40. use common\logic\Config\TaxRate\TaxRate;
  41. use yii\base\Model;
  42. /**
  43. * Signup form
  44. */
  45. class SignupForm extends Model
  46. {
  47. public $username;
  48. public $email;
  49. public $password;
  50. public $name;
  51. public $lastname;
  52. public $phone;
  53. public $is_producer;
  54. public $siret;
  55. public $name_producer;
  56. public $postcode;
  57. public $city;
  58. public $id_producer;
  59. public $option_user_producer;
  60. public $cgv;
  61. public $code;
  62. public $type;
  63. // public $free_price ;
  64. public $id_tax_rate_default;
  65. public $verifyCode;
  66. /**
  67. * @inheritdoc
  68. */
  69. public function rules()
  70. {
  71. return [
  72. ['email', 'filter', 'filter' => 'trim'],
  73. ['email', 'required', 'message' => 'Champs obligatoire'],
  74. ['email', 'email'],
  75. ['email', function ($attribute, $params) {
  76. $email = $this->$attribute;
  77. $userExist = User::searchOne([
  78. 'type' => 'individual',
  79. 'email' => $email
  80. ]);
  81. if ($userExist) {
  82. $this->addError($attribute, 'Cet email est déjà utilisé.');
  83. }
  84. }],
  85. [['name', 'lastname', 'phone'], 'required', 'message' => 'Champs obligatoire'],
  86. [['name', 'lastname', 'phone', 'option_user_producer'], 'string', 'min' => 2, 'max' => 255],
  87. ['password', 'required', 'message' => 'Champs obligatoire'],
  88. ['password', 'string', 'min' => 6, 'tooShort' => 'Votre mot de passe doit contenir au moins 6 caractères'],
  89. ['is_producer', 'boolean'],
  90. ['cgv', 'boolean'],
  91. ['cgv', function ($attribute, $params) {
  92. $cgv = $this->$attribute;
  93. if ($this->option_user_producer == 'producer' && !$cgv) {
  94. $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
  95. }
  96. }],
  97. ['postcode', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  98. return $model->option_user_producer == 'producer';
  99. }, 'whenClient' => "function (attribute, value) {
  100. return $('#option-producer').prop('checked') ;
  101. }"],
  102. ['id_tax_rate_default', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  103. return $model->option_user_producer == 'producer';
  104. }, 'whenClient' => "function (attribute, value) {
  105. return $('#option-producer').prop('checked') ;
  106. }"],
  107. ['city', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  108. return $model->option_user_producer == 'producer';
  109. }, 'whenClient' => "function (attribute, value) {
  110. return $('#option-producer').prop('checked') ;
  111. }"],
  112. ['name_producer', 'string'],
  113. ['name_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  114. return $model->option_user_producer == 'producer';
  115. }, 'whenClient' => "function (attribute, value) {
  116. return $('#option-producer').prop('checked') ;
  117. }"],
  118. ['type', 'string'],
  119. ['type', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  120. return $model->option_user_producer == 'producer';
  121. }, 'whenClient' => "function (attribute, value) {
  122. return $('#option-producer').prop('checked') ;
  123. }"],
  124. ['siret', 'string'],
  125. ['siret', function ($attribute, $params) {
  126. $siret = $this->$attribute;
  127. $siret = str_replace(' ', '', $siret);
  128. if (strlen($siret) != 14) {
  129. $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
  130. return;
  131. }
  132. if (!is_numeric($siret)) {
  133. $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
  134. return;
  135. }
  136. // on prend chaque chiffre un par un
  137. // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
  138. // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
  139. // on ajoute cette valeur à la somme totale
  140. $sum = 0;
  141. for ($index = 0; $index < 14; $index++) {
  142. $number = (int)$siret[$index];
  143. if (($index % 2) == 0) {
  144. if (($number *= 2) > 9)
  145. $number -= 9;
  146. }
  147. $sum += $number;
  148. }
  149. // le numéro est valide si la somme des chiffres est multiple de 10
  150. if (($sum % 10) != 0)
  151. $this->addError($attribute, 'Numéro SIRET invalide');
  152. }],
  153. ['id_producer', 'integer'],
  154. ['id_producer', function ($attribute, $params) {
  155. if ($this->id_producer) {
  156. $producer = Producer::findOne($this->id_producer);
  157. if (!$producer) {
  158. $this->addError($attribute, 'Ce producteur n\'existe pas.');
  159. }
  160. }
  161. }],
  162. ['id_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  163. return $this->option_user_producer == 'user';
  164. }],
  165. ['code', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
  166. $producer = Producer::findOne($this->id_producer);
  167. if ($producer) {
  168. return strlen($producer->code);
  169. } else {
  170. return false;
  171. }
  172. }],
  173. ['code', function ($attribute, $params) {
  174. $code = $this->$attribute;
  175. $producer = Producer::findOne($this->id_producer);
  176. if ($producer && strtolower(trim($code)) != strtolower(trim($producer->code))) {
  177. $this->addError($attribute, 'Code incorrect');
  178. }
  179. }],
  180. // ['free_price', 'number'],
  181. ['id_tax_rate_default', 'exist',
  182. 'targetClass' => TaxRate::className(),
  183. 'targetAttribute' => ['id_tax_rate_default' => 'id']],
  184. ['verifyCode', 'captcha', 'message' => 'Veuillez recopier le code de vérification'],
  185. ];
  186. }
  187. public function attributeLabels()
  188. {
  189. return [
  190. 'id' => 'ID',
  191. 'username' => 'Identifiant',
  192. 'password' => 'Mot de passe',
  193. 'rememberMe' => 'Se souvenir de moi',
  194. 'name' => 'Prénom',
  195. 'lastname' => 'Nom',
  196. 'phone' => 'Téléphone',
  197. 'is_producer' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
  198. 'name_producer' => 'Nom de votre structure',
  199. 'siret' => 'Numéro SIRET',
  200. 'postcode' => 'Code postal',
  201. 'city' => 'Commune',
  202. 'id_producer' => 'Producteur',
  203. 'type' => 'Type de producteur',
  204. // 'free_price' => 'Prix libre',
  205. 'id_tax_rate_default' => 'TVA par défaut',
  206. 'verifyCode' => 'Code de vérification',
  207. ];
  208. }
  209. /**
  210. * Signs user up.
  211. *
  212. * @return User|null the saved model or null if saving fails
  213. */
  214. public function signup()
  215. {
  216. $userContainer = \Yii::$app->logic->getUserContainer();
  217. $producerContainer = \Yii::$app->logic->getProducerContainer();
  218. if ($this->validate()) {
  219. $user = $userContainer->getFactory()->create();
  220. $this->populateUser($user);
  221. if ($this->isProducer()) {
  222. $producer = $this->processFormProducer($user);
  223. $idProducer = $producer->id;
  224. } else {
  225. $idProducer = $this->id_producer;
  226. }
  227. $producer = $producerContainer->getRepository()->getOneById($idProducer);
  228. if ($user->save() && $producer) {
  229. // Liaison User / Producer
  230. $producerContainer->getBuilder()->addUser($user->id, $idProducer);
  231. // Envoi d'un email de bienvenue à l'utilisateur
  232. if ($this->isCustomer()) {
  233. $userContainer->getUtils()->sendEmailSignup($user, $producer);
  234. }
  235. return $user;
  236. }
  237. }
  238. return null;
  239. }
  240. public function isCustomer()
  241. {
  242. return $this->option_user_producer == 'user';
  243. }
  244. public function isProducer()
  245. {
  246. return $this->option_user_producer == 'producer';
  247. }
  248. public function processFormProducer($user)
  249. {
  250. $userContainer = \Yii::$app->logic->getUserContainer();
  251. $producerContainer = \Yii::$app->logic->getProducerContainer();
  252. // Création du producteur
  253. $producer = $producerContainer->getFactory()->createInstance();
  254. $this->populateProducer($producer);
  255. $producerContainer->getBuilder()->init($producer);
  256. $producer->save();
  257. /*
  258. * Envoi d'un email à l'administrateur pour le prévenir
  259. * qu'un nouveau producteur s'est inscrit
  260. */
  261. $producerContainer->getUtils()->sendEmailNewProducer($producer);
  262. // Initialisation de l'utilisateur (statut et liaison au producteur)
  263. $userContainer->getBuilder()->initProducer($user, $producer);
  264. return $producer;
  265. }
  266. public function populateUser($user)
  267. {
  268. $userContainer = \Yii::$app->logic->getUserContainer();
  269. $user->username = $this->email;
  270. $user->email = $this->email;
  271. $user->name = $this->name;
  272. $user->lastname = $this->lastname;
  273. $user->phone = $this->phone;
  274. $userContainer->getBuilder()->initPassword($user, $this->password);
  275. }
  276. public function populateProducer($producer)
  277. {
  278. $producer->name = $this->name_producer;
  279. $producer->type = $this->type;
  280. $producer->siret = $this->siret;
  281. $producer->postcode = $this->postcode;
  282. $producer->city = $this->city;
  283. $producer->id_tax_rate_default = $this->id_tax_rate_default;
  284. }
  285. }