<?php

class ClientesTransferencias extends GxActiveRecord {

    // variáveis para pesquisa
    var $CLI_NOME, $CLI_CNPJCPF_AUTORIZADOR, $CLI_CNPJCPF_AUTORIZADO, 
    $CLI_IDREVENDA_AUTORIZADOR, $CLI_IDREVENDA_AUTORIZADO;

    const STATUS_AGUARDANDO = "A";
    const STATUS_AGUARDANDO_VINCULO = "AV";
    const STATUS_VINCULADO = "V";
    const STATUS_PROCESSADO = "P";
    const STATUS_CANCELADO = "C";
    const STATUS_ENCERRADO = "E";
    public $status = array(
        self::STATUS_AGUARDANDO => 'Aguardando',
        self::STATUS_AGUARDANDO_VINCULO => 'Aguardando Vínculo',
        self::STATUS_VINCULADO => 'Vinculado',
        self::STATUS_PROCESSADO => 'Processado',
        self::STATUS_CANCELADO  => 'Cancelado',
        self::STATUS_ENCERRADO => 'Efetivado',
    );
    ///
    const TIPO_SISTEMA = "S";
    const TIPO_BANCO = "B";
    const TIPO_SISTEMA_BANCO = "SB";
    public $tipos = array(
        self::TIPO_SISTEMA => 'Transferência de Sistema',
        self::TIPO_BANCO => 'Transferência de Banco de Dados',
        self::TIPO_SISTEMA_BANCO => 'Transferência de Sistema & Banco de Dados',
    );

    public static function model($className = __CLASS__) {
        return parent::model($className);
    }
    ///
    const ORIGEM_AREA_CLIENTE = "AC";
    const ORIGEM_EMAIL = "M";
    const ORIGEM_ADMINISTRATIVO = "IA";
    const ORIGEM_COMERCIAL = "IC";
    const ORIGEM_FINANCEIRO = "IF";
    const ORIGEM_SUPORTE = "IS";

    public $origens = array(
        self::ORIGEM_AREA_CLIENTE => 'Área do Cliente',
        self::ORIGEM_EMAIL => 'E-mail',
        self::ORIGEM_ADMINISTRATIVO => 'Administrativo',
        self::ORIGEM_COMERCIAL => 'Comercial',
        self::ORIGEM_FINANCEIRO => 'Financeiro',
        self::ORIGEM_SUPORTE => 'Suporte',
    );

    public $CLT_DTSOLICITACAO_FINAL;
    public $CLT_ORIGEM_CANCELAMENTO;
    public $CLT_OBS_CANCELAMENTO;
    public $COT_SIMPLES_CAMPO;
    public $COT_SIMPLES;

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

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

    public function rules() {
        return array(
            array(
                '
                    CLT_IDCLIENTE, CLT_ORIGEM, CLT_IDVENDEDOR, CLT_CNPJCPF, CLT_RAZAO_SOCIAL,
                    CLT_CONTATO, CLT_TIPO, CLT_STATUS, CLT_DTSOLICITACAO, CLT_CIDADE
                ',
                'required'
            ),
            array(
                '
                    CLT_INSCR_EST, CLT_EMAIL, CLT_OBS, CLT_TELEFONE, CLT_CEP, CLT_ENDERECO, CLT_NUMERO,
                    CLT_COMPLEMENTO, CLT_BAIRRO, CLT_CIDADE,
                    CLT_AVISO_PREVIO_INICIO, CLT_AVISO_PREVIO_FIM, CLT_DT_ENCERRAMENTO, CLT_DT_ULTIMA_MENSALIDADE,
                    CLT_ORIGEM_CANCELAMENTO, CLT_OBS_CANCELAMENTO
                ',
                'safe'
            ),
            array('CLT_TIPO, CLT_STATUS, CLT_DTSOLICITACAO, CLT_DTSOLICITACAO_FINAL, CLI_NOME, 
                CLI_CNPJCPF_AUTORIZADOR, CLI_CNPJCPF_AUTORIZADO, CLI_IDREVENDA_AUTORIZADOR, CLI_IDREVENDA_AUTORIZADO',
                'safe', 
                'on'=>'search'),
            array(
                '
                    CLT_INSCR_EST, CLT_EMAIL, CLT_TELEFONE, CLT_CEP, CLT_ENDERECO, CLT_NUMERO,
                    CLT_COMPLEMENTO, CLT_BAIRRO, CLT_CIDADE, CLT_OBS
                ',
                'default',
                'setOnEmpty' => true,
                'value' => null
            ),
            array('CLT_CNPJCPF', 'verificaCliente'),
            array('CLT_ORIGEM_CANCELAMENTO', 'required', 'on' => 'cancelamentoTransferencia'),
        );
    }

    public function relations() {
        return array(
            'Autor' => array(self::BELONGS_TO, 'Funcionarios', 'CLT_IDAUTOR'),
            'Cliente' => array(self::BELONGS_TO, 'Clientes', 'CLT_IDCLIENTE'),
            'Vendedor' => array(self::BELONGS_TO, 'Funcionarios', 'CLT_IDVENDEDOR'),
            'ClienteAutorizado' => array(self::BELONGS_TO, 'Clientes', 'CLT_IDCLIENTE_AUTORIZADO'),
            'Documentos' => array(self::HAS_MANY, 'Contratos', 'COT_ID_SOLICITACAO_TRANSFERENCIA'),
            'Cidade' => array(self::BELONGS_TO, 'Cidades', 'CLT_CIDADE'),
        );
    }

    public function attributeLabels() {
        return array(
            'CLT_IDTRANSFERENCIA'       => 'Código da Solicitação',
            'CLT_IDCLIENTE'             => 'Cliente autorizador',
            'CLT_IDAUTOR'               => 'Cadastrado por',
            'CLT_ORIGEM'                => 'Origem',
            'CLT_IDVENDEDOR'            => 'Vendedor',
            'CLT_CNPJCPF'               => 'CNPJ/CPF',
            'CLT_INSCR_EST'             => 'Inscrição Estadual',
            'CLT_RAZAO_SOCIAL'          => 'Razão Social',
            'CLT_CONTATO'               => 'Contato',
            'CLT_EMAIL'                 => 'E-mail',
            'CLT_TELEFONE'              => 'Telefone',
            'CLT_CEP'                   => 'CEP',
            'CLT_ENDERECO'              => 'Endereço',
            'CLT_NUMERO'                => 'Número',
            'CLT_COMPLEMENTO'           => 'Complemento',
            'CLT_BAIRRO'                => 'Bairro',
            'CLT_CIDADE'                => 'Cidade',
            'CLT_OBS'                   => 'Observações',
            'CLT_TIPO'                  => 'Tipo',
            'CLT_IDCLIENTE_AUTORIZADO'  => 'Cliente autorizado',
            'CLT_AVISO_PREVIO_INICIO'   => 'Início do aviso prévio',
            'CLT_AVISO_PREVIO_FIM'      => 'Fim do aviso prévio',
            'CLT_DT_ENCERRAMENTO'       => 'Data de encerramento do contrato',
            'CLT_DT_ULTIMA_MENSALIDADE' => 'Data da última mensalidade',
            'CLT_STATUS'                => 'Status',
            'CLT_DTSOLICITACAO'         => 'Data da solicitação',
            'CLT_DTEFETIVACAO'          => 'Data da efetivação',
            'CLT_ORIGEM_CANCELAMENTO'   => 'Origem da Solicitação',
            'CLT_OBS_CANCELAMENTO'      => 'Observações',
            'CLI_NOME'                  => 'Razão Social',
            'CLI_CNPJCPF_AUTORIZADOR'   => 'CPF/CNPJ',
            'CLI_IDREVENDA_AUTORIZADOR' => 'Unidade de Negócios',
            'CLI_CNPJCPF_AUTORIZADO'    => 'CPF/CNPJ',
            'CLI_IDREVENDA_AUTORIZADO'  => 'Unidade de Negócios'
        );
    }

    public function verificaCliente($attribute, $params)
    {
        if (!empty($this->{$attribute})) {
            $autorizado = Clientes::model()->find('CLI_CNPJCPF = "' . Util::unmask($this->CLT_CNPJCPF) . '"');
            if($autorizado && $autorizado->CLI_SITUACAO == "A") {
                if($this->CLT_TIPO == self::TIPO_SISTEMA) {
                    if($this->CLT_IDCLIENTE != $autorizado->CLI_IDCLIENTE) {
                        $this->addError($attribute, 'Transferência de sistema entre clientes Ativos somente permitida para migrar cliente Winsul para Windel. Neste caso o CNPJ do AUTORIZADOR deve ser o mesmo do AUTORIZADO, caso queira fazer esta migração informe o mesmo CNPJ para AUTORIZADOR e AUTORIZADO. Caso esteja querendo realizar transferência entre dois clientes distintos, altere o tipo da transferência para Transferênia de Banco de Dados!');
                        return false;
                    } else if($autorizado->CLI_IDEMPRESA != 2) {
                        $this->addError($attribute, 'Transferência de sistema entre clientes Ativos somente permitida para migrar cliente Winsul para Windel, o CNPJ do AUTORIZADOR deve ser o mesmo do AUTORIZADO, e o cliente deve ser da Winsul. O cliente informado não é cliente da Winsul. Favor alterar o mesmo!');
                        return false;
                    }
                } else if($this->CLT_TIPO == self::TIPO_BANCO) {
                    if($this->CLT_IDCLIENTE == $autorizado->CLI_IDCLIENTE) {
                        $this->addError($attribute, 'Não é permitido transferência banco de dados de um cleinte para ele mesmo, favor alterar CNPJ do AUTORIZADO ou o tipo de transferência!');
                        return false;
                    }

                } else if($this->CLT_TIPO == self::TIPO_SISTEMA_BANCO) {
                    $this->addError($attribute, 'Não é permitido transferência de sistema e banco entre clientes ativos, favor alterar CNPJ informado ou o tipo de transferência!');
                    return false;
                }
            }
        }
    }

    public function getStatus($status = false)
    {
        if (!$status) {
            $status = $this->CLT_STATUS;
        }
        return $this->status[$status] ?? "Não informado";
    }

    public function getTipo($tipo = false)
    {
        if (!$tipo) {
            $tipo = $this->CLT_TIPO;
        }
        return $this->tipos[$tipo] ?? "Não informado";
    }

    public function getOrigem($origem = false)
    {
        if (!$origem) {
            $origem = $this->CLT_ORIGEM;
        }
        return $this->origens[$origem] ?? "Não informado";
    }

    public function cnpjExists()
    {
        return Clientes::model()->find("CLI_CNPJCPF = '{$this->CLT_CNPJCPF}'");
    }

    public function cnpjAtivo()
    {
        return Clientes::model()->find("
            CLI_CNPJCPF = '{$this->CLT_CNPJCPF}' AND
            CLI_SITUACAO = 'A'
        ");
    }

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

        if (User::isVendedor()) {
            $criteria->addCondition('CLT_IDVENDEDOR = "'.User::getId().'"');
        } else {
            $criteria->addCondition('
                (
                    Cliente.CLI_CIDADE IN ('.User::getCidades(true).') OR
                    ClienteAutorizado.CLI_CIDADE IN ('.User::getCidades(true).')
                )
            ');
        }

        // autorizador
        if (!empty($this->CLI_CNPJCPF_AUTORIZADOR)) {
            $criteria->compare('Cliente.CLI_CNPJCPF', Util::unmask($this->CLI_CNPJCPF_AUTORIZADOR), true);
        }

        if (!empty($this->CLI_IDREVENDA_AUTORIZADOR)) {
            if (is_array($this->CLI_IDREVENDA_AUTORIZADOR)) {
                $revendas = implode(",",$this->CLI_IDREVENDA_AUTORIZADOR);
            } else {
                $revendas = $this->CLI_IDREVENDA_AUTORIZADOR;
            }
            $Regioescidades = Regioescidades::model()->findAll('RCD_IDREVENDA IN ('. $revendas . ')');
            $data_cidades = CHtml::listData($Regioescidades, 'RCD_IDCIDADE', 'RCD_IDCIDADE');
            $criteria->addInCondition('Cliente.CLI_CIDADE', $data_cidades);
        }

        if (!empty($this->CLI_NOME)) {
            $criteria->addCondition("
                Cliente.CLI_NOME like '%" . Util::secureForSelect($this->CLI_NOME, true) . "%' or
                Cliente.CLI_FANTASIA like '%" . Util::secureForSelect($this->CLI_NOME, true) . "%' or
                Cliente.CLI_NOME like '%" . Util::secureForSelect($this->CLI_NOME) . "%' or
                Cliente.CLI_FANTASIA like '%" . Util::secureForSelect($this->CLI_NOME) . "%'
            ");
        }

        // autorizado
        if (!empty($this->CLI_CNPJCPF_AUTORIZADO)) {
            $criteria->compare('CLT_CNPJCPF', Util::unmask($this->CLI_CNPJCPF_AUTORIZADO), true);
        }

        if (!empty($this->CLI_IDREVENDA_AUTORIZADO)) {
            if (is_array($this->CLI_IDREVENDA_AUTORIZADO)) {
                $revendas = implode(",",$this->CLI_IDREVENDA_AUTORIZADO);
            } else {
                $revendas = $this->CLI_IDREVENDA_AUTORIZADO;
            }
            $Regioescidades = Regioescidades::model()->findAll('RCD_IDREVENDA IN ('. $revendas . ')');
            $data_cidades = CHtml::listData($Regioescidades, 'RCD_IDCIDADE', 'RCD_IDCIDADE');
            $criteria->addInCondition('ClienteAutorizado.CLI_CIDADE', $data_cidades);
        }

        if (!empty($this->CLT_TIPO)) {
            $criteria->compare('CLT_TIPO', $this->CLT_TIPO);
        }

        if (!empty($this->CLT_ORIGEM)) {
            $criteria->compare('CLT_ORIGEM', $this->CLT_ORIGEM);
        }

        if (!empty($this->CLT_STATUS)) {
            $criteria->compare('CLT_STATUS', $this->CLT_STATUS);
        }

        if (!empty($this->CLT_IDVENDEDOR)) {
            $criteria->compare('CLT_IDVENDEDOR', $this->CLT_IDVENDEDOR);
        }

        if ($data = Util::formatDataMysql($this->CLT_DTSOLICITACAO)) {
            $criteria->addCondition("CLT_DTSOLICITACAO >= '{$data}'");
        }
        if ($data = Util::formatDataMysql($this->CLT_DTSOLICITACAO_FINAL)) {
            $criteria->addCondition("CLT_DTSOLICITACAO <= '{$data}'");
        }

        $criteria->with = array(
            'Cliente' => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => false),
            'ClienteAutorizado' => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => false),
        );

        $sort = new CSort;
        $sort->attributes = array(
            '*',
            'Cliente' => array(
              'asc'=>'Cliente.CLI_NOME',
              'desc'=>'Cliente.CLI_NOME desc'
            ),
            'Cliente.CLI_CNPJCPF' => array(
              'asc'=>'Cliente.CLI_CNPJCPF',
              'desc'=>'Cliente.CLI_CNPJCPF desc'
            ),
        );

        $sort->defaultOrder = 'CLT_IDTRANSFERENCIA DESC';

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

    public function podeAdicionarAtividade()
    {
        return in_array($this->CLT_STATUS, [self::STATUS_AGUARDANDO, self::STATUS_AGUARDANDO_VINCULO]);
    }

    public function gerarDatasCancelamento()
    {
        $dados = array();

        $cliente = $this->Cliente;
        $dados['CLT_AVISO_PREVIO_INICIO'] = Util::getCurrentDate()->modify('first day of this month')->format('Y-m-d');
        $dados['CLT_AVISO_PREVIO_FIM'] = Util::getCurrentDate()->modify('last day of this month')->format('Y-m-d');

        if ($cliente->CLI_DIAVENCIMENTO == 10) {

            $dados['CLT_DT_ULTIMA_MENSALIDADE'] = Util::getCurrentDate()->modify('+1 month')->format('Y-m-10');
        } elseif ($cliente->CLI_DIAVENCIMENTO == 20) {

            $dados['CLT_DT_ULTIMA_MENSALIDADE'] = Util::getCurrentDate()->format('Y-m-20');
        } else {

           $dados['CLT_DT_ULTIMA_MENSALIDADE'] = Util::getCurrentDate()->modify('+1 month')->format('Y-m-10');
        }
        $dados['CLT_DT_ENCERRAMENTO'] = $dados['CLT_AVISO_PREVIO_FIM'];

        $this->setAttributes($dados);

        return $dados;
    }

    public function gerarTermoCancelamentoTransferencia()
    {
        $contrato = new Contratos;

        $contrato->COT_SITUACAO = Contratos::TERMO_CANCELAMENTO;
        $contrato->COT_IDCLIENTE = $this->CLT_IDCLIENTE;
        $contrato->COT_ID_SOLICITACAO_TRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
        $contrato->COT_IDVENDEDOR = $this->CLT_IDVENDEDOR;
        $contrato->COT_DTCADASTRO = date('Y-m-d');
        $contrato->COT_HORACADASTRO = date('H:i:s');
        $contrato->COT_VLRMENSAL = (float) $this->Cliente->CLI_VLRMENSAL;
        $contrato->COT_DIAVENCTO = $this->Cliente->CLI_DIAVENCIMENTO;
        $contrato->COT_NROUSUARIOS = $this->Cliente->CLI_QTDUSUARIOS;
        $contrato->COT_IDPRODUTO = $this->Cliente->CLI_PRODUTO;
        $contrato->COT_FUNCIONAMENTO = $this->Cliente->CLI_QTDUSUARIOS == 1 ? 1 : "N";
        $contrato->COT_STATUS = 575; // Transferência Aguardando Contrato
        $contrato->COT_CLI_NOME = $this->Cliente->CLI_NOME;
        $contrato->COT_CLI_CONTATO = $this->Cliente->CLI_CONTATO;
        $contrato->COT_CLI_ENDERECO = $this->Cliente->CLI_ENDERECO;
        $contrato->COT_CLI_NUMERO = $this->Cliente->CLI_NUMERO;
        $contrato->COT_CLI_COMPLEMENTO = $this->Cliente->CLI_COMPLEMENTO;
        $contrato->COT_CLI_BAIRRO = $this->Cliente->CLI_BAIRRO;
        $contrato->COT_CLI_CIDADE = $this->Cliente->CLI_CIDADE;
        $contrato->COT_CLI_CNPJCPF = $this->Cliente->CLI_CNPJCPF;
        $contrato->COT_CLI_INSCR_EST = $this->Cliente->CLI_INSCR_EST;
        $contrato->COT_CLI_CEP = $this->Cliente->CLI_CEP;
        $contrato->COT_CLI_FONE1 = $this->Cliente->CLI_FONE1;
        $contrato->COT_CLI_EMAIL = $this->Cliente->CLI_EMAIL;
        $contrato->COT_CLI_IDMOTIVO = 79; // transferência
        $contrato->COT_DTATIVACAO = date('Y-m-d');
        $contrato->COT_IDREVENDA = $this->Cliente->getRevendaResponsavel2()->REV_IDREVENDA ?? 0;

        if ($contrato->save()) {
            $atividadeContrato = new Atendimentos;

            $descricaoAtendimento = "Termo de cancelamento gerado automaticamente, ";
            $descricaoAtendimento .= "aguardando finalização do processo de transferência.";

            $atividadeContrato->ATD_IDCLIENTE = $contrato->COT_IDCLIENTE;
            $atividadeContrato->ATD_IDCONTRATO = $contrato->COT_IDCONTRATO;
            $atividadeContrato->ATD_IDFUNCIONARIO = $this->CLT_IDVENDEDOR;
            $atividadeContrato->ATD_TIPO = 'D';
            $atividadeContrato->ATD_AUTOMATICO = 1;
            $atividadeContrato->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
            $atividadeContrato->ATD_HORAINICIO = date('H:i:s');
            $atividadeContrato->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
            $atividadeContrato->ATD_TOTALHORAS = '00:01:00';
            $atividadeContrato->ATD_IDMOTIVO = $contrato->COT_STATUS;
            $atividadeContrato->ATD_OBS = $descricaoAtendimento;
            $atividadeContrato->ATD_DTCADASTRO = date('d/m/Y');
            $atividadeContrato->ATD_SITUACAO = 'R';
            $atividadeContrato->ATD_IDUSUARIO = User::getId();
            $atividadeContrato->ATD_DTALTERACAO = date('d/m/Y');
            $salvou = $atividadeContrato->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'
            ));

            if ($salvou) {
                return $contrato;
            }
        }
        return false;
    }

    public function gerarTransferenciaBancoEnvio()
    {
        $contrato = new Contratos;

        $autorizador = $this->Cliente;

        $contrato->COT_SITUACAO = Contratos::TRANSFERENCIA_BANCO_ENVIO;
        $contrato->COT_IDCLIENTE = $this->CLT_IDCLIENTE;
        $contrato->COT_ID_SOLICITACAO_TRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
        $contrato->COT_IDVENDEDOR = $this->CLT_IDVENDEDOR;
        $contrato->COT_DTCADASTRO = date('Y-m-d');
        $contrato->COT_HORACADASTRO = date('H:i:s');
        $contrato->COT_VLRMENSAL = (float) $this->Cliente->CLI_VLRMENSAL;
        $contrato->COT_DIAVENCTO = $autorizador->CLI_DIAVENCIMENTO;
        $contrato->COT_NROUSUARIOS = $autorizador->CLI_QTDUSUARIOS;
        $contrato->COT_IDPRODUTO = $autorizador->CLI_PRODUTO;
        $contrato->COT_FUNCIONAMENTO = $autorizador->CLI_QTDUSUARIOS == 1 ? 1 : "N";
        $contrato->COT_STATUS = 4; // Aguardando aceite do cliente
        $contrato->COT_CLI_NOME = $autorizador->CLI_NOME;
        $contrato->COT_CLI_CONTATO = $autorizador->CLI_CONTATO;
        $contrato->COT_CLI_ENDERECO = $autorizador->CLI_ENDERECO;
        $contrato->COT_CLI_NUMERO = $autorizador->CLI_NUMERO;
        $contrato->COT_CLI_COMPLEMENTO = $autorizador->CLI_COMPLEMENTO;
        $contrato->COT_CLI_BAIRRO = $autorizador->CLI_BAIRRO;
        $contrato->COT_CLI_CIDADE = $autorizador->CLI_CIDADE;
        $contrato->COT_CLI_CNPJCPF = $autorizador->CLI_CNPJCPF;
        $contrato->COT_CLI_INSCR_EST = $autorizador->CLI_INSCR_EST;
        $contrato->COT_CLI_CEP = $autorizador->CLI_CEP;
        $contrato->COT_CLI_FONE1 = $autorizador->CLI_FONE1;
        $contrato->COT_CLI_EMAIL = $autorizador->CLI_EMAIL;
        $contrato->COT_CLI_IDMOTIVO = 79;
        $contrato->COT_DTATIVACAO = date('Y-m-d');

        $contrato->COT_IDREVENDA = $autorizador->getRevendaResponsavel2()->REV_IDREVENDA ?? 0;
        if ($contrato->save()) {
            $atividadeContrato = new Atendimentos;

            $descricaoAtendimento = "Termo de transferência de banco de dados gerado automaticamente, ";
            $descricaoAtendimento .= "aguardando aceite do cliente.";

            $atividadeContrato->ATD_IDCLIENTE = $contrato->COT_IDCLIENTE;
            $atividadeContrato->ATD_IDCONTRATO = $contrato->COT_IDCONTRATO;
            $atividadeContrato->ATD_IDFUNCIONARIO = $this->CLT_IDVENDEDOR;
            $atividadeContrato->ATD_TIPO = 'D';
            $atividadeContrato->ATD_AUTOMATICO = 1;
            $atividadeContrato->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
            $atividadeContrato->ATD_HORAINICIO = date('H:i:s');
            $atividadeContrato->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
            $atividadeContrato->ATD_TOTALHORAS = '00:01:00';
            $atividadeContrato->ATD_IDMOTIVO = $contrato->COT_STATUS;
            $atividadeContrato->ATD_OBS = $descricaoAtendimento;
            $atividadeContrato->ATD_DTCADASTRO = date('d/m/Y');
            $atividadeContrato->ATD_SITUACAO = 'R';
            $atividadeContrato->ATD_IDUSUARIO = User::getId();
            $atividadeContrato->ATD_DTALTERACAO = date('d/m/Y');
            $salvou = $atividadeContrato->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'
            ));

            if ($salvou) {
                MailTemplates::documentoAguardandoAceiteDoCliente($contrato);
                return $contrato;
            }
        }
        return false;
    }

    public function gerarTransferenciaBancoRecepcao()
    {
        $contrato = new Contratos;

        $autorizador = $this->Cliente;
        $autorizado = $this->ClienteAutorizado;

        $contrato->COT_SITUACAO = Contratos::TRANSFERENCIA_BANCO_RECEPCAO;
        $contrato->COT_IDCLIENTE = $this->CLT_IDCLIENTE_AUTORIZADO;
        $contrato->COT_ID_SOLICITACAO_TRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
        $contrato->COT_IDVENDEDOR = $this->CLT_IDVENDEDOR;
        $contrato->COT_DTCADASTRO = date('Y-m-d');
        $contrato->COT_HORACADASTRO = date('H:i:s');
        $contrato->COT_VLRMENSAL = (float) $autorizador->CLI_VLRMENSAL;
        $contrato->COT_DIAVENCTO = $autorizador->CLI_DIAVENCIMENTO;
        $contrato->COT_NROUSUARIOS = $autorizador->CLI_QTDUSUARIOS;
        $contrato->COT_IDPRODUTO = $autorizador->CLI_PRODUTO;
        $contrato->COT_FUNCIONAMENTO = $autorizador->CLI_QTDUSUARIOS == 1 ? 1 : "N";
        $contrato->COT_STATUS = 4; // Aguardando aceite do cliente
        $contrato->COT_CLI_NOME = $autorizador->CLI_NOME;
        $contrato->COT_CLI_CONTATO = $autorizador->CLI_CONTATO;
        $contrato->COT_CLI_ENDERECO = $autorizador->CLI_ENDERECO;
        $contrato->COT_CLI_NUMERO = $autorizador->CLI_NUMERO;
        $contrato->COT_CLI_COMPLEMENTO = $autorizador->CLI_COMPLEMENTO;
        $contrato->COT_CLI_BAIRRO = $autorizador->CLI_BAIRRO;
        $contrato->COT_CLI_CIDADE = $autorizador->CLI_CIDADE;
        $contrato->COT_CLI_CNPJCPF = $autorizador->CLI_CNPJCPF;
        $contrato->COT_CLI_INSCR_EST = $autorizador->CLI_INSCR_EST;
        $contrato->COT_CLI_CEP = $autorizador->CLI_CEP;
        $contrato->COT_CLI_FONE1 = $autorizador->CLI_FONE1;
        $contrato->COT_CLI_EMAIL = $autorizador->CLI_EMAIL;
        $contrato->COT_CLI_IDMOTIVO = 79;
        $contrato->COT_DTATIVACAO = date('Y-m-d');

        $contrato->COT_IDREVENDA = $autorizado->getRevendaResponsavel2()->REV_IDREVENDA ?? 0;
        if ($contrato->save()) {
            $atividadeContrato = new Atendimentos;

            $descricaoAtendimento = "Termo de transferência de banco de dados gerado automaticamente, ";
            $descricaoAtendimento .= "aguardando aceite do cliente.";

            $atividadeContrato->ATD_IDCLIENTE = $contrato->COT_IDCLIENTE;
            $atividadeContrato->ATD_IDCONTRATO = $contrato->COT_IDCONTRATO;
            $atividadeContrato->ATD_IDFUNCIONARIO = $this->CLT_IDVENDEDOR;
            $atividadeContrato->ATD_TIPO = 'D';
            $atividadeContrato->ATD_AUTOMATICO = 1;
            $atividadeContrato->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
            $atividadeContrato->ATD_HORAINICIO = date('H:i:s');
            $atividadeContrato->ATD_HORAFINAL = date('H:i:s', strtotime('+1 minute'));
            $atividadeContrato->ATD_TOTALHORAS = '00:01:00';
            $atividadeContrato->ATD_IDMOTIVO = $contrato->COT_STATUS;
            $atividadeContrato->ATD_OBS = $descricaoAtendimento;
            $atividadeContrato->ATD_DTCADASTRO = date('d/m/Y');
            $atividadeContrato->ATD_SITUACAO = 'R';
            $atividadeContrato->ATD_IDUSUARIO = User::getId();
            $atividadeContrato->ATD_DTALTERACAO = date('d/m/Y');
            $salvou = $atividadeContrato->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'
            ));

            if ($salvou) {
                return $contrato;
            }
        }
        return false;
    }

    public function afterVinculado($cliente)
    {
        $commit = true;

        $this->CLT_IDCLIENTE_AUTORIZADO = $cliente->CLI_IDCLIENTE;
        $this->CLT_STATUS = self::STATUS_VINCULADO;
        $updateFields = array('CLT_IDCLIENTE_AUTORIZADO', 'CLT_STATUS');
        if ($this->podeCadastrarTermoCancelamento()) {
            $updateFields[] = 'CLT_AVISO_PREVIO_INICIO';
            $updateFields[] = 'CLT_AVISO_PREVIO_FIM';
            $updateFields[] = 'CLT_DT_ENCERRAMENTO';
            $updateFields[] = 'CLT_DT_ULTIMA_MENSALIDADE';

            $datas = $this->gerarDatasCancelamento();
            if (!empty($datas)) {
                $termoCancelamento = $this->gerarTermoCancelamentoTransferencia();
                if (!$termoCancelamento) {
                    $commit = false;
                }
            } else {
                $commit = false;
            }
        }

        if ($this->podeCadastrarTransferenciaBanco()) {
            $transferenciaAutorizador = $this->gerarTransferenciaBancoEnvio();
            $transferenciaAutorizado = $this->gerarTransferenciaBancoRecepcao();
            if ($transferenciaAutorizador && $transferenciaAutorizado) {
                if (!$transferenciaAutorizado->vincular($transferenciaAutorizador->COT_IDCONTRATO)) {
                    $commit = false;
                }
            } else {
                $commit = false;
            }
        }

        if ($commit) {
            if ($this->save(false, $updateFields)) {
                return true;
            }
        }
        return false;
    }

    public function getCamposInvalidosCadastroTermoBanco()
    {
        $autorizado = $this->ClienteAutorizado;

        $campos = array(
            'CLI_CNPJCPF',
            'CLI_EMAIL_AREA_CLIENTES'
        );
        $camposInvalidos = array();
        foreach ($campos as $campo) {
            if (empty($autorizado->{$campo})) {
                $camposInvalidos[] = $campo;
            }
        }

        return $camposInvalidos;
    }

    public function deveCadastrarTermoCancelamento()
    {
        if ($this->hasTermoCancelamento()) {
            return false;
        }

        if ($this->CLT_TIPO == self::TIPO_BANCO) {
            return false;
        }

        return true;
    }

    public function deveCadastrarTermoBanco()
    {
        if ($this->hasTransferenciaBanco()) {
            return false;
        }

        if ($this->CLT_TIPO == self::TIPO_SISTEMA) {
            return false;
        }

        return true;
    }

    public function deveCadastrarContrato()
    {
        if ($this->hasContrato()) {
            return false;
        }
        return true;
    }

    public function hasTermoCancelamento()
    {
        foreach ($this->Documentos as $documento) {
            if ($documento->COT_SITUACAO == Contratos::TERMO_CANCELAMENTO) {
                // não reprovados/cancelados
                if (!in_array($documento->COT_STATUS, [5, 9, 12, 13, 16, 17, 18, 22, 25, 468])) {
                    return $documento;
                }
            }
        }

        return false;
    }

    public function hasTransferenciaBanco()
    {
        $transferencias = [Contratos::TRANSFERENCIA_BANCO_ENVIO, Contratos::TRANSFERENCIA_BANCO_RECEPCAO];
        foreach ($this->Documentos as $documento) {
            if (in_array($documento->COT_SITUACAO, $transferencias)) {
                if (!in_array($documento->COT_STATUS, [5, 9, 12, 13, 16, 17, 18, 22, 25, 468])) { // não reprovados/cancelados
                    return $documento;
                }
            }
        }

        return false;
    }

    public function hasContrato()
    {
        foreach ($this->Documentos as $documento) {
            if ($documento->COT_SITUACAO == Contratos::CONTRATO) {
                if (!in_array($documento->COT_STATUS, [5, 9, 12, 13, 16, 17, 18, 22, 25, 468])) { // não reprovados/cancelados
                    return $documento;
                }
            }
        }

        return false;
    }

    public function podeCadastrarTermoCancelamento()
    {
        if (!in_array($this->CLT_TIPO, [self::TIPO_SISTEMA, self::TIPO_SISTEMA_BANCO])) {
            return false;
        }

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

        if (empty($this->ClienteAutorizado->CLI_CNPJCPF)) {
            return false;
        }

        return true;
    }

    public function podeCadastrarTransferenciaBanco()
    {
        if (!in_array($this->CLT_TIPO, [self::TIPO_BANCO, self::TIPO_SISTEMA_BANCO])) {
            return false;
        }

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

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

        return true;
    }

    public function podeCadastrarContrato()
    {
        return $this->ClienteAutorizado->podeCadastrarContrato(true);
    }

    public function podeCadastrarPedidoImplantacao()
    {
        return $this->ClienteAutorizado->podeCadastrarPedidoImplantacao(true);
    }

    public function processaSolicitacao()
    {
        $transaction = Yii::app()->db->beginTransaction();
        $commit = true;

        $this->CLT_STATUS = ClientesTransferencias::STATUS_PROCESSADO;
        if ($this->save()) {
            if (in_array($this->CLT_TIPO, [self::TIPO_SISTEMA, self::TIPO_SISTEMA_BANCO])) {
                $termoCancelamento = $this->getTermoCancelamento();
                if ($termoCancelamento) {
                    $termoCancelamento->COT_STATUS = 14; // Processo concluído
                    if (!$termoCancelamento->save(false, ['COT_STATUS'])) {
                        $commit = false;
                    }
                } else {
                    $commit = false;
                }
            }

            $atividade = new Atendimentos;

            $obs = "Todos os documentos da solicitação de transferência foram ativados, ";
            $obs .= "status alterado para Processado.";

            $atividade->ATD_IDCLIENTE = $this->CLT_IDCLIENTE;
            $atividade->ATD_IDSOLTRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
            $atividade->ATD_IDFUNCIONARIO = $this->CLT_IDVENDEDOR;
            $atividade->ATD_TIPO = 'O';
            $atividade->ATD_AUTOMATICO = 0;
            $atividade->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
            $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_IDMOTIVO = 79;
            $atividade->ATD_OBS = $obs;
            $atividade->ATD_DTCADASTRO = date('d/m/Y');
            $atividade->ATD_SITUACAO = 'R';
            $atividade->ATD_IDUSUARIO = 16;
            $atividade->ATD_DTALTERACAO = date('d/m/Y');

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

            if ($saved) {
                $commit = $this->registraNegociacoes();
            } else {
                $commit = false;
            }
        } else {
            $commit = false;
        }

        if ($commit) {
            try {
                $transaction->commit();
            } catch (Exception $e) {
                $transaction->rollback();
                $commit = false;
            }
        } else {
            $transaction->rollback();
        }

        return $commit;
    }

    public function reverteProcesamentoSolicitacao()
    {
        if ($this->CLT_STATUS == self::STATUS_PROCESSADO) {
            $transaction = Yii::app()->db->beginTransaction();
            $commit = true;

            $this->CLT_STATUS = ClientesTransferencias::STATUS_VINCULADO;
            if ($this->save()) {
                if (in_array($this->CLT_TIPO, [self::TIPO_SISTEMA, self::TIPO_SISTEMA_BANCO])) {
                    $termoCancelamento = $this->getTermoCancelamento();
                    if ($termoCancelamento) {
                        $termoCancelamento->COT_STATUS = 575; // Transferência Aguardando Contrato
                        if (!$termoCancelamento->save(false, ['COT_STATUS'])) {
                            $commit = false;
                        }
                    } else {
                        $commit = false;
                    }
                }

                $atividade = new Atendimentos;

                $obs = "Um dos documentos da solicitação de transferência não está mais ativo, ";
                $obs .= "status alterado para Vinculado.";

                $atividade->ATD_IDCLIENTE = $this->CLT_IDCLIENTE;
                $atividade->ATD_IDSOLTRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
                $atividade->ATD_IDFUNCIONARIO = $this->CLT_IDVENDEDOR;
                $atividade->ATD_TIPO = 'O';
                $atividade->ATD_AUTOMATICO = 0;
                $atividade->ATD_DTLANCAMENTO = date('Y-m-d H:i:s');
                $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_IDMOTIVO = 79;
                $atividade->ATD_OBS = $obs;
                $atividade->ATD_DTCADASTRO = date('d/m/Y');
                $atividade->ATD_SITUACAO = 'R';
                $atividade->ATD_IDUSUARIO = 16;
                $atividade->ATD_DTALTERACAO = date('d/m/Y');

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

                if (!$saved) {
                    $commit = false;
                }
            } else {
                $commit = false;
            }

            if ($commit) {
                try {
                    $transaction->commit();
                } catch (Exception $e) {
                    $transaction->rollback();
                    $commit = false;
                }
            } else {
                $transaction->rollback();
            }

            return $commit;
        }
        return true;
    }

    public function registraNegociacoes()
    {
        if ($this->CLT_STATUS == self::STATUS_PROCESSADO) {
            $clienteAutorizador = $this->Cliente;
            $clienteAutorizado = $this->ClienteAutorizado;

            // Cancelamento por transferência
            if (in_array($this->CLT_TIPO, [self::TIPO_SISTEMA, self::TIPO_SISTEMA_BANCO])) {
                $revenda = $clienteAutorizador->RevendaResponsavel;
                $termoCancelamento = $this->getTermoCancelamento();

                $negociacao = new FechamentosNegociacoes;

                $negociacao->FEN_IDCLIENTE = $this->CLT_IDCLIENTE;
                $negociacao->FEN_IDCONTRATO = $termoCancelamento->COT_IDCONTRATO;
                $negociacao->FEN_SOLTRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
                $negociacao->FEN_TIPO_NEGOCIACAO = FechamentosNegociacoes::CANCELAMENTOS_TRANSFERENCIA;
                $negociacao->FEN_IDREVENDA = $revenda->REV_IDREVENDA;

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

                $negociacao->FEN_IDPRODUTO = $clienteAutorizador->CLI_PRODUTO;
                $negociacao->FEN_NROUSUARIOS = $clienteAutorizador->CLI_QTDUSUARIOS;
                $negociacao->FEN_IDMOTIVO = 79; // Transferência
                $negociacao->FEN_DTCONTRATACAO = $clienteAutorizador->CLI_DTATIVACAO;
                $negociacao->FEN_DTRESCISAO = $this->CLT_DT_ENCERRAMENTO;
                if (strpos($negociacao->FEN_DTCONTRATACAO, "/"))  {
                    $negociacao->FEN_DTCONTRATACAO = Util::formatDataMysql($negociacao->FEN_DTCONTRATACAO);
                }
                if (strpos($negociacao->FEN_DTRESCISAO, "/"))  {
                    $negociacao->FEN_DTRESCISAO = Util::formatDataMysql($negociacao->FEN_DTRESCISAO);
                }
                $negociacao->FEN_DTCADASTRO = date('Y-m-d H:i:s');
                $negociacao->FEN_STATUS = FechamentosNegociacoes::STATUS_ATIVO;

                $exists = $negociacao->exists("
                    FEN_IDCLIENTE = {$negociacao->FEN_IDCLIENTE} AND
                    FEN_IDCONTRATO = {$negociacao->FEN_IDCONTRATO} AND
                    FEN_SOLTRANSFERENCIA = {$negociacao->FEN_SOLTRANSFERENCIA} AND
                    FEN_TIPO_NEGOCIACAO = {$negociacao->FEN_TIPO_NEGOCIACAO} AND
                    FEN_IDREVENDA = {$negociacao->FEN_IDREVENDA} AND
                    FEN_VLRNEGOCIADO = {$negociacao->FEN_VLRNEGOCIADO} AND
                    FEN_IDPRODUTO = {$negociacao->FEN_IDPRODUTO} AND
                    FEN_NROUSUARIOS = {$negociacao->FEN_NROUSUARIOS} AND
                    FEN_DTCONTRATACAO = '{$negociacao->FEN_DTCONTRATACAO}' AND
                    FEN_DTRESCISAO = '{$negociacao->FEN_DTRESCISAO}' AND
                    FEN_STATUS = {$negociacao->FEN_STATUS}
                ");

                if (!$exists) {
                    if (!$negociacao->save()) {
                        return false;
                    }
                }
            }

            $contrato = $this->getContrato();
            $revenda = $clienteAutorizado->RevendaResponsavel;

            // Transferência sem cancelamento conta como uma nova venda
            if ($this->CLT_TIPO == self::TIPO_BANCO) {
                $negociacao = new FechamentosNegociacoes;

                $negociacao->FEN_IDCLIENTE = $this->CLT_IDCLIENTE_AUTORIZADO;
                $negociacao->FEN_IDCONTRATO = $contrato->COT_IDCONTRATO;
                $negociacao->FEN_SOLTRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
                $negociacao->FEN_TIPO_NEGOCIACAO = FechamentosNegociacoes::CLIENTES_NOVOS;
                $negociacao->FEN_IDREVENDA = $revenda->REV_IDREVENDA;
                $negociacao->FEN_IDVENDEDOR = $contrato->COT_IDVENDEDOR;

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

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

                $negociacao->FEN_IDPRODUTO = $contrato->COT_IDPRODUTO;
                $negociacao->FEN_NROUSUARIOS = $contrato->COT_NROUSUARIOS;
                $negociacao->FEN_IDMOTIVO = $contrato->COT_CLI_IDMOTIVO;
                $negociacao->FEN_DTCONTRATACAO = $contrato->COT_DTATIVACAO;
                $negociacao->FEN_DTCADASTRO = date('Y-m-d H:i:s');
                $negociacao->FEN_STATUS = FechamentosNegociacoes::STATUS_ATIVO;
                if (!$negociacao->save()) {
                    return false;
                }
            }

            // Transferência com cancelamento calcula apenas a diferença dos valores
            if (in_array($this->CLT_TIPO, [self::TIPO_SISTEMA, self::TIPO_SISTEMA_BANCO])) {
                $diferencaMensalidade = $contrato->COT_VLRMENSAL - $clienteAutorizador->CLI_VLRMENSAL;
                $diferencaMensalidade = number_format((float) $diferencaMensalidade, 2, '.', '');
                $valorImplantacao = number_format((float) $contrato->COT_VLRIMPLANTACAO, 2, '.', '');

                if ($diferencaMensalidade > 0) {
                    $tipo = FechamentosNegociacoes::TRANSFERENCIAS_COM_ACRESCIMO;
                } elseif ($diferencaMensalidade == 0 && $valorImplantacao > 0) {
                    $tipo = FechamentosNegociacoes::TRANSFERENCIAS_COM_ACRESCIMO;
                } else {
                    $tipo = FechamentosNegociacoes::TRANSFERENCIAS_SEM_ACRESCIMO;
                }

                $numeroUsuarios = $contrato->COT_NROUSUARIOS - $clienteAutorizador->CLI_QTDUSUARIOS;

                $negociacao = new FechamentosNegociacoes;

                $negociacao->FEN_IDCLIENTE = $this->CLT_IDCLIENTE_AUTORIZADO;
                $negociacao->FEN_IDCONTRATO = $contrato->COT_IDCONTRATO;
                $negociacao->FEN_SOLTRANSFERENCIA = $this->CLT_IDTRANSFERENCIA;
                $negociacao->FEN_TIPO_NEGOCIACAO = $tipo;
                $negociacao->FEN_IDREVENDA = $revenda->REV_IDREVENDA;
                $negociacao->FEN_IDVENDEDOR = $contrato->COT_IDVENDEDOR;

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

                $negociacao->FEN_VLRIMPLANTACAO = $valorImplantacao;

                $negociacao->FEN_VLRDIFERENCA = $diferencaMensalidade;
                $negociacao->FEN_IDPRODUTO = $contrato->COT_IDPRODUTO;
                $negociacao->FEN_NROUSUARIOS = $numeroUsuarios;
                $negociacao->FEN_DTCONTRATACAO = $contrato->COT_DTATIVACAO;
                if (strpos($negociacao->FEN_DTCONTRATACAO, "/")) {
                    $negociacao->FEN_DTCONTRATACAO = Util::formatDataMysql($negociacao->FEN_DTCONTRATACAO);
                }
                $negociacao->FEN_DTCADASTRO = date('Y-m-d H:i:s');
                $negociacao->FEN_STATUS = FechamentosNegociacoes::STATUS_ATIVO;

                $exists = $negociacao->exists("
                    FEN_IDCLIENTE = {$negociacao->FEN_IDCLIENTE} AND
                    FEN_IDCONTRATO = {$negociacao->FEN_IDCONTRATO} AND
                    FEN_SOLTRANSFERENCIA = {$negociacao->FEN_SOLTRANSFERENCIA} AND
                    FEN_TIPO_NEGOCIACAO = {$negociacao->FEN_TIPO_NEGOCIACAO} AND
                    FEN_IDREVENDA = {$negociacao->FEN_IDREVENDA} AND
                    FEN_IDVENDEDOR = {$negociacao->FEN_IDVENDEDOR} AND
                    FEN_VLRNEGOCIADO = {$negociacao->FEN_VLRNEGOCIADO} AND
                    FEN_VLRDIFERENCA = {$negociacao->FEN_VLRDIFERENCA} AND
                    FEN_IDPRODUTO = {$negociacao->FEN_IDPRODUTO} AND
                    FEN_NROUSUARIOS = {$negociacao->FEN_NROUSUARIOS} AND
                    FEN_DTCONTRATACAO = '{$negociacao->FEN_DTCONTRATACAO}' AND
                    FEN_STATUS = {$negociacao->FEN_STATUS}
                ");

                if (!$exists) {
                    if (!$negociacao->save()) {
                        return false;
                    }
                } else {
                    return true;
                }
            }
        }
        return true;
    }

    public function removeNegociacoes()
    {
        if ($this->CLT_STATUS == self::STATUS_CANCELADO) {
            $negociacoes = FechamentosNegociacoes::model()->findAll("
                FEN_SOLTRANSFERENCIA = {$this->CLT_IDTRANSFERENCIA} AND
                FEN_TIPO_NEGOCIACAO IN (
                    'TRANSFERENCIAS_COM_ACRESCIMO',
                    'TRANSFERENCIAS_SEM_ACRESCIMO',
                    'CANCELAMENTOS_TRANSFERENCIA'
                ) AND
                FEN_STATUS = " . FechamentosNegociacoes::STATUS_ATIVO . "
            ");
            if ($negociacoes) {
                foreach ($negociacoes as $negociacao) {
                    $negociacao->FEN_STATUS = FechamentosNegociacoes::STATUS_REMOVIDO;
                    if (!$negociacao->save(false, ['FEN_STATUS'])) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public function trocaVendedorResponsavel()
    {
        if ($this->CLT_STATUS == self::STATUS_VINCULADO) {
            $clienteSolicitacao = $this->Cliente;
            $clienteAutorizado = $this->ClienteAutorizado;

            $revendaSolicitacao = $clienteSolicitacao->RevendaResponsavel->REV_IDREVENDA;
            $revendaAutorizado = $clienteAutorizado->RevendaResponsavel->REV_IDREVENDA;
            if ($revendaSolicitacao != $revendaAutorizado) {
                if ($clienteAutorizado->VendedorResponsavel->FUN_SITUACAO == "A") {
                    $vendedor = $clienteAutorizado->CLI_IDVENDEDOR;
                } else {
                    $vendedor = $clienteAutorizado->Cidade->Revenda->REV_IDFUNCIONARIO;
                }
                $this->CLT_IDVENDEDOR = $vendedor;

                if ($this->save(false, ['CLT_IDVENDEDOR'])) {
                    if ($this->notificacaoTrocaVendedor()) {
                        return true;
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            }
            return 1;
        }
        return 1;
    }

    public function notificacaoTrocaVendedor()
    {
        $botao = Util::createMailButton(
            Util::createUrl('clientesTransferencias/view', array('id' => $this->CLT_IDTRANSFERENCIA)),
            'ABRIR SOLICITAÇÂO'
        );
        $corpo = "
            <p align='justify'>
                A solicitação de transferência Nº {$this->CLT_IDTRANSFERENCIA} foi vinculada a um prospecto da sua
                unidade de negócios, clique no botão abaixo para visualizá-la e cadastrar os documentos necessários.
            </p>
            {$botao}
        ";
        $subject = "Aviso de solicitação de transferência pendente: {$this->ClienteAutorizado->CLI_NOME}";

        $extra = array();
        $gerenteUnidade = @$this->ClienteAutorizado->RevendaResponsavel->Responsavel->FUN_EMAIL;
        if (!empty($gerenteUnidade)) {
            $extra = array(
                'CC' => array(
                    $gerenteUnidade
                )
            );
        }
        return Util::sendEmail($this->Vendedor->FUN_EMAIL, $subject, $corpo, $extra);
    }

    public function isAllowed()
    {
        if ($this->Cliente->isAllowed()) {
            return true;
        }
        if (!empty($this->ClienteAutorizado) && $this->ClienteAutorizado->isAllowed()) {
            return true;
        }

        return false;
    }

    public function getTermoCancelamento()
    {
        if (!empty($this->Documentos)) {
            foreach ($this->Documentos as $documento) {
                if ($documento->COT_SITUACAO == Contratos::TERMO_CANCELAMENTO) {
                    return $documento;
                }
            }
        }
        return false;
    }

    public function getContrato()
    {
        if (!empty($this->Documentos)) {
            $statusAtivo = array(2, 14, 19, 23, 494);
            foreach ($this->Documentos as $documento) {
                if ($documento->COT_SITUACAO == Contratos::CONTRATO) {
                    if (in_array($documento->COT_STATUS, $statusAtivo)) {
                        return $documento;
                    }
                }
            }
        }
        return false;
    }

    public function podeSerCancelado()
    {
        if ($this->CLT_TIPO == self::TIPO_BANCO) {
            if ($this->CLT_STATUS != self::STATUS_ENCERRADO) {
                return true;
            }
        } elseif (!in_array($this->CLT_STATUS, [self::STATUS_CANCELADO, self::STATUS_ENCERRADO])) {
            $atual = DateTime::createFromFormat('d/m/Y', date("d/m/Y"));
            $encerramento = DateTime::createFromFormat('d/m/Y', $this->CLT_DT_ENCERRAMENTO);
            if ($encerramento) {
                if ($atual <= $encerramento) {
                    return true;
                }
            } else {
                return true;
            }
        }

        return false;
    }

    public function canCreate()
    {
        if (User::isAdmin() || User::getUser()->FUN_CADASTRO_SOLICITACOES_TRANSFERENCIA == 1) {
            return true;
        }
        return false;
    }
}
