<?php
use Mpdf\Mpdf;

class Seguro_DevolucaoController extends Agro_Controller_Action
{
    public function getModel()
    {
        return new Seguro_Model_PropostasDevolucoes();
    }

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

    public function init()
    {
        $this->view->title = 'Seguro » Proposta » Devolução';
    }

    public function listAction()
    {
        parent::listAction();
        $modelPropostasDevolucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();
        $this->view->comboStatusDevolucoes = $modelPropostasDevolucoesStatus->getComboStatusDevolucoes();
    }

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

        if ($this->getRequest()->getParam('id_proposta_search')) {
            $tmp = explode(" ", trim($this->getRequest()->getParam('id_proposta_search')));
			$ids = implode(',', $tmp);
            $where[] = "pe.id_endosso in (SELECT id_endosso FROM seguro.propostas WHERE id IN ({$ids}))";
        } else {

            if ($this->getRequest()->getParam('nr_apolice')) {
                $where[] = "pr.nr_apolice = {$this->getRequest()->getParam('nr_apolice')}";
            }

            if ($this->getRequest()->getParam('ds_nome_proponente')) {
                $where[] = "pp.ds_nome_proponente ilike '%{$this->getRequest()->getParam('ds_nome_proponente')}%'";
            }

            if ($this->getRequest()->getParam('ds_cpf_proponente')) {
                $where[] = "pp.cpf_cnpj = '{$this->getRequest()->getParam('ds_cpf_proponente')}'";
            }

            if ($this->getRequest()->getParam('dt_inicio')) {
                $inicio = Agro_Util::formatDate($this->getRequest()->getParam('dt_inicio'), Zend_Date::W3C);
                $where[] = "pr.dt_transmissao >= '$inicio'";
            }

            if ($this->getRequest()->getParam('dt_fim')) {
                $fim = Agro_Util::formatDate($this->getRequest()->getParam('dt_fim'), Zend_Date::W3C);
                $where[] = "pr.dt_transmissao <= '$fim'";
            }

            if ($this->getRequest()->getParam('status_devolucao')) {
                $ids = is_array($this->getRequest()->getParam('status_devolucao')) ? implode(', ', $this->getRequest()->getParam('status_devolucao')) : $this->getRequest()->getParam('status_devolucao');
                $where[] = "pds.id_status in ({$ids})";
            }

            if ($this->getRequest()->getParam('id_preposto')) {
                $where[] = "pre.id_usuario = {$this->getRequest()->getParam('id_preposto')}";
            } else if ($this->getRequest()->getParam('id_corretor')) {
                $where[] = "c.id_usuario = {$this->getRequest()->getParam('id_corretor')}";
            }

            if ($this->getRequest()->getParam('id_safra')) {
                $idSafras = implode(", ", $this->getRequest()->getParam('id_safra'));
                $where[] = "prod.id_safra IN ({$idSafras})";
            }

            if ($this->getRequest()->getParam('id_cultura')) {
                $where[] = "pg.id_cultura = {$this->getRequest()->getParam('id_cultura')}";
            }

            if ($this->getRequest()->getParam('id_produto')) {
                $idProdutos = implode(", ", $this->getRequest()->getParam('id_produto'));
                $where[] = "pr.id_produto IN ({$idProdutos})";
            }
        }

        return $where;
    }

    public function alterardataprogramadaAction()
    {
        $this->isAjax();
        $result = ['status' => true, 'message' => 'Data programada alterada com sucesso.'];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $param = $this->getRequest()->getParams();
            $modelPropostasDevolucoes = $this->getModel();
            $modelPropostasDevoucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();

            if (empty($param['id'])) {
                throw new Exception("ID da devolução não informado.");
            }

            if (empty($param['dt_programada'])) {
                throw new Exception("Data programada não informada.");
            }

            if (empty($param['id_status'])) {
                throw new Exception("Status não informado.");
            }

            $dataProgramadaFormatada = Agro_Util::formatDate($param['dt_programada'], Zend_Date::W3C);

            if (!$modelPropostasDevolucoes->update(['dt_programada' => $dataProgramadaFormatada], "id = {$param['id']}")) {
                throw new Exception("Erro ao alterar a data programada.");
            }

            $observacao = "Data programada alterada para {$param['dt_programada']}.";

            $dadosStatus = [
                'id_proposta_devolucao' => $param['id'],
                'id_status' => $param['id_status'],
                'ds_observacao' => $observacao,
                'fl_observacao_automatica' => true
            ];

            if (!$modelPropostasDevoucoesStatus->save($dadosStatus)) {
                throw new Exception("Erro ao salvar a observação da alteração no histórico.");
            }

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

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

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

    public function alterarstatusAction()
    {
        $this->isAjax();
        $result = ['status' => true, 'message' => 'Status alterado com sucesso.'];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $param = $this->getRequest()->getParams();
            $modelPropostasDevoucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();
            
            if (empty($param['id'])) {
                throw new Exception("ID da devolução não informado.");
            }

            if (empty($param['id_status'])) {
                throw new Exception("Status não informado.");
            }

            $rsStatus = $modelPropostasDevoucoesStatus->getByIdPropostaDevolucao($param['id']);
            $idStatusAtual = null;
            if (!empty($rsStatus)) {
                $idStatusAtual = $rsStatus[0]['id_status'];
            }
            
            if ($idStatusAtual != $param['id_status'] && $param['id_status'] == Sistema_Model_Status::DEVOLUCAO_PENDENCIA_CORRETOR) {
                $this->enviaEmailsAlteracaoStatusPendenciaCorretor([$param['id']], false);
            }

            $dadosStatus = [
                'id_proposta_devolucao' => $param['id'],
                'id_status' => $param['id_status'],
                'fl_observacao_automatica' => true
            ];
            
            if (!$modelPropostasDevoucoesStatus->save($dadosStatus)) {
                throw new Exception("Erro ao alterar o status.");
            }

            if ($this->limparDataProgramada((int) $param['id_status'], (int) $param['id'])) {
                $result['limpar_data_programada'] = true;
            }

            $result['id_status'] = $param['id_status'];

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

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

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

    public function formalterarstatusdevolucaoemloteAction(): void
    {
        $this->isAjax(true);
        $this->getHelper('layout')->disableLayout();

        try {
            if ($this->getRequest()->isPost()) {
                $this->getHelper('ViewRenderer')->setNoRender();

                if (empty($_FILES)) {
                    throw new Exception('Nenhum arquivo selecionado');
                }

                $arrStatus = (new Sistema_Model_Status())->getComboSimples('DEVOLUCAO_PREMIO');
                $statusAsKey = [];
                
                foreach ($arrStatus as $id => $status) {
                    if (!empty($status)) {
                        $statusAsKey[strtolower(trim($status))] = $id;
                    }
                }

                $file = $_FILES['file'];
                $errorMessage = '';
                $aux = explode('.', $file['name']);
                $extension = $aux[count($aux) - 1];

                if ($extension !== 'csv') {
                    throw new Exception('Só permitido realizar upload de arquivos .csv.');
                }

                $fileContent = [];
                
                if (($open = fopen($file['tmp_name'], "r")) !== false) {
                    // Ignora primeira linha
                    $data = fgetcsv($open, 100, ',');
                    $line = 2;
                    $idsPropostaEndosso = '';
                    
                    while (($data = fgetcsv($open, 100, ',')) !== FALSE) {
                        $lineErrorMessage = '';
                        $columnsContent = explode(';', $data[0]);

                        if (empty($columnsContent[0])) {
                            break;
                        }

                        $idProposta = $columnsContent[0];
                        $nrEndosso = $columnsContent[1] ?? 0;
                        $statusDevolucao = strtolower(trim($columnsContent[2]));
                        $dataProgramada = $columnsContent[3];
                        $observacao = $columnsContent[4];
                        
                        if (empty($idProposta)) {
                            $lineErrorMessage .= "\nLinha {$line}: Proposta não informada.";
                        }

                        if (!is_numeric($nrEndosso)) {
                            $lineErrorMessage .= "\nLinha {$line}: Endosso não informado.";
                        }

                        if (empty($statusDevolucao)) {
                            $lineErrorMessage .= "\nLinha {$line}: Status da Devolução não informado.";
                        }
                        
                        if (!array_key_exists($statusDevolucao, $statusAsKey)) {
                            $lineErrorMessage .= "\nLinha {$line}: Status não encontrado: {$statusDevolucao}.";
                        }

                        if (
                            in_array($statusDevolucao, ['agendada', 'agendada - com termo'])
                            && empty($dataProgramada)
                        ) {
                            $lineErrorMessage .= "\nLinha {$line}: Data Programada é obrigatória para os Status:";
                            $lineErrorMessage .= " Agendada e Agendada - Com Termo.";
                        }

                        if (in_array($statusDevolucao, ['pendência corretor', 'finalizado - crédito reaproveitado'])) {
                            if (empty($observacao)) {
                                $lineErrorMessage .= "\nLinha {$line}: Observação é obrigatória para os Status:";
                                $lineErrorMessage .= " Pendência Corretor, Finalizado - Crédito Reaproveitado.";
                            }

                            // Altera para null para não atualizar a data programada
                            $dataProgramada = null;
                        }

                        if (!empty($dataProgramada)) {
                            $aux = explode('/', $dataProgramada);

                            if (count($aux) < 3 || !checkdate($aux[1], $aux[0], $aux[2])) {
                                $lineErrorMessage .= "\nLinha {$line}: Data inválida \"{$dataProgramada}\".";
                            }
                        }

                        $idPropostaEndosso = Agro_Db_Table_Row_Proposta::busca_endosso_id(
                            (int)$idProposta,
                            (int)$nrEndosso
                        );

                        if ($idPropostaEndosso < 0) {
                            $lineErrorMessage .= "\nLinha {$line}: Proposta {$idProposta}, com Endosso na versão";
                            $lineErrorMessage .= " {$nrEndosso}, não encontrada.";
                        }

                        if (empty($lineErrorMessage)) {
                            $idsPropostaEndosso .= !empty($idsPropostaEndosso)
                                ? ',' . $idPropostaEndosso
                                : $idPropostaEndosso;

                            $fileContent[$idPropostaEndosso] = [
                                'idPropostaMae' => $idProposta,
                                'nrEndosso' => $nrEndosso,
                                'statusDevolucao' => $statusAsKey[$statusDevolucao],
                                'dataProgramada' => $dataProgramada,
                                'observacao' => $observacao
                            ];
                        }

                        $errorMessage .= $lineErrorMessage;

                        $line++;
                    }

                    fclose($open);
                    
                    if (empty($fileContent)) {
                        throw new Exception(
                            "Não foi possível atualizar em lote. Ocorreram os seguintes erros:\n{$errorMessage}"
                        );
                    }
                    
                    if (empty($idsPropostaEndosso)) {
                        throw new Exception('Propostas não encontradas.');
                    }
                    
                    $modelDevolucao = new Seguro_Model_PropostasDevolucoes();
                    $modelDevolucaoStatus = new Seguro_Model_PropostasDevolucoesStatus();
                    $devolucoes = $modelDevolucao->getDevolucoesByIdsProposta($idsPropostaEndosso);

                    if (empty($devolucoes)) {
                        throw new Exception('Devoluções não encontradas.');
                    }

                    $mapIdDevolucaoByIdPropostaEndosso = [];

                    foreach ($devolucoes as $devolucao) {
                        $mapIdDevolucaoByIdPropostaEndosso[$devolucao['id_proposta']] = $devolucao['id'];
                    }

                    Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
                    $idsPropostasDevolucoesPendenciaCorretor = [];

                    $idsPropostaAtualizadas = '';
                    
                    foreach ($fileContent as $key => $content) {
                        $idDevolucao = $mapIdDevolucaoByIdPropostaEndosso[$key];

                        if (empty($idDevolucao)) {
                            continue;
                        }

                        $atualizarDataProgramada = false;
                        $dataProgramada = str_replace("/", "-", $content["dataProgramada"]);
                        $idsPropostaAtualizadas .= $idsPropostaAtualizadas
                            ? ", {$content['idPropostaMae']}"
                            : $content['idPropostaMae'];

                        if (!empty($dataProgramada)) {
                            $atualizarDataProgramada = true;
                            $dataProgramada = date('Y-m-d', strtotime($dataProgramada));
                        }

                        if (
                            !in_array(
                                $content['statusDevolucao'],
                                Seguro_Model_PropostasDevolucoesStatus::statusNaoLimpamDataProgramada())
                        ) {
                            $atualizarDataProgramada = true;
                            $dataProgramada = null;
                        }

                        if ($atualizarDataProgramada) {
                            $affectedRows = $modelDevolucao->update([
                                'dt_programada' => $dataProgramada
                            ], "id = {$idDevolucao}");
                        }

                        $affectedRowsStatus = $modelDevolucaoStatus->save([
                            'id_status' => $content['statusDevolucao'],
                            'ds_observacao' => $content['observacao'],
                            'id_proposta_devolucao' => $idDevolucao,
                            'fl_observacao_automatica' => true
                        ]);

                        if ($content['statusDevolucao'] == Sistema_Model_Status::DEVOLUCAO_PENDENCIA_CORRETOR) {
                            $idsPropostasDevolucoesPendenciaCorretor[] = (int) $idDevolucao;
                        }

                        if (($atualizarDataProgramada && !$affectedRows) || !$affectedRowsStatus) {
                            $mensagem = "Erro ao atualizar o status para a proposta {$content['idPropostaMae']}";
                            $mensagem .= ", endosso {$content['nrEndosso']}.";

                            throw new Exception($mensagem);
                        }
                    }

                    Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
                }

                $message = "Alteração de status por lote realizada com sucesso para as seguintes Propostas:";
                $message .= " {$idsPropostaAtualizadas}";

                if (!empty($errorMessage)) {
                    $message .= "\n\nOs seguintes erros foram identificados:\n{$errorMessage}";
                }

                if (!empty($idsPropostasDevolucoesPendenciaCorretor)) {
                    $this->enviaEmailsAlteracaoStatusPendenciaCorretor($idsPropostasDevolucoesPendenciaCorretor, false);
                }

                $this->getResponse()->setBody(Zend_Json::encode([
                    'statusCode' => 200,
                    'message' => $message,
                    'status' => true
                ]));
            }
        } catch (Exception $e) {
            $this->getResponse()->setBody(Zend_Json::encode([
                'statusCode' => 406,
                'message' => $e->getMessage(),
                'status' => false
            ]));
        }
    }

    public function historicoAction()
    {
        $this->getHelper('layout')->disableLayout();
        $modelPropostasDevolucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();
        $modelProposta = new Atendimento_Model_Proposta();
        $id = (int) $this->getRequest()->getParam('id');
        
        $this->view->id_proposta_devolucao = $id;
        $this->view->id_proposta = $this->getRequest()->getParam('id_proposta');
        $this->view->desabilitar_liberacao = $this->getRequest()->getParam('desabilitar_liberacao');
        $this->view->historico = $modelPropostasDevolucoesStatus->getByIdPropostaDevolucao($id, false);
        $this->view->boletos = $modelProposta->getBoleto($this->getRequest()->getParam('id_proposta'));
        $this->view->origem = 'devolucao';
        $this->view->is_usuario_agro = Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro();
    }

    public function arquivosAction()
    {
        $this->isAjax(true);
        
        $model = $this->getModel();
        $modelPropostasDevolucoesArquivos = new Seguro_Model_PropostasDevolucoesArquivos();

        $idPropostaDevolucao = $this->getRequest()->getParam('id');
        $rowDevolucao = $model->find($idPropostaDevolucao)->current();

        $this->view->id_proposta_devolucao = $idPropostaDevolucao;
        $this->view->arquivos = $modelPropostasDevolucoesArquivos->getArquivosByPropostaDevolucao($idPropostaDevolucao);

        $filePath = realpath(Seguro_Model_PropostasDevolucoesArquivos::FILE_PATH . "/{$rowDevolucao['id']}_termo_autorizacao_pagamento_beneficiario.pdf");
        if (file_exists($filePath)) {
            unlink($filePath);
        }

        if (!empty($rowDevolucao['id_beneficiario'])) {
            $this->gerarPDFTermoAutorizacaoPagamentoBeneficiario($idPropostaDevolucao);
        }
    }

    public function downloadtermoautorizacaopagamentobeneficiarioAction()
    {
        $this->isAjax();
        
        try {
            $idPropostaDevolucao = $this->getRequest()->getParam('id_proposta_devolucao');

            if (empty($idPropostaDevolucao)) {
                throw new InvalidArgumentException('ID da devolução da proposta não informado.', 1);
            }

            [$pdfBinary, $fileName] = (new Seguro_Service_GerarTermoAutorizacaoCreditoBeneficiario)
                ->executar($idPropostaDevolucao);

            $return = [
                'filename' => $fileName,
                'file' => base64_encode($pdfBinary),
                'status' => true
            ];
        } catch (Exception $e) {
            $return = [
                'erro' => $e->getCode() === 1 ? $e->getMessage() : 'Erro ao baixar arquivo.',
                'status' => false
            ];
        }

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

    public function adicionararquivosAction()
    {
        $this->isAjax();
        $result = ['status'=> true, 'message' => 'Salvo com sucesso.'];


        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $modelPropostasDevoucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();
            $modelPropostasDevolucoesArquivos = new Seguro_Model_PropostasDevolucoesArquivos();
            $params = $this->getRequest()->getParams();
         
            $model = $this->getModel();
            $modelPropostasDevolucoesArquivos = new Seguro_Model_PropostasDevolucoesArquivos();

			$nomesArquivos = [];
            $idPropostaDevolucao = !Agro_Util::filterVariable($params['id_proposta_devolucao'])
                ? 0
                : (int)$params['id_proposta_devolucao'];

            if (empty($idPropostaDevolucao)) {
				throw new Exception("ID da devolução não informado.");
			}

            if (empty($_FILES)) {
				throw new Exception("Ao menos um arquivo deve ser informado.");
			}
            $propostaDevolucoes = $modelPropostasDevoucoesStatus->getByIdPropostaDevolucao($idPropostaDevolucao,true);
            $idStatusPropostaDevolucoes = $propostaDevolucoes[0]['id_status'];
            
            $diretorio = Seguro_Model_PropostasDevolucoesArquivos::FILE_PATH;

            if (!file_exists($diretorio)) {
				mkdir($diretorio, '0755', true);
			}

            $adapter = new Zend_File_Transfer_Adapter_Http();
            $adapter->setDestination($diretorio);
            $adapter->addValidator(
                'Extension',
                false,
                ['png', 'jpg', 'jpeg', 'jfif', 'pdf', 'doc', 'docx', 'oxt', 'xls', 'xlsx', 'csv']
            );

            if (!$adapter->isValid()) {
                $mensagem = "Formato de arquivo inválido (formato aceito: PNG, JPG, JPEG, JFIF, PDF, DOC, DOCX, OXT";
                $mensagem .= ", XLS, XLSX e CSV).";

                throw new Exception($mensagem);
            }

            $contadorArquivos = 0;
            $files = $adapter->getFileInfo();

            foreach ($files as $file) {
                $hash = time() + $contadorArquivos;
                $nomeArquivo = $idPropostaDevolucao . '_' . $hash . '_' . $file['name'];

                if (!copy($file['tmp_name'], $diretorio . "/" . $nomeArquivo)) {
                    throw new Exception("Não foi possível copiar o arquivo {$file['name']} para a pasta.");
                }

                $params['ds_nome_arquivo'] = $nomeArquivo;
                $nomesArquivos[] = $nomeArquivo;

                $modelPropostasDevolucoesArquivos->save($params);
                $contadorArquivos++;
            }
 
            $rowDevolucao        = $model->find($idPropostaDevolucao)->current();
            $idProposta          = $rowDevolucao['id_proposta'];
            $info = (new Seguro_Model_PropostasBeneficiarios())->getBeneficiarios($idProposta, ["pb.fl_favorecido_autorizacao_credito = true"]);
            $infoStatusDevolucao = $model->getStatusVigenteDevolucao($idPropostaDevolucao);
            $infoStatusDevolucao['ds_chave'] = 'PENDENCIA_CORRETOR';
         
            if($infoStatusDevolucao['ds_chave'] == 'PENDENCIA_CORRETOR' && !empty($info)){
                $modelStatus = new Sistema_Model_Status();
                $chaveStatus = 'EM_ANALISE_COM_TERMO';
                $dadosStatus = [
                    'id_proposta_devolucao' => $params['id_proposta_devolucao'],
                    'id_status' => $modelStatus->getIdByChaveTipoChave($chaveStatus, 'DEVOLUCAO_PREMIO'),
                    'fl_observacao_automatica' => true
                ];
                $modelPropostasDevoucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();
                if (!$modelPropostasDevoucoesStatus->save($dadosStatus)) {
                    throw new Exception("Erro ao salvar o status.");
                }
               
            }

            if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro() && $idStatusPropostaDevolucoes == 288) {
                $modelStatus = new Sistema_Model_Status();

                $chaveStatus = 'EM_PROCESSAMENTO_DADOS_BANCARIOS';
                $dadosStatus = [
                    'id_proposta_devolucao' => $idPropostaDevolucao,
                    'id_status' => $modelStatus->getIdByChaveTipoChave($chaveStatus, 'DEVOLUCAO_PREMIO'),
                    'fl_observacao_automatica' => true,
                    'ds_observacao' => 'Documento anexado'
                ];

                if (!$modelPropostasDevoucoesStatus->save($dadosStatus)) {
                    throw new Exception("Erro ao salvar o status.");
                }

                $result['recarregar'] = true;
            }

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (\Throwable $th) {
			foreach ($nomesArquivos as $nomeArquivo) {
                $path = realpath(Seguro_Model_PropostasDevolucoesArquivos::FILE_PATH . "/" . $nomeArquivo);

				if (file_exists($path)) {
					unlink($path);
				}
			}

			$result['status'] = false;
			$result['message'] = $th->getMessage();
            
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
        }

        $result['recarregar'] = true;
        $this->getResponse()->setBody(Zend_Json::encode($result));
    }

    public function deletararquivoAction()
    {
        $this->isAjax();
        $result = ['status'=> true, 'message' => 'Excluído com sucesso.'];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $params = $this->getRequest()->getParams();

            if (empty($params['id'])) {
                throw new Exception("ID do arquivo não informado.");
            }

            if (empty($params['id_proposta_devolucao'])) {
                throw new Exception("ID da devolução não informado.");
            }

            $modelPropostasDevolucoesArquivos = new Seguro_Model_PropostasDevolucoesArquivos();
            if (!$modelPropostasDevolucoesArquivos->deleteById($params['id'])) {
                throw new Exception("Erro ao excluír o arquivo da devolução.");
            }

            $arquivos = $modelPropostasDevolucoesArquivos->getArquivosByPropostaDevolucao($params['id_proposta_devolucao']);
            $result['possui_documento_anexado'] = !empty($arquivos);

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

			$result['status'] = false;
			$result['message'] = $th->getMessage();
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
        }

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

    public function salvarobservacaoAction()
    {
        $this->isAjax();
        $result = ['status'=> true, 'message' => 'Observação salva com sucesso.'];
        
        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $param = $this->getRequest()->getParams();
            $modelPropostasDevolucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();
            
            if (empty($param['id_proposta_devolucao'])) {
                throw new Exception("ID da devolução não informado.");
            }
            
            if (empty($param['ds_observacao'])) {
                throw new Exception("Observação não informada.");
            }
            
            $enviarEmail = false;
            $idPropostaDevolucao = $param['id_proposta_devolucao'];

            if (!empty($param['id'])) {
                $propostaDevolucaoStatus = $modelPropostasDevolucoesStatus->find($param['id'])->current();
                $idStatus = $propostaDevolucaoStatus['id_status'];

                $idPropostaDevolucao = $propostaDevolucaoStatus['id_proposta_devolucao'];
            } else {
                $propostaDevolucaoStatus = $modelPropostasDevolucoesStatus->getByIdPropostaDevolucao($param['id_proposta_devolucao']);
                
                $idStatus = $propostaDevolucaoStatus[0]['id_status'];
                if (!empty($param['id_status']) &&  $idStatus != $param['id_status']) {
                    $idStatus = $param['id_status'];

                    $result['message'] = 'Status alterado com sucesso.';
                }
            }

            $enviarEmail = $idStatus == Sistema_Model_Status::DEVOLUCAO_PENDENCIA_CORRETOR;

            if ($idStatus != Sistema_Model_Status::DEVOLUCAO_PENDENCIA_CORRETOR) {
                $param['fl_devolvido_financeiro_banco'] = false;
            }
            
            $dadosStatus = [
                'id' => !empty($param['id']) ? $param['id'] : '',
                'id_proposta_devolucao' => $idPropostaDevolucao,
                'id_status' => $idStatus,
                'ds_observacao' => $param['ds_observacao'],
                'fl_devolvido_financeiro_banco' => $param['fl_devolvido_financeiro_banco'] ?? '0'
            ];
            
            if (!$modelPropostasDevolucoesStatus->save($dadosStatus)) {
                throw new Exception("Erro ao salvar a observação.");
            }

            if ($enviarEmail) {
                $this->enviaEmailsAlteracaoStatusPendenciaCorretor([$idPropostaDevolucao], false);
            }

            if ($this->limparDataProgramada((int) $param['id_status'], (int) $idPropostaDevolucao)) {
                $result['limpar_data_programada'] = true;
            }

            $result['id_status'] = $idStatus;

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

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

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

    private function enviaEmailsAlteracaoStatusPendenciaCorretor(array $idsPropostasDevolucoes,bool $copiarAtendimento = true)
    {
        $rs = (new Seguro_Model_PropostasDevolucoes())->getInfoEmailByIds($idsPropostasDevolucoes);

        $email = new Agro_Mail();
        
        foreach ($rs as $row) {
            $body = "
                Prezado Corretor,

                <br><br>Informamos que não foi possível realizar a Devolução de Prêmio da proposta <b>{$row['nr_proposta']}</b>, referente ao endosso <b>{$row['nr_endosso']}</b>, pois possui pendência, conforme o motivo apresentado abaixo:

                <br><br>Motivo: <b>{$row['ds_observacao']}</b>


                <br><br>Para continuidade no processo de devolução, é imprescindível regularizar a pendência. Para casos de devolução ao Beneficiário, não havendo regularização, o valor será devolvido ao Segurado.

                <br><br>Para realizar o retorno, acesse o módulo de devolução no sistema em Seguro>Propostas & Orçamentos>Devolução de Prêmio.
                <br><br>ATENÇÃO: esta é uma mensagem automática. Por favor, não responda. Se deseja entrar em contato conosco, escreva para atendimento@agrobrasilseguros.com.br.

                <br><br>
            ";
            
            $email->clearFrom();
            $email->setFrom('ti@agrobrasilseguros.com.br', 'AgroBrasil - Agronet 2.0');
            $email->addTo($row['ds_email_corretor']);
            if($copiarAtendimento){
                $email->addBcc('atendimento@agrobrasilseguros.com.br');
            }
            $email->addBcc('karina.silva@agrobrasilseguros.com.br');
            $email->addBcc('karina.figueiro@agrobrasilseguros.com.br');
            $email->setSubject("Assunto: Alerta de Pendência na Devolução de Prêmio: Proposta {$row['nr_proposta']} - Endosso {$row['nr_endosso']}");

            $anexo = Agro_Mail::getAssinatura($email, 1);
            $body .= "<img src=\"cid:{$anexo->id}\" height=\"102\" width=\"480\" />";
            $body .= Agro_Mail::textoPadraoEmailHtml();

                        //DEBUG - INICIO
		        if (APPLICATION_ENV != 'production') {
                
			        $body .= "<br><br><hr><b>DEBUG</b>";
			        $body .= "<br>Destinatários";
			        foreach ($email->getRecipients() as $recipient) {
				        $body .= "<br> - {$recipient}";
			        }
		        }
		    //DEBUG - FIM

            $email->setBody($body, 'html');
            $email->send();
        }
    }

    public function deletarpropostadevolucaostatusAction()
    {
        $this->isAjax();
        $result = ['status'=> true, 'message' => 'Histórico excluído com sucesso.'];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $param = $this->getRequest()->getParams();
            $modelPropostasDevoucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();

            if (empty($param['id'])) {
                throw new Exception("ID do histórico não informado.");
            }

            if (!$modelPropostasDevoucoesStatus->deleteById($param['id'])){
                throw new Exception("Erro ao excluir o histórico.");
            }

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

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

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

    public function liberarparcelasAction()
    {
        $this->isAjax();
        $result = [
            'status'=> true,
            'message' => '',
            'vl_previsto' => 0
        ];

        try {
           
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $param = $this->getRequest()->getParams();
            $modelPropostasParcelas = new Seguro_Model_PropostasParcelas();
            $observacoes = [];

            if (empty($param['id_proposta'])) {
                throw new Exception("ID da proposta não informado.");
            }

            if (empty($param['parcelas_canceladas']) && empty($param['parcelas_liberadas'])) {
                throw new Exception("Nenhuma parcela informada para liberação/cancelamento.");
            }

            if (!empty($param['parcelas_canceladas'])) {
                $nrParcelasLiberacaoCancelada = implode(", ", $param['parcelas_canceladas']);
                if (!$modelPropostasParcelas->update(['fl_liberar_devolucao' => 0], "id_proposta = {$param['id_proposta']} AND nr_parcela in ($nrParcelasLiberacaoCancelada)")) {
                    throw new Exception("Erro liberar a devolução.");
                }

                $observacoes[] = "As seguintes parcelas tiveram a liberação de devolução cancelada: {$nrParcelasLiberacaoCancelada}";
                $result['message'] = "Cancelamento de liberação de Parcelas ({$nrParcelasLiberacaoCancelada}) concluída com sucesso.";
            }

            if (!empty($param['parcelas_liberadas'])) {
                $nrParcelasLiberadas = implode(", ", $param['parcelas_liberadas']);
                if (!$modelPropostasParcelas->update(['fl_liberar_devolucao' => 1], "id_proposta = {$param['id_proposta']} AND nr_parcela in ({$nrParcelasLiberadas})")) {
                    throw new Exception("Erro liberar a devolução.");
                }

                $observacoes[] = "As seguintes parcelas tiveram liberação de devolução: {$nrParcelasLiberadas}";
                $result['message'] .= "\n Parcelas ({$nrParcelasLiberadas}) liberadas com sucesso.";
            }
            $modelPropostasDevolucoes = $this->getModel();
            $propostaDevolucao = $modelPropostasDevolucoes->fetchRow(["id_proposta = {$param['id_proposta']}"]);
   
            if (empty($propostaDevolucao)) {
                $idPropostaDevolucao = $modelPropostasDevolucoes->primeiraInclusao($param['id_proposta']);   
           
            } else {
                $idPropostaDevolucao = $propostaDevolucao['id'];
            }

            $select = $modelPropostasDevolucoes->getData(["pd.id = {$idPropostaDevolucao}"]);
            $rs = $modelPropostasDevolucoes->fetchAll($select);

            if (!empty($rs[0]['vl_previsto'])) {
                $result['vl_previsto'] = $rs[0]['vl_previsto'];
            }

            $this->incluirObservacaoAutomatica($idPropostaDevolucao, implode("\n", $observacoes));

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

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

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

    /**
     * Inclui uma observação
     *
     * @param int $idPropostaDevolucao
     * @param string $observacao
     */
    private function incluirObservacaoAutomatica(int $idPropostaDevolucao, string $observacao)
    {
        $modelPropostasDevoucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();
        $propostaDevolucaoStatus = $modelPropostasDevoucoesStatus->getByIdPropostaDevolucao($idPropostaDevolucao);
        $idStatus = $propostaDevolucaoStatus[0]['id_status'];

        $dadosStatus = [
            'id_proposta_devolucao' => $idPropostaDevolucao,
            'id_status' => $idStatus,
            'ds_observacao' => $observacao,
            'fl_observacao_automatica' => true
        ];

        if (!$modelPropostasDevoucoesStatus->save($dadosStatus)) {
            throw new Exception("Erro ao salvar a observação.");
        }
    }

    private function getAlteracaoByProposta(int $idInformacoesBancarias) : array
    {
        $retorno = [
            'ds_campos_valores_iniciais' => '',
            'camposAlterados' => '',
        ];

        $parametros = ["id_informacoes_bancarias = {$idInformacoesBancarias}"];

        if (!empty($idSolicitacao)) {
            $parametros[] = "id = {$idSolicitacao}";
        }

        $model = new Sistema_Model_InformacoesBancarias();
        $rowSolicitacao = $model->getCamposAlterados($idInformacoesBancarias);
        if (!empty($rowSolicitacao)) {
            $retorno['ds_campos_valores_iniciais'] = $rowSolicitacao['ds_campos_valores_iniciais'];
            $retorno['camposAlterados'] = $rowSolicitacao['ds_campos_alteracoes'];
        }
        return $retorno;
    }

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

        $model = $this->getModel();
        $modelBancos = new Sistema_Model_Bancos();
        $modelFormasPagamento = new Sistema_Model_FormasPagamento();

        $idPropostaDevolucao = $this->getRequest()->getParam('id');

        $this->view->id_proposta_devolucao = $idPropostaDevolucao;
        $this->view->bancos = array_filter($modelBancos->getCombo());
        $this->view->formasPagamento = $modelFormasPagamento->getFormasPagamento();


        $this->view->informacoesBancarias = $model->getInformacaoBancaria($idPropostaDevolucao);
    
        $informacoesBancarias = $model->getInformacaoBancaria($idPropostaDevolucao)->toArray();
    
        $idProposta = $informacoesBancarias['id_proposta'];

        $this->view->aFavorDe = $model->getComboAFavorDe($idPropostaDevolucao);
        $this->view->dadosSolicitacao = $this->getAlteracaoByProposta($informacoesBancarias['id']);
        $this->view->bloqueiaCampoBeneficiario = $this->validaPermissaoCampoBeneficiario($this->view->informacoesBancarias['id_proposta']);
    }

    /**
     * Valida se o campo do beneficiário (a favor de) pode ser alterado
     *
     * @param int $idProposta
     * @return bool
     */
    private function validaPermissaoCampoBeneficiario(int $idProposta): bool
    {
        $bloqueiaCampoBeneficiario = false;

        $modelPropostas = new Seguro_Model_Propostas();
        $proposta = $modelPropostas->getRow($idProposta);

        if ($proposta['id_status'] == Sistema_Model_Status::ID_PROPOSTA_CANCELADA) {
            $motivosCorretor = [
                Atendimento_Model_TipoCancelamento::MOTIVO_CANCELADA_A_PEDIDO_CORRETOR_SEGURADO,
                Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_SEGURADO_DESISTIU_SEGURO,
                Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_SERA_REFEITA,
                Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_SEGURO_INDEVIDO,
                Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_SEGURO_DUPLICADO,
                Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_ERRO_TRANSMISSAO,
                Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_FALTA_PAGAMENTO_PARCELA,
                Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_OUTRO
            ];

            $modelPropostasCancelamento = new Seguro_Model_PropostasCancelamento();
            $motivosCancelamento = $modelPropostasCancelamento->getByProposta($proposta['id']);
            foreach ($motivosCancelamento as $motivo) {
                if (in_array($motivo['id_motivo_cancelamento'], $motivosCorretor)) {
                    $nrEndosso = Agro_Db_Table_Row_Proposta::busca_nr_endosso((int) $proposta['id'], (int) $proposta['id_endosso']);
                    $bloqueiaCampoBeneficiario = ($nrEndosso == 0 ? true : false) && !Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro();
                    break;
                }
            }
        }

        return $bloqueiaCampoBeneficiario;
    }

    private function organizarPadrao($parametros)
    {
        /**
         * Primeiramente atualiza os valores iniciais, caso seja a primeira vez que está salvando um bloco
         * Desta forma, será possível validar sempre com os dados da forma que estavam ao abrir a solicitação
         */
        $camposValoresIniciais = [$parametros['bloco_alteracoes'] => json_decode($parametros['ds_campos_valores_iniciais'], true)];
        $parametros['ds_campos_valores_iniciais'] = json_encode($camposValoresIniciais);

        /**
         * Validações do que foi alterado/excluído/incluído
         */
        if (!empty($parametros['ds_campos_alteracoes'])) {
            $camposAlteracoesTela = json_decode($parametros['ds_campos_alteracoes'], true);
            $alteracoesSalvar = [];
            $camposNovos = [];

            foreach ($camposAlteracoesTela as $campoAlteracao) {
                $camposNovos[$campoAlteracao['name']] = $campoAlteracao['value'];

                foreach ($camposValoresIniciais[$parametros['bloco_alteracoes']] as $indice => $campoValorInicial) {
                    $campoValorInicial = (array) $campoValorInicial;

                    if ($campoValorInicial['name'] === $campoAlteracao['name']) {
                        if ($campoValorInicial['value'] !== $campoAlteracao['value']) {
                            $alteracoesSalvar['E'][] = $campoAlteracao;
                        }
                        unset($camposNovos[$campoAlteracao['name']]);
                    }
                }
            }

            foreach ($camposValoresIniciais[$parametros['bloco_alteracoes']] as $indice => $campoValorInicial) {
                $campoValorInicial = (array) $campoValorInicial;
                $campoEncontrado = false;

                foreach ($camposAlteracoesTela as $campoAlteracao) {
                    if ($campoAlteracao['name'] === $campoValorInicial['name']) {
                        $campoEncontrado = true;
                    }
                }

                if (!$campoEncontrado) {
                    $alteracoesSalvar['D'][] = $campoValorInicial;
                }
            }

            foreach ($camposNovos as $nomeCampo => $valorCampo) {
                $alteracoesSalvar['I'][] = ['name' => $nomeCampo, 'value' => $valorCampo];
            }

            if (!empty($alteracoesSalvar)) {
                $camposAlteracoesSalvas[$parametros['bloco_alteracoes']] = $alteracoesSalvar;
            } else {
                unset($camposAlteracoesSalvas[$parametros['bloco_alteracoes']]);
            }

            $parametros['ds_campos_alteracoes'] = !empty($camposAlteracoesSalvas) ? json_encode($camposAlteracoesSalvas) : '';
        }

        return $parametros;
    }

    private function organizarCamposEditadosSolicitacao(array $parametros)
    {
        $parametros = $this->organizarPadrao($parametros);
        return $parametros;
    }

    public function salvardadosbancariosAction()
    {
        $this->isAjax();
        $result = ['status'=> true, 'message' => 'Dados bancários salvo com sucesso.', 'id_informacao_bancaria' => '', 'recarregar' => false];

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
            $param = $this->getRequest()->getParams();
            $model = $this->getModel();
            $modelPropostasDevolucoesArquivos = new Seguro_Model_PropostasDevolucoesArquivos();
            if (!empty($param['camposAlterados'])) {
                if (empty($param['id'])) {
                    $dadosSaveinicial = $param;

                    $dadosSaveinicial['bloco_alteracoes'] = 'informacoes_bancarias';
                    $dadosSaveinicial['ds_campos_alteracoes'] = '';
                    $dadosSaveinicial['ds_campos_valores_iniciais'] = '';

                    $parametros['id'] = $this->getRequest()->getParam('id');
                }

                $param = $this->organizarCamposEditadosSolicitacao($param);
            }

            $modelInformacoesBancarias = new Sistema_Model_InformacoesBancarias();
            $modelPropostasDevoucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();

            if (empty($param['id_proposta_devolucao'])) {
                throw new Exception("ID da devolução não informado.");
            }

            if (!$modelPropostasDevoucoesStatus->permiteEditarDadosBancarios($param['id_proposta_devolucao'])) {
                throw new Exception("Ação não permitida.");
            }

            if (empty($param['a_favor_de'])) {
                throw new Exception("A Favor De não informado.");
            }

            if (empty($param['id_forma_pagamento'])) {
                throw new Exception("Forma de Pagamento não informado.");
            }

            if (empty($param['id_banco'])) {
                throw new Exception("Banco não informado.");
            }

            if (empty($param['ds_agencia'])) {
                throw new Exception("Agência não informada.");
            }

            if ($param['id_forma_pagamento'] == '1') {

                if (empty($param['ds_conta'])) {
                    throw new Exception("Conta não informada.");
                }

                if (!isset($param['nu_digito_conta'])) {
                   throw new Exception("Dígito da Conta não informado.");
                }

                if ($param['nu_digito_conta'] != 0 && empty($param['nu_digito_conta'])) {
                    throw new Exception("Dígito da Conta não informado.");
                }

                if (empty($param['ds_tipo_conta'])) {
                    throw new Exception("Tipo de Conta não informado.");
                }
            } else {
                $param['ds_tipo_conta'] = 'O';
            }
            $rowDevolucao = $model->find($param['id_proposta_devolucao'])->current();
            $statusDevolucao = $model->getStatusVigenteDevolucao($rowDevolucao['id']);
            
            $bloqueiaCampoBeneficiario = $this->validaPermissaoCampoBeneficiario($rowDevolucao['id_proposta']);

            $rowInformacoesBancarias = $modelInformacoesBancarias->save($param);

            if (empty($param['id'])) {
                $rowDevolucao['id_informacao_bancaria'] = $rowInformacoesBancarias->id;
            }

            if (!$bloqueiaCampoBeneficiario) {

                $rowDevolucao['id_proponente'] = null;
                $rowDevolucao['id_beneficiario'] = null;

                if ($param['a_favor_de_tipo'] == 'P') {
                    $rowDevolucao['id_proponente'] = $param['a_favor_de'];
                } else {
                    $rowDevolucao['id_beneficiario'] = $param['a_favor_de'];
                }
            }

            $rowDevolucao['id_forma_pagamento'] = $param['id_forma_pagamento'];
            $rowDevolucao['fl_conta_conjunta'] = (bool) $param['fl_conta_conjunta'];
            $model->save($rowDevolucao->toArray());

            $modelPropostaBeneficiario = new Seguro_Model_PropostasBeneficiarios();
            $modelPropostaBeneficiario->setFlagFavorecidoAutorizacaoCredito($param['a_favor_de_tipo'],$rowDevolucao['id_proposta']);

            $arquivos = $modelPropostasDevolucoesArquivos->getArquivosByPropostaDevolucao($param['id_proposta_devolucao']);
            $possuiDocumentoAnexado =  !empty($arquivos);
            
            if($statusDevolucao['ds_chave'] == 'PENDENCIA_CORRETOR' and $param['a_favor_de_tipo'] == 'B' && $possuiDocumentoAnexado){
                $modelStatus = new Sistema_Model_Status();
                $chaveStatus = 'EM_ANALISE_COM_TERMO';
                $dadosStatus = [
                    'id_proposta_devolucao' => $rowDevolucao['id'],
                    'id_status' => $modelStatus->getIdByChaveTipoChave($chaveStatus, 'DEVOLUCAO_PREMIO'),
                    'fl_observacao_automatica' => true
                ];
                if (!$modelPropostasDevoucoesStatus->save($dadosStatus)) {
                    throw new Exception("Erro ao salvar o status.");
                }
                $result['recarregar'] = true;

            }else{
                if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) {
                    $modelStatus = new Sistema_Model_Status();
                    $chaveStatus = (!empty($rowDevolucao['id_beneficiario'])) ? 'AGUARDANDO_TERMO' : 'EM_PROCESSAMENTO_DADOS_BANCARIOS';
                    $dadosStatus = [
                        'id_proposta_devolucao' => $rowDevolucao['id'],
                        'id_status' => $modelStatus->getIdByChaveTipoChave($chaveStatus, 'DEVOLUCAO_PREMIO'),
                        'fl_observacao_automatica' => true
                    ];

                    if (!$modelPropostasDevoucoesStatus->save($dadosStatus)) {
                        throw new Exception("Erro ao salvar o status.");
                    }
                    $result['recarregar'] = true;
                }
            }
        
            $result['id_informacao_bancaria'] = $rowDevolucao['id_informacao_bancaria'];

            $filePath = realpath(Seguro_Model_PropostasDevolucoesArquivos::FILE_PATH . "/{$rowDevolucao->id}_termo_autorizacao_pagamento_beneficiario.pdf");

            if (file_exists($filePath)) {
                unlink($filePath);
            }

            if ($param['a_favor_de_tipo'] != 'P') {
                $this->gerarPDFTermoAutorizacaoPagamentoBeneficiario($rowDevolucao->id);
            }

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

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

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

    public function gerarPDFTermoAutorizacaoPagamentoBeneficiario(int $idPropostasDevolucao)
    {
        $model = $this->getModel();
        $mpdf = new Mpdf([
            'tempDir' => APPLICATION_PATH . '/upload_files/temp',
            'margin_top' => 10,
            'margin_bottom' => 10
        ]);

        $diretorio = Seguro_Model_PropostasDevolucoesArquivos::FILE_PATH;
        if (!file_exists($diretorio)) {
            mkdir($diretorio, '0755', true);
        }

        $filePath = $diretorio . "/{$idPropostasDevolucao}_termo_autorizacao_pagamento_beneficiario.pdf";

        $dadosTermo = $model->getDadosTermoBeneficiario($idPropostasDevolucao);

        if (empty($dadosTermo)) {
            throw new Exception("Erro ao buscar os dados do termo de autorização de pagamento do beneficiário.");
        }

        $this->view->isEnviarDocusign = false;
        $this->view->isDevolucao = true;
        $this->view->dadosTermos = $dadosTermo->toArray();

        $html = '';
        $html .= '<iframe class="hide" width="0" frameborder="0" marginwidth="0" height="0" marginheight="0" id="hiddenFrame" name="hiddenFrame"></iframe>';
		$html .= '<div id="divAjaxDialog"></div>';
		$html .= '<div class="container">';
		$html .= '   <div class="content">';
		$html .= $this->view->render('proposta/termo_autorizacao_pagamento_beneficiario.phtml');
		$html .= '  </div>';
		$html .= '</div>';
		$html = str_replace("/resources/",$_SERVER['DOCUMENT_ROOT']."/resources/",$html);

        $sanitizedPath = realpath($_SERVER['DOCUMENT_ROOT']."/resources/css/seguro/propostaprint_mpdf.css");

        $css = file_get_contents($sanitizedPath);
		$mpdf->WriteHTML($css, \Mpdf\HTMLParserMode::HEADER_CSS);

		$mpdf->WriteHTML($html, \Mpdf\HTMLParserMode::HTML_BODY);
		$mpdf->Output($filePath, \Mpdf\Output\Destination::FILE);
    }


    public function atualizarinformacoesbancariasdevolucaoAction()
    {
        $this->isAjax();
        $result             = ['status'=> true, 'message' => '', 'recarregar' => false];
        $params             = $this->getRequest()->getParams();
        $id_favorecido      = $params['id_favorecido'];
        $tipo_favorecido    = $params['tipo_favorecido'];

        if($tipo_favorecido == 'B'){
            $rowBeneficiario = (new Seguro_Model_InformacoesBancariasBeneficiarios())->fetchAll(["id_beneficiario = {$id_favorecido}"])->current();

            if(empty($rowBeneficiario)){
                $result['status'] = false;
                $result['message'] = "Não foi possível localizar dados bancários do beneficiario.";
            }else{
                $id_informacoes_bancarias = $rowBeneficiario->toArray()['id_informacoes_bancarias'];
                $informacoes_bancarias = (new Sistema_Model_InformacoesBancarias())->getInformacoesBancariasById($id_informacoes_bancarias);
              
                $informacoes_bancarias['digito_agencia'] = (empty($informacoes_bancarias['digito_agencia'])) ? " " : $informacoes_bancarias['digito_agencia'];
                $informacoes_bancarias['digito_conta']   = (empty($informacoes_bancarias['digito_conta'])) ? " " : $informacoes_bancarias['digito_conta'];
            
                $idFormaPagamento                           = $informacoes_bancarias['id_forma_pagamento'];
                $idBanco                                    = $informacoes_bancarias['id_banco'];
                $agencia                                    = $informacoes_bancarias['ds_agencia'];
                $digitoAgencia                              = $informacoes_bancarias['digito_agencia'];
                $conta                                      = $informacoes_bancarias['ds_conta'];
                $digitoConta                                = $informacoes_bancarias['digito_conta'];
                $tipoConta                                  = $informacoes_bancarias['ds_tipo_conta'];

                $result['status']   = true;
                $result['message'] = [
                    'id_banco'           => $idBanco,
                    'agencia'           => $agencia,
                    'digito_agencia'    => $digitoAgencia, 
                    'conta'             => $conta,
                    'digito_conta'      => $digitoConta,
                    'id_forma_pagamento'=> $idFormaPagamento,
                    'tipo_conta'        => $tipoConta
                ];
            }
        }else{
            $id_proposta = $params['id_proposta'];
            $informacoes_bancarias = (new Seguro_Model_InformacoesBancariasPropostas())->getInformacoesBancariasProponentesByProposta($id_proposta);
            foreach($informacoes_bancarias as $info){
                $idFormaPagamento                           = (empty($info['id_forma_pagamento'])) ? 1 : $info['id_forma_pagamento'];
                $idBanco                                    = $info['id_banco'];
                $agencia                                    = $info['ds_agencia'];
                $digitoAgencia                              = $info['nu_digito_agencia'];
                $conta                                      = $info['ds_conta'];
                $digitoConta                                = $info['nu_digito_conta'];
                $tipoConta                                  = $info['ds_tipo_conta'];
                $flContaConjunta                            = $info['fl_conta_conjunta'];
            }
         
            $result['status'] = true;
            $result['message'] = [
                'id_banco'          => $idBanco,
                'agencia'           => $agencia,
                'digito_agencia'    => $digitoAgencia, 
                'conta'             => $conta,
                'digito_conta'      => $digitoConta,
                'id_forma_pagamento'=> $idFormaPagamento,
                'tipo_conta'        => $tipoConta
            ];

            //busca na outra tabela
        }

        $this->getResponse()->setBody(Zend_Json::encode($result));
    }
    private function limparDataProgramada(int $idStatus, int $idPropostaDevolucao) : bool
    {
        $limparDataProgramada = false;

        if (
            !in_array($idStatus, Seguro_Model_PropostasDevolucoesStatus::statusNaoLimpamDataProgramada())
        ) {
            if (
                !(new Seguro_Model_PropostasDevolucoes())->update(
                    ["dt_programada" => null],
                    "id = {$idPropostaDevolucao}"
                )
            ) {
                throw new Exception("Erro ao limpar a Data Programada.");
            }

            $limparDataProgramada = true;
        }

        return $limparDataProgramada;
    }
}
