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.

399 lines
14KB

  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 "point_vente".
  46. *
  47. * @property integer $id
  48. * @property string $name
  49. * @property string $address
  50. * @property integer $id_producer
  51. * @property integer $default
  52. */
  53. class PointSale extends ActiveRecordCommon
  54. {
  55. var $orders = [];
  56. var $revenues = 0;
  57. var $revenues_with_tax = 0;
  58. var $data_select_orders;
  59. var $data_options_orders;
  60. var $users = [];
  61. var $users_comment = [];
  62. /**
  63. * @inheritdoc
  64. */
  65. public static function tableName()
  66. {
  67. return 'point_sale';
  68. }
  69. /**
  70. * @inheritdoc
  71. */
  72. public function rules()
  73. {
  74. return [
  75. [['name'], 'required'],
  76. [['restricted_access'], 'boolean'],
  77. [['name', 'code'], 'string', 'max' => 255],
  78. [['address', 'locality', 'infos_monday', 'infos_tuesday',
  79. 'infos_wednesday', 'infos_thursday', 'infos_friday',
  80. 'infos_saturday', 'infos_sunday', 'credit_functioning'], 'string'],
  81. [['point_production', 'credit', 'delivery_monday', 'delivery_tuesday',
  82. 'delivery_wednesday', 'delivery_thursday', 'delivery_friday',
  83. 'delivery_saturday', 'delivery_sunday', 'default'], 'boolean'],
  84. ['point_production', 'default', 'value' => 0],
  85. [['id_producer', 'id_user'], 'integer'],
  86. ['id_producer', 'required'],
  87. [['users', 'users_comment', 'code'], 'safe'],
  88. [['product_price_percent'], 'double'],
  89. ];
  90. }
  91. /**
  92. * @inheritdoc
  93. */
  94. public function attributeLabels()
  95. {
  96. return [
  97. 'id' => 'ID',
  98. 'name' => 'Nom',
  99. 'address' => 'Adresse',
  100. 'locality' => 'Localité',
  101. 'point_production' => 'Point de production',
  102. 'infos_monday' => 'Lundi',
  103. 'infos_tuesday' => 'Mardi',
  104. 'infos_wednesday' => 'Mercredi',
  105. 'infos_thursday' => 'Jeudi',
  106. 'infos_friday' => 'Vendredi',
  107. 'infos_saturday' => 'Samedi',
  108. 'infos_sunday' => 'Dimanche',
  109. 'restricted_access' => 'Accès restreint',
  110. 'credit' => 'Activer le Crédit',
  111. 'delivery_monday' => 'Lundi',
  112. 'delivery_tuesday' => 'Mardi',
  113. 'delivery_wednesday' => 'Mercredi',
  114. 'delivery_thursday' => 'Jeudi',
  115. 'delivery_friday' => 'Vendredi',
  116. 'delivery_saturday' => 'Samedi',
  117. 'delivery_sunday' => 'Dimanche',
  118. 'code' => 'Code',
  119. 'credit_functioning' => 'Utilisation du Crédit par l\'utilisateur',
  120. 'default' => 'Point de vente par défaut',
  121. 'id_user' => 'Contact',
  122. 'product_price_percent' => 'Prix produits : pourcentage'
  123. ];
  124. }
  125. /*
  126. * Relations
  127. */
  128. public function getUserPointSale()
  129. {
  130. return $this->hasMany(
  131. UserPointSale::className(),
  132. ['id_point_sale' => 'id']
  133. );
  134. }
  135. public function getPointSaleDistribution()
  136. {
  137. return $this->hasMany(
  138. PointSaleDistribution::className(),
  139. ['id_point_sale' => 'id']
  140. );
  141. }
  142. public function getUser()
  143. {
  144. return $this->hasOne(
  145. User::className(),
  146. ['id' => 'id_user']
  147. ) ;
  148. }
  149. /**
  150. * Retourne les options de base nécessaires à la fonction de recherche.
  151. *
  152. * @return array
  153. */
  154. public static function defaultOptionsSearch()
  155. {
  156. return [
  157. 'with' => [],
  158. 'join_with' => [],
  159. 'orderby' => '',
  160. 'attribute_id_producer' => 'point_sale.id_producer'
  161. ];
  162. }
  163. /**
  164. * Initialise les commandes liées au point de vente.
  165. *
  166. * @param array $ordersArray
  167. */
  168. public function initOrders($ordersArray)
  169. {
  170. $this->orders = [];
  171. $this->revenues = 0;
  172. $this->revenues_with_tax = 0;
  173. if ($ordersArray) {
  174. foreach ($ordersArray as $order) {
  175. if ($this->id == $order->id_point_sale) {
  176. $this->orders[] = $order;
  177. if (is_null($order->date_delete)) {
  178. $this->revenues += (float)$order->amount;
  179. $this->revenues_with_tax += (float)$order->amount_with_tax;
  180. }
  181. }
  182. }
  183. }
  184. }
  185. /**
  186. * Retourne les commandes liées à ce point de vente.
  187. *
  188. * @return array
  189. */
  190. public function getOrders()
  191. {
  192. return $this->orders;
  193. }
  194. /**
  195. * Enregistre le point de vente.
  196. *
  197. * @param boolean $runValidation
  198. * @param array $attributeNames
  199. * @return type
  200. */
  201. public function save($runValidation = true, $attributeNames = NULL)
  202. {
  203. $this->id_producer = GlobalParam::getCurrentProducerId();
  204. return parent::save($runValidation, $attributeNames);
  205. }
  206. /**
  207. * Traite la mise à jour de l'attribut 'point_production'.
  208. */
  209. public function processPointProduction()
  210. {
  211. if ($this->point_production) {
  212. PointSale::updateAll(
  213. ['point_production' => 0],
  214. ['id_producer' => $this->id_producer]
  215. );
  216. $this->point_production = 1;
  217. $this->save();
  218. }
  219. }
  220. /**
  221. * Traite les accès restreints d'un point de vente.
  222. */
  223. public function processRestrictedAccess()
  224. {
  225. UserPointSale::deleteAll(['id_point_sale' => $this->id]);
  226. if (is_array($this->users) && count($this->users)) {
  227. foreach ($this->users as $key => $val) {
  228. $user = User::findOne($val);
  229. if ($user) {
  230. $userPointSale = new UserPointSale;
  231. $userPointSale->id_user = $val;
  232. $userPointSale->id_point_sale = $this->id;
  233. if (isset($this->users_comment[$val]) && strlen($this->users_comment[$val])) {
  234. $userPointSale->comment = $this->users_comment[$val];
  235. }
  236. $userPointSale->save();
  237. }
  238. }
  239. }
  240. }
  241. /**
  242. * Retourne le commentaire de l'utilisateur courant lié au point de vente.
  243. *
  244. * @return string|null
  245. */
  246. public function getComment()
  247. {
  248. if (isset($this->userPointSale)) {
  249. foreach ($this->userPointSale as $userPointSale) {
  250. if ($userPointSale->id_user == User::getCurrentId()) {
  251. return $userPointSale->comment;
  252. }
  253. }
  254. }
  255. return null;
  256. }
  257. /**
  258. * Retourne le nombre de points de vente pour l'établissement courant.
  259. *
  260. * @return integer
  261. */
  262. public static function count()
  263. {
  264. return self::searchCount(['id_producer' => GlobalParam::getCurrentProducerId()]);
  265. }
  266. /**
  267. * Vérifie le code d'accès à un point de vente.
  268. *
  269. * @param string $code
  270. * @return boolean
  271. */
  272. public function validateCode($code)
  273. {
  274. if (strlen($this->code)) {
  275. if (trim(strtolower($code)) == trim(strtolower($this->code))) {
  276. return true;
  277. } else {
  278. return false;
  279. }
  280. }
  281. return true;
  282. }
  283. /**
  284. * Retourne les jours de livraison du point de vente sous forme d'une chaine
  285. * de caractères.
  286. *
  287. * @return string
  288. */
  289. public function getStrDeliveryDays()
  290. {
  291. $str = '';
  292. if ($this->delivery_monday) $str .= 'lundi, ';
  293. if ($this->delivery_tuesday) $str .= 'mardi, ';
  294. if ($this->delivery_wednesday) $str .= 'mercredi, ';
  295. if ($this->delivery_thursday) $str .= 'jeudi, ';
  296. if ($this->delivery_friday) $str .= 'vendredi, ';
  297. if ($this->delivery_saturday) $str .= 'samedi, ';
  298. if ($this->delivery_sunday) $str .= 'dimanche, ';
  299. if (strlen($str)) {
  300. return substr($str, 0, strlen($str) - 2);
  301. } else {
  302. return '';
  303. }
  304. }
  305. /**
  306. * Retourne un commentaire informant l'utilisateur sur les détails de
  307. * livraison d'un point de vente et pour un jour donné.
  308. *
  309. * @param string $jour
  310. * @return string
  311. */
  312. public function getStrInfos($day)
  313. {
  314. $str = '';
  315. $field = 'infos_' . $day;
  316. if (strlen($this->$field)) {
  317. $str = nl2br(Html::encode($this->$field));
  318. $str = preg_replace('/\[select_previous_day\](.*?)\[\/select_previous_day\]/', '<a href="javascript:void(0);" class="select-previous-day">$1</a>', $str);
  319. }
  320. return $str;
  321. }
  322. /**
  323. * Retourne le mode de fonctionnement du crédit du point de vente.
  324. *
  325. * @return string
  326. */
  327. public function getCreditFunctioning()
  328. {
  329. return strlen($this->credit_functioning) > 0 ?
  330. $this->credit_functioning :
  331. Producer::getConfig('credit_functioning');
  332. }
  333. /**
  334. * Lie un utilisateur au point de vente.
  335. *
  336. * @param integer $idUser
  337. */
  338. public function linkUser($idUser)
  339. {
  340. if ($idUser) {
  341. $userPointSale = UserPointSale::find()
  342. ->where([
  343. 'id_user' => $idUser,
  344. 'id_point_sale' => $this->id
  345. ])->one();
  346. if (!$userPointSale) {
  347. $userPointSale = new UserPointSale;
  348. $userPointSale->id_user = $idUser;
  349. $userPointSale->id_point_sale = $this->id;
  350. $userPointSale->save();
  351. }
  352. }
  353. }
  354. public static function populateDropdownList()
  355. {
  356. $pointSalesArrayDropdown = ['' => '--'] ;
  357. $pointSalesArray = PointSale::find()->where('id_producer = ' . GlobalParam::getCurrentProducerId())->all() ;
  358. foreach($pointSalesArray as $pointSale) {
  359. $pointSalesArrayDropdown[$pointSale['id']] = $pointSale['name'] ;
  360. }
  361. return $pointSalesArrayDropdown ;
  362. }
  363. }