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.

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