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