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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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 common\models;
  38. use common\helpers\GlobalParam;
  39. use common\models\User;
  40. class UserSearch extends User
  41. {
  42. var $id_point_sale;
  43. var $subscribers;
  44. var $inactive;
  45. var $username;
  46. public function rules()
  47. {
  48. return [
  49. [['no_mail', 'mail_distribution_monday', 'mail_distribution_tuesday', 'mail_distribution_wednesday', 'mail_distribution_thursday', 'mail_distribution_friday', 'mail_distribution_saturday', 'mail_distribution_sunday'], 'boolean'],
  50. [['lastname', 'name', 'phone', 'address'], 'string'],
  51. [['id_point_sale', 'inactive', 'subscribers'], 'integer'],
  52. [['date_last_connection', 'id_point_sale', 'username'], 'safe'],
  53. ];
  54. }
  55. public function search($params = [])
  56. {
  57. $optionsSearch = self::defaultOptionsSearch();
  58. $query = User::find()
  59. ->select(
  60. '`user`.id, '
  61. . '`user`.username,'
  62. . '`user`.email, '
  63. . '`user`.status, '
  64. . '`user`.created_at, '
  65. . '`user`.updated_at, '
  66. . '`user`.lastname, '
  67. . '`user`.name, '
  68. . '`user`.phone, '
  69. . '`user`.address, '
  70. . '`user`.no_mail, '
  71. . '`user`.mail_distribution_monday, '
  72. . '`user`.mail_distribution_tuesday, '
  73. . '`user`.mail_distribution_wednesday, '
  74. . '`user`.mail_distribution_thursday, '
  75. . '`user`.mail_distribution_friday, '
  76. . '`user`.mail_distribution_saturday, '
  77. . '`user`.mail_distribution_sunday, '
  78. . '`user`.id_producer, '
  79. . '`user`.date_last_connection, '
  80. . '(SELECT COUNT(*) FROM `order` WHERE `user`.id = `order`.id_user) AS count_orders');
  81. $dataProvider = new ActiveDataProvider([
  82. 'query' => $query,
  83. 'sort' => ['attributes' => ['username', 'credit', 'orders']],
  84. 'pagination' => [
  85. 'pageSize' => 20,
  86. ],
  87. ]);
  88. $dataProvider->sort->attributes['username'] = [
  89. 'asc' => ['user.lastname' => SORT_ASC, 'user.name' => SORT_ASC],
  90. 'desc' => ['user.lastname' => SORT_DESC, 'user.name' => SORT_DESC],
  91. ];
  92. $dataProvider->sort->attributes['credit'] = [
  93. 'asc' => ['user_producer.credit' => SORT_ASC],
  94. 'desc' => ['user_producer.credit' => SORT_DESC],
  95. ];
  96. $this->load($params);
  97. if (!$this->validate()) {
  98. return $dataProvider;
  99. }
  100. $query->innerJoin('user_producer', 'user.id = user_producer.id_user AND user_producer.id_producer = :id_producer AND user_producer.active = 1', [':id_producer' => GlobalParam::getCurrentProducerId()]);
  101. if (isset($this->id_point_sale) && $this->id_point_sale) {
  102. $pointSale = PointSale::findOne(['id' => $this->id_point_sale]);
  103. $query->innerJoin('user_point_sale', 'user.id = user_point_sale.id_user AND user_point_sale.id_point_sale = :id_point_sale', [':id_point_sale' => $this->id_point_sale]);
  104. }
  105. if (isset($this->subscribers) && $this->subscribers) {
  106. $query->innerJoin(
  107. 'subscription',
  108. 'user.id = subscription.id_user AND subscription.id_producer = :id_producer',
  109. [':id_producer' => GlobalParam::getCurrentProducerId()]
  110. )->groupBy('user.id');
  111. }
  112. if (isset($this->inactive) && $this->inactive) {
  113. $query->having([
  114. 'count_orders' => 0
  115. ]);
  116. }
  117. $query->andFilterWhere([
  118. 'or',
  119. ['like', 'user.lastname', $this->username],
  120. ['like', 'user.name', $this->username]
  121. ]);
  122. return $dataProvider;
  123. }
  124. }