Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

vor 3 Jahren
vor 3 Jahren
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  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. [
  105. ['tiller_provider_token', 'tiller_restaurant_token'],
  106. 'required',
  107. 'when' => function ($model) {
  108. return $model->tiller == true;
  109. }
  110. ],
  111. [
  112. [
  113. 'order_delay',
  114. 'order_deadline',
  115. 'order_delay_monday',
  116. 'order_deadline_monday',
  117. 'order_delay_tuesday',
  118. 'order_deadline_tuesday',
  119. 'order_delay_wednesday',
  120. 'order_deadline_wednesday',
  121. 'order_delay_thursday',
  122. 'order_deadline_thursday',
  123. 'order_delay_friday',
  124. 'order_deadline_friday',
  125. 'order_delay_saturday',
  126. 'order_deadline_saturday',
  127. 'order_delay_sunday',
  128. 'order_deadline_sunday',
  129. 'id_tax_rate_default',
  130. 'document_quotation_duration',
  131. 'option_dashboard_number_distributions'
  132. ],
  133. 'integer'
  134. ],
  135. [
  136. [
  137. 'order_deadline',
  138. 'order_deadline_monday',
  139. 'order_deadline_tuesday',
  140. 'order_deadline_wednesday',
  141. 'order_deadline_thursday',
  142. 'order_deadline_friday',
  143. 'order_deadline_saturday',
  144. 'order_deadline_sunday',
  145. ],
  146. 'in',
  147. 'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
  148. ],
  149. ['order_delay', 'in', 'range' => [1, 2, 3, 4, 5, 6, 7]],
  150. [
  151. 'code',
  152. function ($attribute, $params) {
  153. $code = $this->$attribute;
  154. $producer = Producer::findOne(['code' => $code]);
  155. if ($producer && $producer->id != $this->id) {
  156. $this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
  157. }
  158. }
  159. ],
  160. [
  161. ['document_quotation_prefix', 'document_invoice_prefix', 'document_delivery_note_prefix'],
  162. function ($attribute, $params) {
  163. if (!ctype_upper($this->$attribute)) {
  164. $this->addError($attribute, 'Ne doit contenir que des majuscules');
  165. }
  166. }
  167. ],
  168. [
  169. [
  170. 'description',
  171. 'mentions',
  172. 'gcs',
  173. 'order_infos',
  174. 'slug',
  175. 'secret_key_payplug',
  176. 'background_color_logo',
  177. 'option_behavior_cancel_order',
  178. 'tiller_provider_token',
  179. 'tiller_restaurant_token',
  180. 'status',
  181. 'document_infos_bottom',
  182. 'document_infos_quotation',
  183. 'document_infos_invoice',
  184. 'document_infos_delivery_note',
  185. 'address',
  186. 'behavior_home_point_sale_day_list',
  187. 'behavior_order_select_distribution',
  188. 'option_payment_info',
  189. 'option_order_reference_type',
  190. 'option_order_entry_point',
  191. 'option_stripe_public_key',
  192. 'option_stripe_private_key',
  193. 'option_stripe_endpoint_secret',
  194. 'option_online_payment_type'
  195. ],
  196. 'string'
  197. ],
  198. [
  199. [
  200. 'negative_balance',
  201. 'credit',
  202. 'active',
  203. 'online_payment',
  204. 'user_manage_subscription',
  205. 'option_allow_user_gift',
  206. 'use_credit_checked_default',
  207. 'tiller',
  208. 'document_display_orders_invoice',
  209. 'document_display_orders_delivery_note',
  210. 'document_display_prices_delivery_note',
  211. 'option_email_confirm',
  212. 'option_email_confirm_producer',
  213. 'option_csv_export_all_products',
  214. 'option_csv_export_by_piece',
  215. 'option_export_display_product_reference',
  216. 'option_allow_order_guest',
  217. 'option_delivery',
  218. 'option_display_export_grid',
  219. 'option_stripe_mode_test'
  220. ],
  221. 'boolean'
  222. ],
  223. [
  224. [
  225. 'name',
  226. 'siret',
  227. 'logo',
  228. 'photo',
  229. 'postcode',
  230. 'city',
  231. 'code',
  232. 'type',
  233. 'credit_functioning',
  234. 'option_behavior_cancel_order',
  235. 'document_quotation_prefix',
  236. 'document_quotation_first_reference',
  237. 'document_invoice_prefix',
  238. 'document_invoice_first_reference',
  239. 'document_delivery_note_prefix',
  240. 'document_delivery_note_first_reference'
  241. ],
  242. 'string',
  243. 'max' => 255
  244. ],
  245. [['free_price', 'credit_limit_reminder', 'credit_limit'], 'double'],
  246. [
  247. 'free_price',
  248. 'compare',
  249. 'compareValue' => 0,
  250. 'operator' => '>=',
  251. 'type' => 'number',
  252. 'message' => 'Prix libre doit être supérieur ou égal à 0'
  253. ],
  254. //[['option_dashboard_date_start', 'option_dashboard_date_end'], 'date', 'format' => 'php:d/m/Y'],
  255. [['option_dashboard_date_start', 'option_dashboard_date_end'], 'safe'],
  256. ];
  257. }
  258. /**
  259. * @inheritdoc
  260. */
  261. public function attributeLabels()
  262. {
  263. return [
  264. 'id' => 'ID',
  265. 'name' => 'Nom',
  266. 'siret' => 'Siret',
  267. 'logo' => 'Logo',
  268. 'photo' => 'Photo',
  269. 'description' => 'Description',
  270. 'postcode' => 'Code postal',
  271. 'city' => 'Ville',
  272. 'code' => 'Code',
  273. 'order_delay' => 'Délai de commande',
  274. 'order_deadline' => 'Heure limite de commande',
  275. 'order_delay_monday' => 'Délai de commande (lundi)',
  276. 'order_deadline_monday' => 'Heure limite de commande (lundi)',
  277. 'order_delay_tuesday' => 'Délai de commande (mardi)',
  278. 'order_deadline_tuesday' => 'Heure limite de commande (mardi)',
  279. 'order_delay_wednesday' => 'Délai de commande (mercredi)',
  280. 'order_deadline_wednesday' => 'Heure limite de commande (mercredi)',
  281. 'order_delay_thursday' => 'Délai de commande (jeudi)',
  282. 'order_deadline_thursday' => 'Heure limite de commande (jeudi)',
  283. 'order_delay_friday' => 'Délai de commande (vendredi)',
  284. 'order_deadline_friday' => 'Heure limite de commande (vendredi)',
  285. 'order_delay_saturday' => 'Délai de commande (samedi)',
  286. 'order_deadline_saturday' => 'Heure limite de commande (samedi)',
  287. 'order_delay_sunday' => 'Délai de commande (dimanche)',
  288. 'order_deadline_sunday' => 'Heure limite de commande (dimanche)',
  289. 'negative_balance' => 'Solde négatif',
  290. 'credit' => 'Crédit pain',
  291. 'active' => 'Actif',
  292. 'date_creation' => 'Date de création',
  293. 'order_infos' => 'Informations',
  294. 'slug' => 'Slug',
  295. 'type' => 'Type de producteur',
  296. 'credit_limit_reminder' => 'Seuil de crédit limite avant relance',
  297. 'online_payment' => 'Activer le paiement en ligne (Stripe)',
  298. 'option_online_payment_type' => 'Type de paiement',
  299. 'option_stripe_mode_test' => 'Mode test',
  300. 'option_stripe_public_key' => 'Clé publique',
  301. 'option_stripe_private_key' => 'Clé secrète',
  302. 'option_stripe_endpoint_secret' => 'Clé secrète (endpoint)',
  303. 'user_manage_subscription' => 'Autoriser les utilisateurs à gérer leurs abonnements',
  304. 'mentions' => 'Mentions légales',
  305. 'gcs' => 'Conditions générales de vente',
  306. 'option_allow_user_gift' => 'Autoriser les utilisateurs à effectuer un don à la plateforme lors de leur commande',
  307. 'credit_functioning' => 'Utilisation du Crédit par l\'utilisateur',
  308. 'credit_limit' => 'Crédit limite',
  309. 'use_credit_checked_default' => 'Cocher par défaut l\'option "Utiliser mon crédit" lors de la commande de l\'utilisateur',
  310. 'background_color_logo' => 'Couleur de fond du logo',
  311. 'option_behavior_cancel_order' => 'Comportement lors de la suppression d\'une commande',
  312. 'tiller' => 'Tiller',
  313. 'tiller_provider_token' => 'Token provider',
  314. 'tiller_restaurant_token' => 'Token restaurant',
  315. 'status' => 'Statut',
  316. 'id_tax_rate_default' => 'Taxe',
  317. 'document_quotation_prefix' => 'Préfixe des devis',
  318. 'document_quotation_first_reference' => 'Première référence des devis',
  319. 'document_quotation_duration' => 'Durée du devis',
  320. 'document_invoice_prefix' => 'Préfixe des factures',
  321. 'document_invoice_first_reference' => 'Première référence des factures',
  322. 'document_delivery_note_prefix' => 'Préfixe des bons de livraison',
  323. 'document_delivery_note_first_reference' => 'Première référence des bons de livraison',
  324. 'document_infos_bottom' => 'Informations affichées en bas des documents',
  325. 'document_infos_quotation' => 'Informations affichées en bas des devis',
  326. 'document_infos_invoice' => 'Informations affichées en bas des factures',
  327. 'document_infos_delivery_note' => 'Informations affichées en bas des bons de livraison',
  328. 'address' => 'Adresse',
  329. 'document_display_orders_invoice' => 'Afficher le détail des commandes dans les factures',
  330. 'document_display_orders_delivery_note' => 'Afficher le détail des commandes dans les bons de livraison',
  331. 'document_display_prices_delivery_note' => 'Afficher le chiffrage dans les bons de livraison',
  332. 'behavior_home_point_sale_day_list' => 'Accueil : affichage des jours de distribution',
  333. 'behavior_order_select_distribution' => 'Sélection de la date de distribution',
  334. 'option_payment_info' => 'Informations liées au paiement',
  335. 'option_email_confirm' => 'Envoyer un email de confirmation au client',
  336. 'option_email_confirm_producer' => 'Envoyer un email de confirmation au producteur',
  337. 'option_dashboard_number_distributions' => 'Nombre de distributions affichées sur le tableau de board',
  338. 'option_dashboard_date_start' => 'Date de début',
  339. 'option_dashboard_date_end' => 'Date de fin',
  340. 'option_csv_export_all_products' => 'Exporter tous les produits dans le fichier récapitulatif (CSV)',
  341. 'option_csv_export_by_piece' => 'Exporter les produits par pièce dans le fichier récapitulatif (CSV)',
  342. 'option_order_reference_type' => 'Type de référence',
  343. 'option_export_display_product_reference' => 'Afficher la référence des produits au moment de l\'export',
  344. 'option_allow_order_guest' => 'Autoriser les visiteurs à passer commande (création de compte à la fin du tunnel)',
  345. 'option_order_entry_point' => 'Point d\'entrée par point de vente ou par date',
  346. 'option_delivery' => 'Proposer la livraison à domicile',
  347. 'option_display_export_grid' => 'Afficher l\'export grille dans les distributions'
  348. ];
  349. }
  350. /*
  351. * Relations
  352. */
  353. public function getUserProducer()
  354. {
  355. return $this->hasMany(
  356. UserProducer::className(),
  357. ['id_producer' => 'id']
  358. );
  359. }
  360. public function getUser()
  361. {
  362. return $this->hasMany(User::className(), ['id_producer' => 'id']);
  363. }
  364. public function getContact()
  365. {
  366. return $this->hasMany(User::className(), ['id_producer' => 'id'])
  367. ->where(['status' => User::STATUS_PRODUCER]);
  368. }
  369. public function getTaxRate()
  370. {
  371. return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate_default']);
  372. }
  373. /**
  374. * Retourne les options de base nécessaires à la fonction de recherche.
  375. *
  376. * @return array
  377. */
  378. public static function defaultOptionsSearch()
  379. {
  380. return [
  381. 'with' => ['taxRate'],
  382. 'join_with' => [],
  383. 'orderby' => 'name ASC',
  384. 'attribute_id_producer' => 'id'
  385. ];
  386. }
  387. /**
  388. * Retourne la liste des établissements pour l'initialisation d'une liste
  389. * sélective.
  390. *
  391. * @return array
  392. */
  393. public static function getProducerPopulateDropdown()
  394. {
  395. $producers = Producer::find()
  396. ->where([
  397. 'active' => true,
  398. ])
  399. ->orderBy('postcode, city ASC')
  400. ->all();
  401. $departments = Departments::get();
  402. $dataProducers = [];
  403. $optionsProducers = [];
  404. foreach ($producers as $p) {
  405. $departmentCode = substr($p->postcode, 0, 2);
  406. if (!key_exists('d' . $departmentCode, $dataProducers) && isset($departments[$departmentCode])) {
  407. $dataProducers['d' . $departmentCode] = '<strong>' . $departments[$departmentCode] . '</strong>';
  408. $optionsProducers['d' . $departmentCode] = ['disabled' => true];
  409. }
  410. $dataProducers[$p->id] = '<span class="glyphicon glyphicon-lock"></span> ' . Html::encode(
  411. $p->name
  412. ) . ' - ' . Html::encode($p->postcode) . ' ' . Html::encode(
  413. $p->city
  414. ) . ' <span class="glyphicon glyphicon-lock"></span>';
  415. if (strlen($p->code)) {
  416. $optionsProducers[$p->id] = ['class' => 'lock'];
  417. }
  418. }
  419. return ['data' => $dataProducers, 'options' => $optionsProducers];
  420. }
  421. /**
  422. * Retourne le CA de l'établissement pour un mois donné.
  423. *
  424. * @param string $period
  425. * @param boolean $format
  426. * @return string
  427. */
  428. public function getTurnover($period = '', $format = false)
  429. {
  430. if (!$period) {
  431. $period = date('Y-m');
  432. }
  433. $connection = Yii::$app->getDb();
  434. $command = $connection->createCommand(
  435. '
  436. SELECT SUM(product_order.price * product_order.quantity) AS turnover
  437. FROM `order`, product_order, distribution, product
  438. WHERE `order`.id = product_order.id_order
  439. AND distribution.id_producer = :id_producer
  440. AND `order`.id_distribution = distribution.id
  441. AND product_order.id_product = product.id
  442. AND distribution.date > :date_begin
  443. AND distribution.date < :date_end',
  444. [
  445. ':date_begin' => date('Y-m-31', strtotime("-1 month", strtotime($period))),
  446. ':date_end' => date('Y-m-01', strtotime("+1 month", strtotime($period))),
  447. ':id_producer' => $this->id
  448. ]
  449. );
  450. $result = $command->queryOne();
  451. $turnover = $result['turnover'];
  452. if ($format) {
  453. return number_format($turnover, 2) . ' €';
  454. } else {
  455. return $turnover;
  456. }
  457. }
  458. /**
  459. * Retourne le montant à facturer pour une période donnée.
  460. *
  461. * @param string $periode
  462. * @param float $ca
  463. * @param boolean $format
  464. * @return string
  465. */
  466. public function getMAmountBilled($format = false)
  467. {
  468. if ($format) {
  469. return number_format($this->free_price, 2) . ' €';
  470. } else {
  471. return $this->free_price;
  472. }
  473. }
  474. /**
  475. * Retourne la facture d'une période donnée.
  476. *
  477. * @param string $periode
  478. * @return Facture
  479. */
  480. public function getInvoice($period = '')
  481. {
  482. if (!$period) {
  483. $period = date('Y-m', strtotime('-1 month'));
  484. }
  485. $invoice = Invoice::searchOne(
  486. ['id_producer' => $this->id, 'period' => ':period'],
  487. ['params' => [':period' => $period]]
  488. );
  489. return $invoice;
  490. }
  491. /**
  492. * Retourne la facture du mois dernier.
  493. *
  494. * @return Facture
  495. */
  496. public function getInvoiceLastMonth()
  497. {
  498. return $this->getInvoice(date('Y-m', strtotime('-1 month')));
  499. }
  500. /**
  501. * Retourne une configuration d'un établissement donné.
  502. *
  503. * @param string $config
  504. * @param integer $id_etablissement
  505. * @return mixed
  506. */
  507. public static function getConfig($config = '', $idProducer = 0)
  508. {
  509. if (strlen($config)) {
  510. if (!$idProducer) {
  511. $idProducer = GlobalParam::getCurrentProducerId();
  512. }
  513. $producer = self::findOne($idProducer);
  514. if ($producer) {
  515. return $producer->$config;
  516. }
  517. }
  518. return false;
  519. }
  520. /**
  521. * Retourne le montant de l'abonnement à prix libre définit par
  522. * le producteur.
  523. *
  524. * @param boolean $format
  525. * @return mixed
  526. */
  527. public function getFreePrice($format = true)
  528. {
  529. if (!is_null($this->free_price)) {
  530. if ($format) {
  531. return number_format($this->free_price, 2, ',', false) . ' € HT';
  532. } else {
  533. return $this->free_price;
  534. }
  535. }
  536. }
  537. /**
  538. * Lie un utilisateur à un producteur.
  539. *
  540. * @param integer $id_user
  541. * @param integer $id_producer
  542. * @return UserProducer
  543. */
  544. public static function addUser($idUser, $idProducer, $bookmark = 1)
  545. {
  546. $userProducer = UserProducer::searchOne([
  547. 'user_producer.id_user' => $idUser,
  548. 'user_producer.id_producer' => $idProducer
  549. ]);
  550. if (!$userProducer) {
  551. $newUserProducer = new UserProducer;
  552. $newUserProducer->id_producer = $idProducer;
  553. $newUserProducer->id_user = $idUser;
  554. $newUserProducer->credit = 0;
  555. $newUserProducer->active = 1;
  556. $newUserProducer->bookmark = (int)$bookmark;
  557. $newUserProducer->save();
  558. } else {
  559. if (!$userProducer->active) {
  560. $userProducer->active = 1;
  561. $userProducer->save();
  562. }
  563. }
  564. return $userProducer;
  565. }
  566. public function getSpecificDelays()
  567. {
  568. $array = [];
  569. $daysArray = [
  570. 'monday',
  571. 'tuesday',
  572. 'wednesday',
  573. 'thursday',
  574. 'friday',
  575. 'saturday',
  576. 'sunday'
  577. ];
  578. foreach ($daysArray as $day) {
  579. $fieldDelay = 'order_delay_' . $day;
  580. $fieldDeadline = 'order_deadline_' . $day;
  581. $delay = $this->order_delay;
  582. $deadline = $this->order_deadline;
  583. if ($this->$fieldDelay) {
  584. $delay = $this->$fieldDelay;
  585. }
  586. if ($this->$fieldDeadline) {
  587. $deadline = $this->$fieldDeadline;
  588. }
  589. $array[$day] = [
  590. 'order_delay' => $delay,
  591. 'order_deadline' => $deadline,
  592. ];
  593. }
  594. return $array;
  595. }
  596. public function hasSpecificDelays()
  597. {
  598. $daysArray = [
  599. 'monday',
  600. 'tuesday',
  601. 'wednesday',
  602. 'thursday',
  603. 'friday',
  604. 'saturday',
  605. 'sunday'
  606. ];
  607. foreach ($daysArray as $day) {
  608. $fieldDelay = 'order_delay_' . $day;
  609. $fieldDeadline = 'order_deadline_' . $day;
  610. if ($this->$fieldDelay || $this->$fieldDeadline) {
  611. return true;
  612. }
  613. }
  614. return false;
  615. }
  616. /**
  617. * Retourne le chemin vers le fichier contenant la clé secrète d'API de Stripe
  618. *
  619. * @return string
  620. */
  621. public function getFilenamePrivateKeyApiStripe()
  622. {
  623. return '../../common/config/stripe/api-' . $this->id . '.key';
  624. }
  625. public function getFilenamePrivateKeyEndpointStripe()
  626. {
  627. return '../../common/config/stripe/endpoint-' . $this->id . '.key';
  628. }
  629. public function savePrivateKeyStripe($filename, $value)
  630. {
  631. if (strlen($value) > 0) {
  632. $handle = fopen($filename, "w");
  633. fwrite($handle, $value);
  634. fclose($handle);
  635. }
  636. }
  637. public function savePrivateKeyApiStripe()
  638. {
  639. $this->savePrivateKeyStripe(
  640. $this->getFilenamePrivateKeyApiStripe(),
  641. $this->option_stripe_private_key
  642. );
  643. }
  644. public function savePrivateKeyEndpointStripe()
  645. {
  646. $this->savePrivateKeyStripe(
  647. $this->getFilenamePrivateKeyEndpointStripe(),
  648. $this->option_stripe_endpoint_secret
  649. );
  650. }
  651. /**
  652. * Retourne la clé secrète d'API de Stripe.
  653. *
  654. * @return string
  655. */
  656. public function getPrivateKeyStripe($filename)
  657. {
  658. if (file_exists($filename)) {
  659. $handle = fopen($filename, "r");
  660. $filesize = filesize($filename);
  661. if ($handle && $filesize) {
  662. $secretKey = fread($handle, $filesize);
  663. fclose($handle);
  664. return $secretKey;
  665. }
  666. }
  667. return '';
  668. }
  669. public function getPrivateKeyApiStripe()
  670. {
  671. return $this->getPrivateKeyStripe($this->getFilenamePrivateKeyApiStripe());
  672. }
  673. public function getPrivateKeyEndpointStripe()
  674. {
  675. return $this->getPrivateKeyStripe($this->getFilenamePrivateKeyEndpointStripe());
  676. }
  677. /**
  678. * Retourne le compte producteur de démonstration.
  679. *
  680. * @return Producer
  681. */
  682. public static function getDemoAccount()
  683. {
  684. $producer = Producer::find()->where('name LIKE \'Démo\'')->one();
  685. return $producer;
  686. }
  687. /**
  688. * Retourne true si le compte est un compte de démo.
  689. *
  690. * @return boolean
  691. */
  692. public function isDemo()
  693. {
  694. if (strpos($this->name, 'Démo') !== false) {
  695. return true;
  696. }
  697. return false;
  698. }
  699. public function getFullAddress($nl2br = false)
  700. {
  701. $address = '';
  702. $address .= $this->name . "\n";
  703. if (strlen($this->address)) {
  704. $address .= $this->address . "\n";
  705. }
  706. if (strlen($this->postcode) || strlen($this->city)) {
  707. $address .= $this->postcode . ' ' . $this->city;
  708. }
  709. if ($nl2br) {
  710. $address = nl2br($address);
  711. }
  712. return $address;
  713. }
  714. public function getHtmlLogo()
  715. {
  716. $html = '';
  717. if (strlen($this->logo)) {
  718. $html = '<img src="' . $this->getUrlLogo() . '" class="producer-logo" />';
  719. }
  720. return $html;
  721. }
  722. public function getUrlLogo()
  723. {
  724. return Yii::$app->urlManagerProducer->getHostInfo(
  725. ) . '/' . Yii::$app->urlManagerProducer->baseUrl . '/uploads/' . $this->logo;
  726. }
  727. public function getEmailOpendistrib()
  728. {
  729. return $this->slug . '@opendistrib.net';
  730. }
  731. public function getMainContact()
  732. {
  733. if ($this->contact) {
  734. foreach ($this->contact as $contact) {
  735. if ($contact->is_main_contact) {
  736. return $contact;
  737. }
  738. }
  739. }
  740. return false;
  741. }
  742. public function isOnlinePaymentActive()
  743. {
  744. return $this->online_payment || ($this->option_stripe_mode_test && Yii::$app->user->identity->status > 10);
  745. }
  746. public function isOnlinePaymentActiveAndTypeOrder()
  747. {
  748. return $this->isOnlinePaymentActive() && $this->option_online_payment_type == 'order' ;
  749. }
  750. }