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.

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