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.

699 satır
30KB

  1. <?php
  2. /**
  3. * Copyright Souke (2018)
  4. *
  5. * contact@souke.fr
  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 domain\Producer\Producer;
  38. use common\components\ActiveRecordCommon;
  39. use domain\Config\TaxRate\TaxRate;
  40. use domain\User\User\User;
  41. use domain\User\UserProducer\UserProducer;
  42. use yii\web\UploadedFile;
  43. use domain\User\UserGroup\UserGroup;
  44. /**
  45. * This is the model class for table "producer".
  46. *
  47. */
  48. class Producer extends ActiveRecordCommon
  49. {
  50. const CREDIT_FUNCTIONING_MANDATORY = 'mandatory';
  51. const CREDIT_FUNCTIONING_OPTIONAL = 'optional';
  52. const CREDIT_FUNCTIONING_USER = 'user';
  53. const HINT_CREDIT_FUNCTIONING =
  54. "- Optionnelle : les utilisateurs choisissent s'ils débitent ou non leur cagnotte. L'éventuel restant à payer est à régler sur place. Le paiement sur place est automatiquement proposé en parallèle.\n
  55. - Obligatoire : tous les utilisateurs payent leurs commandes via la cagnotte. Le paiement sur place et le paiement en ligne ne peuvent pas être proposés en parallèle.\n
  56. - Obligatoire par utilisateur : les utilisateurs avec l'option 'Cagnotte obligatoire' activée au niveau de leur profil payent leurs commandes via la cagnotte. Les autres utilisateurs voient simplement une note explicative au sujet de ce mode de paiement.";
  57. public static $creditFunctioningArray = [
  58. self::CREDIT_FUNCTIONING_OPTIONAL => 'Optionnelle',
  59. self::CREDIT_FUNCTIONING_MANDATORY => 'Obligatoire',
  60. self::CREDIT_FUNCTIONING_USER => 'Obligatoire par utilisateur',
  61. ];
  62. const BEHAVIOR_DELETE_ORDER_DELETE = 'delete';
  63. const BEHAVIOR_DELETE_ORDER_STATUS = 'status';
  64. const BEHAVIOR_HOME_POINT_SALE_DAY_LIST_WEEK = 'days-of-week';
  65. const BEHAVIOR_HOME_POINT_SALE_DAY_LIST_INCOMING_DISTRIBUTIONS = 'incoming-distributions';
  66. const BEHAVIOR_ORDER_SELECT_DISTRIBUTION_CALENDAR = 'calendar';
  67. const BEHAVIOR_ORDER_SELECT_DISTRIBUTION_LIST = 'list';
  68. const ORDER_REFERENCE_TYPE_NONE = '';
  69. const ORDER_REFERENCE_TYPE_YEARLY = 'yearly';
  70. const ORDER_ENTRY_POINT_DATE = 'date';
  71. const ORDER_ENTRY_POINT_POINT_SALE = 'point-sale';
  72. const BILLING_FREQUENCY_MONTHLY = 'monthly';
  73. const BILLING_FREQUENCY_QUARTERLY = 'quarterly';
  74. const BILLING_FREQUENCY_BIANNUAL = 'biannual';
  75. public static $billingFrequencyArray = [
  76. self::BILLING_FREQUENCY_MONTHLY => 'Mensuelle',
  77. self::BILLING_FREQUENCY_QUARTERLY => 'Trimestrielle',
  78. self::BILLING_FREQUENCY_BIANNUAL => 'Biannuelle',
  79. ];
  80. const BILLING_TYPE_CLASSIC = 'classic';
  81. const BILLING_TYPE_FREE_PRICE = 'free-price';
  82. public static $billingTypeArray = [
  83. self::BILLING_TYPE_CLASSIC => 'Classique',
  84. self::BILLING_TYPE_FREE_PRICE => 'Prix libre',
  85. ];
  86. const ONLINE_PAYMENT_MINIMUM_AMOUNT_DEFAULT = 25;
  87. const ORDER_DEADLINE_DEFAULT = 20;
  88. const ORDER_DELAY_DEFAULT = 1;
  89. var $secret_key_payplug;
  90. /**
  91. * @var UploadedFile
  92. */
  93. public $logoFile;
  94. /**
  95. * @var UploadedFile
  96. */
  97. public $photoFile;
  98. /**
  99. * @var UploadedFile
  100. */
  101. public $document_image_bottomFile;
  102. /**
  103. * @inheritdoc
  104. */
  105. public static function tableName()
  106. {
  107. return 'producer';
  108. }
  109. /**
  110. * @inheritdoc
  111. */
  112. public function rules()
  113. {
  114. return [
  115. [['name', 'type', 'id_tax_rate_default'], 'required'],
  116. [
  117. ['tiller_provider_token', 'tiller_restaurant_token'],
  118. 'required',
  119. 'when' => function ($model) {
  120. return $model->tiller == true;
  121. }
  122. ],
  123. [['logoFile', 'photoFile', 'document_image_bottomFile'], 'file', 'extensions' => 'png, jpg, jpeg', 'mimeTypes' => 'image/png, image/jpeg'],
  124. [
  125. [
  126. 'order_delay',
  127. 'order_deadline',
  128. 'order_delay_monday',
  129. 'order_deadline_monday',
  130. 'order_delay_tuesday',
  131. 'order_deadline_tuesday',
  132. 'order_delay_wednesday',
  133. 'order_deadline_wednesday',
  134. 'order_delay_thursday',
  135. 'order_deadline_thursday',
  136. 'order_delay_friday',
  137. 'order_deadline_friday',
  138. 'order_delay_saturday',
  139. 'order_deadline_saturday',
  140. 'order_delay_sunday',
  141. 'order_deadline_sunday',
  142. 'id_tax_rate_default',
  143. 'document_quotation_duration',
  144. 'option_dashboard_number_distributions',
  145. 'option_online_payment_minimum_amount',
  146. 'option_document_price_decimals',
  147. 'option_billing_reduction_percentage',
  148. 'dolibarr_socid',
  149. 'dolibarr_product_id',
  150. 'option_weeks_distributions_activated_in_advance',
  151. 'option_document_width_logo',
  152. 'export_shopping_cart_labels_number_per_column',
  153. 'id_user_group_default',
  154. 'sponsored_by'
  155. ],
  156. 'integer'
  157. ],
  158. [
  159. [
  160. 'order_deadline',
  161. 'order_deadline_monday',
  162. 'order_deadline_tuesday',
  163. 'order_deadline_wednesday',
  164. 'order_deadline_thursday',
  165. 'order_deadline_friday',
  166. 'order_deadline_saturday',
  167. 'order_deadline_sunday',
  168. ],
  169. 'in',
  170. 'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
  171. ],
  172. ['order_delay', 'in', 'range' => [1, 2, 3, 4, 5, 6, 7]],
  173. ['option_csv_separator', 'in', 'range' => [',', ';']],
  174. [
  175. 'code',
  176. function ($attribute, $params) {
  177. $code = $this->$attribute;
  178. $producer = Producer::findOne(['code' => $code]);
  179. if ($producer && $producer->id != $this->id) {
  180. $this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
  181. }
  182. }
  183. ],
  184. /*[
  185. ['document_quotation_prefix', 'document_invoice_prefix', 'document_delivery_note_prefix'],
  186. function ($attribute, $params) {
  187. if (!ctype_upper($this->$attribute)) {
  188. $this->addError($attribute, 'Ne doit contenir que des majuscules');
  189. }
  190. }
  191. ],*/
  192. [
  193. [
  194. 'description',
  195. 'mentions',
  196. 'gcs',
  197. 'order_infos',
  198. 'slug',
  199. 'secret_key_payplug',
  200. 'background_color_logo',
  201. 'option_behavior_cancel_order',
  202. 'tiller_provider_token',
  203. 'tiller_restaurant_token',
  204. 'status',
  205. 'document_infos_top',
  206. 'document_infos_bottom',
  207. 'document_infos_quotation',
  208. 'document_infos_invoice',
  209. 'document_infos_delivery_note',
  210. 'address',
  211. 'behavior_home_point_sale_day_list',
  212. 'behavior_order_select_distribution',
  213. 'option_payment_info',
  214. 'option_order_reference_type',
  215. 'option_order_entry_point',
  216. 'option_stripe_public_key',
  217. 'option_stripe_private_key',
  218. 'option_stripe_endpoint_secret',
  219. 'option_online_payment_type',
  220. 'option_tax_calculation_method',
  221. 'latest_version_opendistrib',
  222. 'option_csv_separator',
  223. 'option_point_sale_wording',
  224. 'option_testimony',
  225. 'contact_email',
  226. 'admin_comment',
  227. 'export_shopping_cart_labels_format',
  228. 'document_image_bottom',
  229. 'website',
  230. 'tiller_api_version',
  231. 'tiller_client_id',
  232. 'tiller_client_secret',
  233. 'tiller_access_token',
  234. 'tiller_refresh_token',
  235. 'tiller_redirect_uri',
  236. 'tiller_store_id',
  237. 'option_main_color',
  238. 'option_newsletter_description',
  239. 'option_leave_period_message_title',
  240. 'option_leave_period_message',
  241. 'option_credit_description',
  242. 'sponsorship_code',
  243. 'option_communicate_email_default_subject',
  244. 'option_communicate_email_default_message',
  245. ],
  246. 'string'
  247. ],
  248. [
  249. [
  250. 'negative_balance',
  251. 'credit',
  252. 'active',
  253. 'online_payment',
  254. 'user_manage_subscription',
  255. 'option_allow_user_gift',
  256. 'use_credit_checked_default',
  257. 'tiller',
  258. 'document_display_orders_invoice',
  259. 'document_display_orders_delivery_note',
  260. 'document_display_prices_delivery_note',
  261. 'document_display_product_description',
  262. 'option_email_confirm',
  263. 'option_email_confirm_producer',
  264. 'option_csv_export_all_products',
  265. 'option_csv_export_by_piece',
  266. 'option_export_display_product_reference',
  267. 'option_allow_order_guest',
  268. 'option_delivery',
  269. 'option_distribution_export_shopping_cart_labels_pdf',
  270. 'option_distribution_export_total_products_csv',
  271. 'option_distribution_export_orders1_csv',
  272. 'option_distribution_export_orders2_csv',
  273. 'option_distribution_export_orders_pdf',
  274. 'option_distribution_export_orders_grid_pdf',
  275. 'option_stripe_mode_test',
  276. 'option_notify_producer_order_summary',
  277. 'option_billing_reduction',
  278. 'option_export_evoliz',
  279. 'option_display_message_new_opendistrib_version',
  280. 'option_billing_permanent_transfer',
  281. 'option_export_display_column_delivery_note',
  282. 'option_invoice_only_based_on_delivery_notes',
  283. 'option_document_display_price_unit_reference',
  284. 'option_check_by_default_prevent_user_credit',
  285. 'delivery_note_automatic_validation',
  286. 'is_new',
  287. 'agree_contact_about_software_development',
  288. 'option_leave_period_message_display',
  289. 'sponsorship_sponsor_reward',
  290. 'sponsorship_godson_reward',
  291. ],
  292. 'boolean'
  293. ],
  294. [
  295. [
  296. 'name',
  297. 'siret',
  298. 'logo',
  299. 'photo',
  300. 'document_image_bottom',
  301. 'postcode',
  302. 'city',
  303. 'code',
  304. 'type',
  305. 'credit_functioning',
  306. 'option_behavior_cancel_order',
  307. 'document_quotation_prefix',
  308. 'document_quotation_first_reference',
  309. 'document_invoice_prefix',
  310. 'document_invoice_first_reference',
  311. 'document_delivery_note_prefix',
  312. 'document_delivery_note_first_reference',
  313. 'option_billing_type',
  314. 'option_billing_frequency',
  315. 'option_point_sale_wording',
  316. ],
  317. 'string',
  318. 'max' => 255
  319. ],
  320. [[
  321. 'free_price',
  322. 'credit_limit_reminder',
  323. 'credit_limit',
  324. 'option_billing_permanent_transfer_amount',
  325. 'latitude',
  326. 'longitude',
  327. 'option_time_saved'
  328. ], 'double'],
  329. [
  330. 'free_price',
  331. 'compare',
  332. 'compareValue' => 0,
  333. 'operator' => '>=',
  334. 'type' => 'number',
  335. 'message' => 'Prix libre doit être supérieur ou égal à 0'
  336. ],
  337. [[
  338. 'option_dashboard_date_start',
  339. 'option_dashboard_date_end',
  340. 'option_leave_period_start',
  341. 'option_leave_period_end',
  342. 'alert_message_read_at'
  343. ], 'safe'],
  344. [
  345. ['option_leave_period_start', 'option_leave_period_end'],
  346. 'required',
  347. 'when' => function ($model) {
  348. return $model->option_leave_period_start || $model->option_leave_period_end;
  349. }
  350. ],
  351. [
  352. 'option_leave_period_start',
  353. function ($attribute, $params) {
  354. if($this->option_leave_period_start
  355. && $this->option_leave_period_end) {
  356. $leavePeriodStart = strtotime(str_replace('/', '-', $this->option_leave_period_start));
  357. $leavePeriodEnd = strtotime(str_replace('/', '-', $this->option_leave_period_end));
  358. if($leavePeriodStart > $leavePeriodEnd) {
  359. $this->addError($attribute, "La date de début de vos congés ne peut pas être après la date de fin.");
  360. }
  361. }
  362. }
  363. ],
  364. [
  365. 'option_leave_period_end',
  366. function ($attribute, $params) {
  367. if($this->option_leave_period_start
  368. && $this->option_leave_period_end) {
  369. $leavePeriodStart = strtotime(str_replace('/', '-', $this->option_leave_period_start));
  370. $leavePeriodEnd = strtotime(str_replace('/', '-', $this->option_leave_period_end));
  371. if($leavePeriodEnd < $leavePeriodStart) {
  372. $this->addError($attribute, "La date de fin de vos congés ne peut pas être avant la date de début.");
  373. }
  374. }
  375. }
  376. ],
  377. ];
  378. }
  379. /**
  380. * @inheritdoc
  381. */
  382. public function attributeLabels()
  383. {
  384. return [
  385. 'id' => 'ID',
  386. 'name' => 'Nom',
  387. 'siret' => 'Siret',
  388. 'logoFile' => 'Logo',
  389. 'photoFile' => 'Bannière',
  390. 'description' => 'Description',
  391. 'postcode' => 'Code postal',
  392. 'city' => 'Ville',
  393. 'code' => "Code d'accès",
  394. 'order_delay' => 'Délai de commande',
  395. 'order_deadline' => 'Heure limite de commande',
  396. 'order_delay_monday' => 'Délai de commande (lundi)',
  397. 'order_deadline_monday' => 'Heure limite de commande (lundi)',
  398. 'order_delay_tuesday' => 'Délai de commande (mardi)',
  399. 'order_deadline_tuesday' => 'Heure limite de commande (mardi)',
  400. 'order_delay_wednesday' => 'Délai de commande (mercredi)',
  401. 'order_deadline_wednesday' => 'Heure limite de commande (mercredi)',
  402. 'order_delay_thursday' => 'Délai de commande (jeudi)',
  403. 'order_deadline_thursday' => 'Heure limite de commande (jeudi)',
  404. 'order_delay_friday' => 'Délai de commande (vendredi)',
  405. 'order_deadline_friday' => 'Heure limite de commande (vendredi)',
  406. 'order_delay_saturday' => 'Délai de commande (samedi)',
  407. 'order_deadline_saturday' => 'Heure limite de commande (samedi)',
  408. 'order_delay_sunday' => 'Délai de commande (dimanche)',
  409. 'order_deadline_sunday' => 'Heure limite de commande (dimanche)',
  410. 'negative_balance' => 'Solde négatif',
  411. 'credit' => 'Cagnotte',
  412. 'active' => 'Actif',
  413. 'date_creation' => 'Date de création',
  414. 'order_infos' => 'Informations',
  415. 'slug' => 'Slug',
  416. 'type' => 'Type de producteur',
  417. 'credit_limit_reminder' => 'Seuil de cagnotte limite avant relance',
  418. 'online_payment' => 'Activer le paiement en ligne (Stripe)',
  419. 'option_online_payment_type' => 'Type de paiement',
  420. 'option_stripe_mode_test' => 'Mode test',
  421. 'option_stripe_public_key' => 'Clé publique',
  422. 'option_stripe_private_key' => 'Clé secrète',
  423. 'option_stripe_endpoint_secret' => 'Clé secrète (endpoint)',
  424. 'user_manage_subscription' => 'Autoriser les utilisateurs à gérer leurs abonnements',
  425. 'mentions' => 'Mentions légales',
  426. 'gcs' => 'Conditions générales de vente',
  427. 'option_allow_user_gift' => 'Autoriser les utilisateurs à effectuer un don à la plateforme lors de leur commande',
  428. 'credit_functioning' => 'Fonctionnement de la cagnotte',
  429. 'credit_limit' => 'Cagnotte : montant limite',
  430. 'use_credit_checked_default' => 'Sélectionner par défaut le mode de paiement "Cagnotte" lors de la commande de l\'utilisateur (en fonctionnement optionnel)',
  431. 'background_color_logo' => 'Couleur de fond du logo',
  432. 'option_behavior_cancel_order' => 'Comportement lors de la suppression d\'une commande',
  433. 'tiller' => 'Tiller',
  434. 'tiller_provider_token' => 'Token provider',
  435. 'tiller_restaurant_token' => 'Token restaurant',
  436. 'status' => 'Statut',
  437. 'id_tax_rate_default' => 'Taxe',
  438. 'document_quotation_prefix' => 'Préfixe des devis',
  439. 'document_quotation_first_reference' => 'Première référence des devis',
  440. 'document_quotation_duration' => 'Durée du devis',
  441. 'document_invoice_prefix' => 'Préfixe des factures',
  442. 'document_invoice_first_reference' => 'Première référence des factures',
  443. 'document_delivery_note_prefix' => 'Préfixe des bons de livraison',
  444. 'document_delivery_note_first_reference' => 'Première référence des bons de livraison',
  445. 'document_infos_top' => 'Informations affichées en haut des documents',
  446. 'document_infos_bottom' => 'Informations affichées en bas des documents',
  447. 'document_image_bottomFile' => "Image affichée en bas des documents",
  448. 'document_infos_quotation' => 'Informations affichées en bas des devis',
  449. 'document_infos_invoice' => 'Informations affichées en bas des factures',
  450. 'document_infos_delivery_note' => 'Informations affichées en bas des bons de livraison',
  451. 'address' => 'Adresse',
  452. 'document_display_orders_invoice' => 'Afficher le détail des commandes dans les factures',
  453. 'document_display_orders_delivery_note' => 'Afficher le détail des commandes dans les bons de livraison',
  454. 'document_display_prices_delivery_note' => 'Afficher le chiffrage dans les bons de livraison',
  455. 'behavior_home_point_sale_day_list' => 'Accueil : affichage des jours de distribution',
  456. 'behavior_order_select_distribution' => 'Sélection de la date de distribution',
  457. 'option_payment_info' => 'Informations liées au paiement',
  458. 'option_email_confirm' => 'Envoyer un email de confirmation au client',
  459. 'option_email_confirm_producer' => 'Envoyer un email de confirmation au producteur',
  460. 'option_dashboard_number_distributions' => 'Nombre de distributions affichées sur le tableau de board',
  461. 'option_dashboard_date_start' => 'Date de début',
  462. 'option_dashboard_date_end' => 'Date de fin',
  463. 'option_export_display_column_delivery_note' => "Commandes (PDF) : afficher une colonne bon de livraison",
  464. 'option_csv_export_all_products' => "Commandes #1 (CSV) : exporter tous les produits",
  465. 'option_csv_export_by_piece' => 'Commandes #1 (CSV) : exporter les produits par pièce',
  466. 'option_order_reference_type' => 'Type de référence',
  467. 'option_export_display_product_reference' => 'Afficher la référence des produits au moment de l\'export',
  468. 'option_allow_order_guest' => 'Autoriser les visiteurs à passer commande (création de compte à la fin du tunnel)',
  469. 'option_order_entry_point' => 'Point d\'entrée par point de vente ou par date',
  470. 'option_delivery' => 'Proposer la livraison à domicile',
  471. 'option_distribution_export_shopping_cart_labels_pdf' => 'Étiquettes (PDF)',
  472. 'option_distribution_export_total_products_csv' => 'Totaux produits (CSV)',
  473. 'option_distribution_export_orders1_csv' => 'Commandes 1 (CSV)',
  474. 'option_distribution_export_orders2_csv' => 'Commandes 2 (CSV)',
  475. 'option_distribution_export_orders_pdf' => 'Commandes (PDF)',
  476. 'option_distribution_export_orders_grid_pdf' => 'Commandes grille (PDF)',
  477. 'document_display_product_description' => 'Documents : afficher la description des produits',
  478. 'option_notify_producer_order_summary' => 'Recevoir les récapitulatifs de commande par email',
  479. 'option_billing_type' => 'Type de facturation',
  480. 'option_billing_frequency' => 'Fréquence de facturation',
  481. 'option_billing_reduction' => 'Réduction appliquée au moment de la facturation',
  482. 'option_tax_calculation_method' => 'Méthode de calcul de la TVA',
  483. 'option_export_evoliz' => 'Activer l\'export vers Evoliz',
  484. 'latest_version_opendistrib' => 'Dernière version de Souke',
  485. 'option_csv_separator' => 'Séparateur de colonnes (CSV)',
  486. 'option_display_message_new_opendistrib_version' => 'Afficher les messages de mise à jour du logiciel Souke',
  487. 'option_online_payment_minimum_amount' => 'Paiement en ligne : montant minimum',
  488. 'option_document_price_decimals' => 'Prix : nombre de décimales affichées',
  489. 'option_billing_reduction_percentage' => 'Réduction : pourcentage',
  490. 'option_billing_permanent_transfer' => 'Virement permanent',
  491. 'option_billing_permanent_transfer_amount' => 'Virement permanent : montant',
  492. 'option_point_sale_wording' => 'Libellé points de vente',
  493. 'latitude' => 'Latitude',
  494. 'longitude' => 'Longitude',
  495. 'option_testimony' => 'Témoignage',
  496. 'option_time_saved' => 'Temps gagné / semaine',
  497. 'contact_email' => 'Email de contact',
  498. 'admin_comment' => 'Commentaire',
  499. 'dolibarr_socid' => 'Dolibarr : id user',
  500. 'dolibarr_product_id' => 'Dolibarr : id produit',
  501. 'option_weeks_distributions_activated_in_advance' => "Semaines de distributions à activer à l'avance",
  502. 'option_invoice_only_based_on_delivery_notes' => 'Facturer uniquement sur la base des bons de livraison',
  503. 'option_document_width_logo' => 'Largeur du logo dans les documents',
  504. 'export_shopping_cart_labels_number_per_column' => "Étiquettes (PDF) : nombre d'étiquettes par colonne",
  505. 'export_shopping_cart_labels_format' => 'Étiquettes (PDF) : format',
  506. 'option_document_display_price_unit_reference' => "Afficher les prix au kilogramme",
  507. 'id_user_group_default' => "Groupe utilisateur par défaut attribué à l'inscription",
  508. 'option_check_by_default_prevent_user_credit' => "Par défaut, prévenir l'utilisateur quand on crédite sa cagnotte",
  509. 'delivery_note_automatic_validation' => 'Validation automatique des bons de livraison',
  510. 'website' => 'Site web',
  511. 'option_leave_period_start' => 'Prochains congés : date de début',
  512. 'option_leave_period_end' => 'Prochains congés : date de fin',
  513. 'tiller_api_version' => 'Tiller : version API',
  514. 'tiller_client_id' => 'Tiller : client ID',
  515. 'tiller_client_secret' => 'Tiller : client secret',
  516. 'tiller_access_token' => 'Tiller : access token',
  517. 'tiller_refresh_token' => 'Tiller : refresh token',
  518. 'tiller_redirect_uri' => 'Tiller : callback URL',
  519. 'tiller_store_id' => 'Tiller : store ID',
  520. 'is_new' => 'Nouveau',
  521. 'agree_contact_about_software_development' => "J'accepte d'être contacté dans le cadre de l'amélioration du logiciel",
  522. 'option_main_color' => 'Couleur principale',
  523. 'option_newsletter_description' => 'Description infolettre',
  524. 'option_leave_period_message_display' => 'Afficher le message des congés',
  525. 'option_leave_period_message_title' => 'Titre du message des congés',
  526. 'option_leave_period_message' => 'Message des congés',
  527. 'option_credit_description' => "Description Cagnotte",
  528. 'sponsorship_sponsor_reward' => 'Récompense parrain',
  529. 'option_communicate_email_default_subject' => 'Sujet par défaut',
  530. 'option_communicate_email_default_message' => 'Message par défaut',
  531. ];
  532. }
  533. public function getName(): string
  534. {
  535. return $this->name;
  536. }
  537. public function getSponsorshipCode(): string
  538. {
  539. return $this->sponsorship_code;
  540. }
  541. public function setSponsorshipCode(string $sponsorshipCode): self
  542. {
  543. $this->sponsorship_code = $sponsorshipCode;
  544. return $this;
  545. }
  546. public function getSponsoredBy(): ?Producer
  547. {
  548. return $this->sponsoredByRelation;
  549. }
  550. public function setSponsoredBy(Producer $producer): self
  551. {
  552. $this->populateFieldObject('sponsored_by', 'sponsoredByRelation', $producer);
  553. return $this;
  554. }
  555. public function getSponsorshipSponsorReward(): ?bool
  556. {
  557. return $this->sponsorship_sponsor_reward;
  558. }
  559. public function setSponsorshipSponsorReward(bool $sponsorshipSponsorReward = null): self
  560. {
  561. $this->sponsorship_sponsor_reward = $sponsorshipSponsorReward;
  562. return $this;
  563. }
  564. public function getSponsorshipGodsonReward(): ?bool
  565. {
  566. return $this->sponsorship_godson_reward;
  567. }
  568. public function setSponsorshipGodsonReward(bool $sponsorshipGodsonReward = null): self
  569. {
  570. $this->sponsorship_godson_reward = $sponsorshipGodsonReward;
  571. return $this;
  572. }
  573. public function getAlertMessageReadAt(): ?\DateTime
  574. {
  575. if($this->alert_message_read_at) {
  576. return new \DateTime($this->alert_message_read_at);
  577. }
  578. return null;
  579. }
  580. public function setAlertMessageReadAt(\DateTime $alertMessageReadAt): self
  581. {
  582. $this->alert_message_read_at = $alertMessageReadAt->format('Y-m-d H:i:s');
  583. return $this;
  584. }
  585. /*
  586. * Relations
  587. */
  588. public function getUserProducer()
  589. {
  590. return $this->hasMany(UserProducer::class, ['id_producer' => 'id']);
  591. }
  592. public function getUser()
  593. {
  594. return $this->hasMany(User::class, ['id_producer' => 'id']);
  595. }
  596. public function getContact()
  597. {
  598. return $this->hasMany(User::class, ['id_producer' => 'id'])
  599. ->where(['status' => User::STATUS_PRODUCER]);
  600. }
  601. public function getTaxRate()
  602. {
  603. return $this->hasOne(TaxRate::class, ['id' => 'id_tax_rate_default']);
  604. }
  605. public function populateTaxRate(TaxRate $taxRate): void
  606. {
  607. $this->populateFieldObject('id_tax_rate', 'taxRate', $taxRate);
  608. }
  609. public function getUserGroupDefault()
  610. {
  611. return $this->hasOne(UserGroup::class, ['id' => 'id_user_group_default']);
  612. }
  613. public function populateUserGroupDefault(UserGroup $userGroup)
  614. {
  615. $this->populateFieldObject('id_user_group_default', 'userGroupDefault', $userGroup);
  616. }
  617. public function getSponsoredByRelation()
  618. {
  619. return $this->hasOne(Producer::class, ['id' => 'sponsored_by']);
  620. }
  621. // ---
  622. public static function getBillingTypePopulateDropdown()
  623. {
  624. return self::$billingTypeArray;
  625. }
  626. public static function getBillingFrequencyPopulateDropdown()
  627. {
  628. return self::$billingFrequencyArray;
  629. }
  630. public function isDemoAccount(): bool
  631. {
  632. if (strpos($this->getName(), 'Démo') !== false) {
  633. return true;
  634. }
  635. return false;
  636. }
  637. public function getShortShopUrl(): string
  638. {
  639. return 'https://'.$this->slug.'.souke.fr';
  640. }
  641. public function getLoginSignupUrl(): string
  642. {
  643. return \Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/producer', 'id' => $this->id]);
  644. }
  645. }