<?php

/**
 * This is the model base class for the table "revendas".
 * DO NOT MODIFY THIS FILE! It is automatically generated by giix.
 * If any changes are necessary, you must set or override the required
 * property or method in class "Revendas".
 *
 * Columns in table "revendas" available as properties of the model,
 * followed by relations of table "revendas" available as properties of the model.
 *
 * @property integer $REV_IDREVENDA
 * @property integer $REV_IDCIDADE
 * @property string $REV_NOME
 * @property string $REV_FONE1
 * @property string $REV_FONE2
 * @property string $REV_FONE3
 * @property string $REV_EMAIL
 * @property string $REV_ENDERECO
 * @property string $REV_CEP
 * @property string $REV_BAIRRO
 * @property string $REV_DTCADASTRO
 * @property integer $REV_IDUSUARIO
 * @property string $REV_DTALTERACAO
 * @property string $REV_SITUACAO
 * @property integer $REV_IDFUNCIONARIO
 * @property integer $REV_COMISSAO
 *
 * @property Funcionarios $Responsavel
 * @property Cidades $Cidade
 * @property Usuarios[] $usuarioses
 */
class Revendas extends GxActiveRecord
{

    public $base;
    public $dest;
    private $arquivo;
    public $REV_TMPLOGO;

    const MATRIZ     = 1;
    const FILIAL     = 2;
    const REVENDA    = 3;
    protected $tipos = array();

    public function init()
    {
        $this->base  = Yii::app()->baseUrl.'/arquivos/revendas/';
        $this->dest  = Yii::app()->getBasePath().DS.'..'.DS.'arquivos'.DS.'revendas'.DS;
        $this->tipos = array(
            self::MATRIZ  => 'Matriz',
            self::FILIAL  => 'Filial',
            self::REVENDA => 'Revenda',
        );
    }

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'revendas';
    }

    public static function label($n = 1)
    {
        return Yii::t('app', 'Unidade de Negócios|Unidades de Negócios', $n);
    }

    public static function representingColumn()
    {
        return 'REV_FANTASIA';
    }

    public function behaviors()
    {
        return array('datetimeI18NBehavior' => array('class' => 'ext.DateTimeI18NBehavior'));
    }

    public function rules()
    {
        return array(
            array('REV_NOME, REV_SIGLA, REV_ENDERECO, REV_CEP, REV_BAIRRO, REV_IDCIDADE, REV_FONE1, REV_EMAIL,
                   REV_HORAMANHAINICIO, REV_HORAMANHAFIM, REV_HORATARDEINICIO, REV_HORATARDEFIM, REV_FANTASIA, REV_TIPO,'
                   , 'required'),

            array('REV_IDCIDADE, REV_IDUSUARIO, REV_IDFUNCIONARIO,REV_TIPO, REV_COMISSAO',
                  'numerical', 'integerOnly' => true),

            array('REV_NOME, REV_FANTASIA, REV_EMAIL, REV_EMAIL_IMPLANTACAO, REV_ENDERECO',
                  'length', 'max' => 50),

            array('REV_LOGO', 'upload'),

            array('REV_EMAIL, REV_EMAILCC, REV_EMAILCCO, REV_EMAIL_IMPLANTACAO', 'email'),

            array('REV_FONE1, REV_FONE2, REV_FONE3', 'length', 'min' => 13),

            array('REV_FONE1, REV_FONE2, REV_FONE3', 'validateFone'),

            array('REV_CEP', 'length', 'min'      => 9),

            array('REV_CNPJ', 'length', 'min'     => 18),

            array('REV_BAIRRO', 'length', 'max'   => 40),

            array('REV_SITUACAO', 'length', 'max' => 1),

            array('REV_DTCADASTRO, REV_UPDATES, REV_SITE, REV_FONE1, REV_FONE2, REV_FONE3, REV_COMISSAO, REV_CONTROLE_IMPLANTACAO, REV_CONTROLE_POSVENDAS', 'safe'),

            array('REV_IDCIDADE, REV_NOME, REV_FANTASIA, REV_FONE1, REV_FONE2, REV_FONE3, REV_EMAIL, REV_EMAILCC, REV_EMAILCCO, REV_ENDERECO, REV_EMAIL_IMPLANTACAO,
                   REV_CEP, REV_BAIRRO, REV_DTCADASTRO, REV_IDUSUARIO, REV_UPDATES, REV_SITUACAO,
                   REV_IDFUNCIONARIO, REV_LOGO, REV_COMISSAO',
                   'default', 'setOnEmpty' => true, 'value' => null),

            array('REV_TMPLOGO, LAST_UPDATE,REV_CONTROLE_POSVENDAS,REV_CONTROLE_POSVENDAS', 'safe'),

            array('REV_IDREVENDA, REV_IDCIDADE, REV_NOME, REV_FONE1, REV_FONE2, REV_FONE3, REV_EMAIL, REV_EMAILCC, REV_EMAILCCO, REV_ENDERECO, REV_EMAIL_IMPLANTACAO,
                   REV_CEP, REV_BAIRRO, REV_DTCADASTRO, REV_IDUSUARIO, REV_UPDATES, REV_SITUACAO, REV_IDFUNCIONARIO,
                   REV_COMISSAO, Revendascidades,REV_TIPO, REV_CONTROLE_IMPLANTACAO, REV_CONTROLE_POSVENDAS', 'safe', 'on' => 'search'),

            array('REV_DTCADASTRO', 'default',
                  'value'      => date('d/m/Y'),
                  'setOnEmpty' => false, 'on' => 'insert'),
        );
    }

    public function relations()
    {
        return array(
            'Responsavel'       => array(self::BELONGS_TO, 'Funcionarios', 'REV_IDFUNCIONARIO', 'joinType'=>'LEFT JOIN'),
            'Cidade'            => array(self::BELONGS_TO, 'Cidades', 'REV_IDCIDADE', 'joinType'=>'LEFT JOIN'),
            // 'RevendasCidades'    => array(self::HAS_MANY, 'Revendacidades', 'RCI_IDREVENDA', 'joinType' => 'LEFT JOIN'),
            'RegioesCidades'    => array(self::HAS_MANY, 'Regioescidades', 'RCD_IDREVENDA', 'joinType'  => 'LEFT JOIN'),
            'Cidades'=>array(self::MANY_MANY, 'Cidades', 'regioescidades(RCD_IDREVENDA, RCD_IDCIDADE)'),
        );
    }

    public function pivotModels()
    {
        return array(
        );
    }

    public function attributeLabels()
    {
        return array(
            'REV_IDREVENDA'       => 'Código',
            'REV_IDCIDADE'        => 'Cidade',
            'REV_NOME'            => 'Razão Social',
            'REV_CNPJ'            => 'CNPJ',
            'REV_FONE1'           => 'Telefone',
            'REV_FONE2'           => 'Telefone 2',
            'REV_FONE3'           => 'Telefone 3',
            'REV_EMAIL'           => 'E-mail',
            'REV_EMAIL_IMPLANTACAO' => 'E-mail Implantação',
            'REV_EMAILCC'         => 'Cópia (Cc)',
            'REV_EMAILCCO'        => 'Cópia Oculta (Cco)',
            'REV_SITE'            => 'Site',
            'REV_ENDERECO'        => 'Endereço',
            'REV_CEP'             => 'CEP',
            'REV_BAIRRO'          => 'Bairro',
            'REV_DTCADASTRO'      => 'Data de Cadastro',
            'REV_IDUSUARIO'       => 'Usuário',
            'REV_UPDATES'         => 'Atualizações',
            'REV_SITUACAO'        => 'Situação',
            'REV_IDFUNCIONARIO'   => 'Contato',
            'Responsavel'         => 'Funcionário',
            'Cidade'              => 'Cidade',
            'REV_FANTASIA'        => 'Nome Fantasia',
            'REV_TIPO'            => 'Tipo de unidade',
            'usuarioses'          => 'Usuário',
            'Revendascidades'     => 'Cidades da Unidade de negócios',
            'REV_HORAMANHAINICIO' => 'Horário Manhã',
            'REV_HORAMANHAFIM'    => 'Horário Final da Manhã',
            'REV_HORATARDEINICIO' => 'Horário Tarde',
            'REV_HORATARDEFIM'    => 'Horário Final da Tarde',
            'REV_LOGO'            => 'Logo',
            'REV_COMISSAO'        => 'Comissão',
            'REV_SIGLA'           => 'Nome Reduzido (max. 31 caracteres)',
            'REV_DATAATIVACAO'    => 'Data de Ativação',
            'REV_DATAINATIVACAO'  => 'Data de Inativação',
            'REV_CONTROLE_IMPLANTACAO' => 'Controle de Implantação',
            'REV_CONTROLE_POSVENDAS'   => 'Controle de Pós-vendas'
        );
    }

    protected function beforeSave()
    {
        parent::beforeSave();
        $agora = new DateTime('now');

        if ($this->isNewRecord) {
            $this->REV_DTCADASTRO = $agora->format('Y-m-d');
        }

        if ($this->REV_SITUACAO == 'A') {
            $this->REV_DATAATIVACAO   = $agora->format('Y-m-d H:i:s');
        } else {
            $this->REV_DATAINATIVACAO = $agora->format('Y-m-d H:i:s');
        }

        $this->LAST_UPDATE = date('Y-m-d H:i:s');
        return true;
    }

    protected function afterSave()
    {
        parent::afterSave();

        if ($this->isNewRecord) {
            $situacao = new RevendasSituacao;
            $situacao->REVS_IDREVENDA = $this->REV_IDREVENDA;
            $situacao->REVS_IDUSUARIO = User::getId();
            $situacao->REVS_SITUACAO = $this->REV_SITUACAO;
            $situacao->REVS_DATA = date('Y-m-d H:i:s');
            $situacao->REVS_OBSERVACOES = "Unidade de negócios cadastrada nesta data.";
            $situacao->save();
        }

        return true;
    }

    public function validateFone($attribute, $params)
    {
        if(!empty($this->{$attribute})) {
            if(!Util::validateFone($this->{$attribute})) {
                $this->addError($attribute, $this->getAttributeLabel($attribute) . ' com formato inválido, somente permitidos (XX)XXXX-XXXX ou (XX)XXXXX-XXXX.');
            }
        }
    }

    public function upload($attribute, $params)
    {
        if (isset($_FILES['Revendas']) && is_array($_FILES['Revendas'])) {

            $this->arquivo                 = new Arquivos;
            $this->arquivo->dest           = $this->dest;
            $this->arquivo->limitExtension = array('jpg', 'jpeg', 'png', 'gif');
            $file                          = array();

            foreach ($_FILES['Revendas'] as $key => $value) {
                $file[$key] = $value['REV_LOGO'];
            }

            $this->arquivo->ARQ_ARQUIVO = $file;
            if ($file['error'] == 4) {
                if (!empty($this->REV_TMPLOGO)) {
                    $this->REV_LOGO = $this->REV_TMPLOGO;
                    return true;
                }
                if (!$this->isNewRecord) {
                    $rev            = $this->findByPk($this->REV_IDREVENDA);
                    $this->REV_LOGO = $rev->REV_LOGO;
                }
                return true;
            }

            if (!$this->arquivo->upload()) {
                $this->addError($attribute, $this->arquivo->getError('ARQ_ARQUIVO'));
            } else {

                $this->REV_LOGO    = $this->arquivo->ARQ_ARQUIVO;
                $this->REV_TMPLOGO = $this->arquivo->ARQ_ARQUIVO;
            }
        }
        return true;
    }

    public function search()
    {
        $criteria = new CDbCriteria;

        $criteria->compare('REV_IDREVENDA',     $this->REV_IDREVENDA);
        $criteria->compare('REV_IDCIDADE',      $this->REV_IDCIDADE);
        $criteria->compare('REV_CNPJ',          $this->REV_CNPJ, true);
        $criteria->compare('REV_FONE1',         $this->REV_FONE1, true);
        $criteria->compare('REV_FONE2',         $this->REV_FONE2, true);
        $criteria->compare('REV_FONE3',         $this->REV_FONE3, true);
        $criteria->compare('REV_EMAIL',         $this->REV_EMAIL, true);
        $criteria->compare('REV_EMAIL_IMPLANTACAO', $this->REV_EMAIL_IMPLANTACAO, true);
        $criteria->compare('REV_EMAILCC',       $this->REV_EMAILCC, true);
        $criteria->compare('REV_EMAILCCO',      $this->REV_EMAILCCO, true);
        $criteria->compare('REV_TIPO',          $this->REV_TIPO);
        $criteria->compare('REV_SITE',          $this->REV_SITE, true);
        $criteria->compare('REV_ENDERECO',      $this->REV_ENDERECO, true);
        $criteria->compare('REV_CEP',           $this->REV_CEP, true);
        $criteria->compare('REV_BAIRRO',        $this->REV_BAIRRO, true);
        $criteria->compare('REV_DTCADASTRO',    $this->REV_DTCADASTRO, true);
        $criteria->compare('REV_IDUSUARIO',     $this->REV_IDUSUARIO);
        $criteria->compare('REV_UPDATES',       $this->REV_UPDATES, true);
        $criteria->compare('REV_SITUACAO',      $this->REV_SITUACAO, true);
        $criteria->compare('REV_IDFUNCIONARIO', $this->REV_IDFUNCIONARIO);
        $criteria->compare('REV_COMISSAO',      $this->REV_COMISSAO);
        $criteria->compare('REV_CONTROLE_IMPLANTACAO', $this->REV_CONTROLE_IMPLANTACAO);
        $criteria->compare('REV_CONTROLE_POSVENDAS', $this->REV_CONTROLE_POSVENDAS);

        $criteria->addCondition('REV_NOME like "%'.Util::secureForSelect($this->REV_NOME, true).'%"
                                 OR REV_FANTASIA like "%'.Util::secureForSelect($this->REV_NOME, true).'%"');

        return new CActiveDataProvider($this, array(
                'criteria' => $criteria,
                'sort' => array(
                    'defaultOrder' => 'REV_NOME ASC',
                ),
                'pagination' => array(
                    'pageSize'  => 20,
                )
            )
        );
    }

    public function searchRelatorio()
    {
        $criteria = new CDbCriteria;

        $criteria->addCondition("SOL_IDDESENVOLVEDOR is not null");

        $criteria->with = array(
            'Titulos' => array('joinType' => 'LEFT JOIN'));

        return new CActiveDataProvider($this, array(
                'criteria' => $criteria,
                'sort' => array(
                    'defaultOrder' => 'REV_NOME ASC',
                ),
                'pagination' => array(
                    'pageSize'  => 20,
                )
            )
        );
    }

    public function getLogoUrl()
    {
        $imgPadrao = true;
        if (isset($this->REV_LOGO)) {
            $url = $this->base . $this->REV_LOGO;
            if (file_exists($url)) {
                $imgPadrao = false;
            }
        }

        if ($imgPadrao) {
            $url = $this->base . "padrao.png";
        }

        return $url;
    }

    public function getLogo($width = false, $height = false)
    {
        $opt   = array();
        $opt[] = 'src="'.$this->base.$this->REV_LOGO.'"';
        $opt[] = 'class="logo_revenda"';
        $style = 'style="';
        if ($width) {
            $style .= 'width:'.$width.'px;';
        }

        if ($height) {
            $style .= 'height:'.$height.'px;';
        }

        $style .= '"';
        $opt[] = $style;
        return '<img '.implode(' ', $opt).' />';
    }
    public function getTmpLogo($width = false, $height = false)
    {
        $opt   = array();
        $opt[] = 'src="'.$this->base.$this->REV_TMPLOGO.'"';
        $opt[] = 'class="logo_revenda"';
        $style = 'style="';
        if ($width) {
            $style .= 'width:'.$width.'px;';
        }

        if ($height) {
            $style .= 'height:'.$height.'px;';
        }

        $style .= '"';
        $opt[] = $style;
        return '<img '.implode(' ', $opt).' />';
    }

    public function getRegioes($list = false)
    {
        $Regioes = Regioes::model()->findAll('REG_IDREVENDA = '.$this->REV_IDREVENDA);
        if ($list) {
            return CHtml::listData($Regioes, 'REG_IDREGIAO', 'REG_IDREGIAO');
        }

        return $Regioes;
    }

    public function getCidades($list = false)
    {
        if (!$this->getRegioes(true)) {
            return false;
        }

        $RegioesCidades = Regioescidades::model()->findAll('RCD_IDREGIAO in ('.implode(',', $this->getRegioes(true)).') and RCD_IDREVENDA = '.$this->REV_IDREVENDA);
        if ($list) {
            return CHtml::listData($RegioesCidades, 'RCD_IDCIDADE', 'RCD_IDCIDADE');
        }

        $data_cidades = CHtml::listData($RegioesCidades, 'RCD_IDCIDADE', 'RCD_IDCIDADE');
        if (count($data_cidades) > 0) {
            return Cidades::model()->findAll('CID_IDCIDADE in ('.implode(', ', $data_cidades).')');
        }

        return false;
    }

    public function getTipos()
    {
        return $this->tipos;
    }

    public function getTipo()
    {
        if (isset($this->tipos[$this->REV_TIPO])) {
            return $this->tipos[$this->REV_TIPO];
        }

        return false;
    }

    public function getSituacao()
    {
        return $this->REV_SITUACAO == "A" ? "Ativa" : "Inativa";
    }

    public function getSituacaoPlural()
    {
        return $this->REV_SITUACAO == "A" ? "Ativas" : "Inativas";
    }

    public function getSituacaoTipos()
    {
        return $this->REV_TIPO == "1" || $this->REV_TIPO == "2" ? "Matriz e Filiais" : "Revendas";
    }

    public function isMatriz()
    {
        return $this->REV_TIPO == Revendas::MATRIZ;
    }

    public function isFilial()
    {
        return $this->REV_TIPO == Revendas::FILIAL;
    }

    public function isMatrizFilial()
    {
        return $this->isMatriz() || $this->isFilial();
    }

    public function getTelefones($implode = false)
    {
        if(isset($this->REV_FONE1)){
            $telefones[] = $this->REV_FONE1;
        }
        if(isset($this->REV_FONE2)){
            $telefones[] = $this->REV_FONE2;
        }
        if(isset($this->REV_FONE3)){
            $telefones[] = $this->REV_FONE3;
        }

        if($implode){
            return implode($implode, $telefones);
        }
        return $telefones;
    }

    public function trocaSituacao()
    {
        $this->REV_SITUACAO = $this->REV_SITUACAO == "A" ? "I" : "A";
    }

    public function getDataInativacao()
    {
        if (null !== $this->REV_DATAINATIVACAO) {
            $data = explode(' ',$this->REV_DATAINATIVACAO);
            return $data[0];
        }
    }

    public function getDataAtivacao()
    {
        if (null !== $this->REV_DATAATIVACAO) {
            $data = explode(' ',$this->REV_DATAATIVACAO);
            return $data[0];
        }
    }

    static public function getRevendasByPeriodo($ano, $mes = false, $tipos = false, $inativas = true)
    {
        $conditions = array();

        if ($mes) {
            $inicioMes = "{$ano}-{$mes}-01";
            $date = DateTime::createFromFormat('Y-m-d', $inicioMes);
            $date->modify('last day of this month');
            $fimMes = $date->format('Y-m-d');

            // Revendas ativas
                $insideConditions = array();

                $insideConditions[] = "REV_SITUACAO = 'A'";
                $insideConditions[] = "DATE_FORMAT(REV_DATAATIVACAO, '%Y-%m-%d') <= '{$fimMes}'";

                $conditions[] = "(" . implode(" AND ", $insideConditions) . ")";

            // Revendas inativas
                if ($inativas) {
                    $insideConditions = array();

                    $insideConditions[] = "REV_SITUACAO = 'I'";
                    $insideConditions[] = "DATE_FORMAT(REV_DATAINATIVACAO, '%Y-%m-%d') >= '{$fimMes}'";

                    $conditions[] = "(" . implode(" AND ", $insideConditions) . ")";
                }
        } elseif ($ano < date('Y')) {
            // Revendas ativas
                $conditions[] = "
                    (
                        REV_SITUACAO = 'A' AND
                        YEAR(REV_DATAATIVACAO) <= {$ano}
                    )
                ";

            // Revendas inativas
                if ($inativas) {
                    $conditions[] = "
                        (
                            REV_SITUACAO = 'I' AND
                            YEAR(REV_DATAINATIVACAO) = {$ano} AND
                            YEAR(REV_DATAATIVACAO) <= {$ano}
                        )
                    ";
                }
        } else {
            // Revendas ativas
                $conditions[] = "REV_SITUACAO = 'A'";

            // Revendas inativas
                if ($inativas) {
                    $conditions[] = "
                        (
                            REV_SITUACAO = 'I' AND
                            YEAR(REV_DATAINATIVACAO) = {$ano} AND
                            YEAR(REV_DATAATIVACAO) <= {$ano}
                        )
                    ";
                }
        }

        $conditions = implode(" OR ", $conditions);

        if ($tipos) {
            $tipos = implode(", ", $tipos);
            $conditions = "({$conditions}) AND REV_TIPO IN ({$tipos})";
        }

        $revendas = Revendas::model()->findAll("
            {$conditions}
            ORDER BY REV_TIPO ASC, REV_FANTASIA ASC
        ");

        return $revendas;
    }

    public function getDescricao()
    {
        $retorno = "{$this->REV_FANTASIA} ";
        $retorno .= "(";
            $retorno .= $this->getTipo();
            $retorno .= " {$this->getSituacao()}";
        $retorno .= ")";

        return $retorno;
    }

    public function podeTransferirMeta()
    {
        if ($this->REV_SITUACAO != "I") {
            return false;
        }

        $transferiu = MetasVendas::model()->exists("MEV_IDTRANSFERENCIA = '{$this->REV_IDREVENDA}'");
        if ($transferiu) {
            return false;
        }

        return true;
    }
}
