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.

PointSale.php 15KB

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