Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  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 Yii;
  39. use common\components\ActiveRecordCommon;
  40. use common\helpers\Departments;
  41. use yii\helpers\Html;
  42. /**
  43. * This is the model class for table "etablissement".
  44. *
  45. * @property integer $id
  46. * @property string $name
  47. * @property string $siret
  48. * @property string $logo
  49. * @property string $photo
  50. * @property string $description
  51. * @property string $postcode
  52. * @property string $city
  53. * @property float credit_limit_reminder
  54. * @property boolean online_payment
  55. * @property string mentions
  56. * @property string gcs
  57. * @property boolean option_allow_user_gift
  58. * @property string credit_functioning
  59. * @property boolean use_credit_checked_default
  60. * @property float credit_limit
  61. * @property string background_color_logo
  62. *
  63. */
  64. class Producer extends ActiveRecordCommon
  65. {
  66. const CREDIT_FUNCTIONING_MANDATORY = 'mandatory';
  67. const CREDIT_FUNCTIONING_OPTIONAL = 'optional';
  68. const CREDIT_FUNCTIONING_USER = 'user';
  69. const HINT_CREDIT_FUNCTIONING = '<ul>'
  70. . '<li>Optionnelle : l\'utilisateur choisit s\'il utilise son Crédit ou non. Les commandes peuvent être payées ou impayées.</li>'
  71. . '<li>Obligatoire : toutes les commandes de l\'utilisateur son comptabilisées au niveau du Crédit. Toutes les commandes sont payées.</li>'
  72. . '<li>Basée sur l\'utilisateur : Crédit obligatoire si l\'utilisateur a le crédit activé au niveau de son compte, système de Crédit non affiché sinon.</li>'
  73. . '</ul>';
  74. public static $creditFunctioningArray = [
  75. self::CREDIT_FUNCTIONING_MANDATORY => 'Obligatoire',
  76. self::CREDIT_FUNCTIONING_OPTIONAL => 'Optionnelle',
  77. self::CREDIT_FUNCTIONING_USER => 'Basée sur l\'utilisateur',
  78. ];
  79. const BEHAVIOR_DELETE_ORDER_DELETE = 'delete';
  80. const BEHAVIOR_DELETE_ORDER_STATUS = 'status';
  81. const BEHAVIOR_HOME_POINT_SALE_DAY_LIST_WEEK = 'days-of-week' ;
  82. const BEHAVIOR_HOME_POINT_SALE_DAY_LIST_INCOMING_DISTRIBUTIONS = 'incoming-distributions' ;
  83. const BEHAVIOR_ORDER_SELECT_DISTRIBUTION_CALENDAR = 'calendar' ;
  84. const BEHAVIOR_ORDER_SELECT_DISTRIBUTION_LIST = 'list' ;
  85. const ORDER_REFERENCE_TYPE_NONE = '' ;
  86. const ORDER_REFERENCE_TYPE_YEARLY = 'yearly' ;
  87. const ORDER_ENTRY_POINT_DATE = 'date' ;
  88. const ORDER_ENTRY_POINT_POINT_SALE = 'point-sale' ;
  89. var $secret_key_payplug;
  90. /**
  91. * @inheritdoc
  92. */
  93. public static function tableName()
  94. {
  95. return 'producer';
  96. }
  97. /**
  98. * @inheritdoc
  99. */
  100. public function rules()
  101. {
  102. return [
  103. [['name', 'type', 'id_tax_rate_default'], 'required'],
  104. [['tiller_provider_token', 'tiller_restaurant_token'], 'required', 'when' => function ($model) {
  105. return $model->tiller == true;
  106. }],
  107. [['order_delay', 'order_deadline', 'order_delay_monday', 'order_deadline_monday', 'order_delay_tuesday', 'order_deadline_tuesday',
  108. 'order_delay_wednesday', 'order_deadline_wednesday', 'order_delay_thursday', 'order_deadline_thursday', 'order_delay_friday',
  109. 'order_deadline_friday', 'order_delay_saturday', 'order_deadline_saturday', 'order_delay_sunday', 'order_deadline_sunday',
  110. 'id_tax_rate_default', 'document_quotation_duration', 'option_dashboard_number_distributions'], 'integer'],
  111. [['order_deadline', 'order_deadline_monday', 'order_deadline_tuesday', 'order_deadline_wednesday',
  112. 'order_deadline_thursday', 'order_deadline_friday', 'order_deadline_saturday',
  113. 'order_deadline_sunday', ], 'in', 'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]],
  114. ['order_delay', 'in', 'range' => [1, 2, 3, 4, 5, 6, 7]],
  115. ['code', function ($attribute, $params) {
  116. $code = $this->$attribute;
  117. $producer = Producer::findOne(['code' => $code]);
  118. if ($producer && $producer->id != $this->id) {
  119. $this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
  120. }
  121. }],
  122. [['document_quotation_prefix', 'document_invoice_prefix', 'document_delivery_note_prefix'], function($attribute, $params) {
  123. if(!ctype_upper($this->$attribute)) {
  124. $this->addError($attribute, 'Ne doit contenir que des majuscules') ;
  125. }
  126. }],
  127. [['description', 'mentions', 'gcs', 'order_infos', 'slug', 'secret_key_payplug', 'background_color_logo', 'option_behavior_cancel_order', 'tiller_provider_token', 'tiller_restaurant_token', 'status',
  128. 'document_infos_bottom', 'document_infos_quotation', 'document_infos_invoice', 'document_infos_delivery_note', 'address', 'behavior_home_point_sale_day_list', 'behavior_order_select_distribution', 'option_payment_info', 'option_order_reference_type', 'option_order_entry_point'], 'string'],
  129. [['negative_balance', 'credit', 'active', 'online_payment', 'user_manage_subscription', 'option_allow_user_gift', 'use_credit_checked_default', 'tiller', 'document_display_orders_invoice', 'document_display_orders_delivery_note', 'document_display_prices_delivery_note', 'option_email_confirm', 'option_email_confirm_producer', 'option_csv_export_all_products', 'option_csv_export_by_piece', 'option_export_display_product_reference', 'option_allow_order_guest', 'option_delivery', 'option_display_export_grid'], 'boolean'],
  130. [['name', 'siret', 'logo', 'photo', 'postcode', 'city', 'code', 'type', 'credit_functioning', 'option_behavior_cancel_order', 'document_quotation_prefix', 'document_quotation_first_reference', 'document_invoice_prefix', 'document_invoice_first_reference', 'document_delivery_note_prefix', 'document_delivery_note_first_reference'], 'string', 'max' => 255],
  131. [['free_price', 'credit_limit_reminder', 'credit_limit'], 'double'],
  132. ['free_price', 'compare', 'compareValue' => 0, 'operator' => '>=', 'type' => 'number', 'message' => 'Prix libre doit être supérieur ou égal à 0'],
  133. //[['option_dashboard_date_start', 'option_dashboard_date_end'], 'date', 'format' => 'php:d/m/Y'],
  134. [['option_dashboard_date_start', 'option_dashboard_date_end'], 'safe'],
  135. ];
  136. }
  137. /**
  138. * @inheritdoc
  139. */
  140. public function attributeLabels()
  141. {
  142. return [
  143. 'id' => 'ID',
  144. 'name' => 'Nom',
  145. 'siret' => 'Siret',
  146. 'logo' => 'Logo',
  147. 'photo' => 'Photo',
  148. 'description' => 'Description',
  149. 'postcode' => 'Code postal',
  150. 'city' => 'Ville',
  151. 'code' => 'Code',
  152. 'order_delay' => 'Délai de commande',
  153. 'order_deadline' => 'Heure limite de commande',
  154. 'order_delay_monday' => 'Délai de commande (lundi)',
  155. 'order_deadline_monday' => 'Heure limite de commande (lundi)',
  156. 'order_delay_tuesday' => 'Délai de commande (mardi)',
  157. 'order_deadline_tuesday' => 'Heure limite de commande (mardi)',
  158. 'order_delay_wednesday' => 'Délai de commande (mercredi)',
  159. 'order_deadline_wednesday' => 'Heure limite de commande (mercredi)',
  160. 'order_delay_thursday' => 'Délai de commande (jeudi)',
  161. 'order_deadline_thursday' => 'Heure limite de commande (jeudi)',
  162. 'order_delay_friday' => 'Délai de commande (vendredi)',
  163. 'order_deadline_friday' => 'Heure limite de commande (vendredi)',
  164. 'order_delay_saturday' => 'Délai de commande (samedi)',
  165. 'order_deadline_saturday' => 'Heure limite de commande (samedi)',
  166. 'order_delay_sunday' => 'Délai de commande (dimanche)',
  167. 'order_deadline_sunday' => 'Heure limite de commande (dimanche)',
  168. 'negative_balance' => 'Solde négatif',
  169. 'credit' => 'Crédit pain',
  170. 'active' => 'Actif',
  171. 'date_creation' => 'Date de création',
  172. 'order_infos' => 'Informations',
  173. 'slug' => 'Slug',
  174. 'type' => 'Type de producteur',
  175. 'credit_limit_reminder' => 'Seuil de crédit limite avant relance',
  176. 'online_payment' => 'Activer le paiement en ligne',
  177. 'secret_key_payplug' => 'Clé secrète Payplug',
  178. 'user_manage_subscription' => 'Autoriser les utilisateurs à gérer leurs abonnements',
  179. 'mentions' => 'Mentions légales',
  180. 'gcs' => 'Conditions générales de vente',
  181. 'option_allow_user_gift' => 'Autoriser les utilisateurs à effectuer un don à la plateforme lors de leur commande',
  182. 'credit_functioning' => 'Utilisation du Crédit par l\'utilisateur',
  183. 'credit_limit' => 'Crédit limite',
  184. 'use_credit_checked_default' => 'Cocher par défaut l\'option "Utiliser mon crédit" lors de la commande de l\'utilisateur',
  185. 'background_color_logo' => 'Couleur de fond du logo',
  186. 'option_behavior_cancel_order' => 'Comportement lors de la suppression d\'une commande',
  187. 'tiller' => 'Tiller',
  188. 'tiller_provider_token' => 'Token provider',
  189. 'tiller_restaurant_token' => 'Token restaurant',
  190. 'status' => 'Statut',
  191. 'id_tax_rate_default' => 'Taxe',
  192. 'document_quotation_prefix' => 'Préfixe des devis',
  193. 'document_quotation_first_reference' => 'Première référence des devis',
  194. 'document_quotation_duration' => 'Durée du devis',
  195. 'document_invoice_prefix' => 'Préfixe des factures',
  196. 'document_invoice_first_reference' => 'Première référence des factures',
  197. 'document_delivery_note_prefix' => 'Préfixe des bons de livraison',
  198. 'document_delivery_note_first_reference' => 'Première référence des bons de livraison',
  199. 'document_infos_bottom' => 'Informations affichées en bas des documents',
  200. 'document_infos_quotation' => 'Informations affichées en bas des devis',
  201. 'document_infos_invoice' => 'Informations affichées en bas des factures',
  202. 'document_infos_delivery_note' => 'Informations affichées en bas des bons de livraison',
  203. 'address' => 'Adresse',
  204. 'document_display_orders_invoice' => 'Afficher le détail des commandes dans les factures',
  205. 'document_display_orders_delivery_note' => 'Afficher le détail des commandes dans les bons de livraison',
  206. 'document_display_prices_delivery_note' => 'Afficher le chiffrage dans les bons de livraison',
  207. 'behavior_home_point_sale_day_list' => 'Accueil : affichage des jours de distribution',
  208. 'behavior_order_select_distribution' => 'Sélection de la date de distribution',
  209. 'option_payment_info' => 'Informations liées au paiement',
  210. 'option_email_confirm' => 'Envoyer un email de confirmation au client',
  211. 'option_email_confirm_producer' => 'Envoyer un email de confirmation au producteur',
  212. 'option_dashboard_number_distributions' => 'Nombre de distributions affichées sur le tableau de board',
  213. 'option_dashboard_date_start' => 'Date de début',
  214. 'option_dashboard_date_end' => 'Date de fin',
  215. 'option_csv_export_all_products' => 'Exporter tous les produits dans le fichier récapitulatif (CSV)',
  216. 'option_csv_export_by_piece' => 'Exporter les produits par pièce dans le fichier récapitulatif (CSV)',
  217. 'option_order_reference_type' => 'Type de référence',
  218. 'option_export_display_product_reference' => 'Afficher la référence des produits au moment de l\'export',
  219. 'option_allow_order_guest' => 'Autoriser les visiteurs à passer commande (création de compte à la fin du tunnel)',
  220. 'option_order_entry_point' => 'Point d\'entrée par point de vente ou par date',
  221. 'option_delivery' => 'Proposer la livraison à domicile',
  222. 'option_display_export_grid' => 'Afficher l\'export grille dans les distributions'
  223. ];
  224. }
  225. /*
  226. * Relations
  227. */
  228. public function getUserProducer()
  229. {
  230. return $this->hasMany(
  231. UserProducer::className(),
  232. ['id_producer' => 'id']
  233. );
  234. }
  235. public function getUser()
  236. {
  237. return $this->hasMany(User::className(), ['id_producer' => 'id']);
  238. }
  239. public function getContact()
  240. {
  241. return $this->hasMany(User::className(), ['id_producer' => 'id'])
  242. ->where(['status' => User::STATUS_PRODUCER]);
  243. }
  244. public function getTaxRate()
  245. {
  246. return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate_default']);
  247. }
  248. /**
  249. * Retourne les options de base nécessaires à la fonction de recherche.
  250. *
  251. * @return array
  252. */
  253. public static function defaultOptionsSearch()
  254. {
  255. return [
  256. 'with' => ['taxRate'],
  257. 'join_with' => [],
  258. 'orderby' => 'name ASC',
  259. 'attribute_id_producer' => 'id'
  260. ];
  261. }
  262. /**
  263. * Retourne la liste des établissements pour l'initialisation d'une liste
  264. * sélective.
  265. *
  266. * @return array
  267. */
  268. public static function getProducerPopulateDropdown()
  269. {
  270. $producers = Producer::find()
  271. ->where([
  272. 'active' => true,
  273. ])
  274. ->orderBy('postcode, city ASC')
  275. ->all();
  276. $departments = Departments::get();
  277. $dataProducers = [];
  278. $optionsProducers = [];
  279. foreach ($producers as $p) {
  280. if (!key_exists('d' . substr($p->postcode, 0, 2), $dataProducers)) {
  281. $dataProducers['d' . substr($p->postcode, 0, 2)] = '<strong>' . $departments[substr($p->postcode, 0, 2)] . '</strong>';
  282. $optionsProducers['d' . substr($p->postcode, 0, 2)] = ['disabled' => true];
  283. }
  284. $dataProducers[$p->id] = '<span class="glyphicon glyphicon-lock"></span> ' . Html::encode($p->name) . ' - ' . Html::encode($p->postcode) . ' ' . Html::encode($p->city) . ' <span class="glyphicon glyphicon-lock"></span>';
  285. if (strlen($p->code)) {
  286. $optionsProducers[$p->id] = ['class' => 'lock'];
  287. }
  288. }
  289. return ['data' => $dataProducers, 'options' => $optionsProducers];
  290. }
  291. /**
  292. * Retourne le CA de l'établissement pour un mois donné.
  293. *
  294. * @param string $period
  295. * @param boolean $format
  296. * @return string
  297. */
  298. public function getTurnover($period = '', $format = false)
  299. {
  300. if (!$period) {
  301. $period = date('Y-m');
  302. }
  303. $connection = Yii::$app->getDb();
  304. $command = $connection->createCommand('
  305. SELECT SUM(product_order.price * product_order.quantity) AS turnover
  306. FROM `order`, product_order, distribution, product
  307. WHERE `order`.id = product_order.id_order
  308. AND distribution.id_producer = :id_producer
  309. AND `order`.id_distribution = distribution.id
  310. AND product_order.id_product = product.id
  311. AND distribution.date > :date_begin
  312. AND distribution.date < :date_end', [
  313. ':date_begin' => date('Y-m-31', strtotime("-1 month", strtotime($period))),
  314. ':date_end' => date('Y-m-01', strtotime("+1 month", strtotime($period))),
  315. ':id_producer' => $this->id
  316. ]);
  317. $result = $command->queryOne();
  318. $turnover = $result['turnover'];
  319. if ($format) {
  320. return number_format($turnover, 2) . ' €';
  321. } else {
  322. return $turnover;
  323. }
  324. }
  325. /**
  326. * Retourne le montant à facturer pour une période donnée.
  327. *
  328. * @param string $periode
  329. * @param float $ca
  330. * @param boolean $format
  331. * @return string
  332. */
  333. public function getMAmountBilled($format = false)
  334. {
  335. if ($format) {
  336. return number_format($this->free_price, 2) . ' €';
  337. } else {
  338. return $this->free_price;
  339. }
  340. }
  341. /**
  342. * Retourne la facture d'une période donnée.
  343. *
  344. * @param string $periode
  345. * @return Facture
  346. */
  347. public function getInvoice($period = '')
  348. {
  349. if (!$period) {
  350. $period = date('Y-m', strtotime('-1 month'));
  351. }
  352. $invoice = Invoice::searchOne(
  353. ['id_producer' => $this->id, 'period' => ':period'],
  354. ['params' => [':period' => $period]]
  355. );
  356. return $invoice;
  357. }
  358. /**
  359. * Retourne la facture du mois dernier.
  360. *
  361. * @return Facture
  362. */
  363. public function getInvoiceLastMonth()
  364. {
  365. return $this->getInvoice(date('Y-m', strtotime('-1 month')));
  366. }
  367. /**
  368. * Retourne une configuration d'un établissement donné.
  369. *
  370. * @param string $config
  371. * @param integer $id_etablissement
  372. * @return mixed
  373. */
  374. public static function getConfig($config = '', $idProducer = 0)
  375. {
  376. if (strlen($config)) {
  377. if (!$idProducer) {
  378. $idProducer = GlobalParam::getCurrentProducerId();
  379. }
  380. $producer = self::findOne($idProducer);
  381. if ($producer) {
  382. return $producer->$config;
  383. }
  384. }
  385. return false;
  386. }
  387. /**
  388. * Retourne le montant de l'abonnement à prix libre définit par
  389. * le producteur.
  390. *
  391. * @param boolean $format
  392. * @return mixed
  393. */
  394. public function getFreePrice($format = true)
  395. {
  396. if (!is_null($this->free_price)) {
  397. if ($format) {
  398. return number_format($this->free_price, 2, ',', false) . ' € HT';
  399. } else {
  400. return $this->free_price;
  401. }
  402. }
  403. }
  404. /**
  405. * Lie un utilisateur à un producteur.
  406. *
  407. * @param integer $id_user
  408. * @param integer $id_producer
  409. * @return UserProducer
  410. */
  411. public static function addUser($idUser, $idProducer, $bookmark = 1)
  412. {
  413. $userProducer = UserProducer::searchOne([
  414. 'user_producer.id_user' => $idUser,
  415. 'user_producer.id_producer' => $idProducer
  416. ]);
  417. if (!$userProducer) {
  418. $newUserProducer = new UserProducer;
  419. $newUserProducer->id_producer = $idProducer;
  420. $newUserProducer->id_user = $idUser;
  421. $newUserProducer->credit = 0;
  422. $newUserProducer->active = 1;
  423. $newUserProducer->bookmark = (int)$bookmark;
  424. $newUserProducer->save();
  425. } else {
  426. if (!$userProducer->active) {
  427. $userProducer->active = 1;
  428. $userProducer->save();
  429. }
  430. }
  431. return $userProducer;
  432. }
  433. public function getSpecificDelays()
  434. {
  435. $array = [] ;
  436. $daysArray = [
  437. 'monday','tuesday','wednesday','thursday','friday','saturday','sunday'
  438. ] ;
  439. foreach($daysArray as $day) {
  440. $fieldDelay = 'order_delay_'.$day ;
  441. $fieldDeadline = 'order_deadline_'.$day ;
  442. $delay = $this->order_delay ;
  443. $deadline = $this->order_deadline ;
  444. if($this->$fieldDelay) {
  445. $delay = $this->$fieldDelay ;
  446. }
  447. if($this->$fieldDeadline) {
  448. $deadline = $this->$fieldDeadline ;
  449. }
  450. $array[$day] = [
  451. 'order_delay' => $delay,
  452. 'order_deadline' => $deadline,
  453. ] ;
  454. }
  455. return $array ;
  456. }
  457. public function hasSpecificDelays()
  458. {
  459. $daysArray = [
  460. 'monday','tuesday','wednesday','thursday','friday','saturday','sunday'
  461. ] ;
  462. foreach($daysArray as $day) {
  463. $fieldDelay = 'order_delay_'.$day ;
  464. $fieldDeadline = 'order_deadline_'.$day ;
  465. if($this->$fieldDelay || $this->$fieldDeadline) {
  466. return true ;
  467. }
  468. }
  469. return false ;
  470. }
  471. /**
  472. * Retourne le chemin vers le fichier contenant la clé secrète d'API de Payplug
  473. *
  474. * @return string
  475. */
  476. public function getFilenameSecretKeyPayplug()
  477. {
  478. return '../../common/config/payplug/' . $this->id . '.key';
  479. }
  480. /**
  481. * Enregistre la clé secrète d'API de Payplug dans un fichier
  482. */
  483. public function saveSecretKeyPayplug()
  484. {
  485. if ($this->online_payment) {
  486. $handle = fopen($this->getFilenameSecretKeyPayplug(), "w");
  487. fwrite($handle, $this->secret_key_payplug);
  488. fclose($handle);
  489. }
  490. }
  491. /**
  492. * Retourne la clé secrète d'API de Payplug.
  493. *
  494. * @return string
  495. */
  496. public function getSecretKeyPayplug()
  497. {
  498. if (file_exists($this->getFilenameSecretKeyPayplug())) {
  499. $handle = fopen($this->getFilenameSecretKeyPayplug(), "r");
  500. $filesize = filesize($this->getFilenameSecretKeyPayplug());
  501. if ($handle && $filesize) {
  502. $secretKey = fread($handle, $filesize);
  503. fclose($handle);
  504. return $secretKey;
  505. }
  506. }
  507. return '';
  508. }
  509. /**
  510. * Retourne le compte producteur de démonstration.
  511. *
  512. * @return Producer
  513. */
  514. public static function getDemoAccount()
  515. {
  516. $producer = Producer::find()->where('name LIKE \'Démo\'')->one();
  517. return $producer;
  518. }
  519. /**
  520. * Retourne true si le compte est un compte de démo.
  521. *
  522. * @return boolean
  523. */
  524. public function isDemo()
  525. {
  526. if (strpos($this->name, 'Démo') !== false) {
  527. return true;
  528. }
  529. return false;
  530. }
  531. public function getFullAddress($nl2br = false)
  532. {
  533. $address = '' ;
  534. $address .= $this->name."\n" ;
  535. if(strlen($this->address)) {
  536. $address .= $this->address."\n" ;
  537. }
  538. if(strlen($this->postcode) || strlen($this->city)) {
  539. $address .= $this->postcode.' '.$this->city ;
  540. }
  541. if($nl2br) {
  542. $address = nl2br($address) ;
  543. }
  544. return $address ;
  545. }
  546. public function getHtmlLogo()
  547. {
  548. $html = '' ;
  549. if(strlen($this->logo)) {
  550. $html = '<img src="'.$this->getUrlLogo().'" class="producer-logo" />' ;
  551. }
  552. return $html ;
  553. }
  554. public function getUrlLogo()
  555. {
  556. return Yii::$app->urlManagerProducer->getHostInfo().'/'.Yii::$app->urlManagerProducer->baseUrl.'/uploads/'.$this->logo ;
  557. }
  558. public function getEmailOpendistrib()
  559. {
  560. return $this->slug.'@opendistrib.net' ;
  561. }
  562. public function getMainContact()
  563. {
  564. if($this->contact) {
  565. foreach($this->contact as $contact) {
  566. if($contact->is_main_contact) {
  567. return $contact ;
  568. }
  569. }
  570. }
  571. return false ;
  572. }
  573. }