<?php
/**
 * This is the model base class for the table "contratos".
 * 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 "Contratos".
 *
 * Columns in table "contratos" available as properties of the model,
 * followed by relations of table "contratos" available as properties of the model.
 *
 * @property integer $COT_IDCONTRATO
 * @property integer $COT_IDCLIENTE
 * @property integer $COT_IDVENDEDOR
 * @property string $COT_DTCADASTRO
 * @property string $COT_SITUACAO
 * @property string $COT_VLRMENSAL
 * @property string $COT_DIAVENCTO
 * @property integer $COT_NROUSUARIOS
 * @property string $COT_DTPRICOBRANCA
 * @property string $COT_DTINICOBRANCA
 * @property string $COT_DTINICARENCIA
 * @property string $COT_DTFIMCARENCIA
 * @property string $COT_FORO
 * @property string $COT_COMPOSICAO
 * @property string $COT_VLRIMPLANTACAO
 * @property integer $COT_IDPRODUTO
 * @property string $COT_TOTMENSAL
 * @property string $COT_TOTIMPL
 * @property string $COT_DESCONTO
 * @property integer $COT_IDCONDPAGTO
 * @property string $COT_TIPOVENDA
 * @property string $COT_FUNCAO
 * @property string $COT_REPRESENTANTES
 * @property string $COT_CPFS
 * @property string $COT_FUNCIONAMENTO
 * @property integer $COT_STATUS
 * @property integer $COT_CRIARNOVOCONTRATO
 * @property integer $COT_IDSERVICO
 * @property integer $FINANCEIRO
 *
 * @property Condicaopagto $CondicaoPagamento
 * @property Clientes $Cliente
 * @property Funcionarios $Vendedor
 * @property Modulos $produto
 */
class Contratos extends GxActiveRecord {

    const CONTRATO                     = 1;
    const ADENDO                       = 2;
    const PEDIDO                       = 3;
    const ORCAMENTO                    = 4;
    const TERMO_CANCELAMENTO           = 5;
    const PEDIDO_IMPLANTACAO           = 6;
    const PEDIDO_CUSTOMIZACAO          = 7;
    const PEDIDO_REATIVACAO            = 8;
    const TRANSFERENCIA_SISTEMA        = 9;
    const TRANSFERENCIA_BANCO_ENVIO    = 10;
    const TRANSFERENCIA_BANCO_RECEPCAO = 11;

    const ASSINADO_DIGITAL    = 1;
    const ASSINADO_MANUAL     = 2;
    const ASSINADO_ACEITO     = 3;
    
    const UNIDADES_IMPLANTACAO_OBRIGATORIA = array(1, 3, 12, 40, 47, 49, 53, 53);

    public $COT_IDCONTRATO;
    public $COT_DTCADASTRO_FINAL;
    public $COT_DTATIVACAO_FINAL;
    public $COT_STATUS_FATURAMENTO;
    public $COT_VLRMENSAL_FINAL;
    public $COT_CLI_VLRMENSAL_FINAL;
    public $COT_CNPJ;
    public $CLI_CNPJCPF;
    public $COT_IDCLIENTE;
    public $COT_IDREVENDA;
    public $MOD_VLRMENSAL;
    public $MOD_DESCONTOMAX;
    public $COT_MINIMO;
    public $COT_PERCENTUAL;
    public $COT_HORASIMPLANTACAO;
    public $COT_CRIARNOVOCONTRATO;
    public $COT_DTINICOBRANCA_FINAL;
    public $COT_DTPRICOBRANCA_FINAL;
    public $vencimentos;
    public $produtos = array();
    public $COT_CLI_NOME;
    public $COT_CLI_CONTATO;
    public $COT_CLI_ENDERECO;
    public $COT_CLI_NUMERO;
    public $COT_CLI_COMPLEMENTO;
    public $COT_CLI_BAIRRO;
    public $COT_CLI_CIDADE;
    public $COT_CLI_CNPJCPF;
    public $COT_CLI_INSCR_EST;
    public $COT_CLI_CEP;
    public $COT_CLI_FONE1;
    public $COT_CLI_EMAIL;
    public $COT_CLI_IDMOTIVO;
    public $COT_CATDOCUMENTO;
    public $COT_JUSTIFICATIVA;
    public $CLI_IDMOTIVO;
    public $CLI_IDCLIENTE;
    public $COT_ANOMETA;
    public $COT_IDSERVICO;
    public $COT_MODULOS;
    public $COT_STATUS_REVENDAS;
    public $TOKEN;
    public $SINTETICO;
    public $COT_TIPOASSINATURA;
    public $COT_BLOQUEARASSINATURA;
    public $CLI_SITUACAO;
    public $COT_SIMPLES_CAMPO;
    public $LISTAR_ASSINATURA_PENDENTE;
    public $FINANCEIRO;
    public $CCD_IMPORTAR;
    public $CDP_IDPRODUTO;
    public $CCD_CLIENTES;
    public $CCD_FORNECEDORES;
    public $CCD_OBSERVACAO;
    public $IdsDocumentosFiscais = array();
    private $tiposAssinatura = array(
        // self::ASSINADO_DIGITAL => 'Assinado com assinatura digital',
        self::ASSINADO_MANUAL => 'Assinado manualmente',
        self::ASSINADO_ACEITO => 'Li e aceito'
    );
    public $pedidos = array(Contratos::PEDIDO_IMPLANTACAO, Contratos::PEDIDO_CUSTOMIZACAO, Contratos::PEDIDO_REATIVACAO);
    public $multiSelecao;

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

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

    public static function label($n = 1) {
        return Yii::t('app', 'Documento|Documentos', $n);
    }

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

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

    public function rules() {
        $valor_mensal = (isset($_POST['Contratos']['COT_VLRMENSAL'])) ? $_POST['Contratos']['COT_VLRMENSAL'] : '';
        $rules =  array(
            array('COT_IDCLIENTE, COT_IDVENDEDOR, COT_NROUSUARIOS, COT_HORASIMPLANTACAO, COT_IDPRODUTO, COT_IDCONDPAGTO, COT_STATUS, COT_CLI_PRODUTO, COT_CLI_MODULO1, COT_CLI_MODULO2, COT_CLI_MODULO3, COT_CLI_MODULO4, COT_CLI_MODULO5, COT_CLI_QTDUSUARIOS, COT_IDSERVICO', 'numerical', 'integerOnly' => true),
            array('COT_CLI_NOME, COT_CLI_CONTATO, COT_CLI_ENDERECO, COT_CLI_NUMERO, COT_CLI_COMPLEMENTO, COT_CLI_BAIRRO, COT_CLI_CIDADE, COT_CLI_CNPJCPF, COT_CLI_INSCR_EST, COT_CLI_CEP, COT_CLI_FONE1, COT_CLI_EMAIL, COT_CLI_IDMOTIVO', 'length', 'max' => 1000000),
            array('COT_TIPOVENDA, COT_FUNCAO, COT_FUNCIONAMENTO', 'length', 'max' => 1),
            array('COT_JUSTIFICATIVA, COT_OBS, COT_HORACADASTRO', 'length', 'max' => 1000000),
            array('COT_VLRMENSAL, COT_VLRIMPLANTACAO, COT_TOTMENSAL, COT_TOTIMPL, COT_DESCONTO, COT_CLI_VLRMENSAL', 'length', 'max' => 14),
            array('COT_SITUACAO, COT_NROUSUARIOS, COT_HORASIMPLANTACAO', 'length', 'max' => 2),
            array('COT_MESMETA, COT_ANOMETA', 'length', 'max' => 7),
            array('COT_DIAVENCTO', 'length', 'max' => 2),
            array('COT_IDVENDEDOR', 'required'),
            array('COT_USUARIOS_MOBILE', 'moduloMobile'),
            array('COT_IDMOTIVO_FP', 'required', 'on' => 'contratoSemImplantacao, contratoComImplantacao'),
            array('COT_FORO, COT_STATUS, COT_TESTEMUNHA1, COT_TESTEMUNHA2, COT_CPF1, COT_CPF2, COT_IDREVENDA', 'length', 'max' => 50),
            array('COT_DTCADASTRO, COT_HORACADASTRO, COT_DTPRICOBRANCA, COT_DTINICOBRANCA, COT_DTINICARENCIA, COT_DTFIMCARENCIA, COT_COMPOSICAO, COT_COBRADAIMPLANTACAO, COT_CRIARNOVOCONTRATO,COT_MODULOS, COT_SIMPLES, COT_REPRESENTANTES, COT_CPFS, modulos, vencimentos, IdsDocumentosFiscais, TOKEN, SINTETICO,COT_DTPRICOBRANCA_FINAL,COT_DTINICOBRANCA_FINAL, COT_TIPOASSINATURA,COT_BLOQUEARASSINATURA,COT_FATURAMENTO, COT_DATA_FATURA,CLI_SITUACAO, COT_GERADO_AUTOMATICAMENTE, multiSelecao', 'safe'),
            array('COT_IDCLIENTE, COT_IDVENDEDOR, COT_DTCADASTRO, COT_HORACADASTRO, COT_SITUACAO, COT_VLRMENSAL, COT_DIAVENCTO, COT_NROUSUARIOS, COT_DTPRICOBRANCA, COT_DTINICOBRANCA, COT_DTINICARENCIA, COT_DTFIMCARENCIA, COT_FORO, COT_COMPOSICAO, COT_VLRIMPLANTACAO, COT_IDPRODUTO, COT_TOTMENSAL, COT_TOTIMPL, COT_DESCONTO, COT_IDCONDPAGTO, COT_TIPOVENDA', 'default', 'setOnEmpty' => true, 'value' => null),
            array('COT_USUARIOS_MOBILE, COT_SIMPLES, COT_DTCADASTRO, COT_DTCADASTRO_FINAL, COT_DTATIVACAO_FINAL, COT_IDCONTRATO, COT_IDCLIENTE, COT_IDVENDEDOR, COT_DTCADASTRO, COT_SITUACAO, COT_VLRMENSAL, COT_DIAVENCTO, COT_NROUSUARIOS, COT_DTPRICOBRANCA, COT_DTINICOBRANCA, COT_DTINICARENCIA, COT_DTFIMCARENCIA, COT_FORO, COT_COMPOSICAO, COT_VLRIMPLANTACAO, COT_IDPRODUTO, COT_TOTMENSAL, COT_TOTIMPL, COT_DESCONTO, COT_IDCONDPAGTO, COT_TIPOVENDA, LISTAR_ASSINATURA_PENDENTE, COT_FUNCAO, COT_REPRESENTANTES, COT_CPFS, COT_FUNCIONAMENTO, COT_STATUS, COT_TESTEMUNHA1, COT_TESTEMUNHA2, COT_CPF1, COT_CPF2, COT_CNPJ, CLI_CNPJCPF, CLI_NOME, COT_IDCLIENTE, COT_CLI_NOME, COT_CLI_CONTATO, COT_CLI_CNPJCPF, COT_VLRMENSAL_FINAL,COT_CATDOCUMENTO, COT_JUSTIFICATIVA, CLI_IDMOTIVO, COT_OBS, COT_HORACADASTRO, COT_HORASIMPLANTACAO, COT_MESMETA, COT_DTATIVACAO, COT_ANOMETA, COT_CLI_PRODUTO, COT_CLI_MODULO1, COT_CLI_MODULO2, COT_CLI_MODULO3, COT_CLI_MODULO4, COT_CLI_MODULO5, COT_CLI_QTDUSUARIOS, COT_CLI_VLRMENSAL, COT_CRIARNOVOCONTRATO,COT_STATUS_FATURAMENTO, FINANCEIRO, COT_IDMOTIVO_FP', 'safe', 'on' => 'search,ValidacaoValoresTabela'),
            array('COT_SIMPLES, COT_IDPRODUTO, COT_NROUSUARIOS, COT_VLRMENSAL, COT_JUSTIFICATIVA', 'required', 'on' => 'adendoComImplantacao, adendoSemImplantacao'),
            array('COT_IDSERVICO', 'required', 'on' => 'adendoSemImplantacao, adendoComImplantacao'),
            array('COT_SIMPLES, COT_IDPRODUTO, COT_NROUSUARIOS, COT_VLRMENSAL', 'required', 'on' => 'contratoComImplantacao, contratoSemImplantacao, pedidoReativacaoContratoNovo'),
            array('COT_JUSTIFICATIVA', 'required', 'on' => 'pedidoReativacaoContratoNovo'),
            array('COT_VLRMENSAL', 'CampoJustificativa', 'COT_VLRMENSAL' => $valor_mensal, 'on' => 'contratoSemImplantacao,contratoComImplantacao'),
            array('COT_VLRMENSAL', 'compare', 'compareValue' => "0,00", 'operator' => '!=', 'message' => 'Valor Mensal não pode ser vazio.', 'on' => 'adendoSemImplantacao,contratoSemImplantacao,adendoComImplantacao,contratoComImplantacao,pedidoReativacaoContratoNovo'),
            array('COT_VLRIMPLANTACAO', 'CampoValorImplantacao', 'on' => 'adendoComImplantacao,contratoComImplantacao,orcamentoComImplantacao'),
            array('COT_IDPRODUTO, COT_NROUSUARIOS, COT_VLRMENSAL', 'required', 'on' => 'orcamentoComImplantacao, orcamentoSemImplantacao'),
            array('COT_VLRMENSAL', 'CampoDesconto', 'COT_VLRMENSAL' => $valor_mensal, 'on' => 'orcamentoComImplantacao, orcamentoSemImplantacao'),
            array('COT_HORASIMPLANTACAO', 'required', 'on' => 'pedidoImplantacao, pedidoCustomizacao, pedidoReativacaoContratoNovo, pedidoReativacaoSemContratoNovo'),
            array('COT_VLRMENSAL', 'CampoJustificativaPedido', 'on' => 'pedidoImplantacao, pedidoCustomizacao, pedidoReativacaoContratoNovo, pedidoReativacaoSemContratoNovo'),
            array('vencimentos', 'CampoVencimentos', 'on' => 'pedidoImplantacao, pedidoCustomizacao, pedidoReativacaoContratoNovo,pedidoReativacaoSemContratoNovo'),
            array('COT_IDPRODUTO, COT_IMPLANTACAO_URGENTE, COT_IMPLANTACAO_SITUACAO, COT_IMPLANTACAO_LOCAL, COT_IMPLANTACAO_OBSERVACAO, ConversaoDados', 'Produtos', 'on' => 'pedidoImplantacao'),
            array('COT_CLI_FONE1', 'validateFone', 'on' => 'update'),
            array('COT_DTPRICOBRANCA', 'validatePrimeiraCobranca', 'on' => 'update'),
            array('IdsDocumentosFiscais', 'validateDocumentosFiscais', 'on' => 'adendoComImplantacao, adendoSemImplantacao, contratoComImplantacao, contratoSemImplantacao, pedidoReativacaoContratoNovo'),
        );
        return $rules;
    }

    public function relations() {
        return array(
            'CondicaoPagamento'     => array(self::BELONGS_TO, 'Condicaopagto', 'COT_IDCONDPAGTO', 'joinType' => 'LEFT JOIN'),
            'DocumentosFiscais'     => array(self::HAS_MANY, 'ContratosDocumentosFiscais', 'CDF_IDCONTRATO', 'joinType' => 'LEFT JOIN'),
            'Cliente'               => array(self::BELONGS_TO, 'Clientes', 'COT_IDCLIENTE', 'joinType' => 'LEFT JOIN'),
            'Vendedor'              => array(self::BELONGS_TO, 'Funcionarios', 'COT_IDVENDEDOR', 'joinType' => 'LEFT JOIN'),
            'Produto'               => array(self::BELONGS_TO, 'Modulos', 'COT_IDPRODUTO', 'joinType' => 'LEFT JOIN'),
            'ProdutoInicial'        => array(self::BELONGS_TO, 'Modulos', 'COT_CLI_PRODUTO', 'joinType' => 'LEFT JOIN'),
            'Valor'                 => array(self::BELONGS_TO, 'Valores', 'COT_IDVALOR', 'joinType' => 'LEFT JOIN'),
            'Itens'                 => array(self::HAS_MANY, 'ContratosItens', 'CTI_IDCONTRATO', 'joinType' => 'LEFT JOIN'),
            'Vencimentos'           => array(self::HAS_MANY, 'ContratosVencimentos', 'COV_IDCONTRATO', 'joinType' => 'LEFT JOIN'),
            'Cidade'                => array(self::BELONGS_TO, 'Cidades', 'COT_CLI_CIDADE', 'joinType' => 'LEFT JOIN'),
            'ComoConheceu'          => array(self::BELONGS_TO, 'Motivos', 'COT_CLI_IDMOTIVO', 'joinType' => 'LEFT JOIN'),
            'ProdutoCliente'        => array(self::BELONGS_TO, 'Modulos', 'COT_CLI_PRODUTO', 'joinType' => 'LEFT JOIN'),
            'ProdutoOrcamento'      => array(self::BELONGS_TO, 'Modulos', 'COT_IDPRODUTO', 'joinType' => 'LEFT JOIN'),
            'Revenda'               => array(self::BELONGS_TO, 'Revendas', 'COT_IDREVENDA', 'joinType' => 'LEFT JOIN'),
            'Servico'               => array(self::BELONGS_TO, 'Servicos', 'COT_IDSERVICO', 'joinType' => 'LEFT JOIN'),
            'Status'                => array(self::BELONGS_TO, 'Motivos', 'COT_STATUS', 'joinType' => 'LEFT JOIN'),
            'ModuloComplementar1'   => array(self::BELONGS_TO, 'Modulos', 'COT_CLI_MODULO1', 'joinType' => 'LEFT JOIN'),
            'ModuloComplementar2'   => array(self::BELONGS_TO, 'Modulos', 'COT_CLI_MODULO2', 'joinType' => 'LEFT JOIN'),
            'ModuloComplementar3'   => array(self::BELONGS_TO, 'Modulos', 'COT_CLI_MODULO3', 'joinType' => 'LEFT JOIN'),
            'ModuloComplementar4'   => array(self::BELONGS_TO, 'Modulos', 'COT_CLI_MODULO4', 'joinType' => 'LEFT JOIN'),
            'ModuloComplementar5'   => array(self::BELONGS_TO, 'Modulos', 'COT_CLI_MODULO5', 'joinType' => 'LEFT JOIN'),
            'Arquivo'               => array(self::HAS_ONE, 'Arquivos', 'ARQ_FOREIGNKEY', 'condition'=>'Arquivo.ARQ_MODEL="Contratos"'),
            'ArquivoAssinadoDigital'=> array(self::HAS_MANY, 'Arquivos', 'ARQ_FOREIGNKEY', 'condition'=>'ArquivoAssinadoDigital.ARQ_MODEL="ContratosAssinadosDigitalmente"'),
            'AlteracoesCliente'     => array(self::HAS_MANY, 'ClienteAlteracoesExternas', 'ARQ_FOREIGNKEY', 'condition'=>'AlteracoesCliente.ARQ_MODEL="Contratos"'),
            'SolicitacaoCancelamento'   => array(self::BELONGS_TO, 'ClientesCancelamentos', 'COT_ID_SOLICITACAO_CANCELAMENTO', 'joinType' => 'LEFT JOIN'),
            'SolicitacaoTransferencia'   => array(self::BELONGS_TO, 'ClientesTransferencias', 'COT_ID_SOLICITACAO_TRANSFERENCIA', 'joinType' => 'LEFT JOIN'),
            'ConversaoDados'        => [self::HAS_MANY, 'ContratosConversaoDados', 'CCD_IDCONTRATO', 'joinType' => 'LEFT JOIN'],
            'MotivoFechamentoPositivo' => array(self::BELONGS_TO, 'Motivos', 'COT_IDMOTIVO_FP', 'joinType' => 'LEFT JOIN'),
        );
    }

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

    public function attributeLabels() {
        return array(
            'COT_IDCONTRATO'         => 'Código',
            'COT_IDCLIENTE'          => 'Cliente',
            'COT_IDVENDEDOR'         => 'Vendedor',
            'COT_DTCADASTRO'         => 'Data da Assinatura',
            'COT_DTCADASTRO_FINAL'   => 'Data Final de Assinatura',
            'COT_SITUACAO'           => 'Tipo do Documento',
            'COT_VLRMENSAL'          => 'Valor Mensal',
            'COT_DIAVENCTO'          => 'Dia de Vencimento',
            'COT_NROUSUARIOS'        => 'Número de Usuários',
            'COT_DTPRICOBRANCA'      => 'Primeira Mensalidade',
            'COT_DTINICOBRANCA'      => 'Início da Cobrança',
            'COT_DTINICARENCIA'      => 'Início da Carência',
            'COT_DTFIMCARENCIA'      => 'Final da Carência',
            'COT_FORO'               => 'Foro',
            'COT_CNPJ'               => 'CNPJ',
            'COT_COMPOSICAO'         => 'Produtos Complementares',
            'COT_VLRIMPLANTACAO'     => 'Valor de Implantação',
            'COT_IDPRODUTO'          => 'Produto',
            'COT_TOTMENSAL'          => 'Total Mensal',
            'COT_TOTIMPL'            => 'Total Implantação',
            'COT_DESCONTO'           => 'Desconto',
            'COT_IDCONDPAGTO'        => 'Condição de pagamento',
            'COT_TIPOVENDA'          => 'Tipo de Venda',
            'COT_FUNCAO'             => 'Função',
            'COT_REPRESENTANTES'     => 'Representantes',
            'COT_CPFS'               => 'CPFs dos Representantes',
            'COT_FUNCIONAMENTO'      => 'Funcionamento',
            'COT_STATUS'             => 'Status',
            'Status'                 => 'Status',
            'CondicaoPagamento'      => 'Condição de Pagamento',
            'Cliente'                => 'Cliente',
            'Vendedor'               => 'Vendedor',
            'Produto'                => 'Produto',
            'COT_TESTEMUNHA1'        => 'Testemunha 1',
            'COT_CPF1'               => 'CPF Testemunha 1',
            'COT_TESTEMUNHA2'        => 'Testemunha 2',
            'COT_CPF2'               => 'CPF Testemunha 2',
            'COT_SIMPLES'            => 'Optante do Simples',
            'CLI_CNPJCPF'            => 'CNPJ',
            'COT_IDREVENDA'          => 'Unidade de Negócios',
            'Revenda'                => 'Unidade de negócios',
            'COT_MINIMO'             => 'Mínimo Tabela',
            'COT_PERCENTUAL'         => '% de variação',
            'COT_CLI_NOME'           => 'Razão Social',
            'COT_CLI_CONTATO'        => 'Contato',
            'COT_CLI_ENDERECO'       => 'Endereço',
            'COT_CLI_NUMERO'         => 'Numero',
            'COT_CLI_COMPLEMENTO'    => 'Complemento',
            'COT_CLI_BAIRRO'         => 'Bairro',
            'COT_CLI_CIDADE'         => 'Cidade',
            'COT_CLI_CNPJCPF'        => 'CNPJ/CPF',
            'COT_CLI_INSCR_EST'      => 'Inscrição Estadual / RG',
            'COT_CLI_CEP'            => 'CEP',
            'COT_CLI_FONE1'          => 'Telefone',
            'COT_HORASIMPLANTACAO'   => 'Horas de Implantação',
            'COT_CLI_EMAIL'          => 'E-mail',
            'Cidade'                 => 'Cidade',
            'COT_VLRMENSAL_FINAL'    => 'Valor Mensal Final',
            'ComoConheceu'           => 'Como nos Conheceu',
            // 'COT_CATDOCUMENTO'       => 'Categoria',
            'COT_CATDOCUMENTO'       => 'Situação do documento',
            'COT_JUSTIFICATIVA'      => 'Justificativa',
            'CLI_IDMOTIVO'           => 'Como nos Conheceu',
            'COT_OBS'                => 'Observações',
            'COT_HORACADASTRO'       => 'Hora Cadastro',
            'COT_CRIARNOVOCONTRATO'  => 'Criar novo contrato?',
            'vencimentos'            => 'Vencimentos',
            'COT_DTATIVACAO'         => 'Data de ativação',
            'COT_MESMETA'            => 'Mês meta',
            'COT_ANOMETA'            => 'Ano meta',
            'COT_IDSERVICO'          => 'Tipo de Serviço',
            'COT_COBRADAIMPLANTACAO' => 'Haverá cobrança de implantação?',
            'COT_MODULOS'            => 'Módulos Complementares',
            'COT_MINIMOTABELA'       => 'Mínimo tabela',
            'COT_VARIACAO'           => '% de variação',
            'DocumentosFiscais'      => 'Documentos Fiscais',
            'IdsDocumentosFiscais'   => 'Documentos Fiscais',
            'COT_CLI_IDMOTIVO'       => 'Como nos conheceu',
            'SINTETICO'              => 'Exportar somente relatório sintético',
            'COT_TIPOASSINATURA'     => 'Tipo de assinatura',
            'COT_BLOQUEARASSINATURA' => 'Todas assinaturas coletadas',
            'COT_FATURAMENTO'        => 'Status do Faturamento',
            'CLI_SITUACAO'           => 'Status do Cliente',
            'COT_DATA_FATURA'        => 'Vencimento da fatura',
            'multiSelecao'           => '',
            'FINANCEIRO'             => '',
            'CCD_IMPORTAR'           => 'Importar',
            'CDP_IDPRODUTO'          => 'Produtos',
            'CCD_CLIENTES'           => 'Clientes',
            'CCD_FORNECEDORES'       => 'Fornecedores',
            'CCD_OBSERVACAO'         => 'Observações',
            'COT_IMPLANTACAO_URGENTE'   => 'Solicita urgência',
            'COT_IMPLANTACAO_SITUACAO'  => 'Situação do pedido',
            'COT_IMPLANTACAO_LOCAL'     => 'Local da implantação (quando diferente do endereço no contrato)',
            'COT_IMPLANTACAO_OBSERVACAO'=> 'Observações',
            'COT_IDMOTIVO_FP'        => 'Motivo do Fechamento Positivo',
            'COT_STATUS_REVENDAS'    => 'Status unidades de negócios',
            'COT_GERADO_AUTOMATICAMENTE' => 'Gerado automaticamente',
            'COT_FOI_ATIVADO' => 'Foi ativado no CRM',
            'COT_USUARIOS_MOBILE' => 'Usuários módulo Mobile',
        );
    }

    protected function beforeSave() {
        parent::beforeSave();
        
        if ($this->isNewRecord) {

            $this->COT_FUNCIONAMENTO = $this->COT_NROUSUARIOS == 1 ? '1' : 'N';

            $this->COT_VLRIMPLANTACAO = $this->COT_VLRIMPLANTACAO ? Util::convertdecimal($this->COT_VLRIMPLANTACAO) : 00.00;
            $this->COT_VLRMENSAL = $this->COT_VLRMENSAL ? Util::convertDecimal($this->COT_VLRMENSAL) : 00.00;

            $this->COT_HORACADASTRO = date('H:i:s');

            if (empty($this->COT_IDREVENDA)) {
                $cliente = Clientes::model()->find('CLI_IDCLIENTE='.$this->COT_IDCLIENTE);
                if (isset($cliente->CLI_CIDADE)) {
                    $revenda = $cliente->getRevendaResponsavel2();
                    if ($revenda) {
                        $this->COT_IDREVENDA = $revenda->REV_IDREVENDA;
                    }
                }
            }

            if (!in_array($this->COT_SITUACAO, array(Contratos::PEDIDO_REATIVACAO, Contratos::PEDIDO_CUSTOMIZACAO))) {
                $this->COT_MINIMOTABELA = $this->getValorMinimo();
                $Percentual             = 0;
                $Minimo                 = $this->COT_MINIMOTABELA;
                $Valor                  = $this->getValorNegociado(true);
                if ($Minimo != 0) {
                    $Percentual         = ($Valor*100)/$Minimo;
                    $Percentual         = $Percentual-100;
                    $this->COT_VARIACAO = round($Percentual, 1);
                }

                $produto = Modulos::model()->findByPk($this->COT_IDPRODUTO);
                if(isset($produto->MOD_IDVALOR)) {
                    $this->COT_IDVALOR = $produto->MOD_IDVALOR;
                }
            }
        }

        $this->COT_CLI_CNPJCPF = str_replace(array('.', '/', '-'), '', $this->COT_CLI_CNPJCPF);
        return true;
    }

    public function afterDelete() {
        parent::afterDelete();
        if(!empty($this->Arquivo)) {
            $this->Arquivo->delete();
        }
        if(!empty($this->ArquivoAssinadoDigital)) {
            foreach ($this->ArquivoAssinadoDigital as $arquivo) {
                $arquivo->delete();
            }
        }

        return true;
    }

    public function moduloMobile($attribute, $params) {
        if(!in_array($this->COT_SITUACAO, [
            Contratos::CONTRATO,
            Contratos::ADENDO,
            Contratos::ORCAMENTO,
            Contratos::PEDIDO_REATIVACAO,
        ])) {
            return true;
        }

        $modulos = [];
        if(!empty($this->COT_IDPRODUTO)) {
            $modulos[] = $this->COT_IDPRODUTO;
        }
        if(!empty($this->produtos) && is_array($this->produtos)) {
            $modulos = array_merge($modulos, $this->produtos);
        }
        $modulos = !empty($modulos) ? implode(', ', $modulos) : "";
        if(!empty($modulos) && Modulos::model()->count("MOD_MOBILE = 1 and MOD_IDMODULO in ({$modulos})") > 0) {
            if(empty($this->{$attribute})) {
                $this->addError($attribute, $this->getAttributeLabel($attribute) . ' não pode ser deixado em branco.');
            }
        }
    }

    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 validatePrimeiraCobranca($attribute, $params) {
        if($this->COT_SITUACAO == Contratos::ADENDO) {
            if(!empty($this->{$attribute})) {
                $date = $this->{$attribute};
                if(strpos($date, '/') !== false) {
                    $date = DateTime::createFromFormat('d/m/Y', $date);
                } else {
                    $date = DateTime::createFromFormat('Y-m-d', $date);
                }
                if($date->format('d') != 10) {
                    $this->addError($attribute, $this->getAttributeLabel($attribute) . ' somente pode ser no dia 10.');
                }
                if($date->format('Ymd') < date('Ymd')) {
                    $this->addError($attribute, $this->getAttributeLabel($attribute) . ' não pode ser menor que a data atual.');
                }
            } else {
                $this->addError($attribute, $this->getAttributeLabel($attribute) . ' não pode ser deixado em branco.');
            }
        }
    }

    // Verifica vencimentos para pedidos
    public function CampoVencimentos($attribute, $params) {
        $todosPreenchidos = true;
        $confereData = true;
        $datasDiferentes = true;
        $dia15 = true;

        $datasVencimentos = array();
        if(isset($this->vencimentos)) {
            foreach ($this->vencimentos as $vencimento) {
                if(!isset($vencimento['valor']) || empty($vencimento['valor'])) {
                    $todosPreenchidos = false;
                }

                $Data = Util::formatDataMysql($vencimento['data']);
                $Data = DateTime::createFromFormat('Y-m-d', $Data);
                if ($Data) {
                    if ($Data->format('Y-m-d') < date('Y-m-d')) {
                        $todosPreenchidos = $ConfereData = false;
                    } elseif (!empty($datasVencimentos)) {
                        foreach ($datasVencimentos as $dataVencimento) {
                            if ($Data->format('Y-m-d') == $dataVencimento) {
                                $datasDiferentes = false;
                            }
                        }
                    }

                    $datasVencimentos[] = $Data->format('Y-m-d');

                    if (
                        $this->scenario == "pedidoImplantacao" &&
                        $this->Cliente->isMatrizFilial() &&
                        $Data->format('d') != 15
                    ) {
                        $dia15 = false;
                    }
                }
            }
        }

        if (!$todosPreenchidos) {
            $this->addError($attribute, "É necessário informar as datas e valores de todos os vencimentos.Todas as datas devem ser superiores a " . date('d/m/Y'));
        } elseif (!$confereData) {
            $this->addError($attribute, 'Todas as datas dos vencimentos devem ser superiores a ' . date('d/m/Y'));
        } elseif (!$datasDiferentes) {
            $this->addError($attribute, 'Todas as datas dos vencimentos devem ser diferentes.');
        } elseif (!$dia15) {
            $this->addError($attribute, 'O dia informado é inválido! Todos os vencimentos de matriz e filiais devem ser no dia 15.');
        }

        return $todosPreenchidos;
    }

    // Solicitação de aprovação para valores menores em contrato / orçamento/ adendo
    public function CampoJustificativa($attribute, $params) {
        $JustificativaPreenchida = (isset($_POST['Contratos']['COT_JUSTIFICATIVA']) && !empty($_POST['Contratos']['COT_JUSTIFICATIVA']));
        if($JustificativaPreenchida)
            return true;

        if($this->descontosAbaixoTabela()) {
            $this->addError('COT_JUSTIFICATIVA', 'O desconto concedido necessita de aprovação da diretoria! A justificativa de desconto é obrigatória!');
            return false;
        }

        if($this->COT_COBRADAIMPLANTACAO != 1 && $this->isMatrizFilial()) {
            $this->addError('COT_JUSTIFICATIVA', 'Justificativa de não cobrança da implantação é obrigatória!');
            return false;
        }

        return true;
    }

    public function CampoValorImplantacao($attribute, $params) {
        $valorInformado = $this->COT_VLRIMPLANTACAO ? Util::convertdecimal($this->COT_VLRIMPLANTACAO) : 0;
        if($this->COT_COBRADAIMPLANTACAO && $this->COT_VLRIMPLANTACAO == 0)
            $this->addError('COT_VLRIMPLANTACAO', 'Valor de implantação é obrigatório!');
    }
    public function Produtos($attribute, $params) {
        if ($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO != 1){
            return false;
        } else if ($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO == 1 && !$this->COT_IDPRODUTO){
            $this->addError($attribute, 'Produto é obrigatório');
            return false;
        }

        if (!$this->COT_IDPRODUTO && (!isset($_POST['produtos']) || empty($_POST['produtos']) || !is_array($_POST['produtos'])))
            $this->addError($attribute, 'Você não selecionou nenhum produto ou módulo complementar');
    }

    // Soliciação de aprovação para valores menores em pedido
    public function CampoJustificativaPedido($attribute, $params) {
        $JustificativaPreenchida = (isset($_POST['Contratos']['COT_JUSTIFICATIVA']) && !empty($_POST['Contratos']['COT_JUSTIFICATIVA']));
        if($JustificativaPreenchida || (!$this->isMatrizFilial() && $this->COT_SITUACAO == Contratos::PEDIDO_IMPLANTACAO))
            return true;

        $return = true;
        if(isset($_POST['vencimentos']) && count($_POST['vencimentos']) > 4 && $this->isMatrizFilial()) {
            $this->addError('COT_JUSTIFICATIVA', 'Você informou mais que 4 vencimentos para este o pedido! A justificativa é obrigatória!');
            $return = false;
        }

        if($this->getMaximoHorasImplantacao() < $this->COT_HORASIMPLANTACAO && $this->COT_HORASIMPLANTACAO > 0 && $this->isMatrizFilial()) {
            $this->addError('COT_HORASIMPLANTACAO', 'O total de horas de implantação informado excede o valor máximo de horas dos produtos selecionados! A justificativa é obrigatória!');
            $return = false;
        }

        if($this->descontosAbaixoTabela()) {
            if($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO == 1) {
                $this->addError('COT_VLRMENSAL', 'O desconto concedido necessita de aprovação da diretoria! A justificativa de desconto é obrigatória!');
                $return = false;
            } else if($this->isMatrizFilial()) {
                $this->addError('COT_JUSTIFICATIVA', 'O desconto concedido necessita de aprovação da diretoria! A justificativa de desconto é obrigatória!');
                $return = false;
            }
        }
        return $return;
    }

    // Não permite em orçamentos colocar valor menor de tabela
    public function CampoDesconto($attribute, $params) {
        if($this->descontosAbaixoTabela())
            $this->addError($attribute, 'Não é permitido orçamento abaixo do valor de tabela!');
    }

    public function validateDocumentosFiscais($attribute, $params) {
        $modulos = $this->produtos;
        if(!empty($this->COT_IDPRODUTO)) {
            $modulos[] = $this->COT_IDPRODUTO;
        }
        if(empty($this->IdsDocumentosFiscais) && ModulosDocumentosFiscais::model()->countDocumentos($modulos) > 0) {
            $this->addError($attribute, 'Você deve informar quais documentos fiscais o cliente utiliza!');
        }
    }

    public function descontosAbaixoTabela() {
        $ValorMinimo = $this->getValorMinimo();
        $valorInformado = $this->getValorNegociado(true, ($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO == 1), true);

        // para pedidos valor mínimo somente é levado em conta quando for implantação
        // valor mínimo de pedidos somente é validados para para matriz IDREVENDA = 1 e filial de porto alegre IDREVENDA = 12
        if($this->COT_SITUACAO == Contratos::PEDIDO_IMPLANTACAO && !$this->isMatrizFilial())
            return false;

        return ($ValorMinimo > $valorInformado);
    }

    public function getCliente() {
        if($this->isNewRecord || empty($this->COT_IDCLIENTE)) {
            if(isset($_GET['CLI_IDCLIENTE']))
                $this->COT_IDCLIENTE = $_GET['CLI_IDCLIENTE'];
            elseif(isset($_POST['Contratos']['COT_IDCLIENTE']))
                $this->COT_IDCLIENTE = $_POST['Contratos']['COT_IDCLIENTE'];
        }
        return Clientes::model()->find('CLI_IDCLIENTE = '. $this->COT_IDCLIENTE);
    }

    public function isMatrizFilial() {
        if(isset($this->Revenda->REV_IDREVENDA)) {
            return $this->Revenda->isMatrizFilial();
        }
        return $this->getCliente()->isMatrizFilial();
    }

    public function isMatriz() {
        if(isset($this->Revenda->REV_IDREVENDA)) {
            return $this->Revenda->isMatriz();
        }
        return $this->getCliente()->isMatriz();
    }

    public function isFilial() {
        if(isset($this->Revenda->REV_IDREVENDA)) {
            return $this->Revenda->isFilial();
        }
        return $this->getCliente()->isFilial();
    }

    public function documentoAtivo() {
        return in_array($this->COT_STATUS, array(2, 14));
    }

    public function documentoAceito() {
        return $this->COT_TIPOASSINATURA == Contratos::ASSINADO_ACEITO && $this->COT_STATUS == 494;
    }

    public function podeFazerAnalise()
    {
        return in_array(User::getPrivilegio(), array(1,7,11)) || User::getId() == 356;
    }

    public function canUpdate($msg = false) {
        if(User::isRevenda() || (User::getPrivilegio() == 8 && !$this->podeFazerAnalise())) {
            if($this->COT_STATUS != 1) {
                if ($msg) {
                    Yii::app()->user->setFlash('error', 'Este documento não pode ser editado!');
                }
                return false;
            }
            if(User::isVendedor() && User::getId() != $this->COT_IDVENDEDOR) {
                if ($msg) {
                    Yii::app()->user->setFlash('error', 'Você não pode visualizar documentos que não sejam de suas vendas!');
                }
                return false;
            }

            return true;
        }
        if (!$this->podeFazerAnalise()) {
            if ($msg) {
                Yii::app()->user->setFlash('error', 'Você não tem permissão para alterar os dados deste documento!');
            }
            return false;
        }
        if ($this->documentoAtivo()) {
            if ($msg) {
                Yii::app()->user->setFlash('error', 'Este documento é um documento ativo, não é possível alterar dados do mesmo!');
            }
            return false;
        }
        if ($this->documentoAceito()) {
            if ($msg) {
                Yii::app()->user->setFlash('error', 'Este documento já foi aceito pelo cliente, não é possível alterar dados do mesmo!');
            }
            return false;
        }
        if ($this->mostrarCopiaDigital()) {
            if ($msg) {
                Yii::app()->user->setFlash('error', 'Este documento não pode ser editado!');
            }
            return false;
        }
        if ($this->mostrarCopiaDigitalAssinada()) {
            if($this->COT_STATUS == 12) {
                return true;
            }
            if ($msg) {
                Yii::app()->user->setFlash('error', 'Este documento não pode ser editado!');
            }
            return false;
        }

        if (in_array($this->COT_STATUS, array(1, 3))) {
            return true;
        }

        if ($msg) {
            Yii::app()->user->setFlash('error', 'Este documento não pode ser editado!');
        }
        return false;
    }

    public function mostrarPdf() {
        if($this->mostrarCopiaDigital()) {
            return false;
        }
        if($this->mostrarCopiaDigitalAssinada()) {
            if($this->COT_STATUS == 12) {
                return true;
            }
            return false;
        }
        return in_array($this->COT_STATUS, array(2, 4, 8, 11, 14, 21, 494));
    }
    public function podeRemoverPDF() {
        if(!$this->podeFazerAnalise()) {
            return false;
        }
        if($this->mostrarCopiaDigital()) {
            return false;
        }
        if($this->mostrarCopiaDigitalAssinada()) {
            if($this->COT_STATUS == 12) {
                return true;
            }
            return false;
        }
        if($this->documentoAtivo()) {
            return false;
        }
        if (!$this->hasPdfGerado()) {
            return false;
        }
        if ($this->hasPdfAreaClientes()) {
            return false;
        }
        return in_array($this->COT_STATUS, array(4,8,10,11,21));
    }

    public function podeAnexarCopiaDigital() {
        if ($this->COT_SITUACAO == self::TERMO_CANCELAMENTO) {
            return false;
        }
        /*if($this->COT_TIPOASSINATURA == Contratos::ASSINADO_DIGITAL) {
            return false;
        }*/
        if(!empty($this->Arquivo)) {
            return false;
        }
        /*if($this->mostrarCopiaDigitalAssinada()) {
            return false;
        }*/
        if($this->COT_BLOQUEARASSINATURA) {
            return false;
        }

        if($this->mostrarCopiaDigital()) {
            return false;
        }

        if(in_array(User::getPrivilegio(), array(1,7,8,11)) || User::isRevenda()) {
            if(in_array($this->COT_STATUS, array(2, 4, 10, 11, 14))) {
            // Documento ativado, Aguardando aceite do cliente, Enviando documentação, Analisando documentação recebida, Processo concluído
                return true;
            }
        }

        return false;
    }
    public function podeDesanexarCopiaDigital() {
        if(!$this->podeFazerAnalise()) {
            return false;
        }
        if($this->COT_BLOQUEARASSINATURA) {
            return false;
        }
        /*if($this->mostrarCopiaDigitalAssinada()) {
            return false;
        }*/
        if($this->documentoAtivo()) {
            return false;
        }
        if(!$this->mostrarCopiaDigital()) {
            return false;
        }
        return in_array($this->COT_STATUS, array(4, 8, 11, 21));
        // Aguardando aceite do cliente, Exceção aprovada, Analisando documentação recebida, Documentação pendente
    }
    public function mostrarCopiaDigital() {
        if($this->COT_TIPOASSINATURA != Contratos::ASSINADO_MANUAL) {
            return false;
        }
        return !empty($this->Arquivo);
    }

    public function podeAnexarCopiaDigitalAssinada() {
        // ASSINATURA DIGITAL INATIVADA
        return false;

        /*if(!$this->isMatriz()) {
            return false;
        }
        if(!empty($this->Arquivo)) {
            return false;
        }
        if($this->COT_TIPOASSINATURA == Contratos::ASSINADO_MANUAL) {
            return false;
        }
        if($this->mostrarCopiaDigital()) {
            return false;
        }
        if($this->COT_BLOQUEARASSINATURA) {
            return false;
        }
        if(in_array(User::getPrivilegio(), array(1,7,11))) {
            return true;
        }
        if(User::isRevenda() || User::getPrivilegio() == 8) {
            if($this->COT_STATUS == 4) {
                return true;
            }
            if($this->COT_TIPOASSINATURA == Contratos::ASSINADO_DIGITAL && $this->COT_STATUS == 12) {
                return true;
            }
        }

        if(User::getPrivilegio() == 16) {
            if($this->COT_TIPOASSINATURA != Contratos::ASSINADO_DIGITAL) {
                return false;
            }
            if($this->documentoAtivo()) {
                return true;
            }
        }

        return false;*/
    }
    public function mostrarCopiaDigitalAssinada() {
        // ASSINATURA DIGITAL INATIVADA
        return false;

        /*if($this->COT_TIPOASSINATURA != Contratos::ASSINADO_DIGITAL) {
            return false;
        }
        return !empty($this->ArquivoAssinadoDigital);*/
    }

    public function trocarTipoAssinatura() {
        // ASSINATURA DIGITAL INATIVADA
        return false;

        /*if(!in_array(User::getPrivilegio(), array(1,7,11))) {
            return false;
        }
        if(!$this->mostrarCopiaDigital() && !$this->mostrarCopiaDigitalAssinada()) {
            return false;
        }

        return in_array($this->COT_STATUS, array(10,11));*/
    }

    public function listarCopiasAssinadasDigitalmente() {
        // ASSINATURA DIGITAL INATIVADA
        return false;

        /*if(!in_array(User::getPrivilegio(), array(1,7,11))) {
            return false;
        }

        if(!$this->mostrarCopiaDigitalAssinada()) {
            return false;
        }

        return true;*/
    }

    public function podeEscolherTipoCopiaDigital() {
        // ASSINATURA DIGITAL INATIVADA
        return false;

        // return $this->podeAnexarCopiaDigital() && $this->podeAnexarCopiaDigitalAssinada();
    }

    private function conditionValores($value, $comparison) {
        $conditios = array();

        //contrato, adendo, orçamento
        $cond_contrato = array();
        $cond_contrato[] = "t.COT_VLRMENSAL {$comparison} '{$value}'";
        $cond_contrato[] = 't.COT_SITUACAO in (' . Contratos::CONTRATO . ',' . Contratos::ADENDO . ',' . Contratos::ORCAMENTO . ')';
        $conditions[] = '(' . implode(' AND ', $cond_contrato) . ')';

        // pedidos
        $cond_pedido = array();
        $cond_pedido[] = "t.COT_VLRIMPLANTACAO {$comparison} '{$value}'";
        $cond_pedido[] = 't.COT_SITUACAO in (' . Contratos::PEDIDO_IMPLANTACAO . ',' . Contratos::PEDIDO_REATIVACAO . ')';
        $conditions[] = '(' . implode(' AND ', $cond_pedido) . ')';

        return '('.implode(' OR ', $conditions).')';
    }

    public function search($pageSize = false) {

        $conditions = array();
        if (!empty(Util::formatDataMysql($this->COT_DTCADASTRO)))
            $conditions[] = 't.COT_DTCADASTRO >= "'.Util::formatDataMysql($this->COT_DTCADASTRO).'"';
        if (!empty(Util::formatDataMysql($this->COT_DTCADASTRO_FINAL)))
            $conditions[] = 't.COT_DTCADASTRO <= "'.Util::formatDataMysql($this->COT_DTCADASTRO_FINAL).'"';

        if (!empty(Util::formatDataMysql($this->COT_DTATIVACAO)))
            $conditions[] = 't.COT_DTATIVACAO >= "'.Util::formatDataMysql($this->COT_DTATIVACAO).'"';
        if (!empty(Util::formatDataMysql($this->COT_DTATIVACAO_FINAL)))
            $conditions[] = 't.COT_DTATIVACAO <= "'.Util::formatDataMysql($this->COT_DTATIVACAO_FINAL).'"';

        if (!empty(Util::formatDataMysql($this->COT_DTINICOBRANCA)))
            $conditions[] = 't.COT_DTINICOBRANCA >= "'.Util::formatDataMysql($this->COT_DTINICOBRANCA).'"';
        if (!empty(Util::formatDataMysql($this->COT_DTINICOBRANCA_FINAL)))
            $conditions[] = 't.COT_DTINICOBRANCA <= "'.Util::formatDataMysql($this->COT_DTINICOBRANCA_FINAL).'"';

        if (!empty(Util::formatDataMysql($this->COT_DTPRICOBRANCA)))
            $conditions[] = 't.COT_DTPRICOBRANCA >= "'.Util::formatDataMysql($this->COT_DTPRICOBRANCA).'"';
        if (!empty(Util::formatDataMysql($this->COT_DTPRICOBRANCA_FINAL)))
            $conditions[] = 't.COT_DTPRICOBRANCA <= "'.Util::formatDataMysql($this->COT_DTPRICOBRANCA_FINAL).'"';

        if(!empty(Util::convertdecimal($this->COT_VLRMENSAL)))
            $conditions[] = $this->conditionValores(Util::convertdecimal($this->COT_VLRMENSAL), '>=');
        if(!empty(Util::convertdecimal($this->COT_VLRMENSAL_FINAL)))
            $conditions[] = $this->conditionValores(Util::convertdecimal($this->COT_VLRMENSAL_FINAL), '<=');

        if(!empty($this->COT_IDCONTRATO))
            $conditions[] = 't.COT_IDCONTRATO = "'. ((int)$this->COT_IDCONTRATO).'"';

        if (!empty($this->COT_IDREVENDA)) {
            if(is_array($this->COT_IDREVENDA)) {
                $conditions[] = 't.COT_IDREVENDA in ('. implode(',', $this->COT_IDREVENDA).')';
            } else {
                $conditions[] = 't.COT_IDREVENDA = ' . $this->COT_IDREVENDA;
            }
        }

        if (User::isVendedor()) {
            $conditions[] = 'COT_CLI_CIDADE in(' . User::getCidades(true) . ')';
        } elseif (User::isRevenda()) {
            $conditions[] = 'COT_IDREVENDA in(' . User::getRevendas(true) . ')';
        }

        if (User::isRevenda()) {
            $conditions[] = 't.COT_CLI_CIDADE in('.User::getCidades(true).')';
        }

        if(!empty($this->COT_IDVENDEDOR))
            $conditions[] = 't.COT_IDVENDEDOR = ' .  $this->COT_IDVENDEDOR;

        if(!empty($this->COT_IDPRODUTO)) {
            if(is_array($this->COT_IDPRODUTO)) {
                $conditions[] = 't.COT_IDPRODUTO in ('. implode(',', $this->COT_IDPRODUTO).')';
            } else {
                $conditions[] = 't.COT_IDPRODUTO = ' . $this->COT_IDPRODUTO;
            }
        }

        if(!empty($this->COT_MODULOS)) {
            if(is_array($this->COT_MODULOS)) {
                $conditions[] = 'EXISTS (SELECT CTI_IDPRODUTO FROM contratos_itens cti where t.COT_IDCONTRATO = cti.CTI_IDCONTRATO and cti.CTI_IDPRODUTO in ('.implode(',', $this->COT_MODULOS).'))';
            } else {
                $conditions[] = "EXISTS (SELECT CTI_IDPRODUTO FROM contratos_itens cti where t.COT_IDCONTRATO = cti.CTI_IDCONTRATO and cti.CTI_IDPRODUTO = {$this->COT_MODULOS})";
            }
        }
        if(!empty($this->COT_GERADO_AUTOMATICAMENTE)) {
            $conditions[] = 't.COT_GERADO_AUTOMATICAMENTE = ' . $this->COT_GERADO_AUTOMATICAMENTE;
        }

        if (!empty($this->COT_SITUACAO) && is_array($this->COT_SITUACAO)) {
            $cond_situacao = array();
            foreach ($this->COT_SITUACAO as $situacao) {
                if ($situacao == Contratos::ADENDO && !empty($this->COT_IDSERVICO)) {
                    $cond_situacao[] = '(t.COT_SITUACAO = ' . $situacao . ' AND t.COT_IDSERVICO ' . (is_array($this->COT_IDSERVICO) ? 'in ('.implode(',', $this->COT_IDSERVICO) . ')' : '='.$this->COT_IDSERVICO) . ')';
                } else if ($situacao == Contratos::PEDIDO_IMPLANTACAO && !User::isRevenda()) {
                    $cond_situacao[] = "(t.COT_SITUACAO = ".Contratos::PEDIDO_IMPLANTACAO." AND Revenda.REV_TIPO in(".Revendas::MATRIZ.", ".Revendas::FILIAL."))";
                } else {
                    $cond_situacao[] = 't.COT_SITUACAO = '.$situacao;
                }
            }
            $conditions[] = '('.implode(' OR ', $cond_situacao).')';
        } else {
            if (User::isRevenda()) {
                $tipos = array(
                    Contratos::CONTRATO,
                    Contratos::ADENDO,
                    Contratos::PEDIDO_CUSTOMIZACAO,
                    Contratos::PEDIDO_REATIVACAO,
                    Contratos::PEDIDO_IMPLANTACAO
                );
                $conditions[] = 't.COT_SITUACAO in ('.implode(', ', $tipos).')';
            } else {
                $cond_situacao   = array();
                $cond_situacao[] = "(t.COT_SITUACAO = ".Contratos::PEDIDO_IMPLANTACAO." AND Revenda.REV_TIPO in(".Revendas::MATRIZ.", ".Revendas::FILIAL."))";

                // $tipos           = array(Contratos::CONTRATO, Contratos::ADENDO, Contratos::PEDIDO_CUSTOMIZACAO, Contratos::PEDIDO_REATIVACAO);
                $tipos           = array(
                    Contratos::CONTRATO,
                    Contratos::ADENDO,
                    Contratos::PEDIDO_CUSTOMIZACAO,
                    Contratos::PEDIDO_REATIVACAO
                );
                $cond_situacao[] = 't.COT_SITUACAO in ('.implode(', ', $tipos).')';
                $conditions[]    = '('.implode(' OR ', $cond_situacao).')';
            }
        }

        if(!empty($this->COT_STATUS)) {
            if(is_array($this->COT_STATUS)) {
                $conditions[] = 't.COT_STATUS in('.implode(', ', $this->COT_STATUS).')';
            } else {
                $conditions[] = 't.COT_STATUS  = '. $this->COT_STATUS;
            }
        }

        if (is_array($this->COT_CATDOCUMENTO)) {
            $codStatus = array();
            if (in_array('P', $this->COT_CATDOCUMENTO)) {
                $codStatus[] = "1, 3, 4, 6, 7, 8, 10, 11, 15, 21";

            }
            if (in_array('A', $this->COT_CATDOCUMENTO)) {
                $codStatus[] = "2, 14, 19, 23, 494";

            }
            if (in_array('R', $this->COT_CATDOCUMENTO)) {
                $codStatus[] = "5, 9, 12, 17, 22";

            }
            if (in_array('C', $this->COT_CATDOCUMENTO)) {
                $codStatus[] = "13, 16, 18, 25, 468";

            }
            $conditions[] = "t.COT_STATUS IN (" . implode(",", $codStatus) . ")";
        }

        if (is_array($this->CLI_IDMOTIVO))
            $conditions[] = 't.COT_CLI_IDMOTIVO in ('. implode(',', $this->CLI_IDMOTIVO).')';

        if (is_array($this->COT_IDMOTIVO_FP))
            $conditions[] = 't.COT_IDMOTIVO_FP in ('. implode(',', $this->COT_IDMOTIVO_FP).')';

        if(!empty($this->COT_CLI_CNPJCPF))
            $conditions[] = 't.COT_CLI_CNPJCPF = "' . str_replace("([^0-9])", "", $this->COT_CLI_CNPJCPF).'"';

        if(!empty($this->COT_CLI_NOME))
            $conditions[] = "(t.COT_CLI_NOME like '%" . Util::secureForSelect($this->COT_CLI_NOME, true) . "%' or t.COT_CLI_NOME like '%" . Util::secureForSelect($this->COT_CLI_NOME) . "%')";

        if(!empty($this->COT_CLI_CONTATO))
            $conditions[] = "(t.COT_CLI_CONTATO like '%" . Util::secureForSelect($this->COT_CLI_CONTATO, true) . "%' or t.COT_CLI_CONTATO like '%" . Util::secureForSelect($this->COT_CLI_CONTATO) . "%')";

        if(!empty($this->COT_TIPOASSINATURA)) {
            if(is_array($this->COT_TIPOASSINATURA)) {
                $conditions[] = "t.COT_TIPOASSINATURA in ('".implode("','", $this->COT_TIPOASSINATURA)."')";
            } else {
                $conditions[] = "t.COT_TIPOASSINATURA = '".$this->COT_TIPOASSINATURA."'";
            }
        }

        if(!empty($this->CLI_SITUACAO)) {
            $conditions[] = "Cliente.CLI_SITUACAO = '".$this->CLI_SITUACAO."'";
        }

        if(!empty($this->LISTAR_ASSINATURA_PENDENTE)) {
            $conditions[] = "(t.COT_BLOQUEARASSINATURA is null or t.COT_BLOQUEARASSINATURA = 0)";
        }
        if(!empty($this->COT_FATURAMENTO)) {
            $conditions[] = "t.COT_FATURAMENTO is not null";
        }

        if(strlen($this->COT_STATUS_FATURAMENTO) > 0) {
            $conditions[] = "COT_FATURAMENTO = {$this->COT_STATUS_FATURAMENTO}";
        }

        $criteria = new CDbCriteria;

        $conditions = implode(' AND ', $conditions);
        $criteria->addCondition($conditions);
        $criteria->with = array(
            'ComoConheceu'  => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => 'ComoConheceu.MOT_DESCRICAO'),
            'Produto'       => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => 'Produto.MOD_DESCRICAO'),
            'Revenda'       => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => 'Revenda.REV_FANTASIA, Revenda.REV_TIPO'),
            'Status'        => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => 'Status.MOT_DESCRICAO'),
            'Vendedor'      => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => 'Vendedor.FUN_NOME'),
            );

        if (!empty($this->CLI_SITUACAO)) {
            $criteria->with['Cliente'] = array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => 'Cliente.CLI_SITUACAO');
        }

        $select = array(
            't.COT_IDCONTRATO',
            't.COT_SITUACAO',
            't.COT_DTCADASTRO',
            't.COT_DTATIVACAO',
            't.COT_IDCLIENTE',
            't.COT_CLI_NOME',
            't.COT_IDVENDEDOR',
            't.COT_IDREVENDA',
            't.COT_IDPRODUTO',
            't.COT_VLRMENSAL',
            't.COT_VLRIMPLANTACAO',
            't.COT_STATUS',
            't.COT_CLI_IDMOTIVO',
            't.COT_CLI_CNPJCPF',
            't.COT_DTINICOBRANCA',
            't.COT_DTPRICOBRANCA',
            't.COT_FATURAMENTO',
            't.COT_TIPOASSINATURA',
            't.COT_HORASIMPLANTACAO',
            );

        if (User::getPermissao('FUN_TBL_DESCONTO')) {
            $select[] = 't.COT_MINIMOTABELA';
            $select[] = 't.COT_VARIACAO';
        }

        if (!empty($this->TOKEN)) {
            $select[] = 't.COT_CLI_CIDADE';
            $select[] = 't.COT_NROUSUARIOS';
            $select[] = 't.COT_REPRESENTANTES';
            $select[] = 't.COT_CRIARNOVOCONTRATO';
            $select[] = 't.COT_DOCUMENTOVINCULADO';

            $criteria->with['Cidade'] = array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => 'Cidade.CID_DESCRICAO');
            $criteria->with['Itens'] = array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => '*');
        }
        $criteria->select = implode(',', $select);

        // $criteria->group = 't.COT_IDCONTRATO';
        $sort = new CSort;

        $sort->defaultOrder = 'COT_DTCADASTRO DESC, COT_IDCONTRATO DESC';
        $sort->attributes = array(
            'COT_IDVENDEDOR'=>array(
              'asc'=>'Vendedor.FUN_NOME',
              'desc'=>'Vendedor.FUN_NOME desc'
            ),
            'ComoConheceu'=>array(
              'asc'=>'ComoConheceu.MOT_DESCRICAO',
              'desc'=>'ComoConheceu.MOT_DESCRICAO desc'
            ),
            'Revenda'=>array(
              'asc'=>'Revenda.REV_FANTASIA',
              'desc'=>'Revenda.REV_FANTASIA desc'
            ),
            '*'
        );
        $dataProvider = new CActiveDataProvider($this, array(
                'criteria'  => $criteria,
                'sort' => $sort,
                'pagination' => array(
                    'pageSize' => $pageSize ? $pageSize : 20
                    )
                )
            );
        // CacheUtil::setDataProvider($this->TOKEN, $dataProvider);
        return $dataProvider;
    }

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

        $criteria->compare('COT_IDCLIENTE', $this->COT_IDCLIENTE);
        $criteria->compare('COT_FOI_ATIVADO', $this->COT_FOI_ATIVADO);

        if(isset($this->COT_GERADO_AUTOMATICAMENTE)) {
            $criteria->compare('COT_GERADO_AUTOMATICAMENTE', $this->COT_GERADO_AUTOMATICAMENTE);
        }

        if(isset($this->COT_FOI_REVISADO)) {
            $criteria->compare('COT_FOI_REVISADO', $this->COT_FOI_REVISADO);
        }

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

    public function getValorNegociado($somente_numero = false, $reativacao_cto = false, $validate = false) {
        $valor = ($somente_numero) ? 0 : 'R$ 0,00';
        switch ($this->COT_SITUACAO) {
            case Contratos::ORCAMENTO:
            case Contratos::CONTRATO:
            case Contratos::ADENDO:
                if($this->isNewRecord && $validate) {
                    $valor = (($somente_numero) ? Util::convertDecimal($this->COT_VLRMENSAL) : 'mensal ' . Util::verMoeda($this->COT_VLRMENSAL));
                } else {
                    $valor = (($somente_numero) ? $this->COT_VLRMENSAL : 'mensal ' . Util::verMoeda($this->COT_VLRMENSAL));
                }
                break;
            case Contratos::PEDIDO_CUSTOMIZACAO:
            return false;
                break;
            case Contratos::PEDIDO_REATIVACAO:
                $valor =  ($reativacao_cto==true ? (($somente_numero) ? Util::convertDecimal($this->COT_VLRMENSAL) : 'mensal ' . Util::verMoeda($this->COT_VLRMENSAL)) : (($somente_numero) ? $this->getValorNegociadoPedido() : 'total ' . Util::verMoeda($this->getValorNegociadoPedido())));
                break;
            case Contratos::PEDIDO_IMPLANTACAO:
                $valor = (($somente_numero) ? $this->getValorNegociadoPedido() : 'total ' . Util::verMoeda($this->getValorNegociadoPedido()));
                break;
            case Contratos::TERMO_CANCELAMENTO:
            case Contratos::TRANSFERENCIA_SISTEMA:
            case Contratos::TRANSFERENCIA_BANCO_ENVIO:
            case Contratos::TRANSFERENCIA_BANCO_RECEPCAO:
                $valor = "-";
                break;
        }
        return $valor;
    }

    private function getValorNegociadoPedido() {
        $soma_vencimentos = 0;
        if ($this->isNewRecord) {
            if (isset($_POST['vencimentos']) && is_array($_POST['vencimentos'])) {
                foreach ($_POST['vencimentos'] as $vencimento) {
                    if (isset($vencimento['valor']) && $vencimento['valor'] != null) {
                        $soma_vencimentos += Util::convertDecimal($vencimento['valor']);
                    }
                }
            }
        } else {
            return $this->COT_VLRIMPLANTACAO;
        }
        return $soma_vencimentos;
    }

    public function getValorMinimo() {
        if(!$this->isNewRecord) {
            return $this->COT_MINIMOTABELA;
        }
        if($this->COT_SITUACAO == Contratos::PEDIDO_CUSTOMIZACAO || ($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && !$this->COT_CRIARNOVOCONTRATO)) {
            return 0;
        }
        return $this->_valorMinimo();
    }

    private function _valorMinimo()
    {
        $valorMinimo = 0;

        $produto = ($this->isNewRecord) ? Modulos::model()->findByPk($this->COT_IDPRODUTO) : $this->Produto;

        if($produto) {
            $valorMinimo += $produto->valorMinimo($this->COT_SITUACAO, $this->COT_NROUSUARIOS, $this->COT_IDCLIENTE);
        }

        if($this->isNewRecord) {
            if(isset($_POST['produtos']) && is_array($_POST['produtos'])) {
                foreach ($_POST['produtos'] as $id) {
                    $modulo = Modulos::model()->findByPk($id);
                    if($modulo) {
                        $valorMinimo += $modulo->valorMinimo($this->COT_SITUACAO, $this->COT_USUARIOS_MOBILE, $this->COT_IDCLIENTE);
                    }
                }
            }
        } else {
            foreach ($this->Itens as $complementar) {
                if($complementar->Modulo) {
                    $valorMinimo += $complementar->Modulo->valorMinimo($this->COT_SITUACAO, $this->COT_USUARIOS_MOBILE, $this->COT_IDCLIENTE);
                }
            }
        }

        return $valorMinimo;
    }

    public function getContratoAnterior() {
        return Contratos::model()->find("COT_IDCLIENTE = $this->COT_IDCLIENTE and COT_SITUACAO = 1 and COT_FOI_ATIVADO = 1 order by COT_DTCADASTRO desc");
    }

    public function getMaximoHorasImplantacao() {
        $maximo = 0;

        $contratoAnterior = ($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO != 1) ? $this->getContratoAnterior() : false;

        $Produto = ($contratoAnterior != false) ? $contratoAnterior->Produto : (($this->isNewRecord) ? Modulos::model()->findByPk($this->COT_IDPRODUTO) : $this->Produto);

        if($Produto && $Produto->Valor)
            $maximo += $Produto->Valor->VAL_HRSIMPLANTACAO;

        if ($this->isNewRecord && $contratoAnterior == false) {
            if (isset($_POST['produtos']) && is_array($_POST['produtos'])) {
                foreach ($_POST['produtos'] as $id_produto => $produtos) {
                    $Modulos = Modulos::model()->findByPk($produtos);
                    if($Modulos && $Modulos->Valor)
                        $maximo += $Modulos->Valor->VAL_HRSIMPLANTACAO;
                }
            }
        } else {
            $id_contrato = ($contratoAnterior != false) ? $contratoAnterior->COT_IDCONTRATO : $this->COT_IDCONTRATO;
            $Complementares = ContratosItens::model()->findAll('CTI_IDCONTRATO = ' . $id_contrato);
            foreach ($Complementares as $complementar) {
                $Modulos = Modulos::model()->findByPk($complementar->CTI_IDPRODUTO);
                if($Modulos && $Modulos->Valor)
                    $maximo += $Modulos->Valor->VAL_HRSIMPLANTACAO;
            }
        }

        return $maximo;
    }

    public function podeVoltarLocal() {
        $ultimo = Atendimentos::model()->find(
            array(
                'condition' => 'ATD_IDCONTRATO = '.$this->COT_IDCONTRATO.' AND ATD_TIPO = "D" AND ATD_IDMOTIVO not in (20, 15, 468)',
                'order' => 'ATD_IDATENDIMENTO DESC',
                'limit' => 1
            )
        );
        if(!isset($ultimo->ATD_IDMOTIVO) || $ultimo->ATD_IDMOTIVO == -1 || $ultimo->ATD_IDFUNCIONARIO != User::getId())
            return false;

        $penultimo = Atendimentos::model()->find(
            array(
                'condition' => 'ATD_IDCONTRATO = '.$this->COT_IDCONTRATO.' AND ATD_TIPO = "D" AND ATD_IDMOTIVO not in (20, 15, 468)',
                'order' => 'ATD_IDATENDIMENTO DESC',
                'limit' => 1,
                'offset' => 1,
            )
        );
        if(!isset($penultimo->ATD_IDMOTIVO) || $penultimo->ATD_IDMOTIVO == -1 || $penultimo->ATD_IDMOTIVO == $ultimo->ATD_IDMOTIVO)
            return false;

        return true;
    }

    public function getLocalAnterior() {
        if(!$this->podeVoltarLocal())
            return;

        $penultimo = Atendimentos::model()->find(
            array(
                'condition' => 'ATD_IDCONTRATO = '.$this->COT_IDCONTRATO.' AND ATD_TIPO = "D" AND ATD_IDMOTIVO not in (20, 15, 468)',
                'order' => 'ATD_IDATENDIMENTO DESC',
                'limit' => 1,
                'offset' => 1,
            )
        );
        if(!isset($penultimo->ATD_IDMOTIVO))
            return false;
        return $penultimo->ATD_IDMOTIVO;
    }

    //id do contrato a ser vinculado
    public function vincular($ID_VINCULAR) {
        $desvinc = $this->COT_DOCUMENTOVINCULADO;
        if($desvinc == $ID_VINCULAR) {
            $this->addError('COT_DOCUMENTOVINCULADO', 'Estes documentos já estão vinculados.');
            return false;
        }
        $this->COT_DOCUMENTOVINCULADO = $ID_VINCULAR;
        if(empty($ID_VINCULAR)) {
            $this->addError('COT_DOCUMENTOVINCULADO', 'Selecione um documento para vincular.');
            return false;
        }
        $vinculado = Contratos::model()->find('COT_IDCONTRATO = ' .$ID_VINCULAR);
        if(!$vinculado) {
            $this->addError('COT_DOCUMENTOVINCULADO', 'Documento informado não encontrado.');
            return false;
        }

        $desvinc2 = $vinculado->COT_DOCUMENTOVINCULADO;
        if($desvinc2 == $this->COT_IDCONTRATO) {
            $this->addError('COT_DOCUMENTOVINCULADO', 'Estes contratos já estão vinculados.');
            return false;
        }
        $vinculado->COT_DOCUMENTOVINCULADO = $this->COT_IDCONTRATO;

        if($this->save(false, array('COT_DOCUMENTOVINCULADO')) && $vinculado->save(false, array('COT_DOCUMENTOVINCULADO'))) {
            if($desvinc) {
                $desvinc = Contratos::model()->find('COT_IDCONTRATO = ' . $desvinc);
                if($desvinc) {
                    $desvinc->COT_DOCUMENTOVINCULADO = null;
                    $desvinc->save(false, array('COT_DOCUMENTOVINCULADO'));
                }
            }

            if($desvinc2) {
                $desvinc2 = Contratos::model()->find('COT_IDCONTRATO = ' . $desvinc2);
                if($desvinc2) {
                    $desvinc2->COT_DOCUMENTOVINCULADO = null;
                    $desvinc2->save(false, array('COT_DOCUMENTOVINCULADO'));
                }
            }

            $modelAtendimento = new Atendimentos;
            /*$modelAtendimento->scenario = 'documentos';*/
            $modelAtendimento->ATD_IDCLIENTE = $this->COT_IDCLIENTE;
            $modelAtendimento->ATD_IDCONTRATO = $this->COT_IDCONTRATO;
            $modelAtendimento->ATD_IDFUNCIONARIO = User::getId();
            $modelAtendimento->ATD_TIPO = 'D';
            $modelAtendimento->ATD_AUTOMATICO = 1;
            $modelAtendimento->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
            $modelAtendimento->ATD_HORAINICIO = date('H:i:s');
            $modelAtendimento->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
            $modelAtendimento->ATD_TOTALHORAS = '00:01:00';
            $modelAtendimento->ATD_IDMOTIVO = 204;
            $modelAtendimento->ATD_OBS = 'Documento vinculado: ' . $this->COT_DOCUMENTOVINCULADO;
            $modelAtendimento->ATD_DTCADASTRO = date('d/m/Y');
            $modelAtendimento->ATD_SITUACAO = 'R';
            $modelAtendimento->ATD_IDUSUARIO = User::getId();
            $modelAtendimento->ATD_DTALTERACAO = date('d/m/Y');
            $modelAtendimento->save(false, array('ATD_DTLANCAMENTO','ATD_IDCLIENTE', 'ATD_IDCONTRATO', 'ATD_IDFUNCIONARIO', 'ATD_TIPO', 'ATD_HORAINICIO', 'ATD_HORAFINAL', 'ATD_TOTALHORAS', 'ATD_IDMOTIVO', 'ATD_OBS', 'ATD_DTCADASTRO', 'ATD_SITUACAO', 'ATD_IDUSUARIO', 'ATD_DTALTERACAO', 'ATD_AUTOMATICO'));

            return true;

        } else {
            $this->COT_DOCUMENTOVINCULADO = $desvinc;
            $this->save(false, array('COT_DOCUMENTOVINCULADO'));

            $vinculado->COT_DOCUMENTOVINCULADO = $desvinc2;
            $vinculado->save(false, array('COT_DOCUMENTOVINCULADO'));

            return false;
        }
    }

    public function getSlugTipoDocumento($tipo_documento) {
        switch ($tipo_documento) {
            case Contratos::CONTRATO:
                return 'contrato';
                break;
            case Contratos::ADENDO:
                return 'adendo';
                break;
            case Contratos::PEDIDO:
                return 'pedido';
                break;
            case Contratos::ORCAMENTO:
                return 'orcamento';
                break;
            case Contratos::TERMO_CANCELAMENTO:
                return 'termo_cancelamento';
                break;
            case Contratos::PEDIDO_IMPLANTACAO:
                return 'pedido_de_implantacao';
                break;
            case Contratos::PEDIDO_CUSTOMIZACAO:
                return 'pedido_de_customizacao';
                break;
            case Contratos::PEDIDO_REATIVACAO:
                return 'pedido_de_reativacao';
                break;

            default:
                return 'documento';
                return false;
                break;
        }
    }

    public function isContrato()
    {
        return $this->COT_SITUACAO == Contratos::CONTRATO;
    }

    public function isAdendo()
    {
        return $this->COT_SITUACAO == Contratos::ADENDO;
    }

    public function isPedidoReativacao()
    {
        return $this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO;
    }

    public function getIdRevenda() {
        return $this->COT_IDREVENDA;
    }

    public function isPedidoReativacaoComNovoContrato()
    {
        return $this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO == 1;
    }

    public function saveDocumentosFiscais() {
        if($this->COT_SITUACAO != Contratos::ADENDO && $this->COT_SITUACAO != Contratos::CONTRATO) {
            return;
        }
        ContratosDocumentosFiscais::model()->deleteAll("CDF_IDCONTRATO = {$this->COT_IDCONTRATO}");

        if (!empty($this->IdsDocumentosFiscais)) {
            $continue = true;
            foreach($this->IdsDocumentosFiscais as $id) {
                $doc = new ContratosDocumentosFiscais;
                $doc->CDF_IDCONTRATO = $this->COT_IDCONTRATO;
                $doc->CDF_IDDOCUMENTO = $id;
                if (!$doc->save()) {
                    $continue = false;
                }
                unset($doc);
            }

            if($continue) {
                $documentos = $this->listDocumentosFiscais(true);
                $documentos = Util::getCampoVazio($documentos);

                $cliente = Clientes::model()->findByPk($this->COT_IDCLIENTE);
                $atividade = new Atendimentos;
                $atividade->ATD_IDCLIENTE = $this->COT_IDCLIENTE;
                $atividade->ATD_IDCONTRATO = $this->COT_IDCONTRATO;
                $atividade->ATD_IDFUNCIONARIO = User::getId();
                $atividade->ATD_IDUSUARIO = User::getId();
                $atividade->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
                $atividade->ATD_DTCADASTRO = date('d/m/Y');
                $atividade->ATD_HORAINICIO = date('H:i:s');
                $atividade->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
                $atividade->ATD_TOTALHORAS = '00:01:00';
                $atividade->ATD_TIPO = 'D';
                $atividade->ATD_IDMOTIVO = 20;
                $atividade->ATD_SITUACAO = 'R';
                $atividade->ATD_OBS = "Foram vinculados os seguintes documentos fiscais ao " . $this->getTipoDocumento() . ':' . PHP_EOL;
                $atividade->ATD_OBS .= $documentos;

                $atividade->ATD_NIVELINTERESSE = $cliente->CLI_NIVELINTERESSE;
                $saved = $atividade->save(false, array(
                    'ATD_AUTOMATICO',
                    'ATD_IDCONTRATO',
                    'ATD_DTLANCAMENTO',
                    'ATD_TIPO',
                    'ATD_IDMOTIVO',
                    'ATD_DTCADASTRO',
                    'ATD_HORAINICIO',
                    'ATD_HORAFINAL',
                    'ATD_TOTALHORAS',
                    'ATD_IDUSUARIO',
                    'ATD_IDFUNCIONARIO',
                    'ATD_SITUACAO',
                    'ATD_IDCLIENTE',
                    'ATD_OBS'
                ));

                if ($saved) {
                    return true;
                }
            }

            return false;
        }
        return true;
    }

    public function listDocumentosFiscais($implode = false, $keys = false) {
        $DocumentosFiscais = ContratosDocumentosFiscais::model()->findAll("CDF_IDCONTRATO = {$this->COT_IDCONTRATO}");
        $documentos = array();
        foreach($DocumentosFiscais as $documento) {
            $documentos[$documento->DocumentoFiscal->DFS_IDDOCUMENTO] = $documento->DocumentoFiscal->DFS_DESCRICAO;
        }
        natcasesort($documentos);

        if($keys) {
            $documentos = array_keys((array)$documentos);
        }
        if($implode) {
            return implode(', ', $documentos);
        }
        return $documentos;
    }

    private function lancaClienteAlteracoesExternas($from, $to, $titulo, $desc, $undone = 0) {
        $alteracoes = new ClienteAlteracoesExternas;
        $alteracoes->CAE_IDCLIENTE = $this->COT_IDCLIENTE;
        $alteracoes->CAE_MODEL = 'Contratos';
        $alteracoes->CAE_FOREIGN_KEY = $this->COT_IDCONTRATO;
        $alteracoes->CAE_FROM = json_encode($from);
        $alteracoes->CAE_TO = json_encode($to);
        $alteracoes->CAE_DATA = date('Y-m-d H:i:s');
        $alteracoes->CAE_IDUSUARIO = User::getId();
        $alteracoes->CAE_TITULO = $titulo;
        $alteracoes->CAE_DESC = $desc;
        $alteracoes->CAE_UNDONE = $undone;
        $alteracoes->save();

        $atividade = new Atendimentos;
        $atividade->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
        $atividade->ATD_TIPO = "D";
        $atividade->ATD_IDMOTIVO = 20;
        $atividade->ATD_DTCADASTRO = date('d/m/Y');
        $atividade->ATD_HORAINICIO = date('H:i:s');
        $atividade->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
        $atividade->ATD_TOTALHORAS = '00:01:00';
        $atividade->ATD_IDFUNCIONARIO = User::getid();
        $atividade->ATD_IDUSUARIO = 16;
        $atividade->ATD_SITUACAO = "R";
        $atividade->ATD_IDCLIENTE = $this->COT_IDCLIENTE;
        $atividade->ATD_IDCONTRATO = $this->COT_IDCONTRATO;
        $atividade->ATD_OBS = $desc;
        $atividade->ATD_AUTOMATICO = 1;
        $atividade->save(false, array('ATD_DTLANCAMENTO', 'ATD_TIPO', 'ATD_IDMOTIVO', 'ATD_DTCADASTRO', 'ATD_HORAINICIO', 'ATD_HORAFINAL', 'ATD_TOTALHORAS', 'ATD_IDFUNCIONARIO', 'ATD_IDUSUARIO', 'ATD_SITUACAO', 'ATD_IDCLIENTE', 'ATD_IDCONTRATO', 'ATD_OBS', 'ATD_AUTOMATICO'));
    }

    public function vinculaDocumentosFiscaisCliente() {
        if($this->COT_SITUACAO != Contratos::ADENDO && $this->COT_SITUACAO != Contratos::CONTRATO) {
            return;
        }

        $cliente = Clientes::model()->findByPk($this->COT_IDCLIENTE);
        $de = Util::getCampoVazio($cliente->listDocumentosFiscais(true));
        $idsAntesSalvar = $cliente->listDocumentosFiscais(false, true);

        $DocumentosFiscais = ContratosDocumentosFiscais::model()->findAll("CDF_IDCONTRATO = {$this->COT_IDCONTRATO}");
        ClientesDocumentosFiscais::model()->deleteAll("CDF_IDCLIENTE = {$this->COT_IDCLIENTE}");

        foreach($DocumentosFiscais as $documento) {
            $doc = new ClientesDocumentosFiscais;
            $doc->CDF_IDCLIENTE = $this->COT_IDCLIENTE;
            $doc->CDF_IDDOCUMENTO = $documento->CDF_IDDOCUMENTO;
            $doc->save();
            unset($doc);
        }
        $para = Util::getCampoVazio($cliente->listDocumentosFiscais(true));
        $idsAposSalvar = $cliente->listDocumentosFiscais(false, true);
        if($idsAntesSalvar != $idsAposSalvar) {
            $from = array('DocumentosFiscais' => $idsAntesSalvar);
            $to = array('DocumentosFiscais' => $idsAposSalvar);
            $titulo = "Alterados documentos fiscais vinculados ao cliente";
            $desc = "Documentos fiscais vinculados ao cliente alterados pela ativação do {$this->getTipoDocumento()} nº {$this->COT_IDCONTRATO} ".PHP_EOL;
            $desc .= "De: $de" . PHP_EOL;
            $desc .= "Para: $para";

            $this->lancaClienteAlteracoesExternas($from, $to, $titulo, $desc);
        }
        /*$cliente->atendimentoDocumentosFiscais($de, $para, $this->COT_IDVENDEDOR);*/
    }


    public function desvinculaDocumentosFiscaisCliente() {
        if($this->COT_SITUACAO != Contratos::ADENDO && $this->COT_SITUACAO != Contratos::CONTRATO) {
            return;
        }
        $alteracoesAnteriores = ClienteAlteracoesExternas::model()->find("CAE_MODEl = 'Contratos' AND CAE_FOREIGN_KEY = {$this->COT_IDCONTRATO} AND CAE_FROM like '%DocumentosFiscais%' AND CAE_UNDONE = 0");
        if($alteracoesAnteriores) {
            $alteracoesDocumentosFiscais = json_decode($alteracoesAnteriores->CAE_FROM);
            if(isset($alteracoesDocumentosFiscais->DocumentosFiscais)) {
                $cliente = Clientes::model()->findByPk($this->COT_IDCLIENTE);
                $de = Util::getCampoVazio($cliente->listDocumentosFiscais(true));
                $idsAntesSalvar = Util::getCampoVazio($cliente->listDocumentosFiscais(false, true));
                $DocumentosFiscais = (!empty($alteracoesDocumentosFiscais->DocumentosFiscais)) ? DocumentosFiscais::model()->findAll("DFS_IDDOCUMENTO in (".implode(',', $alteracoesDocumentosFiscais->DocumentosFiscais).")") : array();
                ClientesDocumentosFiscais::model()->deleteAll("CDF_IDCLIENTE = {$this->COT_IDCLIENTE}");

                foreach($DocumentosFiscais as $documento) {
                    $doc = new ClientesDocumentosFiscais;
                    $doc->CDF_IDCLIENTE = $this->COT_IDCLIENTE;
                    $doc->CDF_IDDOCUMENTO = $documento->DFS_IDDOCUMENTO;
                    $doc->save();
                    unset($doc);
                }
                $para = Util::getCampoVazio($cliente->listDocumentosFiscais(true));
                $idsAposSalvar = Util::getCampoVazio($cliente->listDocumentosFiscais(false, true));
                if($idsAntesSalvar != $idsAposSalvar) {

                    $from = array('DocumentosFiscais' => $idsAntesSalvar);
                    $to = array('DocumentosFiscais' => $idsAposSalvar);
                    $titulo = "Alterados documentos fiscais vinculados ao cliente";
                    $desc = "Documentos fiscais vinculados ao cliente alterados pela troca de status do {$this->getTipoDocumento()} nº {$this->COT_IDCONTRATO} ".PHP_EOL;
                    $desc .= "De: $de" . PHP_EOL;
                    $desc .= "Para: $para";

                    $this->lancaClienteAlteracoesExternas($from, $to, $titulo, $desc, 1);

                    $alteracoesAnteriores->setUndone();
                    /*$cliente->atendimentoDocumentosFiscais($de, $para, User::getId());*/
                }
            }
        }
    }

    public function registraHorasContratadas() {
        if ($this->COT_SITUACAO == Contratos::PEDIDO_IMPLANTACAO) {
            $horas = new HorasContratadas();
            $horas->HOC_IDCONTRATO = $this->COT_IDCONTRATO;
            $horas->HOC_IDCLIENTE = $this->COT_IDCLIENTE;
            $horas->HOC_HORAS = $this->COT_HORASIMPLANTACAO * 60;
            $horas->HOC_SALDO = $this->COT_HORASIMPLANTACAO * 60;
            $horas->HOC_EXPIRACAO = null;
            $horas->save(false, array('HOC_IDCONTRATO', 'HOC_IDCLIENTE', 'HOC_HORAS', 'HOC_SALDO', 'HOC_EXPIRACAO'));
        }
    }

    public function limpaRegistroHorasContratadas() {
        if ($this->COT_SITUACAO == Contratos::PEDIDO_IMPLANTACAO) {
            HorasContratadas::model()->deleteAll('HOC_IDCONTRATO='.$this->COT_IDCONTRATO);
        }
    }

    private function lancaAtendimentoContratoReativacao($atendimento, $obs, $interesse) {
        $AtdReativacao = new Atendimentos;
        $AtdReativacao->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
        $AtdReativacao->ATD_TIPO = $atendimento->ATD_TIPO;
        $AtdReativacao->ATD_IDMOTIVO = 67;
        $AtdReativacao->ATD_DTCADASTRO = date('d/m/Y');
        $AtdReativacao->ATD_HORAINICIO = $atendimento->ATD_HORAINICIO;
        $AtdReativacao->ATD_HORAFINAL = $atendimento->ATD_HORAFINAL;
        $AtdReativacao->ATD_TOTALHORAS = $atendimento->ATD_TOTALHORAS;
        $AtdReativacao->ATD_IDFUNCIONARIO = $atendimento->ATD_IDFUNCIONARIO;
        $AtdReativacao->ATD_SITUACAO = $atendimento->ATD_SITUACAO;
        $AtdReativacao->ATD_IDCLIENTE = $this->Cliente->CLI_IDCLIENTE;
        $AtdReativacao->ATD_IDCONTRATO = $this->COT_IDCONTRATO;
        $AtdReativacao->ATD_NIVELINTERESSE = $interesse;
        $AtdReativacao->ATD_OBS = $obs;
        $AtdReativacao->ATD_AUTOMATICO = 1;
        $AtdReativacao->save(false, array('ATD_DTLANCAMENTO', 'ATD_TIPO', 'ATD_IDMOTIVO', 'ATD_DTCADASTRO', 'ATD_HORAINICIO', 'ATD_HORAFINAL', 'ATD_TOTALHORAS', 'ATD_IDFUNCIONARIO', 'ATD_SITUACAO', 'ATD_IDCLIENTE', 'ATD_IDCONTRATO', 'ATD_NIVELINTERESSE', 'ATD_OBS', 'ATD_AUTOMATICO'));
    }

    public function reativaCliente($atendimento) {
        if($this->isPedidoReativacao() && !$this->isPedidoReativacaoComNovoContrato()) {
            $this->Cliente->CLI_SITUACAO = 'FP';
            $this->Cliente->CLI_IDMOTIVO = 67;
            $this->Cliente->CLI_DTRESCISAO = null;
            $this->Cliente->CLI_IDRESCISAO = null;
            $this->Cliente->CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO = null;
            $this->Cliente->CLI_NIVELINTERESSE = 4;
            //$this->Cliente->geraChave();
            $this->Cliente->save(false, array('CLI_SITUACAO', 'CLI_IDMOTIVO', 'CLI_DTRESCISAO', 'CLI_IDRESCISAO', 'CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO', 'CLI_NIVELINTERESSE'));

            $this->reativaContratoAnterior($atendimento);
        }
    }

    private function reativaContratoAnterior($atendimento) {
        $contrato = Contratos::model()->find("COT_IDCLIENTE = $this->COT_IDCLIENTE and COT_SITUACAO = 1 and COT_FOI_ATIVADO = 1 order by COT_DTCADASTRO desc");
        if(isset($contrato->COT_SITUACAO)) {
            $data = Util::formatDataMysql($contrato->COT_DTCADASTRO);
            $contrato->COT_STATUS = 2;
            $contrato->save(false, array('COT_STATUS'));
            $contrato->lancaAtendimentoContratoReativacao($atendimento, "Documento reativado através de pedido de reativação.", 4);
            $adendos = Contratos::model()->findAll("COT_IDCLIENTE = $this->COT_IDCLIENTE and COT_SITUACAO = 2 and COT_FOI_ATIVADO = 1 and COT_DTCADASTRO > '$data'");
            if($adendos) {
                foreach($adendos as $adendo) {
                    $adendo->COT_STATUS = 2;
                    if($adendo->save(false, array('COT_STATUS'))) {
                        $adendo->lancaAtendimentoContratoReativacao($atendimento, "Documento reativado através de pedido de reativação.", 4);
                    }
                }
            }
        }
    }

    public function getInfoClienteReativacao() {
        return array(
            'CLI_SITUACAO' => $this->Cliente->CLI_SITUACAO,
            'CLI_IDMOTIVO' => $this->Cliente->CLI_IDMOTIVO,
            'CLI_DTRESCISAO' => Util::formatDataMysql($this->Cliente->CLI_DTRESCISAO, true),
            'CLI_IDRESCISAO' => $this->Cliente->CLI_IDRESCISAO,
            'CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO' => Util::formatDataMysql($this->Cliente->CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO, true),
            'CLI_NIVELINTERESSE' => $this->Cliente->CLI_NIVELINTERESSE,
            //'CLI_DTCHAVEGERADA' => Util::formatDataMysql($this->Cliente->CLI_DTCHAVEGERADA, true),
            //'CLI_CHAVEACESSO' => $this->Cliente->CLI_CHAVEACESSO,
        );
    }

    public function desfazReativacaoCliente($atendimento, $LocalAnteriorNome, $obs) {
        if($this->isPedidoReativacao() && !$this->isPedidoReativacaoComNovoContrato()) {
            if(empty($LocalAnteriorNome)) {
                $LocalAnteriorNome = (string) $atendimento->Motivo;
            }
            $this->desfazReativacaoContratoAnterior($atendimento, $LocalAnteriorNome, $obs);
            $this->voltaAlteracaoCliente("Cliente voltado para inativo", 'Reativacao');
        }
    }

    private function desfazReativacaoContratoAnterior($atendimento, $LocalAnteriorNome, $obs) {
        $contrato = Contratos::model()->find("COT_IDCLIENTE = $this->COT_IDCLIENTE and COT_SITUACAO = 1 and COT_FOI_ATIVADO = 1 order by COT_DTCADASTRO desc");
        if(isset($contrato->COT_SITUACAO)) {
            $data = Util::formatDataMysql($contrato->COT_DTCADASTRO);
            $obsContrato = 'Pedido de reativação voltado para local anterior (' . $LocalAnteriorNome . ') então o contrato foi cancelado novamente, motivo: ' . $obs;
            $contrato->COT_STATUS = 16; // volta para cancelado
            $contrato->save(false, array('COT_STATUS'));
            $contrato->lancaAtendimentoContratoReativacao($atendimento, $obsContrato, 3);
            
            $adendos = Contratos::model()->findAll("COT_IDCLIENTE = $this->COT_IDCLIENTE and COT_SITUACAO = 2 and COT_FOI_ATIVADO = 1 and COT_DTCADASTRO > '$data'");
            if($adendos) {
                foreach($adendos as $adendo) {
                    $obsAdendo = 'Pedido de reativação voltado para local anterior (' . $LocalAnteriorNome . ') então o adendo foi cancelado novamente, motivo: ' . $obs;
                    $adendo->COT_STATUS = 16; // volta para cancelado
                    $adendo->save(false, array('COT_STATUS'));
                    $adendo->lancaAtendimentoContratoReativacao($atendimento, $obsAdendo, 3);
                }
            }
        }
    }

    public function getAlteracaoAnterior($tipo) {
        $alteracao = ClienteAlteracoesExternas::model()->find("CAE_MODEl = 'Contratos' AND CAE_FOREIGN_KEY = {$this->COT_IDCONTRATO} AND CAE_FROM like '%{$tipo}%' AND CAE_UNDONE = 0");
        if($alteracao) {
            $from = json_decode($alteracao->CAE_FROM);
            if(!isset($from->{$tipo})) {
                return false;
            }
        }
        return $alteracao;
    }

    public function ativaDocumento()
    {
        $this->COT_FOI_ATIVADO = 1;
        $this->COT_DTATIVACAO = date('Y-m-d');
        $this->COT_FATURAMENTO = 1;
        $this->save(false, array('COT_FATURAMENTO', 'COT_FOI_ATIVADO', 'COT_DTATIVACAO'));
        ContratosVencimentos::model()->updateAll(["COV_FATURAMENTO" => $this->COT_FATURAMENTO], "COV_IDCONTRATO = {$this->COT_IDCONTRATO}");
    }

    public function desfazAtivacaoDocumento()
    {   
        $this->COT_FOI_ATIVADO = 0;
        $this->COT_DTATIVACAO = null;
        $this->COT_FATURAMENTO = 0;
        $this->save(false, array('COT_FATURAMENTO', 'COT_FOI_ATIVADO', 'COT_DTATIVACAO'));
        ContratosVencimentos::model()->updateAll(["COV_FATURAMENTO" => $this->COT_FATURAMENTO], "COV_IDCONTRATO = {$this->COT_IDCONTRATO}");
    }

    public function lancaAtividadeAlteracaoCliente($old, $new)
    {
        $atualizacoes = $this->getAtualizacoesFeitasCliente($old, $new);
        if(!empty($atualizacoes)) {
            $tipo = ($this->COT_SITUACAO == self::PEDIDO_REATIVACAO) ? "Reativacao" : "Ativacao";
            if($this->COT_SITUACAO == self::ADENDO) {
                $tipo = 'Adendo';
            }
            $from = array($tipo => $old);
            $to = array($tipo => $new);

            $titulo = ($this->COT_SITUACAO == self::PEDIDO_REATIVACAO) ? "Cliente ativado" : "Cliente reativado";
            $acao = ($this->COT_SITUACAO == self::PEDIDO_REATIVACAO) ? "reativação" : "ativação";
            if($this->COT_SITUACAO == self::ADENDO) {
                $titulo = 'Adendo ativado';
                $acao = 'ativação';
            }
            $descricao = "<b>Cliente teve informações alteradas pela {$acao} do {$this->getTipoDocumento()} nº {$this->COT_IDCONTRATO}</b>".PHP_EOL;
            $descricao .= Util::formatAllUpdates($atualizacoes);

            $this->lancaClienteAlteracoesExternas($from, $to, $titulo, $descricao);
        }
    }

    public function ativaCliente() {
        if(!$this->isContrato() && !$this->isAdendo()) {
            return;
        }

        if ($this->isContrato()) {
            $this->Cliente->CLI_DTATIVACAO = date('Y-m-d');
            $this->Cliente->CLI_SITUACAO = 'FP';
            $this->Cliente->CLI_DTCONTRATO = $this->COT_DTCADASTRO;
            $this->Cliente->CLI_DIAVENCIMENTO = 10;
            $this->Cliente->CLI_NIVELINTERESSE = 4;

            $transferencia = ClientesTransferencias::model()->count("CLT_IDCLIENTE_AUTORIZADO = {$this->COT_IDCLIENTE}");
            $reativacao = Contratos::model()->count("COT_SITUACAO = 8 and COT_IDCLIENTE = {$this->COT_IDCLIENTE}");

            // Adiciona cliente na lista de avaliação de implantação se não for reativação ou transferência e se a reventa faz controle de implantação
            if($transferencia == 0 && $reativacao == 0 && $this->Cliente->getRevendaResponsavel2()->REV_CONTROLE_IMPLANTACAO == 1) {
                $agendar = new DateTime('now');
                if(Util::getDiaUtil(5) <= date('j')) {
                    $agendar->modify('last day of this month');
                } else {
                    $agendar->modify('+ 30 days');
                }
                $this->Cliente->CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO = $agendar->format('d/m/Y');
                $this->Cliente->CLI_AVALIACAO_IMPLANTACAO = 1;
            }

        } else if ($this->isAdendo()) {
            if($this->COT_ALTERAR_VENCIMENTO) {
                $this->Cliente->CLI_DIAVENCIMENTO = 10;
            }   
        }

        if($this->temMobile()) {
            $this->Cliente->CLI_MODULO_MOBILE = 1;
            $this->Cliente->CLI_QTDLICENCAS_MOBILE = $this->COT_USUARIOS_MOBILE;
        } else {
            $this->Cliente->CLI_MODULO_MOBILE = 0;
            $this->Cliente->CLI_QTDLICENCAS_MOBILE = 0;
        }

        $this->Cliente->CLI_SIMPLES = $this->COT_SIMPLES;
        $this->Cliente->CLI_QTDUSUARIOS = $this->COT_NROUSUARIOS;
        $this->Cliente->CLI_PRODUTO = $this->COT_IDPRODUTO;

        if(!empty($this->Itens)) {
            $itens = [];
            foreach($this->Itens as $item) {
                if (!$item->Modulo->MOD_MOBILE) {
                    $itens[] = $item->Modulo->MOD_IDMODULO;
                } else {
                    $this->Cliente->CLI_IDMODULO_MOBILE = $item->Modulo->MOD_IDMODULO;
                }
            }
            sort($itens);

            $this->Cliente->CLI_MODULO1 = $itens[0] ?? 0;
            $this->Cliente->CLI_MODULO2 = $itens[1] ?? 0;
            $this->Cliente->CLI_MODULO3 = $itens[2] ?? 0;
            $this->Cliente->CLI_MODULO4 = $itens[3] ?? 0;
            $this->Cliente->CLI_MODULO5 = $itens[4] ?? 0;
        }

        //$this->Cliente->CLI_VLRMENSAL = $this->COT_VLRMENSAL;
        //$this->Cliente->CLI_MESREAJUSTE = date('m');
        //$this->Cliente->geraChave();

        $this->Cliente->save(false, [
            'CLI_DTATIVACAO',
            'CLI_SITUACAO', 
            'CLI_DTCONTRATO', 
            'CLI_DIAVENCIMENTO',
            'CLI_NIVELINTERESSE',
            'CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO',
            'CLI_AVALIACAO_IMPLANTACAO',
            'CLI_MODULO_MOBILE',
            'CLI_IDMODULO_MOBILE',
            'CLI_QTDLICENCAS_MOBILE', 
            'CLI_SIMPLES', 
            'CLI_QTDUSUARIOS',
            'CLI_PRODUTO', 
            'CLI_MODULO1', 
            'CLI_MODULO2', 
            'CLI_MODULO3', 
            'CLI_MODULO4', 
            'CLI_MODULO5',
            //'CLI_VLRMENSAL',
            //'CLI_MESREAJUSTE',
            //'CLI_CHAVEACESSO',
            //'CLI_DTCHAVEGERADA'
        ]);

        if($this->isContrato()) {
            $troca = new ClientesSituacoes;
            $troca->CST_IDCLIENTE       = $this->Cliente->CLI_IDCLIENTE;
            $troca->CST_DATA            = date('Y-m-d H:i:s');
            $troca->CST_IDFUNCIONARIO   = User::getId();
            $troca->CST_SITUACAO        = $this->Cliente->CLI_SITUACAO;
            $troca->CST_IDMOTIVO_FN     = null;
            $troca->CST_DEMONSTRACAO    = ClientesSituacoes::DEMONSTRACAO_NAO_REALIZADA;
            $troca->CST_DESCRICAO       = "Status alterado pela ativação do contrato {$this->COT_IDCONTRATO}";
            $troca->save(false);

            /*Atendimento ativação cliente */
            $ativacao = new Atendimentos;
            $ativacao->ATD_IDCLIENTE = $this->COT_IDCLIENTE;
            $ativacao->ATD_IDCONTRATO = $this->COT_IDCONTRATO;
            $ativacao->ATD_IDFUNCIONARIO = 16;
            $ativacao->ATD_TIPO = 'O';
            $ativacao->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
            $ativacao->ATD_HORAINICIO = date('H:i:s');
            $ativacao->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
            $ativacao->ATD_TOTALHORAS = '00:01:00';
            $ativacao->ATD_IDMOTIVO = 456;
            $ativacao->ATD_OBS = 'Cliente ativado nesta data';
            $ativacao->ATD_DTCADASTRO = date('d/m/Y');
            $ativacao->ATD_SITUACAO = 'R';
            $ativacao->ATD_IDUSUARIO = 16;
            $ativacao->ATD_DTALTERACAO = date('d/m/Y');

            $ativacao->save(false, array(
                'ATD_DTLANCAMENTO',
                'ATD_TIPO',
                'ATD_IDMOTIVO',
                'ATD_DTCADASTRO',
                'ATD_HORAINICIO',
                'ATD_HORAFINAL',
                'ATD_TOTALHORAS',
                'ATD_IDFUNCIONARIO',
                'ATD_SITUACAO',
                'ATD_IDCLIENTE',
                'ATD_IDCONTRATO',
                'ATD_OBS',
                'ATD_IDUSUARIO',
                'ATD_DTALTERACAO'
            ));
        }
    }

    public function desfazAtivacaoCliente() {
        if ($this->isContrato()) {
            $this->voltaAlteracaoCliente("Cliente voltado para fechamento positivo", 'Ativacao');

            $troca = new ClientesSituacoes;
            $troca->CST_IDCLIENTE       = $this->Cliente->CLI_IDCLIENTE;
            $troca->CST_DATA            = date('Y-m-d H:i:s');
            $troca->CST_IDFUNCIONARIO   = User::getId();
            $troca->CST_SITUACAO        = $this->Cliente->CLI_SITUACAO;
            $troca->CST_IDMOTIVO_FN     = null;
            $troca->CST_DEMONSTRACAO    = ClientesSituacoes::DEMONSTRACAO_NAO_REALIZADA;
            $troca->CST_DESCRICAO       = "Status alterado pela alteração de local do contrato {$this->COT_IDCONTRATO}";
            $troca->save(false);
        } 
        if ($this->isAdendo()) {
            $this->voltaAlteracaoCliente("Cliente teve dados atualizados", 'Adendo');
        }
    }

    public function getInfoClienteAtivacao() {
        return array(
            'CLI_DTATIVACAO' => Util::formatDataMysql($this->Cliente->CLI_DTATIVACAO, true),
            'CLI_SITUACAO' => $this->Cliente->CLI_SITUACAO,
            'CLI_DTCONTRATO' => Util::formatDataMysql($this->Cliente->CLI_DTCONTRATO, true),
            'CLI_DIAVENCIMENTO' => $this->Cliente->CLI_DIAVENCIMENTO,
            'CLI_NIVELINTERESSE' => $this->Cliente->CLI_NIVELINTERESSE,
            'CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO' => $this->Cliente->CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO,
            'CLI_AVALIACAO_IMPLANTACAO' => $this->Cliente->CLI_AVALIACAO_IMPLANTACAO,
            'CLI_MODULO_MOBILE' => $this->Cliente->CLI_MODULO_MOBILE,
            'CLI_QTDLICENCAS_MOBILE' => $this->Cliente->CLI_QTDLICENCAS_MOBILE,
            'CLI_SIMPLES' => $this->Cliente->CLI_SIMPLES,
            'CLI_QTDUSUARIOS' => $this->Cliente->CLI_QTDUSUARIOS,
            'CLI_PRODUTO' => $this->Cliente->CLI_PRODUTO,
            'CLI_MODULO1' => $this->Cliente->CLI_MODULO1,
            'CLI_MODULO2' => $this->Cliente->CLI_MODULO2,
            'CLI_MODULO3' => $this->Cliente->CLI_MODULO3,
            'CLI_MODULO4' => $this->Cliente->CLI_MODULO4,
            'CLI_MODULO5' => $this->Cliente->CLI_MODULO5,
            //'CLI_VLRMENSAL' => $this->Cliente->CLI_VLRMENSAL,
            //'CLI_MESREAJUSTE' => $this->Cliente->CLI_MESREAJUSTE,
            'CLI_IDMODULO_MOBILE' => $this->Cliente->CLI_IDMODULO_MOBILE,
            //'CLI_CHAVEACESSO' => $this->Cliente->CLI_CHAVEACESSO,
            //'CLI_DTCHAVEGERADA' => Util::formatDataMysql($this->Cliente->CLI_DTCHAVEGERADA, true),
        );
    }

    private function getAtualizacoesFeitasCliente($old, $new) {
        $atualizacoes = array();
        if (in_array('CLI_SITUACAO', array_keys($new)) && $new['CLI_SITUACAO'] != $old['CLI_SITUACAO']) {
            $atualizacoes[] = Util::formatUpdatedField('Status', Util::getStatusCliente($old['CLI_SITUACAO']), Util::getStatusCliente($new['CLI_SITUACAO']));
        }
        if (in_array('CLI_NIVELINTERESSE', array_keys($new)) && $new['CLI_NIVELINTERESSE'] != $old['CLI_NIVELINTERESSE']) {
            $atualizacoes[] = Util::formatUpdatedField('Nível de interesse', Util::getNivelInteresse($old['CLI_NIVELINTERESSE']), Util::getNivelInteresse($new['CLI_NIVELINTERESSE']));
        }
        if (in_array('CLI_DTATIVACAO', array_keys($new)) && Util::formatDataBR($new['CLI_DTATIVACAO'], true) != Util::formatDataBR($old['CLI_DTATIVACAO'], true)) {
            $atualizacoes[] = Util::formatUpdatedField('Data de ativação', Util::formatDataBR($old['CLI_DTATIVACAO'], true), Util::formatDataBR($new['CLI_DTATIVACAO'], true));
        }
        if (in_array('CLI_DTCONTRATO', array_keys($new)) && Util::formatDataBR($new['CLI_DTCONTRATO'], true) != Util::formatDataBR($old['CLI_DTCONTRATO'], true)) {
            $atualizacoes[] = Util::formatUpdatedField('Cliente desde', Util::formatDataBR($old['CLI_DTCONTRATO'], true), Util::formatDataBR($new['CLI_DTCONTRATO'], true));
        }
        if (in_array('CLI_IDMOTIVO', array_keys($new)) && $new['CLI_IDMOTIVO'] != $old['CLI_IDMOTIVO']) {
            $atualizacoes[] = Util::formatUpdatedField('Como conheceu', (string) Motivos::model()->findByPk($old['CLI_IDMOTIVO']), (string) Motivos::model()->findByPk($new['CLI_IDMOTIVO']));
        }
        if (in_array('CLI_DTRESCISAO', array_keys($new)) && Util::formatDataBR($new['CLI_DTRESCISAO'], true) != Util::formatDataBR($old['CLI_DTRESCISAO'], true)) {
            $atualizacoes[] = Util::formatUpdatedField('Data da Rescisão', Util::formatDataBR($old['CLI_DTRESCISAO'], true), Util::formatDataBR($new['CLI_DTRESCISAO'], true));
        }
        if (in_array('CLI_IDRESCISAO', array_keys($new)) && $new['CLI_IDRESCISAO'] != $old['CLI_IDRESCISAO']) {
            $atualizacoes[] = Util::formatUpdatedField('Motivo da Rescisão', (string) Motivos::model()->findByPk($old['CLI_IDRESCISAO']), (string) Motivos::model()->findByPk($new['CLI_IDRESCISAO']));
        }
        if (in_array('CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO', array_keys($new)) && Util::formatDataBR($new['CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO'], true) != Util::formatDataBR($old['CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO'], true)) {
            $atualizacoes[] = Util::formatUpdatedField('Próxima avaliação da implantação', Util::formatDataBR($old['CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO'], true), Util::formatDataBR($new['CLI_DT_PROXIMA_AVALIACAO_IMPLANTACAO'], true));
        }
        if (in_array('CLI_AVALIACAO_IMPLANTACAO', array_keys($new)) && $new['CLI_AVALIACAO_IMPLANTACAO'] != $old['CLI_AVALIACAO_IMPLANTACAO']) {
            $atualizacoes[] = Util::formatUpdatedField('Status da avaliação da implantação',$old['CLI_AVALIACAO_IMPLANTACAO'],$new['CLI_AVALIACAO_IMPLANTACAO']);
        }
        if (in_array('CLI_QTDUSUARIOS', array_keys($new)) && $new['CLI_QTDUSUARIOS'] != $old['CLI_QTDUSUARIOS']) {
            $atualizacoes[] = Util::formatUpdatedField('Número de usuários',$old['CLI_QTDUSUARIOS'],$new['CLI_QTDUSUARIOS']);
        }
        if (in_array('CLI_PRODUTO', array_keys($new)) && $new['CLI_PRODUTO'] != $old['CLI_PRODUTO']) {
            $atualizacoes[] = Util::formatUpdatedField('Produto', (string) Modulos::model()->findByPk($old['CLI_PRODUTO']), (string) Modulos::model()->findByPk($new['CLI_PRODUTO']));
        }
        if (in_array('CLI_MODULO1', array_keys($new)) && $new['CLI_MODULO1'] != $old['CLI_MODULO1']) {
            $atualizacoes[] = Util::formatUpdatedField('Módulo Complementar 1', (string) Modulos::model()->findByPk($old['CLI_MODULO1']), (string) Modulos::model()->findByPk($new['CLI_MODULO1']));
        }
        if (in_array('CLI_MODULO2', array_keys($new)) && $new['CLI_MODULO2'] != $old['CLI_MODULO2']) {
            $atualizacoes[] = Util::formatUpdatedField('Módulo Complementar 2', (string) Modulos::model()->findByPk($old['CLI_MODULO2']), (string) Modulos::model()->findByPk($new['CLI_MODULO2']));
        }
        if (in_array('CLI_MODULO3', array_keys($new)) && $new['CLI_MODULO3'] != $old['CLI_MODULO3']) {
            $atualizacoes[] = Util::formatUpdatedField('Módulo Complementar 3', (string) Modulos::model()->findByPk($old['CLI_MODULO3']), (string) Modulos::model()->findByPk($new['CLI_MODULO3']));
        }
        if (in_array('CLI_MODULO4', array_keys($new)) && $new['CLI_MODULO4'] != $old['CLI_MODULO4']) {
            $atualizacoes[] = Util::formatUpdatedField('Módulo Complementar 4', (string) Modulos::model()->findByPk($old['CLI_MODULO4']), (string) Modulos::model()->findByPk($new['CLI_MODULO4']));
        }
        if (in_array('CLI_MODULO5', array_keys($new)) && $new['CLI_MODULO5'] != $old['CLI_MODULO5']) {
            $atualizacoes[] = Util::formatUpdatedField('Módulo Complementar 5', (string) Modulos::model()->findByPk($old['CLI_MODULO5']), (string) Modulos::model()->findByPk($new['CLI_MODULO5']));
        }
        if (in_array('CLI_IDMODULO_MOBILE', array_keys($new)) && $new['CLI_IDMODULO_MOBILE'] != $old['CLI_IDMODULO_MOBILE']) {
            $atualizacoes[] = Util::formatUpdatedField('Módulo Complementar Mobile', (string) Modulos::model()->findByPk($old['CLI_IDMODULO_MOBILE']), (string) Modulos::model()->findByPk($new['CLI_IDMODULO_MOBILE']));
        }
        if (in_array('CLI_CHAVEACESSO', array_keys($new)) && $new['CLI_CHAVEACESSO'] != $old['CLI_CHAVEACESSO']) {
            $atualizacoes[] = Util::formatUpdatedField('Chave de acesso',$old['CLI_CHAVEACESSO'],$new['CLI_CHAVEACESSO']);
        }
        if (in_array('CLI_DTCHAVEGERADA', array_keys($new)) && $new['CLI_DTCHAVEGERADA'] != $old['CLI_DTCHAVEGERADA']) {
            $atualizacoes[] = Util::formatUpdatedField('Data Geração Chave de Acesso',Util::formatDataBR($old['CLI_DTCHAVEGERADA']),Util::formatDataBR($new['CLI_DTCHAVEGERADA']));
        }
        if (in_array('CLI_VLRMENSAL', array_keys($new)) && $new['CLI_VLRMENSAL'] != $old['CLI_VLRMENSAL']) {
            $atualizacoes[] = Util::formatUpdatedField('Valor Mensal',$old['CLI_VLRMENSAL'],$new['CLI_VLRMENSAL']);
        }
        if (in_array('CLI_DIAVENCIMENTO', array_keys($new)) && $new['CLI_DIAVENCIMENTO'] != $old['CLI_DIAVENCIMENTO']) {
            $atualizacoes[] = Util::formatUpdatedField('Dia do vencimento',$old['CLI_DIAVENCIMENTO'],$new['CLI_DIAVENCIMENTO']);
        }
        if (in_array('CLI_MESREAJUSTE', array_keys($new)) && $new['CLI_MESREAJUSTE'] != $old['CLI_MESREAJUSTE']) {
            $atualizacoes[] = Util::formatUpdatedField('Mês do reajuste',$old['CLI_MESREAJUSTE'],$new['CLI_MESREAJUSTE']);
        }
        if (in_array('CLI_SIMPLES', array_keys($new)) && $new['CLI_SIMPLES'] != $old['CLI_SIMPLES']) {
            $atualizacoes[] = Util::formatUpdatedField('Optante pelo simples',$old['CLI_SIMPLES'],$new['CLI_SIMPLES']);
        }
        if (in_array('CLI_MODULO_MOBILE', array_keys($new)) && $new['CLI_MODULO_MOBILE'] != $old['CLI_MODULO_MOBILE']) {
            $atualizacoes[] = Util::formatUpdatedField('Módulo mobile',$old['CLI_MODULO_MOBILE']?'Sim':'Não',$new['CLI_MODULO_MOBILE']?'Sim':'Não');
        }
        if (in_array('CLI_QTDLICENCAS_MOBILE', array_keys($new)) && $new['CLI_QTDLICENCAS_MOBILE'] != $old['CLI_QTDLICENCAS_MOBILE']) {
            $atualizacoes[] = Util::formatUpdatedField('Quantidade de licenças mobile',$old['CLI_QTDLICENCAS_MOBILE'],$new['CLI_QTDLICENCAS_MOBILE']);
        }
        
        return $atualizacoes;
    }

    private function voltaAlteracaoCliente($titulo, $tipo) {
        $alteracao = $this->getAlteracaoAnterior($tipo);
        if($alteracao) {
            $from = json_decode($alteracao->CAE_FROM);
            $campos = array_keys((array) $from->{$tipo});
            $old = $new = array();
            foreach($from->{$tipo} as $campo => $valor) {
                $old[$campo] = Util::formatDataMysql($this->Cliente->{$campo}, true);
                $this->Cliente->{$campo} = Util::formatDataMysql($valor, true);
                $new[$campo] = Util::formatDataMysql($this->Cliente->{$campo}, true);
            }
            $this->Cliente->save(false, $campos);

            $atualizacoes = $this->getAtualizacoesFeitasCliente($old, $new);
            if(!empty($atualizacoes)) {
                $from = array($tipo => $old);
                $to = array($tipo => $new);
                $desc = "<b>Cliente teve informações alteradas pela troca de status do {$this->getTipoDocumento()} nº {$this->COT_IDCONTRATO}</b>".PHP_EOL;
                $desc .= Util::formatAllUpdates($atualizacoes);

                $this->lancaClienteAlteracoesExternas($from, $to, $titulo, $desc, 1);

                $alteracao->setUndone();
            }
        }
    }

    public function trocaSituacaoInteressado() {
        $interessado = Interessados::model()->find('INT_IDPROSPECTO = ' . $this->Cliente->CLI_IDCLIENTE . ' order by INT_DATA desc');
        if($interessado) {
            if ($this->COT_SITUACAO == Contratos::CONTRATO) {
                $interessado->trocaSituacao(Interessados::ATIVADO);
            } else if($this->COT_SITUACAO == Contratos::ADENDO) {
                $interessado->trocaSituacao(Interessados::ADENDO_ATIVADO);
            } else if($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO != 1) {
                $interessado->trocaSituacao(Interessados::CLIENTE_REATIVADO);
            }
        }
    }

    public function desfazTrocaSituacaoInteressado() {
        $interessado = Interessados::model()->find('INT_IDPROSPECTO = ' . $this->Cliente->CLI_IDCLIENTE . ' order by INT_CODIGO desc');
        if($interessado) {
            if ($this->COT_SITUACAO == Contratos::CONTRATO) {
                $interessado->voltaSituacaAtivacao(Interessados::ATIVADO);
            } else if($this->COT_SITUACAO == Contratos::ADENDO) {
                $interessado->voltaSituacaAtivacao(Interessados::ADENDO_ATIVADO);
            } else if($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $this->COT_CRIARNOVOCONTRATO != 1) {
                $interessado->voltaSituacaAtivacao(Interessados::CLIENTE_REATIVADO);
            }
        }
    }

    public function atualizaSolicitacaoTransferencia()
    {
        if (!empty($this->COT_ID_SOLICITACAO_TRANSFERENCIA)) {
            $solicitacao = $this->SolicitacaoTransferencia;

            $contratoAtivo = false;
            $temPedido = false;
            $pedidoAtivo = false;
            $transferenciasBancoAceitas = false;
            foreach ($solicitacao->Documentos as $documento) {
                if (in_array($documento->COT_STATUS, [2, 14, 19, 23, 494])) {
                    switch ($documento->COT_SITUACAO) {
                        case self::CONTRATO:
                        if ($documento->COT_STATUS != 494) {
                            $contratoAtivo = true;
                        }
                        break;

                        case self::PEDIDO_IMPLANTACAO:
                        $temPedido = true;
                        $pedidoAtivo = true;
                        break;

                        case self::TRANSFERENCIA_BANCO_ENVIO:
                        case self::TRANSFERENCIA_BANCO_RECEPCAO:
                        $documentoVinculado = Contratos::model()->findByPk($documento->COT_DOCUMENTOVINCULADO);
                        if ($documentoVinculado) {
                            if (in_array($documentoVinculado->COT_STATUS, [2, 14, 494])) {
                                $transferenciasBancoAceitas = true;
                            }
                        }
                    }
                } elseif ($documento->COT_SITUACAO == Contratos::PEDIDO_IMPLANTACAO) {
                    $temPedido = true;
                }
            }

            $processarSolicitacao = false;
            if ($solicitacao->CLT_TIPO == ClientesTransferencias::TIPO_SISTEMA) {
                if ($contratoAtivo && (!$temPedido || ($temPedido && $pedidoAtivo))) {
                    $processarSolicitacao = true;
                }
            } elseif ($solicitacao->CLT_TIPO == ClientesTransferencias::TIPO_BANCO) {
                if ($transferenciasBancoAceitas) {
                    $processarSolicitacao = true;
                }
            } elseif ($solicitacao->CLT_TIPO == ClientesTransferencias::TIPO_SISTEMA_BANCO) {
                if ($contratoAtivo && $transferenciasBancoAceitas && (!$temPedido || ($temPedido && $pedidoAtivo))) {
                    $processarSolicitacao = true;
                }
            }

            if ($processarSolicitacao) {
                $solicitacao->processaSolicitacao();
            } elseif ($solicitacao->CLT_STATUS == ClientesTransferencias::STATUS_PROCESSADO) {
                $solicitacao->reverteProcesamentoSolicitacao();
            }
        }
    }

    public function getTipoDocumento() {
        return Util::getTipoDocumento($this->COT_SITUACAO);
    }
    public function generateToken($userId)
    {
        $token = Tokens::model()->find("user_id = {$userId}
                                        AND used = 0
                                        AND created
                                        AND (created BETWEEN NOW() - INTERVAL 1 DAY
                                        AND NOW())");

        if (!$token) {
            $token = new Tokens;

            $token->user_id = $userId;
            $token->type  = "reset_pwd";
            $token->generateKey();
            $token->content = " ";
            $token->used = 0;
            $token->unlimited = 0;
            $token->created = date('Y-m-d H:i:s');
            $token->modified = date('Y-m-d H:i:s');
            if ($token->save()) {
                return $token->getLinkPrimeiroAcesso();
            }
        } else {
            return $token->getLinkPrimeiroAcesso();
        }

    }

    public function getTiposAssinatura($keys = false, $implode = false) {
        $list = $this->tiposAssinatura;
        /*if(isset($list[self::ASSINADO_ACEITO])) {
            unset($list[self::ASSINADO_ACEITO]);
        }*/
        if ($keys) {
            $list = array_keys($list);
        }
        if($implode) {
            $list = implode(', ', $list);
        }
        return $list;
    }

    public function getTipoAssinatura($tipo = false) {
        if(!$tipo) {
            $tipo = $this->COT_TIPOASSINATURA;
        }
        return isset($this->tiposAssinatura[$tipo]) ? $this->tiposAssinatura[$tipo] : '';
    }

    public function getLatestCopiaAssinadaDigitalmente() {
        return Arquivos::model()->find("ARQ_MODEL='ContratosAssinadosDigitalmente' AND ARQ_FOREIGNKEY = '{$this->COT_IDCONTRATO}'");
    }

    public function getMaskedCpfCnpj() {
        return Util::mask($this->COT_CLI_CNPJCPF, Mask::DOCUMENTO);
    }

    public function isOptanteSimples() {
        return ($this->COT_SIMPLES == 1) ? 'Sim' : 'Não';
    }
    public function getOpcaoSimples() {
        return ($this->COT_SIMPLES == 1) ? 'optante pelo Simples' : 'não optante pelo Simples';
    }

    public function listModulosComplementares($implode = false, $keys = false) {
        $complementares = array();
        foreach ($this->Itens as $complementar) {
            $complementares[$complementar->CTI_IDPRODUTO] = $complementar->Modulo->MOD_OBS;
        }
        natcasesort($complementares);

        if($keys) {
            $complementares = array_keys($complementares);
        }
        if($implode) {
            return implode(', ', $complementares);
        }
        return $complementares;
    }
    public function getIconAutomatico($placement = 'right', $echo  = false)
    {
        $icon = "";
        if($this->COT_GERADO_AUTOMATICAMENTE) {
            $icon = '<i class="fa fa-exclamation-triangle color-red" data-toggle="tooltip" data-placement="'.$placement.'" title="Contrato importado para o CRM pois se trata de cliente antigo e foi assinado manualmente"></i>';
        }
        if($echo) {
            echo $icon;
        } else {
            return $icon;
        }
    }

    public function getIconAssinatura($placement = 'right', $echo  = false)
    {
        $icon = '';
        switch ($this->COT_TIPOASSINATURA) {
            case Contratos::ASSINADO_DIGITAL:
                $icon = $this->getAssinadoDigitalIcon($placement, $echo  = false);
                break;

            case Contratos::ASSINADO_ACEITO:
                $icon = $this->getLiAceitoIcon($placement, $echo  = false);
                break;

            default:
                return;
                break;
        }

        if(!empty($icon)) {
            if($echo) {
                echo $icon;
            }
            return $icon;
        }
    }

    public function getAssinadoDigitalIcon($placement = 'right')
    {
        if($this->COT_TIPOASSINATURA == Contratos::ASSINADO_DIGITAL) {
            return '<i class="fa fa-asterisk color-orange icon-assinado-digital" data-toggle="tooltip" data-placement="'.$placement.'" title="Documento assinado com assinatura digital"></i>';
        }
    }

    public function getLiAceitoIcon($placement = 'right')
    {
        if($this->COT_TIPOASSINATURA == Contratos::ASSINADO_ACEITO) {
            return '<i class="fa fa-check text-success icon-assinado-digital" data-toggle="tooltip" data-placement="'.$placement.'" title="Termos aceitos pelo cliente"></i>';
        }
    }

    public function temExcecao() {
        return !empty($this->getExcecoes());
    }

    public function getExcecoes() {
        $excecoes = array();
        if ($this->COT_SITUACAO == Contratos::CONTRATO || $this->COT_SITUACAO == Contratos::ADENDO) {
            if ($this->descontosAbaixoTabela()) {
                $excecoes[] = 'Valor negociado abaixo do mínimo de tabela';
            }
            if ($this->COT_SITUACAO == Contratos::CONTRATO && !empty($this->COT_DOCUMENTOVINCULADO)) {
                $DocumentoVinculado = Contratos::model()->findByPk($this->COT_DOCUMENTOVINCULADO);
                if (isset($DocumentoVinculado->COT_SITUACAO) && $DocumentoVinculado->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO && $DocumentoVinculado->COT_CRIARNOVOCONTRATO == true) {
                    $excecoes[] = 'Contratos criados a partir de um pedido de reativação, sempre devem ser tratados como exceção';
                }
            }
            if ($this->COT_SITUACAO == Contratos::ADENDO && $this->COT_ALTERAR_VENCIMENTO == '1') {
                $excecoes[] = 'Alteração do vencimento da cobrança mensal para o dia 10 ';
            }
        } elseif ($this->COT_SITUACAO == Contratos::PEDIDO_IMPLANTACAO && $this->isMatrizFilial()) {
            if ($this->descontosAbaixoTabela()) {
                $excecoes[] = 'Valor negociado abaixo do mínimo de tabela';
            }

            if ($this->getMaximoHorasImplantacao() < $this->COT_HORASIMPLANTACAO && $this->COT_HORASIMPLANTACAO > 0) {
                $excecoes[] = 'Horas de implantação acima do máximo de tabela';
            }

            if (count($this->Vencimentos) > 4) {
                $excecoes[] = 'Pagamento parcelado em mais do que 4 vezes';
            }
        } elseif ($this->COT_SITUACAO == Contratos::PEDIDO_REATIVACAO) {
            $excecoes[] = 'Pedidos de reativação sempre devem ser tratados como exceção';
        } elseif ($this->COT_SITUACAO == Contratos::TERMO_CANCELAMENTO) {
            if ($this->SolicitacaoCancelamento->CLC_TIPO_CANCELAMENTO == ClientesCancelamentos::CANCELAMENTO_IMEDIATO) {
                $excecoes[] = 'Cancelamentos imediatos sempre devem ser tratados como exceção';
            }
        }
        return $excecoes;
    }

    public function getFaturamento()
    {
        switch ($this->COT_FATURAMENTO) {
            case 0:
                return 'Não faturar';
                break;
            case 1:
                return 'Faturar';
                break;
            case 2:
                return 'Faturado';
                break;
            case 3:
                return 'Fechado';
                break;
            default:
                return 'Não faturar';
                break;
        }
    }

    public function getNaoFaturar()
    {
        if($this->COT_FATURAMENTO == 0 || $this->COT_FATURAMENTO == NULL){
            return false;
        } else {
            return true;
        }
    }

    public function hasPdfGerado() {
        $file = Arquivos::model()->getPath() . $this->getSlugTipoDocumento($this->COT_SITUACAO) . '_' . $this->COT_IDCONTRATO . '.pdf';

        return file_exists($file);
    }

    public function getPdfAreaClientes()
    {
        return Arquivos::model()->find("ARQ_MODEL = 'ContratosClientes' AND ARQ_FOREIGNKEY = '" . $this->COT_IDCONTRATO . "' ORDER BY ARQ_IDARQUIVO DESC");
    }

    public function hasPdfAreaClientes()
    {
        return $this->getPdfAreaClientes() != false && $this->COT_STATUS == 494;
    }

    public function getInputMultiSelecao()
    {
        if ($this->COT_FATURAMENTO == 1) {
            return "<input type=\"checkbox\" data-codigo=\"{$this->COT_IDCONTRATO}\" value=\"{$this->COT_IDCONTRATO}\" class=\"multiSelecao\">";
        }
        return "";
    }

    public function evaluateAtividadesForAuditor($listagem = true)
    {
        $msg = false;
        $allAtividades = Atendimentos::model()->findAll("ATD_IDCONTRATO = {$this->COT_IDCONTRATO}");
        if (!empty($allAtividades)) {
            $valor = count($allAtividades);
            $processoConcluido = Atendimentos::model()->findAll("
                ATD_IDCONTRATO = {$this->COT_IDCONTRATO} AND
                ATD_IDMOTIVO = 14
            ");

            if (empty($processoConcluido)) {
                $msg = "Nenhuma atividade de \"Processo concluído\" vinculada nesse documento!";
            }
        } else {
            $valor = "0";
            $msg = "Documento sem nenhuma atividade!";
        }

        if ($msg) {
            $placement = $listagem ? 'right' : 'left';
            $spanAttributes = array(
                "data-toggle=\"tooltip\"",
                "data-placement = \"$placement\"",
                "data-html = \"true\"",
                "title = \"$msg\"",
                "data-original-title = \"$msg\"",
                "style = \"color: red;\"",
            );
            $spanAttributes = implode(" ", $spanAttributes);

            return "<span {$spanAttributes}>{$valor}</span>";
        } else {
            return $valor;
        }
    }

    public function saveAtendimentoJustificativa()
    {
        if (!empty($this->COT_JUSTIFICATIVA) && $this->COT_SITUACAO != Contratos::ORCAMENTO) {
            $justificativa = new Atendimentos;
            $justificativa->ATD_IDCLIENTE = $this->COT_IDCLIENTE;
            $justificativa->ATD_IDCONTRATO = $this->COT_IDCONTRATO;
            $justificativa->ATD_IDFUNCIONARIO = $this->COT_IDVENDEDOR;
            $justificativa->ATD_TIPO = 'D';
            $justificativa->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
            $justificativa->ATD_HORAINICIO = date('H:i:s');
            $justificativa->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
            $justificativa->ATD_TOTALHORAS = '00:01:00';
            $justificativa->ATD_IDMOTIVO = 15;
            $justificativa->ATD_OBS = $this->COT_JUSTIFICATIVA;
            $justificativa->ATD_DTCADASTRO = date('d/m/Y');
            $justificativa->ATD_SITUACAO = 'R';
            $justificativa->ATD_IDUSUARIO = User::getId();
            $justificativa->ATD_DTALTERACAO = date('d/m/Y');

            return $justificativa->save(false, array(
                'ATD_DTLANCAMENTO',
                'ATD_TIPO',
                'ATD_IDMOTIVO',
                'ATD_DTCADASTRO',
                'ATD_HORAINICIO',
                'ATD_HORAFINAL',
                'ATD_TOTALHORAS',
                'ATD_IDFUNCIONARIO',
                'ATD_SITUACAO',
                'ATD_IDCLIENTE',
                'ATD_IDCONTRATO',
                'ATD_OBS',
                'ATD_IDUSUARIO',
                'ATD_DTALTERACAO'
            ));
        }
        return true;
    }

    public function registraNegociacao()
    {
        if (in_array($this->COT_SITUACAO, [self::CONTRATO, self::ADENDO, self::PEDIDO_REATIVACAO])) {
            if (empty($this->COT_ID_SOLICITACAO_TRANSFERENCIA)) {
                $negociacao = new FechamentosNegociacoes();
                $negociacao->FEN_IDCLIENTE = $this->COT_IDCLIENTE;
                $negociacao->FEN_IDCONTRATO = $this->COT_IDCONTRATO;

                $valorImplantacao = number_format((float) $this->COT_VLRIMPLANTACAO, 2, '.', '');
                if ($this->COT_SITUACAO == self::CONTRATO) {
                    $tipo = FechamentosNegociacoes::CLIENTES_NOVOS;
                } elseif ($this->COT_SITUACAO == self::ADENDO) {
                    $tipo = FechamentosNegociacoes::ADENDOS_SEM_ACRESCIMO;
                    if ($this->COT_VLRMENSAL > $this->COT_CLI_VLRMENSAL) {
                        $tipo = FechamentosNegociacoes::ADENDOS_COM_ACRESCIMO;
                    } elseif ($this->COT_VLRMENSAL == $this->COT_CLI_VLRMENSAL && $valorImplantacao > 0) {
                        $tipo = FechamentosNegociacoes::ADENDOS_COM_ACRESCIMO;
                    }
                } else {
                    $tipo = FechamentosNegociacoes::REATIVACOES_CLIENTES;
                }

                $negociacao->FEN_TIPO_NEGOCIACAO = $tipo;
                $negociacao->FEN_IDREVENDA = $this->COT_IDREVENDA;

                $valorMensal = number_format((float) $this->COT_VLRMENSAL, 2, '.', '');
                $negociacao->FEN_VLRNEGOCIADO = $valorMensal;

                $negociacao->FEN_VLRIMPLANTACAO = $valorImplantacao;
                $negociacao->FEN_IDPRODUTO = $this->COT_IDPRODUTO;

                if ($this->COT_SITUACAO == self::ADENDO) {
                    $valorDiferenca = $this->COT_VLRMENSAL - $this->COT_CLI_VLRMENSAL;
                    $valorDiferenca = number_format((float) $valorDiferenca, 2, '.', '');

                    $negociacao->FEN_VLRDIFERENCA = $valorDiferenca;
                    $negociacao->FEN_NROUSUARIOS = $this->COT_NROUSUARIOS - $this->COT_CLI_QTDUSUARIOS;
                } elseif ($this->COT_SITUACAO == self::PEDIDO_REATIVACAO) {
                    if ($this->COT_CRIARNOVOCONTRATO) {
                        $contrato = self::model()->findByPk($this->COT_DOCUMENTOVINCULADO);

                        $valorMensal = number_format((float) $contrato->COT_VLRMENSAL, 2, '.', '');

                        $valorImplantacao = number_format((float) $contrato->COT_VLRIMPLANTACAO, 2, '.', '');
                        $negociacao->FEN_VLRIMPLANTACAO = $valorImplantacao;

                        $negociacao->FEN_NROUSUARIOS = $contrato->COT_NROUSUARIOS;
                    } else {
                        $valorMensal = number_format((float) $this->Cliente->CLI_VLRMENSAL, 2, '.', '');

                        $negociacao->FEN_NROUSUARIOS = $this->Cliente->CLI_QTDUSUARIOS;
                        $negociacao->FEN_IDPRODUTO = $this->Cliente->CLI_PRODUTO;
                    }
                    $negociacao->FEN_VLRNEGOCIADO = $valorMensal;
                } else {
                    $negociacao->FEN_NROUSUARIOS = $this->COT_NROUSUARIOS;
                }

                $negociacao->FEN_IDVENDEDOR = $this->COT_IDVENDEDOR;
                $negociacao->FEN_IDMOTIVO = $this->COT_CLI_IDMOTIVO;
                $negociacao->FEN_DTCONTRATACAO = $this->COT_DTATIVACAO;
                $negociacao->FEN_DTCADASTRO = date('Y-m-d H:i:s');
                $negociacao->FEN_STATUS = FechamentosNegociacoes::STATUS_ATIVO;
                if ($negociacao->save()) {
                    $itens = $this->Itens;
                    if (!empty($itens)) {
                        foreach ($itens as $item) {
                            $negociacaoItem = new FechamentosNegociacoesItens;
                            $negociacaoItem->FNI_IDNEGOCIACAO = $negociacao->FEN_IDNEGOCIACAO;
                            $negociacaoItem->FNI_IDMODULO = $item->CTI_IDPRODUTO;
                            if (!$negociacaoItem->save()) {
                                return true;
                            }
                        }
                    }
                    return true;
                }

                return true;
            }
        }

        return true;
    }

    public function reverteRegistroNegociacao()
    {
        if (in_array($this->COT_SITUACAO, [self::CONTRATO, self::ADENDO])) {
            $negociacoes = FechamentosNegociacoes::model()->updateAll(
                array('FEN_STATUS' => FechamentosNegociacoes::STATUS_REMOVIDO),
                "FEN_IDCONTRATO = {$this->COT_IDCONTRATO}"
            );
        }
    }

    public function getProdutoComModulos()
    {
        $name = $this->Produto->MOD_DESCRICAO;
        $itens = $this->Itens;
        if (!empty($itens)) {

            $complementares = "";
            if (count($itens) > 0) {
                foreach ($itens as $k => $item) {
                    $complementares .= $item->Modulo->getNomeProduto();
                    if ($k != count($itens) - 1) {
                        if ($k+1 == count($itens) - 1) {
                            $complementares .= " & ";
                        } else {
                            $complementares .= ", ";
                        }
                    }
                }
            } else {
                $complementares .= $itens[0]->Modulo->getNomeProduto();
            }

            $name .= " c/ " . $complementares;
        }

        return $name;
    }

    public function loadDadosTermoCancelamentos()
    {
        if ($this->COT_SITUACAO == self::TERMO_CANCELAMENTO) {
            if (!empty($this->SolicitacaoCancelamento)) {
                $dadosTermo = array(
                    'AVISO_PREVIO_INICIO' => $this->SolicitacaoCancelamento->CLC_AVISO_PREVIO_INICIO,
                    'AVISO_PREVIO_FIM' => $this->SolicitacaoCancelamento->CLC_AVISO_PREVIO_FIM,
                    'DT_ULTIMA_MENSALIDADE' => $this->SolicitacaoCancelamento->CLC_DT_ULTIMA_MENSALIDADE,
                    'DT_ENCERRAMENTO' => $this->SolicitacaoCancelamento->CLC_DT_ENCERRAMENTO,
                    'Tipo' => $this->SolicitacaoCancelamento->CLC_TIPO_CANCELAMENTO,
                    'Motivo' => $this->SolicitacaoCancelamento->Motivo,
                );
            } else {
                $dadosTermo = array(
                    'AVISO_PREVIO_INICIO' => $this->SolicitacaoTransferencia->CLT_AVISO_PREVIO_INICIO,
                    'AVISO_PREVIO_FIM' => $this->SolicitacaoTransferencia->CLT_AVISO_PREVIO_FIM,
                    'DT_ULTIMA_MENSALIDADE' => $this->SolicitacaoTransferencia->CLT_DT_ULTIMA_MENSALIDADE,
                    'DT_ENCERRAMENTO' => $this->SolicitacaoTransferencia->CLT_DT_ENCERRAMENTO,
                    'Tipo' => ClientesCancelamentos::CANCELAMENTO_NORMAL,
                    'Motivo' => 'Transferência'
                );
            }

            return $dadosTermo;
        }
        return false;
    }

    public function getUnidadesImplantacaoObrigatoria() {
        // @todo no futuro informar no cadastro da unidade se é obrigatoria a implantação
        return Contratos::UNIDADES_IMPLANTACAO_OBRIGATORIA;
    }

    public function temMobile() {
        if(!empty($this->Itens)) {
            foreach($this->Itens as $item) {
                if($item->Modulo->MOD_MOBILE) {
                    return true;
                }
            }
        }
        return false;
    }
}