Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

362 lines
12KB

  1. <?php
  2. /**
  3. * Copyright Souke (2018)
  4. *
  5. * contact@souke.fr
  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 domain\User\User;
  38. use common\components\ActiveRecordCommon;
  39. use domain\Order\Order\Order;
  40. use domain\PointSale\UserPointSale\UserPointSale;
  41. use domain\Producer\Producer\Producer;
  42. use domain\User\UserProducer\UserProducer;
  43. use domain\User\UserUserGroup\UserUserGroup;
  44. use yii\base\NotSupportedException;
  45. use yii\behaviors\TimestampBehavior;
  46. use yii\web\IdentityInterface;
  47. class User extends ActiveRecordCommon implements IdentityInterface
  48. {
  49. const EVENT_CREATE = 'user.event.create';
  50. const TYPE_INDIVIDUAL = 'individual';
  51. const TYPE_LEGAL_PERSON = 'legal-person';
  52. const TYPE_GUEST = 'guest';
  53. public static array $types = [
  54. self::TYPE_GUEST,
  55. self::TYPE_INDIVIDUAL,
  56. self::TYPE_LEGAL_PERSON
  57. ];
  58. const STATUS_DELETED = 0;
  59. const STATUS_ACTIVE = 10;
  60. const STATUS_PRODUCER = 11;
  61. const STATUS_ADMIN = 13;
  62. const ID_USER_SYSTEM = 2;
  63. var $password_old;
  64. var $password_new;
  65. var $password_new_confirm;
  66. var $points_sale = [];
  67. var $user_groups = [];
  68. var $one_name;
  69. var $product_price_percent;
  70. var $newsletter;
  71. var $newsletter_order_taking;
  72. var $send_mail_welcome;
  73. var $trust_alert;
  74. var $trust_alert_comment;
  75. var $exclusive_access_selected_points_sale;
  76. /**
  77. * @inheritdoc
  78. */
  79. public static function tableName()
  80. {
  81. return '{{%user}}';
  82. }
  83. /**
  84. * @inheritdoc
  85. */
  86. public function behaviors()
  87. {
  88. return [
  89. TimestampBehavior::class,
  90. ];
  91. }
  92. /**
  93. * @inheritdoc
  94. */
  95. public function rules()
  96. {
  97. return [
  98. [['no_mail', 'mail_distribution_monday', 'mail_distribution_tuesday', 'mail_distribution_wednesday',
  99. 'mail_distribution_thursday', 'mail_distribution_friday', 'mail_distribution_saturday',
  100. 'mail_distribution_sunday', 'is_main_contact', 'newsletter', 'newsletter_order_taking', 'exclude_export_shopping_cart_labels',
  101. 'send_mail_welcome', 'trust_alert', 'newsletter_souke', 'problem_receiving_emails', 'exclusive_access_selected_points_sale'], 'boolean'],
  102. [['lastname', 'name', 'phone', 'address', 'type', 'name_legal_person', 'evoliz_code', 'trust_alert_comment', 'note_emails'], 'string'],
  103. ['lastname', 'verifyOneName', 'skipOnError' => false, 'skipOnEmpty' => false],
  104. [['email', 'email_sending_invoicing_documents'], 'email', 'message' => 'Cette adresse email n\'est pas valide'],
  105. ['email', 'verifyEmail'],
  106. ['status', 'default', 'value' => self::STATUS_ACTIVE],
  107. ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED, self::STATUS_ADMIN, self::STATUS_PRODUCER]],
  108. ['password_old', 'verifyPasswordOld'],
  109. ['password_new', 'verifyPasswordNew'],
  110. ['password_new_confirm', 'verifyPasswordNewConfirm'],
  111. [['date_last_connection', 'password_old', 'password_new', 'password_new_confirm', 'password_hash', 'points_sale', 'product_price_percent', 'user_groups', 'redirect_url'], 'safe'],
  112. ];
  113. }
  114. public function attributeLabels()
  115. {
  116. return [
  117. 'id' => 'ID',
  118. 'name' => 'Prénom',
  119. 'lastname' => 'Nom',
  120. 'phone' => 'Téléphone',
  121. 'address' => 'Adresse',
  122. 'username' => 'Identifiant',
  123. 'password' => 'Mot de passe',
  124. 'rememberMe' => 'Se souvenir de moi',
  125. 'no_mail' => 'Ne pas recevoir d\'email de la part du Chat des Noisettes',
  126. 'mail_distribution_monday' => 'Lundi',
  127. 'mail_distribution_tuesday' => 'Mardi',
  128. 'mail_distribution_wednesday' => 'Mercredi',
  129. 'mail_distribution_thursday' => 'Jeudi',
  130. 'mail_distribution_friday' => 'Vendredi',
  131. 'mail_distribution_saturday' => 'Samedi',
  132. 'mail_distribution_sunday' => 'Dimanche',
  133. 'password_old' => 'Ancien mot de passe',
  134. 'password_new' => 'Nouveau mot de passe',
  135. 'password_new_confirm' => 'Confirmation du nouveau mot de passe',
  136. 'points_sale' => 'Points de vente',
  137. 'type' => 'Type',
  138. 'name_legal_person' => 'Libellé',
  139. 'is_main_contact' => 'Contact principal',
  140. 'product_price_percent' => 'Prix produits : pourcentage',
  141. 'user_groups' => "Groupes d'utilisateurs",
  142. 'evoliz_code' => 'Code client Evoliz',
  143. 'newsletter' => "Inscrit à l'infolettre",
  144. "newsletter_order_taking" => "Inscrit aux emails de prise de commande",
  145. 'exclude_export_shopping_cart_labels' => "Exclure de l'export d'étiquettes",
  146. 'send_mail_welcome' => "Envoyer un email de bienvenue",
  147. 'email_sending_invoicing_documents' => 'Email facturation',
  148. 'trust_alert' => 'Alerte confiance',
  149. 'trust_alert_comment' => 'Commentaire',
  150. 'newsletter_souke' => "S'abonner à l'infolettre de Souke",
  151. 'problem_receiving_emails' => "Rencontre des problèmes pour recevoir les emails",
  152. 'note_emails' => "Note emails",
  153. 'exclusive_access_selected_points_sale' => "Accès exclusif aux points de vente sélectionnés"
  154. ];
  155. }
  156. /**
  157. * Vérifie le mot de passe envoyé par l'utilisateur.
  158. *
  159. * @param string $attribute
  160. * @param array $params
  161. */
  162. public function verifyPasswordOld($attribute, $params)
  163. {
  164. if (strlen($this->password_old)) {
  165. if (!$this->validatePassword($this->password_old)) {
  166. $this->addError($attribute, 'Mot de passe invalide.');
  167. }
  168. }
  169. if (!strlen($this->password_old) && (strlen($this->password_new) || strlen($this->password_new_confirm))) {
  170. $this->addError($attribute, 'Ce champs ne peut être vide');
  171. }
  172. if (!strlen($this->password_new) && (strlen($this->password_old) || strlen($this->password_new_confirm))) {
  173. $this->addError('password_new', 'Ce champs ne peut être vide');
  174. }
  175. if (!strlen($this->password_new_confirm) && (strlen($this->password_old) || strlen($this->password_new))) {
  176. $this->addError('password_new_confirm', 'Ce champs ne peut être vide');
  177. }
  178. }
  179. /**
  180. * Vérifie le mot de passe de l'utilisateur.
  181. *
  182. * @param string $attribute
  183. * @param array $params
  184. */
  185. public function verifyPasswordNew($attribute, $params)
  186. {
  187. if (strlen($this->password_new) < 6) {
  188. $this->addError($attribute, 'Votre mot de passe doit comporter au moins 6 caractères.');
  189. }
  190. }
  191. /**
  192. * Vérifie la confirmation de mot de passe de l'utilisateur.
  193. *
  194. * @param string $attribute
  195. * @param array $params
  196. */
  197. public function verifyPasswordNewConfirm($attribute, $params)
  198. {
  199. if ($this->password_new != $this->password_new_confirm) {
  200. $this->addError($attribute, 'Les deux mots de passe doivent être identiques');
  201. }
  202. }
  203. /**
  204. * Vérifie l'email de l'utilisateur.
  205. *
  206. * @param string $attribute
  207. * @param array $params
  208. */
  209. public function verifyEmail($attribute, $params)
  210. {
  211. if ($this->id) {
  212. $user = User::find()->where("email LIKE :email AND type != :guest AND id != :id")->params(array(':email' => $this->email, ':id' => $this->id, ':guest' => 'guest'))->one();
  213. } else {
  214. $user = User::find()->where("email LIKE :email AND type != :guest")->params(array(':email' => $this->email, ':guest' => 'guest'))->one();
  215. }
  216. if ($user) {
  217. $this->addError($attribute, 'Cette adresse email est déjà utilisée par un autre utilisateur ');
  218. }
  219. }
  220. /**
  221. * Vérifie que l'utilisateur a au moins un nom de défini
  222. *
  223. * @param $attribute
  224. * @param $params
  225. */
  226. public function verifyOneName($attribute, $params)
  227. {
  228. if (strlen($this->lastname) == 0 && strlen($this->name_legal_person) == 0) {
  229. $this->addError('lastname', 'Vous devez saisir au moins un nom.');
  230. $this->addError('name_legal_person', 'Vous devez saisir au moins un nom.');
  231. }
  232. }
  233. /* Getters / Setters */
  234. public function getProblemReceivingEmails(): ?bool
  235. {
  236. return $this->problem_receiving_emails;
  237. }
  238. public function setProblemReceivingEmails(bool $problemReceivingEmails = null): self
  239. {
  240. $this->problem_receiving_emails = $problemReceivingEmails;
  241. return $this;
  242. }
  243. /*
  244. * Relations
  245. */
  246. public function getProducer()
  247. {
  248. return $this->hasOne(Producer::class, ['id' => 'id_producer']);
  249. }
  250. public function getUserProducer()
  251. {
  252. return $this->hasMany(UserProducer::class, ['id_user' => 'id']);
  253. }
  254. public function getUserPointSale()
  255. {
  256. return $this->hasMany(UserPointSale::class, ['id_user' => 'id']);
  257. }
  258. public function getUserUserGroup()
  259. {
  260. return $this->hasMany(UserUserGroup::class, ['id_user' => 'id']);
  261. }
  262. public function getOrder()
  263. {
  264. return $this->hasMany(Order::class, ['id_user' => 'id']);
  265. }
  266. public function getName(): ?string
  267. {
  268. return $this->name;
  269. }
  270. public function getLastname(): ?string
  271. {
  272. return $this->lastname;
  273. }
  274. public function getStatus(): string
  275. {
  276. return $this->status;
  277. }
  278. /**
  279. * @inheritdoc
  280. */
  281. public static function findIdentity($id)
  282. {
  283. return static::findOne(['id' => $id]);
  284. }
  285. /**
  286. * @inheritdoc
  287. */
  288. public static function findIdentityByAccessToken($token, $type = null)
  289. {
  290. throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
  291. }
  292. /**
  293. * @inheritdoc
  294. */
  295. public function getId()
  296. {
  297. return $this->getPrimaryKey();
  298. }
  299. /**
  300. * @inheritdoc
  301. */
  302. public function getAuthKey()
  303. {
  304. return $this->auth_key;
  305. }
  306. /**
  307. * @inheritdoc
  308. */
  309. public function validateAuthKey($authKey)
  310. {
  311. return $this->getAuthKey() === $authKey;
  312. }
  313. /**
  314. * Validates password
  315. */
  316. public function validatePassword(string $password): bool
  317. {
  318. return \Yii::$app->security->validatePassword($password, $this->password_hash);
  319. }
  320. }