<?php

/**
 * Copyright Souke (2018)
 *
 * contact@souke.fr
 *
 * Ce logiciel est un programme informatique servant à aider les producteurs
 * à distribuer leur production en circuits courts.
 *
 * Ce logiciel est régi par la licence CeCILL soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
 * sur le site "http://www.cecill.info".
 *
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 *
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 *
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
 * pris connaissance de la licence CeCILL, et que vous en avez accepté les
 * termes.
 */

namespace domain\Producer\Producer;

use common\components\ActiveRecordCommon;
use domain\Config\TaxRate\TaxRate;
use domain\User\User\User;
use domain\User\UserProducer\UserProducer;
use yii\web\UploadedFile;

use domain\User\UserGroup\UserGroup;

/**
 * This is the model class for table "producer".
 *
 */
class Producer extends ActiveRecordCommon
{
    const CREDIT_FUNCTIONING_MANDATORY = 'mandatory';
    const CREDIT_FUNCTIONING_OPTIONAL = 'optional';
    const CREDIT_FUNCTIONING_USER = 'user';

    const HINT_CREDIT_FUNCTIONING =
"- 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
- 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
- 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.";

    public static $creditFunctioningArray = [
        self::CREDIT_FUNCTIONING_OPTIONAL => 'Optionnelle',
        self::CREDIT_FUNCTIONING_MANDATORY => 'Obligatoire',
        self::CREDIT_FUNCTIONING_USER => 'Obligatoire par utilisateur',
    ];

    const BEHAVIOR_DELETE_ORDER_DELETE = 'delete';
    const BEHAVIOR_DELETE_ORDER_STATUS = 'status';

    const BEHAVIOR_HOME_POINT_SALE_DAY_LIST_WEEK = 'days-of-week';
    const BEHAVIOR_HOME_POINT_SALE_DAY_LIST_INCOMING_DISTRIBUTIONS = 'incoming-distributions';

    const BEHAVIOR_ORDER_SELECT_DISTRIBUTION_CALENDAR = 'calendar';
    const BEHAVIOR_ORDER_SELECT_DISTRIBUTION_LIST = 'list';

    const ORDER_REFERENCE_TYPE_NONE = '';
    const ORDER_REFERENCE_TYPE_YEARLY = 'yearly';

    const ORDER_ENTRY_POINT_DATE = 'date';
    const ORDER_ENTRY_POINT_POINT_SALE = 'point-sale';

    const BILLING_FREQUENCY_MONTHLY = 'monthly';
    const BILLING_FREQUENCY_QUARTERLY = 'quarterly';
    const BILLING_FREQUENCY_BIANNUAL = 'biannual';

    public static $billingFrequencyArray = [
        self::BILLING_FREQUENCY_MONTHLY => 'Mensuelle',
        self::BILLING_FREQUENCY_QUARTERLY => 'Trimestrielle',
        self::BILLING_FREQUENCY_BIANNUAL => 'Biannuelle',
    ];

    const BILLING_TYPE_CLASSIC = 'classic';
    const BILLING_TYPE_FREE_PRICE = 'free-price';

    public static $billingTypeArray = [
        self::BILLING_TYPE_CLASSIC => 'Classique',
        self::BILLING_TYPE_FREE_PRICE => 'Prix libre',
    ];

    const ONLINE_PAYMENT_MINIMUM_AMOUNT_DEFAULT = 25;

    const ORDER_DEADLINE_DEFAULT = 20;
    const ORDER_DELAY_DEFAULT = 1;

    var $secret_key_payplug;

    /**
     * @var UploadedFile
     */
    public $logoFile;
    /**
     * @var UploadedFile
     */
    public $photoFile;

    /**
     * @var UploadedFile
     */
    public $document_image_bottomFile;

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'producer';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name', 'type', 'id_tax_rate_default'], 'required'],
            [
                ['tiller_provider_token', 'tiller_restaurant_token'],
                'required',
                'when' => function ($model) {
                    return $model->tiller == true;
                }
            ],
            [['logoFile', 'photoFile', 'document_image_bottomFile'], 'file', 'extensions' => 'png, jpg, jpeg', 'mimeTypes' => 'image/png, image/jpeg'],
            [
                [
                    'order_delay',
                    'order_deadline',
                    'order_delay_monday',
                    'order_deadline_monday',
                    'order_delay_tuesday',
                    'order_deadline_tuesday',
                    'order_delay_wednesday',
                    'order_deadline_wednesday',
                    'order_delay_thursday',
                    'order_deadline_thursday',
                    'order_delay_friday',
                    'order_deadline_friday',
                    'order_delay_saturday',
                    'order_deadline_saturday',
                    'order_delay_sunday',
                    'order_deadline_sunday',
                    'id_tax_rate_default',
                    'document_quotation_duration',
                    'option_dashboard_number_distributions',
                    'option_online_payment_minimum_amount',
                    'option_document_price_decimals',
                    'option_billing_reduction_percentage',
                    'dolibarr_socid',
                    'dolibarr_product_id',
                    'option_weeks_distributions_activated_in_advance',
                    'option_document_width_logo',
                    'export_shopping_cart_labels_number_per_column',
                    'id_user_group_default',
                    'sponsored_by'
                ],
                'integer'
            ],
            [
                [
                    'order_deadline',
                    'order_deadline_monday',
                    'order_deadline_tuesday',
                    'order_deadline_wednesday',
                    'order_deadline_thursday',
                    'order_deadline_friday',
                    'order_deadline_saturday',
                    'order_deadline_sunday',
                ],
                'in',
                'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
            ],
            ['order_delay', 'in', 'range' => [1, 2, 3, 4, 5, 6, 7]],
            ['option_csv_separator', 'in', 'range' => [',', ';']],
            [
                'code',
                function ($attribute, $params) {
                    $code = $this->$attribute;
                    $producer = Producer::findOne(['code' => $code]);
                    if ($producer && $producer->id != $this->id) {
                        $this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
                    }
                }
            ],
            /*[
                ['document_quotation_prefix', 'document_invoice_prefix', 'document_delivery_note_prefix'],
                function ($attribute, $params) {
                    if (!ctype_upper($this->$attribute)) {
                        $this->addError($attribute, 'Ne doit contenir que des majuscules');
                    }
                }
            ],*/
            [
                [
                    'description',
                    'mentions',
                    'gcs',
                    'order_infos',
                    'slug',
                    'secret_key_payplug',
                    'background_color_logo',
                    'option_behavior_cancel_order',
                    'tiller_provider_token',
                    'tiller_restaurant_token',
                    'status',
                    'document_infos_top',
                    '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',
                    'option_stripe_public_key',
                    'option_stripe_private_key',
                    'option_stripe_endpoint_secret',
                    'option_online_payment_type',
                    'option_tax_calculation_method',
                    'latest_version_opendistrib',
                    'option_csv_separator',
                    'option_point_sale_wording',
                    'option_testimony',
                    'contact_email',
                    'admin_comment',
                    'export_shopping_cart_labels_format',
                    'document_image_bottom',
                    'website',
                    'tiller_api_version',
                    'tiller_client_id',
                    'tiller_client_secret',
                    'tiller_access_token',
                    'tiller_refresh_token',
                    'tiller_redirect_uri',
                    'tiller_store_id',
                    'option_main_color',
                    'option_newsletter_description',
                    'option_leave_period_message_title',
                    'option_leave_period_message',
                    'option_credit_description',
                    'sponsorship_code',
                    'option_communicate_email_default_subject',
                    'option_communicate_email_default_message',
                ],
                'string'
            ],
            [
                [
                    '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',
                    'document_display_product_description',
                    '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_distribution_export_shopping_cart_labels_pdf',
                    'option_distribution_export_total_products_csv',
                    'option_distribution_export_orders1_csv',
                    'option_distribution_export_orders2_csv',
                    'option_distribution_export_orders_pdf',
                    'option_distribution_export_orders_grid_pdf',
                    'option_stripe_mode_test',
                    'option_notify_producer_order_summary',
                    'option_billing_reduction',
                    'option_export_evoliz',
                    'option_display_message_new_opendistrib_version',
                    'option_billing_permanent_transfer',
                    'option_export_display_column_delivery_note',
                    'option_invoice_only_based_on_delivery_notes',
                    'option_document_display_price_unit_reference',
                    'option_check_by_default_prevent_user_credit',
                    'delivery_note_automatic_validation',
                    'is_new',
                    'agree_contact_about_software_development',
                    'option_leave_period_message_display',
                    'sponsorship_sponsor_reward',
                    'sponsorship_godson_reward',
                ],
                'boolean'
            ],
            [
                [
                    'name',
                    'siret',
                    'logo',
                    'photo',
                    'document_image_bottom',
                    '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',
                    'option_billing_type',
                    'option_billing_frequency',
                    'option_point_sale_wording',
                ],
                'string',
                'max' => 255
            ],
            [[
                'free_price',
                'credit_limit_reminder',
                'credit_limit',
                'option_billing_permanent_transfer_amount',
                'latitude',
                'longitude',
                'option_time_saved'
            ], 'double'],
            [
                'free_price',
                'compare',
                'compareValue' => 0,
                'operator' => '>=',
                'type' => 'number',
                'message' => 'Prix libre doit être supérieur ou égal à 0'
            ],
            [[
                'option_dashboard_date_start',
                'option_dashboard_date_end',
                'option_leave_period_start',
                'option_leave_period_end',
                'alert_message_read_at'
            ], 'safe'],
            [
                ['option_leave_period_start', 'option_leave_period_end'],
                'required',
                'when' => function ($model) {
                    return $model->option_leave_period_start || $model->option_leave_period_end;
                }
            ],
            [
                'option_leave_period_start',
                function ($attribute, $params) {
                    if($this->option_leave_period_start
                        && $this->option_leave_period_end) {
                        $leavePeriodStart = strtotime(str_replace('/', '-', $this->option_leave_period_start));
                        $leavePeriodEnd = strtotime(str_replace('/', '-', $this->option_leave_period_end));
                        if($leavePeriodStart > $leavePeriodEnd) {
                            $this->addError($attribute, "La date de début de vos congés ne peut pas être après la date de fin.");
                        }
                    }
                }
            ],
            [
                'option_leave_period_end',
                function ($attribute, $params) {
                    if($this->option_leave_period_start
                        && $this->option_leave_period_end) {
                        $leavePeriodStart = strtotime(str_replace('/', '-', $this->option_leave_period_start));
                        $leavePeriodEnd = strtotime(str_replace('/', '-', $this->option_leave_period_end));
                        if($leavePeriodEnd < $leavePeriodStart) {
                            $this->addError($attribute, "La date de fin de vos congés ne peut pas être avant la date de début.");
                        }
                    }
                }
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Nom',
            'siret' => 'Siret',
            'logoFile' => 'Logo',
            'photoFile' => 'Bannière',
            'description' => 'Description',
            'postcode' => 'Code postal',
            'city' => 'Ville',
            'code' => "Code d'accès",
            'order_delay' => 'Délai de commande',
            'order_deadline' => 'Heure limite de commande',
            'order_delay_monday' => 'Délai de commande (lundi)',
            'order_deadline_monday' => 'Heure limite de commande (lundi)',
            'order_delay_tuesday' => 'Délai de commande (mardi)',
            'order_deadline_tuesday' => 'Heure limite de commande (mardi)',
            'order_delay_wednesday' => 'Délai de commande (mercredi)',
            'order_deadline_wednesday' => 'Heure limite de commande (mercredi)',
            'order_delay_thursday' => 'Délai de commande (jeudi)',
            'order_deadline_thursday' => 'Heure limite de commande (jeudi)',
            'order_delay_friday' => 'Délai de commande (vendredi)',
            'order_deadline_friday' => 'Heure limite de commande (vendredi)',
            'order_delay_saturday' => 'Délai de commande (samedi)',
            'order_deadline_saturday' => 'Heure limite de commande (samedi)',
            'order_delay_sunday' => 'Délai de commande (dimanche)',
            'order_deadline_sunday' => 'Heure limite de commande (dimanche)',
            'negative_balance' => 'Solde négatif',
            'credit' => 'Cagnotte',
            'active' => 'Actif',
            'date_creation' => 'Date de création',
            'order_infos' => 'Informations',
            'slug' => 'Slug',
            'type' => 'Type de producteur',
            'credit_limit_reminder' => 'Seuil de cagnotte limite avant relance',
            'online_payment' => 'Activer le paiement en ligne (Stripe)',
            'option_online_payment_type' => 'Type de paiement',
            'option_stripe_mode_test' => 'Mode test',
            'option_stripe_public_key' => 'Clé publique',
            'option_stripe_private_key' => 'Clé secrète',
            'option_stripe_endpoint_secret' => 'Clé secrète (endpoint)',
            'user_manage_subscription' => 'Autoriser les utilisateurs à gérer leurs abonnements',
            'mentions' => 'Mentions légales',
            'gcs' => 'Conditions générales de vente',
            'option_allow_user_gift' => 'Autoriser les utilisateurs à effectuer un don à la plateforme lors de leur commande',
            'credit_functioning' => 'Fonctionnement de la cagnotte',
            'credit_limit' => 'Cagnotte : montant limite',
            'use_credit_checked_default' => 'Sélectionner par défaut le mode de paiement "Cagnotte" lors de la commande de l\'utilisateur (en fonctionnement optionnel)',
            'background_color_logo' => 'Couleur de fond du logo',
            'option_behavior_cancel_order' => 'Comportement lors de la suppression d\'une commande',
            'tiller' => 'Tiller',
            'tiller_provider_token' => 'Token provider',
            'tiller_restaurant_token' => 'Token restaurant',
            'status' => 'Statut',
            'id_tax_rate_default' => 'Taxe',
            'document_quotation_prefix' => 'Préfixe des devis',
            'document_quotation_first_reference' => 'Première référence des devis',
            'document_quotation_duration' => 'Durée du devis',
            'document_invoice_prefix' => 'Préfixe des factures',
            'document_invoice_first_reference' => 'Première référence des factures',
            'document_delivery_note_prefix' => 'Préfixe des bons de livraison',
            'document_delivery_note_first_reference' => 'Première référence des bons de livraison',
            'document_infos_top' => 'Informations affichées en haut des documents',
            'document_infos_bottom' => 'Informations affichées en bas des documents',
            'document_image_bottomFile' => "Image affichée en bas des documents",
            'document_infos_quotation' => 'Informations affichées en bas des devis',
            'document_infos_invoice' => 'Informations affichées en bas des factures',
            'document_infos_delivery_note' => 'Informations affichées en bas des bons de livraison',
            'address' => 'Adresse',
            'document_display_orders_invoice' => 'Afficher le détail des commandes dans les factures',
            'document_display_orders_delivery_note' => 'Afficher le détail des commandes dans les bons de livraison',
            'document_display_prices_delivery_note' => 'Afficher le chiffrage dans les bons de livraison',
            'behavior_home_point_sale_day_list' => 'Accueil : affichage des jours de distribution',
            'behavior_order_select_distribution' => 'Sélection de la date de distribution',
            'option_payment_info' => 'Informations liées au paiement',
            'option_email_confirm' => 'Envoyer un email de confirmation au client',
            'option_email_confirm_producer' => 'Envoyer un email de confirmation au producteur',
            'option_dashboard_number_distributions' => 'Nombre de distributions affichées sur le tableau de board',
            'option_dashboard_date_start' => 'Date de début',
            'option_dashboard_date_end' => 'Date de fin',
            'option_export_display_column_delivery_note' => "Commandes (PDF) : afficher une colonne bon de livraison",
            'option_csv_export_all_products' => "Commandes #1 (CSV) : exporter tous les produits",
            'option_csv_export_by_piece' => 'Commandes #1 (CSV) : exporter les produits par pièce',
            'option_order_reference_type' => 'Type de référence',
            'option_export_display_product_reference' => 'Afficher la référence des produits au moment de l\'export',
            'option_allow_order_guest' => 'Autoriser les visiteurs à passer commande (création de compte à la fin du tunnel)',
            'option_order_entry_point' => 'Point d\'entrée par point de vente ou par date',
            'option_delivery' => 'Proposer la livraison à domicile',
            'option_distribution_export_shopping_cart_labels_pdf' => 'Étiquettes (PDF)',
            'option_distribution_export_total_products_csv' => 'Totaux produits (CSV)',
            'option_distribution_export_orders1_csv' => 'Commandes 1 (CSV)',
            'option_distribution_export_orders2_csv' => 'Commandes 2 (CSV)',
            'option_distribution_export_orders_pdf' => 'Commandes (PDF)',
            'option_distribution_export_orders_grid_pdf' => 'Commandes grille (PDF)',
            'document_display_product_description' => 'Documents : afficher la description des produits',
            'option_notify_producer_order_summary' => 'Recevoir les récapitulatifs de commande par email',
            'option_billing_type' => 'Type de facturation',
            'option_billing_frequency' => 'Fréquence de facturation',
            'option_billing_reduction' => 'Réduction appliquée au moment de la facturation',
            'option_tax_calculation_method' => 'Méthode de calcul de la TVA',
            'option_export_evoliz' => 'Activer l\'export vers Evoliz',
            'latest_version_opendistrib' => 'Dernière version de Souke',
            'option_csv_separator' => 'Séparateur de colonnes (CSV)',
            'option_display_message_new_opendistrib_version' => 'Afficher les messages de mise à jour du logiciel Souke',
            'option_online_payment_minimum_amount' => 'Paiement en ligne : montant minimum',
            'option_document_price_decimals' => 'Prix : nombre de décimales affichées',
            'option_billing_reduction_percentage' => 'Réduction : pourcentage',
            'option_billing_permanent_transfer' => 'Virement permanent',
            'option_billing_permanent_transfer_amount' => 'Virement permanent : montant',
            'option_point_sale_wording' => 'Libellé points de vente',
            'latitude' => 'Latitude',
            'longitude' => 'Longitude',
            'option_testimony' => 'Témoignage',
            'option_time_saved' => 'Temps gagné / semaine',
            'contact_email' => 'Email de contact',
            'admin_comment' => 'Commentaire',
            'dolibarr_socid' => 'Dolibarr : id user',
            'dolibarr_product_id' => 'Dolibarr : id produit',
            'option_weeks_distributions_activated_in_advance' => "Semaines de distributions à activer à l'avance",
            'option_invoice_only_based_on_delivery_notes' => 'Facturer uniquement sur la base des bons de livraison',
            'option_document_width_logo' => 'Largeur du logo dans les documents',
            'export_shopping_cart_labels_number_per_column' => "Étiquettes (PDF) : nombre d'étiquettes par colonne",
            'export_shopping_cart_labels_format' => 'Étiquettes (PDF) : format',
            'option_document_display_price_unit_reference' => "Afficher les prix au kilogramme",
            'id_user_group_default' => "Groupe utilisateur par défaut attribué à l'inscription",
            'option_check_by_default_prevent_user_credit' => "Par défaut, prévenir l'utilisateur quand on crédite sa cagnotte",
            'delivery_note_automatic_validation' => 'Validation automatique des bons de livraison',
            'website' => 'Site web',
            'option_leave_period_start' => 'Prochains congés : date de début',
            'option_leave_period_end' => 'Prochains congés : date de fin',
            'tiller_api_version' => 'Tiller : version API',
            'tiller_client_id' => 'Tiller : client ID',
            'tiller_client_secret' => 'Tiller : client secret',
            'tiller_access_token' => 'Tiller : access token',
            'tiller_refresh_token' => 'Tiller : refresh token',
            'tiller_redirect_uri' => 'Tiller : callback URL',
            'tiller_store_id' => 'Tiller : store ID',
            'is_new' => 'Nouveau',
            'agree_contact_about_software_development' => "J'accepte d'être contacté dans le cadre de l'amélioration du logiciel",
            'option_main_color' => 'Couleur principale',
            'option_newsletter_description' => 'Description infolettre',
            'option_leave_period_message_display' => 'Afficher le message des congés',
            'option_leave_period_message_title' => 'Titre du message des congés',
            'option_leave_period_message' => 'Message des congés',
            'option_credit_description' => "Description Cagnotte",
            'sponsorship_sponsor_reward' => 'Récompense parrain',
            'option_communicate_email_default_subject' => 'Sujet par défaut',
            'option_communicate_email_default_message' => 'Message par défaut',
        ];
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function getSponsorshipCode(): string
    {
        return $this->sponsorship_code;
    }

    public function setSponsorshipCode(string $sponsorshipCode): self
    {
        $this->sponsorship_code = $sponsorshipCode;
        return $this;
    }

    public function getSponsoredBy(): ?Producer
    {
        return $this->sponsoredByRelation;
    }

    public function setSponsoredBy(Producer $producer): self
    {
        $this->populateFieldObject('sponsored_by', 'sponsoredByRelation', $producer);
        return $this;
    }

    public function getSponsorshipSponsorReward(): ?bool
    {
        return $this->sponsorship_sponsor_reward;
    }

    public function setSponsorshipSponsorReward(bool $sponsorshipSponsorReward = null): self
    {
        $this->sponsorship_sponsor_reward = $sponsorshipSponsorReward;
        return $this;
    }

    public function getSponsorshipGodsonReward(): ?bool
    {
        return $this->sponsorship_godson_reward;
    }

    public function setSponsorshipGodsonReward(bool $sponsorshipGodsonReward = null): self
    {
        $this->sponsorship_godson_reward = $sponsorshipGodsonReward;
        return $this;
    }

    public function getAlertMessageReadAt(): ?\DateTime
    {
        if($this->alert_message_read_at) {
            return new \DateTime($this->alert_message_read_at);
        }

        return null;
    }

    public function setAlertMessageReadAt(\DateTime $alertMessageReadAt): self
    {
        $this->alert_message_read_at = $alertMessageReadAt->format('Y-m-d H:i:s');
        return $this;
    }

    /*
     * Relations
     */

    public function getUserProducer()
    {
        return $this->hasMany(UserProducer::class, ['id_producer' => 'id']);
    }

    public function getUser()
    {
        return $this->hasMany(User::class, ['id_producer' => 'id']);
    }

    public function getContact()
    {
        return $this->hasMany(User::class, ['id_producer' => 'id'])
            ->where(['status' => User::STATUS_PRODUCER]);
    }

    public function getTaxRate()
    {
        return $this->hasOne(TaxRate::class, ['id' => 'id_tax_rate_default']);
    }

    public function populateTaxRate(TaxRate $taxRate): void
    {
        $this->populateFieldObject('id_tax_rate', 'taxRate', $taxRate);
    }

    public function getUserGroupDefault()
    {
        return $this->hasOne(UserGroup::class, ['id' => 'id_user_group_default']);
    }

    public function populateUserGroupDefault(UserGroup $userGroup)
    {
        $this->populateFieldObject('id_user_group_default', 'userGroupDefault', $userGroup);
    }

    public function getSponsoredByRelation()
    {
        return $this->hasOne(Producer::class, ['id' => 'sponsored_by']);
    }

    // ---

    public static function getBillingTypePopulateDropdown()
    {
        return self::$billingTypeArray;
    }

    public static function getBillingFrequencyPopulateDropdown()
    {
        return self::$billingFrequencyArray;
    }

    public function isDemoAccount(): bool
    {
        if (strpos($this->getName(), 'Démo') !== false) {
            return true;
        }

        return false;
    }
}
        
