Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

247 lines
7.6KB

  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 Yii;
  40. use yii\helpers\Html;
  41. use common\models\UserPointSale;
  42. use common\models\PointSaleDistribution;
  43. use common\components\ActiveRecordCommon;
  44. /**
  45. * This is the model class for table "product_price".
  46. *
  47. * @property integer $id
  48. */
  49. class ProductPrice extends ActiveRecordCommon
  50. {
  51. /**
  52. * @inheritdoc
  53. */
  54. public static function tableName()
  55. {
  56. return 'product_price';
  57. }
  58. /**
  59. * @inheritdoc
  60. */
  61. public function rules()
  62. {
  63. return [
  64. [
  65. 'id_user',
  66. 'required',
  67. 'when' => function ($model) {
  68. return !$model->id_point_sale && !$model->id_user_group;
  69. },
  70. 'message' => 'Vous devez renseigner au moins un utilisateur, un point de vente ou un groupe d\'utilisateur'
  71. ],
  72. [
  73. 'id_point_sale',
  74. 'required',
  75. 'when' => function ($model) {
  76. return !$model->id_user && !$model->id_user_group;
  77. },
  78. 'message' => 'Vous devez renseigner au moins un utilisateur, un point de vente ou un groupe d\'utilisateur'
  79. ],
  80. [
  81. 'id_user_group',
  82. 'required',
  83. 'when' => function ($model) {
  84. return !$model->id_user && !$model->id_point_sale;
  85. },
  86. 'message' => 'Vous devez renseigner au moins un utilisateur, un point de vente ou un groupe d\'utilisateur'
  87. ],
  88. [['id_product', 'price'], 'required'],
  89. [['id_product', 'id_user', 'id_point_sale', 'id_user_group', 'percent'], 'integer'],
  90. [['price', 'from_quantity'], 'double'],
  91. ];
  92. }
  93. /**
  94. * @inheritdoc
  95. */
  96. public function attributeLabels()
  97. {
  98. return [
  99. 'id' => 'ID',
  100. 'id_product' => 'Produit',
  101. 'id_user' => 'Utilisateur',
  102. 'id_point_sale' => 'Point de vente',
  103. 'id_user_group' => "Groupe d'utilisateur",
  104. 'price' => 'Prix (HT)',
  105. 'percent' => 'Pourcentage',
  106. 'from_quantity' => 'À partir de la quantité',
  107. ];
  108. }
  109. /*
  110. * Relations
  111. */
  112. public function getProduct()
  113. {
  114. return $this->hasOne(
  115. Product::className(),
  116. ['id' => 'id_product']
  117. );
  118. }
  119. public function getPointSale()
  120. {
  121. return $this->hasOne(
  122. PointSale::className(),
  123. ['id' => 'id_point_sale']
  124. );
  125. }
  126. public function getUserGroup()
  127. {
  128. return $this->hasOne(
  129. UserGroup::className(),
  130. ['id' => 'id_user_group']
  131. );
  132. }
  133. public function getUser()
  134. {
  135. return $this->hasOne(
  136. User::className(),
  137. ['id' => 'id_user']
  138. );
  139. }
  140. /**
  141. * Retourne les options de base nécessaires à la fonction de recherche.
  142. *
  143. * @return array
  144. */
  145. public static function defaultOptionsSearch()
  146. {
  147. return [
  148. 'with' => ['user', 'pointSale'],
  149. 'join_with' => ['product'],
  150. 'orderby' => '',
  151. 'attribute_id_producer' => 'product.id_producer'
  152. ];
  153. }
  154. public static function percentValues()
  155. {
  156. $percentValues = [
  157. '' => 'Aucun'
  158. ];
  159. for ($i = -50; $i < 51; $i = $i + 5) {
  160. $percentValues[$i] = $i . ' %';
  161. }
  162. return $percentValues;
  163. }
  164. public static function hasMatchOfType($specificPriceArray, $typeMatch, $user, $pointSale)
  165. {
  166. foreach($specificPriceArray as $specificPrice) {
  167. if($specificPrice->$typeMatch($user, $pointSale)) {
  168. return true;
  169. }
  170. }
  171. return false;
  172. }
  173. public static function getPriorityMatchOfSpecificPriceArray($specificPriceArray, $user, $pointSale)
  174. {
  175. if(self::hasMatchOfType($specificPriceArray, 'matchUser', $user, $pointSale)) {
  176. return 'matchUser';
  177. }
  178. if(self::hasMatchOfType($specificPriceArray, 'matchUserGroup', $user, $pointSale)) {
  179. return 'matchUserGroup';
  180. }
  181. if(self::hasMatchOfType($specificPriceArray, 'matchPointSale', $user, $pointSale)) {
  182. return 'matchPointSale';
  183. }
  184. if(self::hasMatchOfType($specificPriceArray, 'matchUserPointSale', $user, $pointSale)) {
  185. return 'matchUserPointSale';
  186. }
  187. return null;
  188. }
  189. public function matchUser($user, $pointSale)
  190. {
  191. return $user
  192. && $this->id_user
  193. && !$this->id_point_sale
  194. && !$this->id_user_group
  195. && $this->id_user == $user->id;
  196. }
  197. public function matchUserGroup($user, $pointSale)
  198. {
  199. return $user
  200. && $this->id_user_group
  201. && !$this->id_point_sale
  202. && !$this->id_user
  203. && $user->belongsToUserGroup($this->id_user_group);
  204. }
  205. public function matchPointSale($user, $pointSale)
  206. {
  207. return $pointSale
  208. && $this->id_point_sale
  209. && !$this->id_user
  210. && !$this->id_user_group
  211. && $this->id_point_sale == $pointSale->id;
  212. }
  213. public function matchUserPointSale($user, $pointSale)
  214. {
  215. return $pointSale && $user
  216. && $this->id_point_sale
  217. && $this->id_user
  218. && $this->id_point_sale == $pointSale->id
  219. && $this->id_user == $user->id;
  220. }
  221. }