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.

373 line
13KB

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