<?php

$Permissoes = User::getUser(true);
if(!in_array($Permissoes->FUN_PRM_PRIVILEGIO, array(1, 7, 11, 16, 20))) {
    User::blockAction("Você não tem permissão para acessar esta tela");
}

class FinanceiroController extends GxController
{
    public function actionAdendos()
    {
        $model = new Contratos('search');
        $model->unsetAttributes();

        if (empty($model->TOKEN)) {
            $model->TOKEN = Util::uid();
        }

        if (isset($_GET['Contratos'])) {
            $model->setAttributes($_GET['Contratos']);

        }

        $model->COT_SITUACAO = array(Contratos::ADENDO);
        $model->COT_FATURAMENTO = 1;

        if (isset($_GET['exportar']) && $_GET['exportar'] == 1) {
            $this->actionGenerateExcelAdendos($model);
        }

        $this->render('contratos_adendos', array('model' => $model, 'pageTitle' => 'Adendos'));
    }

    public function actionContratos()
    {
        $model = new Contratos('search');
        $model->unsetAttributes();
        if (empty($model->TOKEN)) {
            $model->TOKEN = Util::uid();
        }

        if (isset($_GET['Contratos'])) {
            $model->setAttributes($_GET['Contratos']);
        }

        if (isset($_GET['exportar']) && $_GET['exportar'] == 1) {
            $this->actionGenerateExcelContratos($model);
        }

        $model->COT_SITUACAO = array(Contratos::CONTRATO);
        $model->COT_FATURAMENTO = 1;

        $this->render('contratos_adendos', array('model' => $model, 'pageTitle' => 'Contratos'));
    }

    public function actionPedidos()
    {
        $model = new ContratosVencimentos('search');
        $model->unsetAttributes();
        if (empty($model->TOKEN)) {
            $model->TOKEN = Util::uid();
        }

        if (isset($_GET['ContratosVencimentos'])) {
            $model->setAttributes($_GET['ContratosVencimentos']);
        }

        if (isset($_GET['exportar']) && $_GET['exportar'] == 1) {
            $this->actionGenerateExcelPedidos($model);
        }

        $this->render('pedidos', array('model' => $model));
    }

    public function actionGenerateExcelAdendos($model = false)
    {
        if($model == false){
            $model = new Contratos('search');
        }
        $this->generateExcel($model, 'adendos', 'excelReportContratosAdendos');
    }

    public function actionGenerateExcelContratos($model = false)
    {
        if($model == false){
            $model = new Contratos('search');
        }
        $this->generateExcel($model, 'contratos', 'excelReportContratosAdendos');
    }

    public function actionGenerateExcelPedidos($model = false)
    {
        if($model == false){
            $model = new ContratosVencimentos('search');
        }

        $this->generateExcel($model, 'pedidos', 'excelReportPedidos');
    }

    public function actionDocumentosAssinar()
    {
        // ASSINATURA DIGITAL INATIVADA
        User::blockAction("Assinatura Digital Inativada");

        $model = new Contratos('search');
        $model->unsetAttributes();
        if (empty($model->TOKEN)) {
            $model->TOKEN = Util::uid();
        }

        if (isset($_GET['Contratos'])) {
            $model->setAttributes($_GET['Contratos']);
        }
        $model->COT_STATUS = array(2,14);
        $model->COT_TIPOASSINATURA = Contratos::ASSINADO_DIGITAL;
        $model->LISTAR_ASSINATURA_PENDENTE = true;

        $this->render('documentos_assinar', array('model' => $model));
    }

    public function actionFaturarContrato($id)
    {
        $this->isAllowed();
        $this->faturarDocumento($id, Contratos::CONTRATO);
    }

    public function actionFaturarAdendo($id)
    {
        $this->isAllowed();
        $this->faturarDocumento($id, Contratos::ADENDO);
    }

    /**
     * Faturamento de múltiplos adendos ou contratos
     * @name Faturar Múltiplos Adendos/Contratos
     * @screen Fat. Adendos
     * @screen Fat. Contratos
     * @param  string $codigos
     * @param  string $tipoDocumento
     */
    public function actionFaturamentoMultiplosDocumentos($codigos, $tipoDocumento)
    {
        $this->isAllowed();
        if (!empty($codigos)) {
            if (isset($_POST['Contratos']) && isset($_POST['Atendimentos'])) {
                $this->salvarAlteracaoMultiplos($_POST['Contratos']['multiSelecao'], $tipoDocumento);
            }
            $model = new Contratos;
            $atividade = new Atendimentos;
            $retorno = $this->validaCodigosFornecidos($model, $atividade, $codigos);

            $this->render('multi_faturamento_contratos_adendos', array(
                'model' => $model,
                'atividade' => $atividade,
                'contratos' => $retorno['validos'],
                'invalidos' => $retorno['invalidos']
            ));
        } else {
            throw new CHttpException(400, 'Sua solicitação é inválida.');
        }
    }

    /**
     * Faturamento de múltiplos pedidos
     * @name Faturar Múltiplos Pedidos
     * @screen Fat. Pedidos
     * @param  string $codigos
     */
    public function actionFaturamentoMultiplosPedidos($codigos)
    {
        $this->isAllowed();
        if (!empty($codigos)) {
            if (isset($_POST['ContratosVencimentos']) && isset($_POST['Atendimentos'])) {
                $this->salvarAlteracaoMultiplos($_POST['ContratosVencimentos']['multiSelecao'], 'pedidos');
            }
            $model = new ContratosVencimentos;
            $atividade = new Atendimentos;
            $retorno = $this->validaCodigosFornecidos($model, $atividade, $codigos);

            $this->render('multi_faturamento_pedidos', array(
                'model' => $model,
                'atividade' => $atividade,
                'pedidos' => $retorno['validos'],
                'invalidos' => $retorno['invalidos']
            ));
        } else {
            throw new CHttpException(400, 'Sua solicitação é inválida.');
        }
    }

    public function actionFaturarVencimentoPedido($id)
    {
        $this->isAllowed();
        $this->faturarVencimentoPedido($id);
    }

    public function isAllowed()
    {
        if(!in_array(User::getprivilegio(), array(1, 7, 16, 20))) {
            User::blockAction("Você não tem permissão para acessar esta tela");
        }
    }

    public function verificaFaturamento($status)
    {
        if($status === "Não faturar") {
            return false;
        }
        return true;
    }

    private function generateExcel($token, $reportName, $viewFile)
    {

        $search = $token->search();
        $dataProvider = $token->search($search->totalItemCount);


        if ($dataProvider === false) {
            throw new CHttpException(400, 'Sua solicitação é inválida. Você não definiu nenhum critério de busca ou seus critérios expiraram por terem sido gerados há mais de 60 minutos');
        }
        $data = $dataProvider->getData();
        Yii::app()->request->sendFile('relatorio-vencimentos-dos-'.$reportName.'-'. date('d-m-Y-H-i-s') . '.xls',
                                      $this->renderPartial($viewFile, array('dataProvider' => $dataProvider,
                                                                            'data' => $data,
                                                                            'reportName' => $reportName), true),
                                      'application/vnd.ms-excel', true);
    }

    private function salvarAlteracaoMultiplos($codigos, $tipoDocumento)
    {
        $codigosFaturar = base64_decode($codigos);
        if ($codigosFaturar && $codigosFaturar = json_decode($codigosFaturar)) {
            $erro = false;
            $transaction = Yii::app()->db->beginTransaction();
            foreach ($codigosFaturar as $cod => $situacao) {
                if (in_array($situacao, [Contratos::CONTRATO, Contratos::ADENDO])) {
                    try {
                        $this->faturarDocumento($cod, $situacao, true);
                    } catch (Exception $e) {
                        Yii::app()->user->setFlash('error', $e->getMessage());
                        $erro = true;
                    }
                } elseif (in_array($situacao, [Contratos::PEDIDO_IMPLANTACAO, Contratos::PEDIDO_REATIVACAO])) {
                    try {
                        $this->faturarVencimentoPedido($cod, true);
                    } catch (Exception $e) {
                        Yii::app()->user->setFlash('error', $e->getMessage());
                        $erro = true;
                    }
                } else {
                    Yii::app()->user->setFlash('error', 'Documento inválido!');
                    $erro = true;
                }
            }

            if(!$erro) {
                try {
                    $transaction->commit();
                } catch (Exception $e) {
                    $transaction->rollback();
                    Yii::app()->user->setFlash('error', "Erro ao salvar");
                    $erro = true;
                }
            } else {
                $transaction->rollback();
            }

            if (!$erro) {
                Yii::app()->user->setFlash('success', 'Salvo com sucesso!');
                switch ($tipoDocumento) {
                    case Contratos::CONTRATO:
                        $pagina = "contratos";
                        break;
                    case Contratos::ADENDO:
                        $pagina = "adendos";
                        break;
                    default:
                        $pagina = "pedidos";
                        break;
                }
                $this->redirect(array("financeiro/{$pagina}"));
            }
        } else {
            Yii::app()->user->setFlash('error', "Códigos inválidos");
        }
    }

    private function validaCodigosFornecidos($model, $atividade, $codigos)
    {
        $codigosEnviados = explode(",", $codigos);
        $validos = array();
        $invalidos = array();
        foreach ($codigosEnviados as $codigo) {
            if (is_numeric($codigo) && $contrato = $model->findByPk($codigo)) {
                $validos[$codigo] = $contrato;
            } else {
                $invalidos[] = $codigo;
            }
        }
        ksort($validos);

        $retorno['validos'] = $validos;
        $retorno['invalidos'] = $invalidos;

        return $retorno;
    }

    private function faturarDocumento($id, $tipoDocumento, $multi = false)
    {
        $erro = false;

        $model = $this->loadModel($id, 'Contratos');
        if (!$this->verificaFaturamento($model->getFaturamento())) { // Verifica status de faturamento
            $erro = "Essa ação não é permitida para esse status de faturamento.";
            if ($multi) {
                throw new Exception($erro, 1);
            } else {
                User::blockAction($erro);
            }
        }

        $atividade = new Atendimentos;

        if (isset($_POST['Contratos']) && isset($_POST['Atendimentos'])) {

            $tipoalterado = true;
            if (!$multi) {
                $tipoalterado = $model->COT_FATURAMENTO != $_POST['Contratos']['COT_FATURAMENTO'];
            }

            $model->setAttributes($_POST['Contratos']);

            if(!$tipoalterado) {
                $erro = "Houve um erro ao tentar atualizar os dados do {$model->getTipoDocumento()}, status do faturamento informado é o mesmo que consta no documento!";
                if(isset($_POST['Atendimentos']['ATD_OBS'])) {
                    $atividade->ATD_OBS = $_POST['Atendimentos']['ATD_OBS'];
                }
            } elseif(strlen($model->COT_FATURAMENTO) <= 0) {
                $erro = "Houve um erro ao tentar atualizar os dados do {$model->getTipoDocumento()}, status do faturamento não informado!";
                if(isset($_POST['Atendimentos']['ATD_OBS'])) {
                    $atividade->ATD_OBS = $_POST['Atendimentos']['ATD_OBS'];
                }
            } elseif ($model->COT_FATURAMENTO == 0 && (!isset($_POST['Atendimentos']['ATD_OBS']) || strlen(trim($_POST['Atendimentos']['ATD_OBS'])) < 5)) {
                $erro = "Houve um erro ao tentar atualizar os dados do {$model->getTipoDocumento()}, observação em branco ou com tamanho menor que 5 caracteres!";
                if(isset($_POST['Atendimentos']['ATD_OBS'])) {
                    $atividade->ATD_OBS = $_POST['Atendimentos']['ATD_OBS'];
                }
            } else {
                if ($model->save(true, array('COT_FATURAMENTO', 'COT_DATA_FATURA'))) {
                    $dataFatura = $model->COT_DATA_FATURA ? Util::formatDatabr($model->COT_DATA_FATURA) : '--';

                    $obs = "ATIVIDADE LANÇADA AUTOMATICAMENTE PELO CRM".PHP_EOL.PHP_EOL;
                    $obs .= "Alterado status de faturamento do {$model->getTipoDocumento()} Nro {$model->COT_IDCONTRATO} nesta data.".PHP_EOL;
                    $obs .= "<b>Status</b>: {$model->getFaturamento()}".PHP_EOL;
                    $obs .= "<b>Vencimento da fatura:</b>: {$dataFatura}".PHP_EOL;
                    $obs .= "<b>Observação</b>: ". trim($_POST['Atendimentos']['ATD_OBS']);

                    $this->lancaAtividadeFaturar($atividade, $model, $obs);

                    if (!$multi) {
                        Yii::app()->user->setFlash('success', 'Salvo com sucesso!');
                        $this->redirect(array('contratos/view', 'id' => $model->COT_IDCONTRATO));
                    }
                } else {
                    $erro = "Houve um erro ao tentar atualizar os dados do {$model->getTipoDocumento()} Nº {$model->COT_IDCONTRATO}!";
                }
            }
        }

        if ($erro) {
            if ($multi) {
                throw new Exception($erro, 1);
            } else {
                Yii::app()->user->setFlash('error', $erro);
            }
        }

        if (!$multi) {
            $this->render('faturar_contrato_adendo', array('model' => $model, 'atividade' => $atividade));
        } else {
            if ($erro) {
                return false;
            }
            return true;
        }
    }

    private function faturarVencimentoPedido($id, $multi = false)
    {
        $erro = false;

        $model = $this->loadModel($id, 'ContratosVencimentos');
        if (!$this->verificaFaturamento($model->getFaturamento())) { // Verifica status de faturamento
            $erro = "Essa ação não é permitida para esse status de faturamento.";
            if ($multi) {
                throw new Exception($erro, 1);
            } else {
                User::blockAction($erro);
            }
        }

        $documento = $this->loadModel($model->COV_IDCONTRATO, 'Contratos');
        $atividade = new Atendimentos;
        $infoVencimento = $model->COV_DATA . " - " . Util::verMoeda($model->COV_VALOR);

        if (isset($_POST['ContratosVencimentos']) && isset($_POST['Atendimentos'])) {
            $tipoalterado = true;
            if (!$tipoalterado) {
                $tipoalterado = $model->COV_FATURAMENTO != $_POST['ContratosVencimentos']['COV_FATURAMENTO'];
            }

            $model->setAttributes($_POST['ContratosVencimentos']);

            if (!$tipoalterado) {
                $erro = "Houve um erro ao tentar atualizar os dados vencimento cod. {$model->COV_IDVENCIMENTO}, status do faturamento informado é o mesmo que consta no vencimento!";
                if (isset($_POST['Atendimentos']['ATD_OBS'])) {
                    $atividade->ATD_OBS = $_POST['Atendimentos']['ATD_OBS'];
                }
            } elseif (strlen($model->COV_FATURAMENTO) <= 0) {
                $erro = "Houve um erro ao tentar atualizar os dados vencimento cod. {$model->COV_IDVENCIMENTO}, status do faturamento não informado!";
                if(isset($_POST['Atendimentos']['ATD_OBS'])) {
                    $atividade->ATD_OBS = $_POST['Atendimentos']['ATD_OBS'];
                }
            } elseif ($model->COV_FATURAMENTO == 0 && (!isset($_POST['Atendimentos']['ATD_OBS']) || strlen(trim($_POST['Atendimentos']['ATD_OBS'])) < 5)) {
                $erro = "Houve um erro ao tentar atualizar os dados vencimento cod. {$model->COV_IDVENCIMENTO}, observação em branco ou com tamanho menor que 5 caracteres!";
                if(isset($_POST['Atendimentos']['ATD_OBS'])) {
                    $atividade->ATD_OBS = $_POST['Atendimentos']['ATD_OBS'];
                }
            } else {
                if ($model->save(true, array('COV_FATURAMENTO', 'COV_DATA_FATURA'))) {

                    $dataFatura = $model->COV_DATA_FATURA ? Util::formatDatabr($model->COV_DATA_FATURA) : '--';

                    $obs = "ATIVIDADE LANÇADA AUTOMATICAMENTE PELO CRM".PHP_EOL.PHP_EOL;
                    $obs .= "Alterado status de faturamento do vencimento Cod. {$model->COV_IDVENCIMENTO} ({$infoVencimento}) do {$documento->getTipoDocumento()} Nro. {$documento->COT_IDCONTRATO} nesta data.".PHP_EOL;
                    $obs .= "<b>Status</b>: {$model->getFaturamento()}".PHP_EOL;
                    $obs .= "<b>Vencimento da fatura:</b>: {$dataFatura}".PHP_EOL;
                    $obs .= "<b>Observação</b>: ". trim($_POST['Atendimentos']['ATD_OBS']);

                    $this->lancaAtividadeFaturar($atividade, $documento, $obs);

                    if (!$multi) {
                        Yii::app()->user->setFlash('success', 'Salvo com sucesso!');
                        $this->redirect(array('contratos/view', 'id' => $documento->COT_IDCONTRATO));
                    }
                } else {
                    $erro = "Houve um erro ao tentar atualizar os dados do vencimento Nº {$model->COV_IDVENCIMENTO}!";
                }
            }
        }

        if ($erro) {
            if ($multi) {
                throw new Exception($erro, 1);
            } else {
                Yii::app()->user->setFlash('error', $erro);
            }
        }

        if (!$multi) {
            $this->render('faturar_pedido', array(
                'model' => $model,
                'atividade' => $atividade,
                'documento' => $documento,
                'infoVencimento' => $infoVencimento
            ));
        }
    }

    private function lancaAtividadeFaturar($atividade, $documento, $obs)
    {
        $atividade->ATD_IDCLIENTE = $documento->COT_IDCLIENTE;
        $atividade->ATD_IDCONTRATO = $documento->COT_IDCONTRATO;
        $atividade->ATD_IDFUNCIONARIO = User::getId();
        $atividade->ATD_TIPO = 'D';
        $atividade->ATD_AUTOMATICO = 1;
        $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 = 20;
        $atividade->ATD_OBS = $obs;
        $atividade->ATD_DTCADASTRO = date('d/m/Y');
        $atividade->ATD_SITUACAO = 'R';
        $atividade->ATD_IDUSUARIO = User::getId();
        $atividade->ATD_DTALTERACAO = date('d/m/Y');
        $atividade->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', 'ATD_AUTOMATICO'));
    }
}