<?php

use Mpdf\Mpdf;

class Seguro_PropostastipoassinaturadocumentoController extends Agro_Controller_Proposta
{
    public function init()
    {
        $this->view->title = 'Seguro » Propostas & Orçamentos » Assinatura de Documentos';
    }

    public function getModel()
    {
        return new Seguro_Model_PropostasTipoAssinaturaDocumento();
    }

    public function getForm()
    {
        return new Seguro_Form_PropostasTipoAssinaturaDocumento();
    }

    public function getFilter()
    {
        $where = parent::getFilter();

        $statusInvalidos = [
            Seguro_Model_Propostas::ID_STATUS_NAO_ENVIADA,
            Seguro_Model_Propostas::ID_STATUS_ENDOSSO_ANULADO,
            Seguro_Model_Propostas::ID_STATUS_ENDOSSO_CANCELADO,
            Seguro_Model_Propostas::ID_STATUS_ENDOSSO_INCOMPLETO,
            Seguro_Model_Propostas::ID_STATUS_ORCAMENTO_ENDOSSO,
            Seguro_Model_Propostas::ID_STATUS_SOLICITACAO_CANCELADA,
            Seguro_Model_Propostas::ID_STATUS_SOLICITACAO_ENDOSSO,
        ];

        $where[] = '(spr.id_status not in (' . implode(', ', $statusInvalidos)  . '))';

        if (empty($this->getRequest()->getParam('id')) && !empty($this->getRequest()->getParam('status_assinatura'))) {
            $where[] = "(spdoc.ds_status = '". $this->getRequest()->getParam('status_assinatura') ."')";
        }

        return $where;
    }

    public function historicoAction()
    {
        $this->getHelper('layout')->disableLayout();
        $propostasDocusign = new Seguro_Model_PropostasDocusign();
        $model = $this->getModel();
        $this->view->historicoAlteracoes = $model->getByProposta($this->getRequest()->getParam('id_proposta'), false);
        $this->view->historicoEnvio = $propostasDocusign->getByProposta($this->getRequest()->getParam('id_proposta'), false);
    }

    public function documentosdigitalizadosAction()
    {
        $this->getHelper('layout')->disableLayout();
        $modelPropostas  = new Seguro_Model_Propostas();
        $modelPropostasDocusign = new Seguro_Model_PropostasDocusign();
        $modelPropostaDocumentoDigitalizado = new Seguro_Model_PropostaDocumentoDigitalizado();
		$modelPropostaStatusDoccumentoDigitalizado = new Seguro_Model_PropostaStatusDocumentoDigitalizado();
		$modelPendencias = new Atendimento_Model_Pendencia();
        $modelPropostasTipoAssinaturaDocumento = $this->getModel();

        $idProposta = $this->getRequest()->getParam('id_proposta');

        $this->view->proposta = $modelPropostas->get($idProposta);
        $this->view->historicoAlteracoes = $modelPropostasTipoAssinaturaDocumento->getByProposta($idProposta, false);
        $this->view->historicoEnvio = $modelPropostasDocusign->getByProposta($idProposta, false);
        $this->view->digitalizados_historico_status = $modelPropostaStatusDoccumentoDigitalizado->getHistoricoStatus($idProposta);
		$this->view->pendencias_documentos_digitalizados = $modelPendencias->getPendenciasDocDigitalizado($idProposta);
		$this->view->documentos_digitalizados = $modelPropostaDocumentoDigitalizado->getByProposta($idProposta);
    }

        public function documentosdigitalizadosemloteAction()
    {
        $this->getHelper('layout')->disableLayout();

    }

    public function assinaturaeletronicaAction()
    {
        $this->getHelper('layout')->disableLayout();
        $modelPropostas  = new Seguro_Model_Propostas();
        $modelPropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
        $modelPropostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();
        $modelPropostasDocusign = new Seguro_Model_PropostasDocusign();

        $idProposta = $this->getRequest()->getParam('id_proposta');

        $this->view->proposta = $modelPropostas->get($idProposta);
        $this->view->beneficiarios = $this->view->proposta->beneficiarios();
		$this->view->ds_email_instituicao_financeira = [];
		$this->view->ds_email_segurado = '';
		$this->view->proponente = ['nr_justificativa' => '', 'ds_justificativa' => ''];

        $propostaEmailAssinaturaDocumento = $modelPropostasEmailAssinaturaDocumento->getByProposta($idProposta, true);

		if (!empty($propostaEmailAssinaturaDocumento)) {
			$this->view->ds_email_segurado = $propostaEmailAssinaturaDocumento['ds_email_segurado'];
            $this->view->ds_celular_segurado = $propostaEmailAssinaturaDocumento['ds_celular_segurado'];

			if (!empty($propostaEmailAssinaturaDocumento['ds_email_beneficiarios'])) {

				$propostaEmailAssinaturaDocumento['ds_email_beneficiarios'] = Zend_Json::decode($propostaEmailAssinaturaDocumento['ds_email_beneficiarios']);
				foreach ($propostaEmailAssinaturaDocumento['ds_email_beneficiarios'] as $beneficiario) {
					if (!empty($beneficiario['email_instituicao_financeira'])) {
						$this->view->ds_email_instituicao_financeira[$beneficiario['id']] = $beneficiario['email_instituicao_financeira'];
					}
				}
			}

            $emailJustificativa = $modelPropostasEmailJustificativa->getByProposta($idProposta, $propostaEmailAssinaturaDocumento['id']);
		
			if (!empty($emailJustificativa)) {
				$this->view->proponente['nr_justificativa'] = $emailJustificativa['nr_justificativa'];
				$this->view->proponente['ds_justificativa'] = $emailJustificativa['ds_justificativa'];
			}

            $tipoAssinaturaDocumento = (new Seguro_Model_PropostasTipoAssinaturaDocumento())->getByProposta($this->getRequest()->getParam('id_proposta'));
            if (count($tipoAssinaturaDocumento) > 0) {
                $this->view->tipo_assinatura = $tipoAssinaturaDocumento[0]['tipo_assinatura'];
            }
		}
		
		$this->view->historico_email_assinatura_documento = $modelPropostasEmailAssinaturaDocumento->getAssinaturasEndosso($idProposta);

		foreach ($this->view->historico_email_assinatura_documento as $historicoEmail) {
			
			if (!empty($historicoEmail['ds_email_beneficiarios'])) {
				$historicoEmail['ds_email_beneficiarios'] = Zend_Json::decode($historicoEmail['ds_email_beneficiarios']);
			}
		}

        $propostaDocusign = $modelPropostasDocusign->getByProposta($idProposta);
        $this->view->ds_status_envio = !empty($propostaDocusign) ? $propostaDocusign[0]['ds_status'] : '';
    }

    public function imprimirAction()
    {
        $this->isAjax();

        $response = [
            'status' => true,
            'message' => '',
            'path' => APPLICATION_PATH . '/upload_files/proposta_tipo_assinatura/'
        ];
        
        try {
            $zip = new ZipArchive;
            
            if (empty($this->getRequest()->getParam('id_propostas'))) {
                throw new Exception("Nenhuma proposta foi informada.");
            }

            if ($zip->open($response['path'] . 'propostas.zip', (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== TRUE) {
                throw new Exception("Ocorreu um erro ao criar o arquivo ZIP.");
            }

            $gerarPdfService = new Seguro_Service_GerarPdfProposta();

            foreach ($this->getRequest()->getParam('id_propostas') as $idProposta) {
                $nomePdf = $idProposta . '_termo.pdf';
                $filePath = $response['path'] . $nomePdf;
                $gerarPdfService->executar($idProposta, false, false, $filePath);

                $zip->addFile($filePath, $nomePdf);
            }

            $zip->close();

        } catch (\Throwable $th) {
            $response['status'] = false;
            $response['message'] = $th->getMessage();
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    public function editarloteAction()
    {
        $this->isAjax();
        $response = [
            'status' => true,
            'message' => 'Dados alterados com sucesso.',
            'errors' => []
        ];

        foreach ($this->getRequest()->getParam('propostas') as $proposta) {
            try {
                Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
                $validarEmailSegurado = false;
                $validarCelularSegurado = false;

                if ($this->getRequest()->getParam('tipo_assinatura') == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL) {

                    if (empty($proposta['email'])) {
                        throw new Exception("Não há e-mail do segurado cadastrado.");
                    }
                    
                    $validarEmailSegurado = true;
                }

                if ($this->getRequest()->getParam('tipo_assinatura') == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS) {
                    if (empty($proposta['celular'])) {
                        throw new Exception("Não há celular do segurado cadastrado.");
                    }

                    $modelPropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
                    if (!$modelPropostasEmailAssinaturaDocumento->isTelefoneValido($proposta['id'], $proposta['celular'])) {
                        throw new Exception("Não foi possível alterar o tipo de envio. Caro Corretor, favor entrar em contato com a AgroBrasil Seguros.");
                    }

                    $validarCelularSegurado = true;
                }

                $tiposValidos = [Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL, Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS];
                if (in_array($this->getRequest()->getParam('tipo_assinatura'), $tiposValidos)) {
                    $dados = [
                        'id_proposta' => $proposta['id'],
                        'ds_email_segurado' => $proposta['email'],
                        'ds_celular_segurado' => $proposta['celular']
                    ];
            
                    $idPropostaEmailAssinaturaDocumento = $this->alterarDadosAssinatura($dados, $validarEmailSegurado, true, $validarCelularSegurado);
                    
                    //Caso esteja alterando o tipo de assinatura para e-mail e nunca tenha sido cadastrado um e-mail de assinatura
                    //Verifico se o e-mail há justificativa cadastrada para a proposta, e duplico para o e-mail de assinatura do segurado
                    if ($this->getRequest()->getParam('tipo_assinatura') == 1 && !$this->getRequest()->getParam('is_email_assinatura')) {
                        $PropostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();
                        $propostaEmailJustificativa = $PropostasEmailJustificativa->getByProposta($proposta['id']);
    
                        if (!empty($propostaEmailJustificativa)) {
                            $dados = [
                                'id_proposta' => $proposta['id'],
                                'id_proposta_email_assinatura_documento' => $idPropostaEmailAssinaturaDocumento,
                                'nr_justificativa' => $propostaEmailJustificativa['nr_justificativa'],
                                'ds_justificativa' => $propostaEmailJustificativa['ds_justificativa']
                            ];
                            
                            $this->adicionarJustificativa($proposta['id'], $idPropostaEmailAssinaturaDocumento, $dados);
                        }
                    }
                }

                $Model = $this->getModel();
                $Model->save([
                    'id_proposta' => $proposta['id'],
                    'tipo_assinatura' => $this->getRequest()->getParam('tipo_assinatura')
                ]);
                Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
            } catch (\Throwable $th) {
                $response['status'] = false;
                $response['erros'][] = "[".$proposta['id']."] " . $th->getMessage();
                Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
            }
        }

        if ($response['status'] == false) {
            if (count($response['erros']) == count($this->getRequest()->getParam('propostas'))) {
                $response['message'] = "Não foi possível alterar o tipo de assinatura de documento. Os seguintes erros foram encontrados: ";
            } else {
                $response['message'] = "Alteração parcialmente realizada. Algumas propostas tiveram os seguintes erros: ";
            }

            $response['message'] .= "\n\n - ";
            $response['message'] .= implode("\n - ", $response['erros']);
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    public function editarAction()
    {
        $this->isAjax();
        try {
            $response = [
                'status' => true,
                'message' => 'Dados alterados com sucesso.'
            ];

            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            
            if (count($this->getRequest()->getParam('id_propostas')) == 1 && 
                $this->getRequest()->getParam('tipo_assinatura') == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL &&
                empty($this->getRequest()->getParam('ds_email_proponente'))) {
                throw new Exception("E-mail do Segurado não informado.");
            }

            if (count($this->getRequest()->getParam('id_propostas')) == 1 &&
                $this->getRequest()->getParam('tipo_assinatura') == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS &&
                empty($this->getRequest()->getParam('ds_celular_proponente'))) {
                throw new Exception("Telefone celular do Segurado não informado.");
            }

            foreach ($this->getRequest()->getParam('id_propostas') as $idProposta) {

                $validarEmailSegurado = false;

                if ($this->getRequest()->getParam('tipo_assinatura') == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL) {
                    $validarEmailSegurado = count($this->getRequest()->getParam('id_propostas')) > 1;
                }
                
                $dados = [
                    'id_proposta' => $idProposta,
                    'ds_email_segurado' => !empty($this->getRequest()->getParam('ds_email_proponente')) ? $this->getRequest()->getParam('ds_email_proponente') : '',
                    'ds_celular_segurado' => !empty($this->getRequest()->getParam('ds_celular_proponente')) ? $this->getRequest()->getParam('ds_celular_proponente') : ''
                ];
                
                $idPropostaEmailAssinaturaDocumento = $this->alterarDadosAssinatura($dados, $validarEmailSegurado);

                $dadosProponente = $this->getRequest()->getParam('proponente');
                $this->adicionarJustificativa($idProposta, $idPropostaEmailAssinaturaDocumento, $dadosProponente);

                $Model = $this->getModel();
                $Model->save([
                    'id_proposta' => $idProposta,
                    'tipo_assinatura' => $this->getRequest()->getParam('tipo_assinatura')
                ]);
            }

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (\Throwable $th) {
            $response['status'] = false;
            $response['message'] = $th->getMessage();
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    public function alteraremailsAction()
    {
        $this->isAjax();

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

            $response = [
                'status' => true,
                'message' => 'Dados alterados com sucesso.',
                'email_segurado' => $this->getRequest()->getParam('email_segurado'),
                'celular_segurado' => $this->getRequest()->getParam('celular_segurado'),
                'beneficiarios' => !empty($this->getRequest()->getParam('beneficiarios')) ? $this->getRequest()->getParam('beneficiarios') : []
            ];

            $emailBeneficiarios = [];
            foreach ($this->getRequest()->getParam('beneficiarios') as $beneficiario) {

                $stdBeneficiarioEmail = new stdClass;
                $stdBeneficiarioEmail->id = $beneficiario['id_propostas_beneficiarios'];
                $stdBeneficiarioEmail->email = $beneficiario['email'];
                $stdBeneficiarioEmail->email_instituicao_financeira = $beneficiario['email_instituicao_financeira'];
                $emailBeneficiarios[] = $stdBeneficiarioEmail;
            }

            $data = ['id_proposta' =>  $this->getRequest()->getParam('id_proposta')];

            if (!empty($this->getRequest()->getParam('email_segurado'))) {
                $data['ds_email_segurado'] = $this->getRequest()->getParam('email_segurado');
            }

            if (!empty($this->getRequest()->getParam('celular_segurado'))) {
                $data['ds_celular_segurado'] = $this->getRequest()->getParam('celular_segurado');
            }

            if (!empty($emailBeneficiarios)) {
                $data['ds_email_beneficiarios'] = Zend_Json::encode($emailBeneficiarios);
            }

            $PropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
            $idPropostaEmailAssinaturaDocumento = $PropostasEmailAssinaturaDocumento->save($data);
    
            if ($idPropostaEmailAssinaturaDocumento == false) {
                throw new Exception("Erro ao salvar os dados do Segurado.");
            }
            
            $dadosProponente = $this->getRequest()->getParam('proponente');
            $this->adicionarJustificativa($this->getRequest()->getParam('id_proposta'), $idPropostaEmailAssinaturaDocumento, $dadosProponente);
            
            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

        } catch (\Throwable $th) {
            $response['status'] = false;
            $response['message'] = $th->getMessage();
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    private function alterarDadosAssinatura($dados, $validarEmailSegurado = true, $buscarDadosBeneficiarios = false, $validarCelularSegurado = false) 
    {
        $PropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
        $propostaEmailAssinaturaDocumento = $PropostasEmailAssinaturaDocumento->getByProposta($dados['id_proposta'], true);
        $emailCadastrado =  '';
        $celularCadastrado = '';
        $emailBeneficiarioCadastrado = '';

        if (!empty($propostaEmailAssinaturaDocumento)) {
            $emailCadastrado =  $propostaEmailAssinaturaDocumento['ds_email_segurado'];
            $celularCadastrado = $propostaEmailAssinaturaDocumento['ds_celular_segurado'];
            $emailBeneficiarioCadastrado = $propostaEmailAssinaturaDocumento['ds_email_beneficiarios'];
        }

        if ($validarEmailSegurado && !empty($emailCadastrado)) {
            return;
        }

        if ($validarCelularSegurado && !empty($celularCadastrado)) {
            return;
        }

        $dados['ds_email_beneficiarios'] = $emailBeneficiarioCadastrado;
        
        if ($buscarDadosBeneficiarios && empty($dados['ds_email_beneficiarios'])) {
            $modelProposta = new Seguro_Model_Propostas();
			$proposta      = $modelProposta->get($dados['id_proposta']);
			$beneficiarios = $proposta->beneficiarios();

            $emailBeneficiarios = [];
            foreach ($beneficiarios as $beneficiario) {

                $stdBeneficiarioEmail = new stdClass;
                $stdBeneficiarioEmail->id = $beneficiario['id'];
                $stdBeneficiarioEmail->email = $beneficiario['ds_email_beneficiario'];
                $stdBeneficiarioEmail->email_instituicao_financeira = $beneficiario['ds_email_instituicao_financeira'];
                $emailBeneficiarios[] = $stdBeneficiarioEmail;
            }

            if (!empty($emailBeneficiarios)) {
                $dados['ds_email_beneficiarios'] = Zend_Json::encode($emailBeneficiarios);
            }
        }

        $retorno = $PropostasEmailAssinaturaDocumento->save($dados);

        if ($retorno == false) {
            throw new Exception("Erro ao salvar os dados do Segurado.");
        }

        return $retorno;
    }

    public function excelAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        ini_set('memory_limit', '4096M');
        ini_set('max_execution_time', 360);

        $where = $this->getFilter();
        $Model = $this->getModel();

        if ($this->getRequest()->getParam("o")) {
            $Model->_order = trim($this->getRequest()->getParam("o") . ' ' . $this->getRequest()->getParam("s"));
        }

        $Rs = $Model->fetchAllPaginator($where);

        foreach ($Rs as $key => $row) {
            $row['tipo_assinatura'] = Seguro_Model_PropostasTipoAssinaturaDocumento::getDescricaoByTipo($row['tipo_assinatura']);
        }

        if ($Model->_columnExcel) {
            $Csv = new Agro_Plugin_Rs2Csv();
            $Csv->setTitles($Model->_columnExcel);
            $Csv->setRecordSet($Rs);
            $Csv->setType("application/octet-stream");
            $Csv->setFileName("pesquisa.csv");
            $Csv->setDisposition("attachment");
            $Csv->setSeparator(";");
            $Csv->getCsv();
        } else {
            $Csv = new Agro_Plugin_Rs2Csv();
            $Csv->setTitles($Model->_columnExcel);
            $Csv->setRecordSet(array('Excel não configurado'));
            $Csv->setType("application/octet-stream");
            $Csv->setFileName("notfound.csv");
            $Csv->setDisposition("attachment");
            $Csv->setSeparator(";");
            $Csv->getCsv();
        }
    }

    private function adicionarJustificativa($idProposta, $idPropostaEmailAssinaturaDocumento, $dadosProponente)
    {
        if (!empty($dadosProponente['nr_justificativa'])) {
            $PropostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();
            $dadosProponente["id_proposta"] = $idProposta;
            $dadosProponente["id_proposta_email_assinatura_documento"] = $idPropostaEmailAssinaturaDocumento;
            $idPropostaEmailJustificativa = $PropostasEmailJustificativa->save($dadosProponente);

            if (!$idPropostaEmailJustificativa) {
                throw new Exception("Erro ao salvar a justificativa.");
            }
        }
    }

    public function adicionarpropostafiladocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status' => true
        ];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

            if (empty($this->getRequest()->getParam('id_proposta'))) {
                throw new Exception("Proposta não informada.");
            }

            if (empty($this->getRequest()->getParam('st_tipo_envio'))) {
                throw new Exception("Tipo de envio não informado.");
            }

            $modelPropostasDocusign = new Seguro_Model_PropostasDocusign();
            $propostaDocusign = $modelPropostasDocusign->getByProposta($this->getRequest()->getParam('id_proposta'));

            if (!empty($propostaDocusign) && $propostaDocusign[0]['ds_status'] != Seguro_Model_PropostasDocusign::STATUS_ERROR) {
                $descricaoStatus = $modelPropostasDocusign->getDescricaoStatus($propostaDocusign[0]['ds_status']);
                throw new Exception("Não foi possível adicionar a proposta na fila de envio, pois a mesma se encontra com o status '{$descricaoStatus}'.");
            }

            $modelPropostasDocusign->adicionarFila((int)$this->getRequest()->getParam('id_proposta'), $this->getRequest()->getParam('st_tipo_envio'));
            $response['message'] = "Proposta adicionada a fila de envios com sucesso.";

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (\Throwable $th) {
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
            $response['message'] = $th->getMessage();
            $response['status'] = false;
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    public function enviarpropostadocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status' => true
        ];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            
            $idProposta = $this->getRequest()->getParam('id_proposta');
            
            $PropostasDocusign = new Seguro_Model_PropostasDocusign();
            $data = $PropostasDocusign->getByProposta($idProposta);
            
            $statusInvalidos = [
                Seguro_Model_PropostasDocusign::STATUS_SENT,
                Seguro_Model_PropostasDocusign::STATUS_DELIVERED,
                Seguro_Model_PropostasDocusign::STATUS_COMPLETED
            ];
            if (count($data) > 0 && in_array($data[0]['ds_status'], $statusInvalidos)) {
                $this->getResponse()->setBody(Zend_Json::encode($response));
                return;
                //throw new Exception("Não foi possivel realizar o envio pois os documentos da proposta já foram enviados anteriormente.");
            }

            $this->enviarDocusign((int)$idProposta, $this->getRequest()->getParam('st_tipo_envio'));

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (\Throwable $th) {

            Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$response['message'] = $th->getMessage();
			$response['status'] = false;

            $propostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
            $emailsAssinatura = $propostasEmailAssinaturaDocumento->getByProposta($idProposta, true);

            $data = [
                'id_proposta' => $idProposta,
                'id_envelope' => '',
                'id_proposta_email_assinatura_documento' => $emailsAssinatura['id'],
                'ds_status' => Seguro_Model_PropostasDocusign::STATUS_ERROR,
                'st_tipo_envio' => $this->getRequest()->getParam('st_tipo_envio'),
                'ds_mensagem' => $th->getMessage()
            ];
            $PropostasDocusign->save($data);

            $this->enviarEmailErro($data);
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    public function processarfiladocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status' => true
        ];
        
        $arquivoLock = realpath(APPLICATION_PATH . '/upload_files/docusign/processar_fila.lock');
        
        if (file_exists($arquivoLock)) {
            
            $response = [
                'message' => 'A fila de envios já está sendo processada no momento.',
                'status' => false
            ];
            
            $this->getResponse()->setBody(Zend_Json::encode($response));
            return;
        }
        
        file_put_contents($arquivoLock, date("d/m/Y H:i:s") . ' - Início do processamento');

        $PropostasDocusign = new Seguro_Model_PropostasDocusign();
        $fila = $PropostasDocusign->getFila([Seguro_Model_PropostasDocusign::STATUS_WAITING]);
        
        foreach ($fila as $propostaDocusign) {
            try {
                Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
                
                $idProposta = $propostaDocusign['id_proposta'];
                $this->enviarDocusign((int) $idProposta, $propostaDocusign['st_tipo_envio']);

                Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
            } catch (\Throwable $th) {

                Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
                $response['message'] = $th->getMessage();
                $response['status'] = false;

                $propostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
                $emailsAssinatura = $propostasEmailAssinaturaDocumento->getByProposta($idProposta, true);

                $data = [
                    'id_proposta' => $idProposta,
                    'id_envelope' => '',
                    'id_proposta_email_assinatura_documento' => $emailsAssinatura['id'],
                    'ds_status' => Seguro_Model_PropostasDocusign::STATUS_ERROR,
                    'st_tipo_envio' => $propostaDocusign['st_tipo_envio'],
                    'ds_mensagem' => $th->getMessage()
                ];
                $PropostasDocusign->save($data);

                $this->enviarEmailErro($data);
            }
        }

        if (file_exists($arquivoLock)) {
            unlink($arquivoLock);
        }
        
        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    public function atualizarstatusdocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status_docusign' => '',
            'status_atualizado' => false,
            'status' => true
        ];

        $statusValidos = [
            Seguro_Model_PropostasDocusign::STATUS_SENT,
            Seguro_Model_PropostasDocusign::STATUS_DELIVERED
        ];

        $PropostasDocusign = new Seguro_Model_PropostasDocusign();

        if (!empty($this->getRequest()->getParam('id_proposta'))) {
            $fila = $PropostasDocusign->getByProposta($this->getRequest()->getParam('id_proposta'));

            if (count($fila) > 0 && !in_array($fila[0]['ds_status'], $statusValidos)) {
                $fila = [];
            }
        } else {
            $fila = $PropostasDocusign->getFila($statusValidos);
        }

        foreach ($fila as $propostaDocusign) {
            try {
                Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

                $response['status_docusign'] = $PropostasDocusign->atualizarStatusEnvelope($propostaDocusign);
                $response['status_atualizado'] = $response['status_docusign'] != $propostaDocusign['ds_status'];

                Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
            } catch (\Throwable $th) {
                Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
                $response['message'] = $th->getMessage();
                $response['status'] = false;
            }
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    public function baixardocumentosdocusignAction()
    {
        $this->isAjax();

        $response = [
            'message' => '',
            'status' => true,
            'path' => '/upload_files/docusign/'
        ];

        $PropostasDocusign = new Seguro_Model_PropostasDocusign();
        try {

            if (empty($this->getRequest()->getParam('id_proposta'))) {
                throw new Exception("Proposta não informada.");
            }

            $idProposta = $this->getRequest()->getParam('id_proposta');
            $documentos = $PropostasDocusign->getDocumentoByProposta((int) $idProposta);
            
            $zip = new ZipArchive;
            
            if ($zip->open(APPLICATION_PATH . $response['path'] . "{$idProposta}-documentos.zip", (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== TRUE) {
                throw new Exception("Ocorreu um erro ao criar o arquivo ZIP.");
            }

            foreach ($documentos as $key => $documento) {
                $nomePdf = "{$key}.pdf";
                $filePath = APPLICATION_PATH . $response['path'] . $nomePdf;
                $zip->addFile($filePath, $documento->nome);
            }

            $zip->close();

        } catch (\Throwable $th) {
            $response['message'] = $th->getMessage();
            $response['status'] = false;
        }

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    /**
     * Envia um envelope de um ou mais documentos de acordo com o tipo de envio informado no parâmetro.
     * 
     * @param int $idProposta
     * @param string $tipoEnvio
     */
    private function enviarDocusign(int $idProposta, string $tipoEnvio)
    {
        $PropostasDocusign = new Seguro_Model_PropostasDocusign();
        
        switch ($tipoEnvio) {
            case Seguro_Model_PropostasDocusign::TIPO_PROPOSTA:
                $filePath = APPLICATION_PATH . '/upload_files/proposta_tipo_assinatura/' . $idProposta . '_termo.pdf';

                (new Seguro_Service_GerarPdfProposta())->executar($idProposta, false, true, $filePath);
                $PropostasDocusign->enviarOrcamento($idProposta);
                break;
                
            default:
                throw new Exception("Tipo de envio não informado.");
                break;
        }
    }

    /**
     * Envia um e-mail com o erro que aconteceu na assinatura para a TI
     * 
     * @param mixed $data [
     *  'id_proposta' => '',
     *  'ds_mensagem' => ''
     * ]
     */
    private function enviarEmailErro($data)
    {
        if (APPLICATION_ENV != 'production') {
            return;
        }

        $body = "O seguinte erro ocorreu: <br><br>";
        $body .= "<b> - Proposta:</b> {$data['id_proposta']}<br>";
        $body .= "<b> - Mensagem:</b> {$data['ds_mensagem']}<br><br>";

        $email = new Agro_Mail();
        $email->addTo('ti@agrobrasilseguros.com.br', 'TI');
        $email->addCc('andre.mello@agrobrasilseguros.com.br', 'Andre Mello');
        $email->addCc('karina.silva@agrobrasilseguros.com.br', 'Karina Silva');
        $email->addCc('andriellen.pereira@agrobrasilseguros.com.br', 'Andriellen Pereira');
        $email->addCc('gabriella.lemos@agrobrasilseguros.com.br', 'Gabriella Lemos');
        $email->setSubject("[ERRO] - Assinatura Eletrônica");
        $email->setBody($body, 'html');
        $email->send();
    }
}
