<?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\PointSale\PointSale;

use common\components\ActiveRecordCommon;
use common\helpers\GlobalParam;
use domain\Distribution\PointSaleDistribution\PointSaleDistribution;
use domain\PointSale\UserPointSale\UserPointSale;
use domain\Producer\Producer\Producer;
use domain\User\User\User;

/**
 * This is the model class for table "point_sale".
 */
class PointSale extends ActiveRecordCommon
{
    var $orders = [];
    var $revenues = 0;
    var $revenues_with_tax = 0;
    var $data_select_orders;
    var $data_options_orders;
    var $users = [];
    var $users_comment = [];

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

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name'], 'required'],
            [['restricted_access'], 'boolean'],
            [['name', 'code'], 'string', 'max' => 255],
            [['address', 'locality', 'infos_monday', 'infos_tuesday',
                'infos_wednesday', 'infos_thursday', 'infos_friday',
                'infos_saturday', 'infos_sunday', 'credit_functioning', 'bread_box_code'], 'string'],
            [['point_production', 'payment_method_onsite', 'payment_method_credit', 'payment_method_online',
                'delivery_monday', 'delivery_tuesday', 'delivery_wednesday', 'delivery_thursday', 'delivery_friday',
                'delivery_saturday', 'delivery_sunday', 'default', 'is_bread_box',
                'button_generate_delivery_note_point_sale', 'button_generate_delivery_note_each_user',
                'exclude_export_shopping_cart_labels', 'is_home_delivery'], 'boolean'],
            ['point_production', 'default', 'value' => 0],
            [['id_producer', 'id_user', 'maximum_number_orders', 'status'], 'integer'],
            ['id_producer', 'required'],
            [['users', 'users_comment', 'code'], 'safe'],
            [['product_price_percent', 'minimum_order_amount'], 'double'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Nom',
            'address' => 'Adresse',
            'locality' => 'Localité',
            'point_production' => 'Point de production',
            'infos_monday' => 'Lundi',
            'infos_tuesday' => 'Mardi',
            'infos_wednesday' => 'Mercredi',
            'infos_thursday' => 'Jeudi',
            'infos_friday' => 'Vendredi',
            'infos_saturday' => 'Samedi',
            'infos_sunday' => 'Dimanche',
            'restricted_access' => 'Accès restreint',
            'payment_method_onsite' => 'Sur place',
            'payment_method_credit' => 'Cagnotte',
            'payment_method_online' => 'Paiement en ligne',
            'delivery_monday' => 'Lundi',
            'delivery_tuesday' => 'Mardi',
            'delivery_wednesday' => 'Mercredi',
            'delivery_thursday' => 'Jeudi',
            'delivery_friday' => 'Vendredi',
            'delivery_saturday' => 'Samedi',
            'delivery_sunday' => 'Dimanche',
            'code' => 'Code',
            'credit_functioning' => 'Fonctionnement de la cagnotte',
            'default' => 'Point de vente par défaut',
            'id_user' => 'Contact facturation',
            'product_price_percent' => 'Prix produits : pourcentage',
            'maximum_number_orders' => 'Nombre maximum de commandes par distribution',
            'is_bread_box' => 'Boîte à pain',
            'bread_box_code' => 'Code boîte à pain',
            'status' => 'Statut',
            'button_generate_delivery_note_point_sale' => 'Par point de vente',
            'button_generate_delivery_note_each_user' => 'Par client',
            'exclude_export_shopping_cart_labels' => "Exclure de l'export d'étiquettes",
            'is_home_delivery' => "Livraison à domicile",
            'minimum_order_amount' => "Montant minimum de commande (€)"
        ];
    }

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

    public function getProducer(): Producer
    {
        return $this->producerRelation;
    }

    /*
     * Relations
     */

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

    public function getUserPointSale()
    {
        return $this->hasMany(UserPointSale::class, ['id_point_sale' => 'id']);
    }

    public function getPointSaleDistribution()
    {
        return $this->hasMany(PointSaleDistribution::class, ['id_point_sale' => 'id']);
    }

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

    public function populateUser(User $user): void
    {
        $this->populateFieldObject('id_user', 'user', $user);
    }

    /**
     * Enregistre le point de vente.
     */
    public function save($runValidation = true, $attributeNames = NULL)
    {
        $this->id_producer = GlobalParam::getCurrentProducerId();
        return parent::save($runValidation, $attributeNames);
    }
}
