<?php

class ClientesCancelamentos extends GxActiveRecord {

    // variáveis para pesquisa
    var $CLI_NOME, $CLI_CNPJCPF, $CLI_IDREVENDA;

    const RESULTADO_NEGATIVO = "N";
    const RESULTADO_POSITIVO = "P";
    public $resultados = array(
        self::RESULTADO_NEGATIVO => 'Cliente CONFIRMOU o cancelamento, prosseguir',
        self::RESULTADO_POSITIVO => 'Cliente DESISTIU do cancelamento',
    );
    ///
    const STATUS_AGUARDANDO = "A";
    const STATUS_PROCESSADO = "P";
    const STATUS_CANCELADO = "C";
    const STATUS_AGUARDANDO_APROVACAO = "AP";
    const STATUS_AGUARDANDO_EFETIVACAO = "AE";
    const STATUS_EFETIVADO = "E";
    public $status = array(
        self::STATUS_AGUARDANDO => 'Aguardando',
        self::STATUS_PROCESSADO => 'Processado',
        self::STATUS_CANCELADO  => 'Cancelado',
        self::STATUS_AGUARDANDO_APROVACAO => 'Aguardando Aprovação',
        self::STATUS_AGUARDANDO_EFETIVACAO => 'Aguardando Efetivação',
        self::STATUS_EFETIVADO => 'Efetivado',
    );
    ///
    const CANCELAMENTO_NORMAL = "N";
    const CANCELAMENTO_IMEDIATO = "I";
    public $tiposCancelamentos = array(
        self::CANCELAMENTO_NORMAL => 'Normal',
        self::CANCELAMENTO_IMEDIATO => 'Imediato',
    );
    ///
    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 $CLC_DATA_FINAL;
    public $CLC_DT_ENCERRAMENTO_FINAL;
    public $CLC_OBS;
    public $CLC_APROVACAO;
    public $CLC_ORIGEM_CANCELAMENTO;

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

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

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

    public function rules()
    {
        return array(
            array(
                '
                    CLC_IDCLIENTE, CLC_ORIGEM, CLC_IDVENDEDOR, CLC_IDMOTIVO,
                    CLC_STATUS, CLC_DATA
                ',
                'required'
            ),
            array('CLC_RESULTADO', 'verificaResultado'),
            array('CLC_INTERESSE_REATIVACAO', 'validaInteresse'),
            array('CLC_MODIFICADO_CONTRATO', 'validaModificacaoContrato'),
            array(
                '
                    CLC_OBS_CLIENTE, CLC_RESULTADO, CLC_TIPO_CANCELAMENTO, CLC_INTERESSE_REATIVACAO,
                    CLC_MODIFICADO_CONTRATO, CLC_AVISO_PREVIO_INICIO, CLC_AVISO_PREVIO_FIM,
                    CLC_DT_ENCERRAMENTO, CLC_DT_ULTIMA_MENSALIDADE, CLC_OBS
                ',
                'safe'
            ),
            array(
                '
                    CLC_IDMOTIVO, CLC_RESULTADO, CLC_STATUS, CLC_DATA, CLC_DATA_FINAL,
                    CLC_DT_ENCERRAMENTO, CLC_DT_ENCERRAMENTO_FINAL, CLI_CNPJCPF, CLI_NOME, 
                    CLC_IDREVENDA, CLC_TIPO_CANCELAMENTO, CLC_INTERESSE_REATIVACAO, 
                    CLI_IDREVENDA, CLC_IDMOTIVO_VENDEDOR
                ',
                'safe',
                'on' => 'search'
            ),
            array(
                '
                    CLC_IDCANCELAMENTO, CLC_IDCLIENTE,
                    CLC_IDMOTIVO, CLC_IDMOTIVO_VENDEDOR
                ',
                'numerical',
                'integerOnly' => true
            ),

            array('CLC_ORIGEM_CANCELAMENTO', 'required', 'on' => 'cancelamentoDistrato'),
            array('CLC_APROVACAO', 'required', 'on' => 'avaliacao'),
            array('CLC_OBS', 'required', 'on' => 'trocarTipo'),
        );
    }

    public function relations()
    {
        return array(
            'Autor'          => array(self::BELONGS_TO, 'Funcionarios', 'CLC_IDAUTOR'),
            'Cliente'        => array(self::BELONGS_TO, 'Clientes', 'CLC_IDCLIENTE'),
            'Contrato'       => array(self::HAS_ONE, 'Contratos', 'COT_ID_SOLICITACAO_CANCELAMENTO'),
            'Motivo'         => array(self::BELONGS_TO, 'Motivos', 'CLC_IDMOTIVO'),
            'MotivoVendedor' => array(self::BELONGS_TO, 'Motivos', 'CLC_IDMOTIVO_VENDEDOR'),
            'Vendedor'       => array(self::BELONGS_TO, 'Funcionarios', 'CLC_IDVENDEDOR'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'CLC_IDCANCELAMENTO'        => 'Código da Solicitação',
            'CLC_IDCLIENTE'             => 'Razão Social',
            'CLC_IDAUTOR'               => 'Cadastrado por',
            'CLC_ORIGEM'                => 'Origem',
            'CLC_IDVENDEDOR'            => 'Vendedor Responsável',
            'CLC_IDMOTIVO'              => 'Motivo',
            'CLC_OBS_CLIENTE'           => 'Observações do Cliente',
            'CLC_RESULTADO'             => 'Resultado da Negociação',
            'CLC_TIPO_CANCELAMENTO'     => 'Tipo do Cancelamento',
            'CLC_IDMOTIVO_VENDEDOR'     => 'Motivo do Cancelamento (Informado pelo Vendedor)',
            'CLC_INTERESSE_REATIVACAO'  => 'Nível de Interesse em Reativação',
            'CLC_MODIFICADO_CONTRATO'   => 'Houve modificação de contrato?',
            'CLC_AVISO_PREVIO_INICIO'   => 'Início do aviso prévio',
            'CLC_AVISO_PREVIO_FIM'      => 'Fim do aviso prévio',
            'CLC_DT_ENCERRAMENTO'       => 'Data de encerramento do contrato',
            'CLC_DT_ULTIMA_MENSALIDADE' => 'Data da última mensalidade',
            'CLC_DATA'                  => 'Data da Solicitação',
            'CLC_DATA_CONTATO'          => 'Data da Conclusão da Negociação',
            'CLC_STATUS'                => 'Status',
            'Cliente'                   => 'Razão Social',
            'Motivo'                    => 'Motivo',
            'CLC_ORIGEM_CANCELAMENTO'   => 'Origem da Solicitação',
            'CLC_APROVACAO'             => "Status do cancelamento imediato",
            'CLC_OBS'                   => "Observações",
            'CLI_CNPJCPF'               => 'CPF/ CNPJ',
            'CLI_NOME'                  => 'Razão social', 
            'CLI_IDREVENDA'             => 'Revenda'
        );
    }

    public function verificaResultado($attribute, $params)
    {
        if (!$this->isNewRecord && empty($this->{$attribute}) && $this->scenario != "trocarTipo") {
            if($attribute == "CLC_RESULTADO" && $this->scenario == 'avaliacao') {
                $this->addError($attribute, "Antes de aprovar esta solicitação, o vendedor deve tratar a mesma pela tela de atividades.");
            } else {
                $this->addError($attribute, "{$this->getAttributeLabel($attribute)} é obrigatório.");
            }
            return false;
        }
        return true;
    }

    public function verificaData($attribute, $params)
    {
        $DataPostada = Util::formatDataMysql($this->ATD_DTCADASTRO);

        if ($DataPostada < date('Y-m-d')) {
            $this->addError($attribute, 'Data deve ser maior ou igual a "' . date('d/m/Y') . '".');
            return false;
        }
        return true;
    }

    public function verificaHoraFinal($attribute, $params)
    {
        if (!empty($this->{$attribute})) {
            if ($this->{$attribute} <= $this->ATD_HORAINICIO) {
                $this->addError($attribute, 'Hora final deve ser maior que '.$this->ATD_HORAINICIO);
                return false;
            }
        } else {
            $this->addError($attribute, 'Hora final é obrigatório.');
            return false;
        }
        return true;
    }

    public function validaInteresse($attribute, $params)
    {
        if ($this->CLC_RESULTADO == self::RESULTADO_NEGATIVO && $this->{$attribute} == "") {
            $this->addError($attribute, 'Você deve informar o nível de interesse em reativação do cliente!');
            return false;
        }
        return true;
    }

    public function validaModificacaoContrato($attribute, $params)
    {
        if ($this->CLC_RESULTADO == self::RESULTADO_POSITIVO && $this->{$attribute} === "") {
            $this->addError($attribute, 'Você deve informar se houve modificação no contrato do cliente!');
            return false;
        }
        return true;
    }

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

    public function getResultado()
    {
        if (!empty($this->CLC_RESULTADO)) {
            if (in_array($this->CLC_RESULTADO, [self::RESULTADO_NEGATIVO, self::RESULTADO_POSITIVO])) {
                return $this->resultados[$this->CLC_RESULTADO];
            } else {
                return "-";
            }
        }
        return "Pendente";
    }

    public function getTipoCancelamento($tipo = false)
    {
        if (!$tipo) {
            $tipo = $this->CLC_TIPO_CANCELAMENTO;
        }
        return $this->tiposCancelamentos[$tipo] ?? "-";
    }

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

    public function getDate()
    {
        $dataSolicitacao = DateTime::createFromFormat('Y-m-d H:i:s', $this->CLC_DATA);
        if (!$dataSolicitacao) {
            $dataSolicitacao = DateTime::createFromFormat('d/m/Y H:i:s', $this->CLC_DATA);
        }
        return $dataSolicitacao;
    }

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

        $cliente = $this->Cliente;
        if ($this->CLC_TIPO_CANCELAMENTO == self::CANCELAMENTO_NORMAL) {
            if ($this->getDate()->format('d') <= 15) {
                $dados['CLC_AVISO_PREVIO_INICIO'] = $this->getDate()->modify('first day of this month')->format('Y-m-d');
                $dados['CLC_AVISO_PREVIO_FIM'] = $this->getDate()->modify('last day of this month')->format('Y-m-d');

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

                    $dados['CLC_DT_ULTIMA_MENSALIDADE'] = $this->getDate()->modify('+1 month')->format('Y-m-10');
                } elseif ($cliente->CLI_DIAVENCIMENTO == 20) {

                    $dados['CLC_DT_ULTIMA_MENSALIDADE'] = $this->getDate()->format('Y-m-20');
                } else {

                   $dados['CLC_DT_ULTIMA_MENSALIDADE'] = $this->getDate()->modify('+1 month')->format('Y-m-10');
                }
            } else {
                $dados['CLC_AVISO_PREVIO_INICIO'] = $this->getDate()->modify('first day of next month')->format('Y-m-d');
                $dados['CLC_AVISO_PREVIO_FIM'] = $this->getDate()->modify('last day of next month')->format('Y-m-d');

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

                    $dados['CLC_DT_ULTIMA_MENSALIDADE'] = $this->getDate()->modify('+2 months')->format('Y-m-10');
                } elseif ($cliente->CLI_DIAVENCIMENTO == 20) {

                    $dados['CLC_DT_ULTIMA_MENSALIDADE'] = $this->getDate()->modify('+1 months')->format('Y-m-20');
                } else {

                   $dados['CLC_DT_ULTIMA_MENSALIDADE'] = $this->getDate()->modify('+2 months')->format('Y-m-10');
                }
            }
        } else { // imediato
            $dados['CLC_AVISO_PREVIO_INICIO'] = $this->getDate()->modify('first day of this month')->format('Y-m-d');
            $dados['CLC_AVISO_PREVIO_FIM'] = $this->getDate()->format('Y-m-d');

            $ultimoTitulo = Titulos::model()->find("
                TIT_IDCLIENTE = {$this->CLC_IDCLIENTE}
                ORDER BY TIT_VENCIMENTO DESC
            ");
            $dados['CLC_DT_ULTIMA_MENSALIDADE'] = $ultimoTitulo->TIT_VENCIMENTO ?? null;
        }
        $dados['CLC_DT_ENCERRAMENTO'] = $dados['CLC_AVISO_PREVIO_FIM'];

        $this->setAttributes($dados);

        return $dados;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        $criteria->with = array(
            'Cliente' => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => false),
            'Motivo' => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => false),
            'MotivoVendedor' => array('joinType' => 'LEFT JOIN', 'together' => true, 'select' => false),
            'Vendedor' => 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'
            ),
            'Motivo' => array(
              'asc'=>'Motivo.MOT_DESCRICAO',
              'desc'=>'Motivo.MOT_DESCRICAO desc'
            ),
            'MotivoVendedor' => array(
              'asc'=>'MotivoVendedor.MOT_DESCRICAO',
              'desc'=>'MotivoVendedor.MOT_DESCRICAO desc'
            ),
            'Vendedor' => array(
              'asc'=>'Vendedor.FUN_NOME',
              'desc'=>'Vendedor.FUN_NOME desc'
            ),
        );

        $sort->defaultOrder = 'CLC_IDCANCELAMENTO DESC';

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

    public function notificacaoCancelamentoImediato()
    {
        $encerramento = DateTime::createFromFormat('Y-m-d', $this->CLC_DT_ENCERRAMENTO);
        if(!$encerramento) {
            $encerramento = DateTime::createFromFormat('d/m/Y', $this->CLC_DT_ENCERRAMENTO);
        }
        $contrato = Contratos::model()->find("COT_IDCLIENTE = $this->CLC_IDCLIENTE and COT_SITUACAO = 1 and COT_FOI_ATIVADO = 1 order by COT_DTCADASTRO desc");
        $obs = $contrato ? $contrato->getTipoAssinatura() : "";
        $empresa = $this->Cliente->CLI_IDEMPRESA == 1 ? "Windel Sistemas Ltda" : "Winsul Serviços de Informática Ltda";

        $subject = 'Alerta de cancelamento imediato Cliente: '.$this->Cliente->CLI_NOME.'.';
        $corpo = "
        <style>
        .clientes th, .clientes td{border: 1px solid black; padding: 10px;}
        .clientes thead tr th{background: #c2e2ff; color: #4D89BD;}
        h2 {line-height: 20px;margin-bottom: 10px; padding-bottom: 0px;}
        </style>
        <p>Bom dia / Boa tarde!<br />
        Alertamos o cleinte abaixo deve ser cancelado de imediato sem gerar nova fatura.<br />
        <b>Cliente</b>: {$this->Cliente->CLI_NOME}<br />
        <b>CNPJ</b>: {$this->Cliente->CLI_CNPJCPF}<br />
        <h2>Informações do cancelamento para planilhas de fechamentos:</h2>
        <table style=\"border: 1px solid black; border-collapse: collapse\" class=\"clientes\">
            <thead>
                <tr style=\"border: 1px solid black; padding: 10px;\">
                    <th>Razão social</th>
                    <th>Contratação</th>
                    <th>Valor</th>
                    <th>Us.</th>
                    <th>Cidade</th>
                    <th>Uf</th>
                    <th>Revenda</th>
                    <th>obs.:</th>
                    <th>Término do contrato</th>
                    <th>Motivo</th>
                    <th>Motivo Vendedor</th>
                    <th>Empresa</th>
                </tr>
            </thead>
            <tbody>
                <tr style=\"border: 1px solid black; padding: 10px;\">
                    <td>{$this->Cliente->CLI_NOME}</td>
                    <td>{$this->Cliente->CLI_DTCONTRATO}</td>
                    <td>{$this->Cliente->CLI_VLRMENSAL}</td>
                    <td>{$this->Cliente->CLI_QTDUSUARIOS}</td>
                    <td>{$this->Cliente->Cidade->CID_DESCRICAO}</td>
                    <td>{$this->Cliente->Cidade->CID_UF}</td>
                    <td>{$this->Cliente->getRevendaResponsavel2()}</td>
                    <td>{$obs}</td>
                    <td>{$encerramento->format('d/m/Y')}</td>
                    <td>{$this->Motivo}</td>
                    <td>{$this->MotivoVendedor}</td>
                    <td>{$empresa}</td>
                </tr>
            </tbody>
        </table><br />
        <h2>Outras Informações:</h2>"; 

        if (!empty($this->CLC_IDCANCELAMENTO)) {
            $corpo .= "<b>Código da solicitação de cancelamento:</b> " . $this->CLC_IDCANCELAMENTO . "<br />";
        }
        if (!empty($this->CLC_IDVENDEDOR)) {
            $corpo .= "<b>Vendedor Responsável:</b> " . $this->Vendedor->FUN_NOME . "<br />";
        }
        $corpo .= "<strong>Data em que o contrato estará cancelado:</strong> {$encerramento->format('d/m/Y')}";

        $corpo .= "<br /><br />";

        $corpo .= Util::createMailButton(Util::createUrl('clientesCancelamentos/view', array('id' => $this->CLC_IDCANCELAMENTO)), 'ABRIR SOLICITAÇÃO');
        $extra = array(
            'CC' => array(
                'comercial02@windel.com.br',
            )
        );
        Util::sendEmail("financeiro@windel.com.br", $subject, $corpo, $extra);
    }

    public function notificaTrocaVendedor()
    {
        $subject = 'Alerta: Registro de solicitação de cancelamento - Aguardando contato com cliente.';
        $corpo = "
        Bom dia / Boa tarde!<br />
        Alertamos que existe uma solicitação de cancelamento aguardando tratamento no sistema. Pedimos que realize o contato e tente reverter a situação com a maior brevidade possível.<br /><br />
        <h2>Informações do cancelamento:</h2>"; 

        if (!empty($this->CLC_IDCANCELAMENTO)) {
            $corpo .= "<b>Código:</b> " . $this->CLC_IDCANCELAMENTO . "<br />";
        }
        if (!empty($this->CLC_IDCLIENTE)) {
            $corpo .= "<b>Cliente:</b> " . $this->Cliente->CLI_NOME . "<br />";
        }
        if (!empty($this->CLC_IDAUTOR)) {
            $corpo .= "<b>Autor:</b> " . $this->Autor->FUN_NOME . "<br />";
        } 
        if (!empty($this->CLC_ORIGEM)) {
            $corpo .= "<b>Origem:</b> " . $this->origens[$this->CLC_ORIGEM] . "<br />";
        }                      
        if (!empty($this->CLC_IDMOTIVO)) {
            $corpo .= "<b>Motivo:</b> " . $this->Motivo->MOT_DESCRICAO . "<br />";
        }    
        if (!empty($this->CLC_IDVENDEDOR)) {
            $corpo .= "<b>Vendedor:</b> " . $this->Vendedor->FUN_NOME . "<br />";
        }   
        if (!empty($this->CLC_OBS_CLIENTE)) {
            $corpo .= "<b>Observações do Cliente:</b> " . $this->CLC_OBS_CLIENTE . "<br />";
        }  

        $corpo .= "<br /><br />";

        $corpo .= Util::createMailButton(Util::createUrl('clientesCancelamentos/view', array('id' => $this->CLC_IDCANCELAMENTO)), 'ABRIR SOLICITAÇÃO');
        Util::sendEmail($this->Vendedor->FUN_EMAIL, $subject, $corpo);
    }

    public function notificacaoCancelamentoProcessado()
    {
        $FaHtml = new FaHtml();
        $Util = new Util();

        $aviso = DateTime::createFromFormat('Y-m-d', $this->CLC_AVISO_PREVIO_FIM);
        if(!$aviso) {
            $aviso = DateTime::createFromFormat('d/m/Y', $this->CLC_AVISO_PREVIO_FIM);
        }
        $ultimaMensalidade = DateTime::createFromFormat('Y-m-d', $this->CLC_DT_ULTIMA_MENSALIDADE);
        if(!$ultimaMensalidade) {
            $ultimaMensalidade = DateTime::createFromFormat('d/m/Y', $this->CLC_DT_ULTIMA_MENSALIDADE);
        }
        $encerramento = DateTime::createFromFormat('Y-m-d', $this->CLC_DT_ENCERRAMENTO);
        if(!$encerramento) {
            $encerramento = DateTime::createFromFormat('d/m/Y', $this->CLC_DT_ENCERRAMENTO);
        }

        if ($this->CLC_TIPO_CANCELAMENTO == self::CANCELAMENTO_NORMAL) {
            $datas = "
                <strong>Término do aviso prévio:</strong> {$aviso->format('d/m/Y')}<br>
                <strong>Vencimento da última mensalidade:</strong> {$ultimaMensalidade->format('d/m/Y')}<br>
                <strong>Data em que o contrato estará cancelado:</strong> {$encerramento->format('d/m/Y')}
            ";
        } else {
            $datas = "
                <strong>Data em que o contrato estará cancelado:</strong> {$encerramento->format('d/m/Y')}
            ";
        }

        $corpo = "
            <p align=\"justify\">
                A/C {$this->Contrato->COT_CLI_NOME}
            </p>
            <p align=\"justify\">
                Vimos através deste confirmar a Vossa Senhoria que recebemos sua solicitação de cancelamento do contrato cujos dados estão descritos abaixo.
            </p>
            <p align=\"justify\">
                <strong>Razão Social:</strong> {$this->Contrato->COT_CLI_NOME}<br>
                <strong>CNPJ:</strong> {$Util->formataCNPJCPF($this->Contrato->COT_CLI_CNPJCPF)}<br>
                <strong>Motivo de Cancelamento:</strong> {$this->Motivo}
            </p>
            <p align=\"justify\">
                Sua solicitação foi processada nesta data, e conforme previsto em contrato, seguem informações importantes:
            </p>
            <p align=\"justify\">
                {$datas}
            </p>
            <p align=\"justify\">
                É importante destacar que até a data de término do aviso prévio seu sistema estará habilitado para movimentação de dados (inserções, edições, exclusões) e esta solicitação de cancelamento poderá ser extinta caso venha a solicitar tal ação, e a partir da data em que o contrato estará cancelado, o sistema ficará habilitado apenas para consultas de dados e para reativá-lo é necessário fazer um novo contrato.
            </p>
        ";

        $subject = "Notificação de Cancelamento: {$this->Cliente->CLI_NOME}";
        $extra = array(
            'CC' => array(
                'comercial@windel.com.br',
                $this->Vendedor->FUN_EMAIL,
            )
        );
        Util::sendEmail($this->Cliente->CLI_EMAIL, $subject, $corpo, $extra);
    }

    public function notificacaoCancelamentoAguardandoAprovacao() // revisar texto
    {
        $botao = Util::createMailButton(
            Util::createUrl('clientesCancelamentos/view', array('id' => $this->CLC_IDCANCELAMENTO)),
            'ABRIR SOLICITAÇÂO'
        );
        $corpo = "
            <p align='justify'>
                A solicitação de cancelamento Nº {$this->CLC_IDCANCELAMENTO} foi identificada como imediata e
                necessita de aprovação do gerente.
            </p>
            {$botao}
        ";
        $subject = "Notificação de cancelamento imediato aguardando avaliação: {$this->Cliente->CLI_NOME}";

        $emails = array();
        $gerentesComerciais = Funcionarios::model()->findAll("FUN_PRM_PRIVILEGIO = 8 AND FUN_SITUACAO = 'A'");
        foreach ($gerentesComerciais as $gerente) {
            $emails[] = $gerente->FUN_EMAIL;
        }
        $emails = implode(";", $emails);

        $extra = array(
            'CC' => array(
                'cati@windel.com.br',
                $this->Vendedor->FUN_EMAIL,
            )
        );
        Util::sendEmail($emails, $subject, $corpo, $extra);
    }

    public function notificacaoReversaoCancelamento()
    {
        $FaHtml = new FaHtml();
        $Util = new Util();

        $dataSolicitacao = DateTime::createFromFormat('Y-m-d H:i:s', $this->CLC_DATA);
        if (!$dataSolicitacao) {
            $dataSolicitacao = DateTime::createFromFormat('d/m/Y H:i:s', $this->CLC_DATA);
        }
        $corpo = "
            <p align=\"justify\">
                A/C {$this->Cliente->CLI_NOME}
            </p>
            <p align=\"justify\">
                Sua solicitação de cancelamento realizada na data {$dataSolicitacao->format('d/m/Y')}.
                De acordo com seu último contato, está oficialmente cancelada.
            </p>
        ";

        $subject = "Alteração de status de solicitação de cancelamento: {$this->Cliente->CLI_NOME}";
        $extra = array(
            'CC' => array(
                'comercial@windel.com.br',
                $this->Vendedor->FUN_EMAIL,
            )
        );
        Util::sendEmail($this->Cliente->CLI_EMAIL, $subject, $corpo, $extra);
    }

    public function podeSerCancelado()
    {
        if (
            (empty($this->CLC_RESULTADO) || $this->CLC_RESULTADO == self::RESULTADO_NEGATIVO) &&
            !in_array($this->CLC_STATUS, [self::STATUS_CANCELADO, self::STATUS_EFETIVADO])
        ) {
            $atual = DateTime::createFromFormat('d/m/Y', date("d/m/Y"));
            $encerramento = DateTime::createFromFormat('d/m/Y', $this->CLC_DT_ENCERRAMENTO);
            if ($encerramento) {
                if ($atual <= $encerramento) {
                    return true;
                }
            } else {
                return true;
            }
        }

        return false;
    }

    public function podeAdicionarAtividade()
    {
        return $this->CLC_STATUS == self::STATUS_AGUARDANDO;
    }

    public function podeAprovarSolicitacao()
    {
        return $this->temPrivilegioAprovarSolicitacao() && $this->CLC_STATUS == self::STATUS_AGUARDANDO_APROVACAO;
    }

    public function temPrivilegioAprovarSolicitacao()
    {
        return in_array(User::getPrivilegio(), [1, 7]) || User::getId() == 356;
    }

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

    public function podeTrocarTipo()
    {
        if (!in_array(User::getPrivilegio(), [1, 7, 11]) && User::getId() != 356) { // Administrador, Supervisor, Auxiliar Administrativo Geral
            return false;
        }

        if ($this->CLC_TIPO_CANCELAMENTO == self::CANCELAMENTO_IMEDIATO) {
            return false;
        }

        return !in_array($this->CLC_STATUS, [self::STATUS_CANCELADO, self::STATUS_EFETIVADO]);
    }

    public function podeGerarTermo()
    {
        if (!in_array(User::getPrivilegio(), [1, 7, 11]) && User::getId() != 356) { // Administrador, Supervisor, Auxiliar Administrativo Geral
            return false;
        }

        if ($this->CLC_TIPO_CANCELAMENTO == self::CANCELAMENTO_IMEDIATO) {
            return false;
        }

        if($this->CLC_STATUS != self::STATUS_PROCESSADO) {
            return false;
        }

        $contratos = Contratos::model()->count('
            COT_IDCLIENTE = ' . $this->CLC_IDCLIENTE . ' AND 
            COT_SITUACAO = '.Contratos::TERMO_CANCELAMENTO
        );
        return $contratos == 0;
    }

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

        $contrato->COT_SITUACAO = Contratos::TERMO_CANCELAMENTO;
        $contrato->COT_IDCLIENTE = $this->CLC_IDCLIENTE;
        $contrato->COT_ID_SOLICITACAO_CANCELAMENTO = $this->CLC_IDCANCELAMENTO;
        $contrato->COT_IDVENDEDOR = $this->CLC_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 = 14; // Processo concluído
        $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 = $this->Cliente->CLI_IDMOTIVO;
        $contrato->COT_DTATIVACAO = date('Y-m-d');
        $contrato->COT_IDREVENDA = $this->Cliente->getRevendaResponsavel2()->REV_IDREVENDA ?? 0;
        $contrato->COT_IDMOTIVO_FP = 77; // Solicitação de Cancelamento

        if ($contrato->save()) {
            return $contrato;
        }
        return false;
    }

    public function removeNegociacao()
    {
        if ($this->CLC_STATUS == self::STATUS_CANCELADO) {
            $negociacao = FechamentosNegociacoes::model()->find("
                FEN_IDCLIENTE = {$this->CLC_IDCLIENTE} AND
                FEN_TIPO_NEGOCIACAO = " . FechamentosNegociacoes::CANCELAMENTOS . " AND
                FEN_STATUS = " . FechamentosNegociacoes::STATUS_ATIVO . "
            ");
            if ($negociacao) {
                $negociacao->FEN_STATUS = FechamentosNegociacoes::STATUS_REMOVIDO;
                if (!$negociacao->save(false, ['FEN_STATUS'])) {
                    return false;
                }
            }
        }
        return true;
    }

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

    public function getObservacaoResumida($maxLength = 200)
    {
        if (strlen($this->CLC_OBS_CLIENTE) < $maxLength) {
            return $this->CLC_OBS_CLIENTE;
        }
        $obs = nl2br(Util::removeNewLines($this->CLC_OBS_CLIENTE));
        $span = "<span data-toggle=\"tooltip\" data-placement=\"right\" data-html=\"true\" title=\"{$obs}\">";
            $span .= substr($this->CLC_OBS_CLIENTE, 0, $maxLength);
            $span .= "... <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i>";
        $span .= "</span>";

        return $span;
    }
}
