<?php
require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");

class Seguro_BeneficiarioController extends Agro_Controller_Action{
	public $_columnList = array();
	public $_backAfterSave = false;

	public function init() {
		$this->view->title = 'Seguro » Beneficiários';
        $this->_columnList = array('ds_nome_beneficiario' => 'Nome', 'cpf_cnpj' => 'CPF/CNPJ', 'ds_status' => 'Status dos Arquivo');
	}

	public function getModel() {
		return new Seguro_Model_Beneficiarios();
	}

	public function getForm() {
		return new Seguro_Form_Beneficiario();
	}

	public function getFormBeneficiarioArquivo() {
		return new Seguro_Form_BeneficiarioArquivo();
	}

	public function getFilter() {

		$where = array();

		if ($this->getRequest()->getParam('ds_nome_beneficiario')) {
			$where[] = array (
				'field' => 'ds_nome_beneficiario',
				'operator' => 'ilike',
				'value' => '%'.$this->getRequest()->getParam('ds_nome_beneficiario').'%'
			);
		}

        if ($this->getRequest()->getParam('ds_beneficiario')) {
            $where[] = array (
                'field' => 'ds_nome_beneficiario',
                'operator' => 'ilike',
                'value' => '%'.$this->getRequest()->getParam('ds_beneficiario').'%'
            );
        }

		if ($this->getRequest()->getParam('cpf_cnpj')) {
			$where[] = array (
				'field' => 'cpf_cnpj',
				'operator' => '=',
				'value' => str_replace("|", "/", $this->getRequest()->getParam('cpf_cnpj'))
			);
		}

		if ($this->getRequest()->getParam('fl_ativo')) {
			$where[] = array (
				'field' => 'p.fl_ativo',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('fl_ativo')
			);
		}

		if ($this->getRequest()->getParam('id_status') != 0) {
			$where[] = array (
				'field' => 's.id',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_status')
			);
		}

        if ($this->getRequest()->getParam('tp_pessoa')) {
            $where[] = array (
              'field' => 'p.tp_pessoa',
              'operator' => '=',
              'value' => $this->getRequest()->getParam('tp_pessoa')
            );
        }

        if ($this->getRequest()->getParam('idBeneficiario')) {
            $where[] = array (
                'field' => 'p.id',
                'operator' => '=',
                'value' => $this->getRequest()->getParam('idBeneficiario')
            );
        }

		return $where;
	}

	public function arquivoAction(){
		$this->isAjax(true);

        $User = Zend_Auth::getInstance()->getIdentity();
        $empresas = new Sistema_Model_Empresas();

		$Model = new Seguro_Model_BeneficiariosArquivos();
		$Beneficiario = new Seguro_Model_Beneficiarios();
		$modelBeneficiariosPendenciasArquivos = new Seguro_Model_BeneficiariosPendenciasArquivos();
		$Status = new Sistema_Model_Status();
		$ModelPendencias = new Atendimento_Model_Pendencia();
		$ModelPendencias->_order = 'dt_criacao desc';

		$this->view->id           = $this->getRequest()->getParam('id');
		$this->view->status       = $Status->getComboStatusArquivos('ARQUIVOS_PROCESSO_SINISTRO');
		$this->view->beneficiario = $Beneficiario->find($this->getRequest()->getParam('id'))->current()->toArray();
		$this->view->form         = $this->getFormBeneficiarioArquivo();
		$this->view->id_empresa   = $empresas->getIdEmpresaUsuarioCorrente();
		$this->view->tp_usuario   = $User->tp_usuario;
		$this->view->pendencias   = $ModelPendencias->fetchAll('id_tipo_pendencia = ' . Atendimento_Model_TipoPendencia::ID_PENDENCIA_DOCUMENTOS_SINISTRO)->toArray();
        $this->view->idProcesso   = $this->getRequest()->getParam('id_processo') ?? null;
        $this->view->informacoesBancarias = $this->getInformacoesBancarias((int) $this->view->beneficiario['id']);
        $this->view->arquivosVigenciaAnterior = [];
        $this->view->arquivosVigenciaAtual = [];

        $arquivos = $Model->getArquivos($this->getRequest()->getParam('id'));
        $this->view->nomesArquivosReaproveitados = [];

        foreach ($arquivos as $arquivo) {
            if ($arquivo['fl_vigencia_atual']) {
                $this->view->arquivosVigenciaAtual[] = $arquivo;

                if ($arquivo['fl_arquivo_reaproveitado']) {
                    $this->view->nomesArquivosReaproveitados[] = $arquivo['ds_nome_arquivo'];
                }
            } else {
                $this->view->arquivosVigenciaAnterior[] = $arquivo;
            }
        }

        $this->view->tiposArquivosPendentes = [];
        $arquivosPendentes =  $modelBeneficiariosPendenciasArquivos->getArquivosPendentesByBeneficiario($this->getRequest()->getParam('id'));
        
        foreach ($arquivosPendentes as $arquivoPendente) {
            $this->view->tiposArquivosPendentes[] = $arquivoPendente['id_tipo_arquivo'];
        }
	}

	public function pendenciaAction() {
		$this->getHelper('layout')->disableLayout();
		$ModelBeneficiariosPendencias = new Seguro_Model_BeneficiariosPendencias();
		$this->view->beneficiario_pendencias = $ModelBeneficiariosPendencias->getPendencias($this->getRequest()->getParam('id'));
	}

	public function reloadarquivoAction(){
		$this->isAjax();

		$Model = new Seguro_Model_BeneficiariosArquivos();
		$arquivos = $Model->getArquivos($this->getRequest()->getParam('id'));

		$User = Zend_Auth::getInstance()->getIdentity();
		$empresas = new Sistema_Model_Empresas();
		$id_empresa = $empresas->getIdEmpresaUsuarioCorrente();

		$this->getResponse()->setBody(Zend_Json::encode($arquivos));
	}

    public function salvaarquivoAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        $ModelBeneficiarioArquivo = new Seguro_Model_BeneficiariosArquivos();
        $ModelBeneficiario = new Seguro_Model_Beneficiarios();
        $ModelTipoArquivo = new Sistema_Model_TipoArquivoProcesso();
        $params = $this->getRequest()->getParams();

        $alert = "Arquivo salvo com sucesso!";
        $result = 1;

        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        if ($this->getRequest()->getParam('id_beneficiario')) {
            $adapter->beginTransaction();

            try {
                if (!empty($_FILES) && is_array($_FILES)) {
                    $extensoes_permitidas = array('pdf', 'jpg', 'jpeg','png','jfif');
                    $ext = explode('.', $_FILES['file']['name'][0]);
                    $size = $_FILES["file"]["size"][0] / 1024;

                    if($size > 14000) {
                        throw new Exception("Por favor, verifique o tamanho do arquivo (máximo permitido: 14Mb).");
                    } elseif (!in_array(strtolower($ext[1]), $extensoes_permitidas)) {
                        throw new Exception("Por favor, verifique a extensão do arquivo (permitidas: pdf, jpg, jpeg, png ou jfif).");
                    } else {

                        if (isset($params['ch_concordo']) &&
                            $params['ch_concordo'] == "on" &&
                            Seguro_Model_Beneficiarios::apresentarTermoSinistro($params['id_beneficiario'])
                        ){
                            $modelConfirmacaoTermoBeneficiarios = new Sinistro2_Model_ConfirmacaoTermoBeneficiarios();
                            $modelConfirmacaoTermoBeneficiarios->save(['id_beneficiario' => $params['id_beneficiario']]);
                        }

                        $Beneficiario = $ModelBeneficiario->getRow($this->getRequest()->getParam('id_beneficiario'));
                        $TipoArquivo = $ModelTipoArquivo->getRow($this->getRequest()->getParam('id_tipo_arquivo_hidden'));

                        $Adapter = new Zend_File_Transfer();
                        $Adapter->setDestination(APPLICATION_PATH . '/upload_files/beneficiarios/');

                        $files = $Adapter->getFileInfo();

                        foreach ($files as $tipo => $file) {
                            if ($file['name'] == '') {
                                continue;
                            }

                            $cpf_cnpj = str_replace(".", "", $Beneficiario->cpf_cnpj);
                            $cpf_cnpj = str_replace("-", "", $cpf_cnpj);
                            $cpf_cnpj = str_replace("/", "", $cpf_cnpj);

                            $countArquivos = $ModelBeneficiarioArquivo->getCountTipoArquivo($this->getRequest()->getParam('id_beneficiario'),
                              $this->getRequest()->getParam('id_tipo_arquivo_hidden'));
                            if ($countArquivos < 1) {
                                $countArquivos = 1;
                            } else {
                                $countArquivos += 1;
                            }

                            $newName = $cpf_cnpj . "_" . $TipoArquivo->ds_chave_tipo_arquivo . "_" . $countArquivos . "." . end(explode(".",
                                $file['name']));
                            $caminhoArquivo = APPLICATION_PATH . '/upload_files/beneficiarios/' . $newName;

                            $Adapter->addFilter('Rename', array(
                              'target' => $caminhoArquivo,
                              'overwrite' => true
                            ));

                            if (!$Adapter->receive($file['name'])) {
                                $alert = "Erro ao enviar arquivo!";
                                $result = 0;
                            } else {
                                $dados = array(
                                  'id_beneficiario' => $this->getRequest()->getParam('id_beneficiario'),
                                  'arquivo'         => $newName,
                                  'id_tipo_arquivo' => $this->getRequest()->getParam('id_tipo_arquivo_hidden'),
                                  'fl_vigencia_atual' => true
                                );

                                $idBeneficiarioArquivo = $ModelBeneficiarioArquivo->save($dados);

                                if ($idBeneficiarioArquivo) {
                                    $this->atualizarStatusArquivosNaoAnalisado($this->getRequest()->getParam('id_beneficiario'), $Beneficiario['tp_pessoa']);
                                }
                            }
                        }
                    }
                }

                $adapter->commit();
            } catch (Exception $erro) {
                $adapter->rollback();
                $alert = $erro->getMessage();
                $result = 0;
            }
        }

        $this->getResponse()->setBody("
            <script>
                window.top.window.stopUpload($result);
                alert(\"$alert\");
				window.top.window.$.loadArquivos(" . $this->getRequest()->getParam('id_beneficiario') . ");
            </script>
        ");
    }

	public function deletefileAction() {
		$this->isAjax();

		$BeneficiarioArquivo = new Seguro_Model_BeneficiariosArquivos();
        $Row = $BeneficiarioArquivo->getRow($this->getRequest()->getParam('id'));

		if ($this->getRequest()->getParam('id')) {
			$Row->fl_ativo = '0';
			if($Row->save()){
			    if (!$Row['fl_arquivo_reaproveitado']) {
                    $sanitizedPath = realpath(PATH_BENEFICIARIOS. "/" .$Row['ds_nome_arquivo']);

                    if (file_exists($sanitizedPath)) {
    			        @unlink($sanitizedPath);
                    }
                }

                (new Seguro_Model_Beneficiarios())->atualizarDataDocumentoVigenciaAtual((int) $Row['id_beneficiario']);

    			$deleted = 'Arquivo deletado com sucesso!';
			} else {
    			$deleted = 'Erro ao deletar arquivo!';
    		}
	    }

		$this->getResponse()->setBody(Zend_Json::encode($deleted));
	}

	public function atualizastatusarquivosAction() {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        $idStatus = $this->getRequest()->getParam('id_status_arquivos');
        $idBeneficiario = $this->getRequest()->getParam('id_beneficiario');
        $idProcesso = $this->getRequest()->getParam('id_processo');
        $result = array('status'=>true);

        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();
        try {
            $adapter->beginTransaction();

            $ModelBeneficiario = new Seguro_Model_Beneficiarios();
            $ModelPropostasBeneficiario = new Seguro_Model_PropostasBeneficiarios();
            
            $Beneficiario = $ModelBeneficiario->getRow($idBeneficiario);
            $Beneficiario->id_status_arquivos = $idStatus;
            $Beneficiario->save();

            if ((int) $idStatus === Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA) {
                $this->salvarArquivosFilaTransmissao($idBeneficiario);
                $this->atualizarInformacoesBancariasPropostas($idBeneficiario);
                $this->salvarDataBasePagamento($idBeneficiario);
                
                if (!empty($idProcesso) && $idProcesso != 'null') {
                    $processo = (new Sinistro2_Model_Processos())->find($idProcesso)->current();
                    (new Sinistro2_Service_AtualizarStatusLiquidacaoAposConclusaoAnalise())
                        ->executar($processo->id_proposta, (int) $idProcesso);
                }

                $propostas = $ModelPropostasBeneficiario->getPropostasByBeneficiarioId($idBeneficiario);
                $modelCronometro = new Sinistro2_Model_CronometroRegulacao();
                $serviceAvisosEncerramento = new Sinistro2_Service_AvisoEncerramentoColheita();
                foreach($propostas as $proposta){
                    if($proposta['dt_transmissao'] > DATA_INICIO_NOVA_LEI_SEGURO){
                        $cronometros = $modelCronometro->getByProposta($proposta['id_proposta']);

                        if($cronometros){
                            foreach($cronometros as $cronometro){
                                $modelCronometro->reativar($cronometro);
                            }
                        }
                        
                        $serviceAvisosEncerramento->criaMultiplosCronometrosRegulacaoPorProposta($proposta['id_proposta']);
                        
                    }
                }


            }elseif((int) $idStatus === Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ANALISADO){
                $propostas = $ModelPropostasBeneficiario->getPropostasByBeneficiarioId($idBeneficiario);
                $modelCronometro = new Sinistro2_Model_CronometroRegulacao();
                $serviceAvisosEncerramento = new Sinistro2_Service_AvisoEncerramentoColheita();
                foreach($propostas as $proposta){
                    if($proposta['dt_transmissao'] > DATA_INICIO_NOVA_LEI_SEGURO){
                        $cronometros = $modelCronometro->getByProposta($proposta['id_proposta']);

                        if($cronometros){
                            foreach($cronometros as $cronometro){
                                $modelCronometro->reativar($cronometro);
                            }
                        }
                        $serviceAvisosEncerramento->criaMultiplosCronometrosRegulacaoPorProposta($proposta['id_proposta']);
                    }
                }
                $this->removerArquivosFilaTransmissao($idBeneficiario);
            } elseif((int)$idStatus == Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ENVIADO) {
                $propostas = $ModelPropostasBeneficiario->getPropostasByBeneficiarioId($idBeneficiario);
                $modelCronometro = new Sinistro2_Model_CronometroRegulacao();
                $serviceAvisosEncerramento = new Sinistro2_Service_AvisoEncerramentoColheita();
                foreach($propostas as $proposta){
                    if($proposta['dt_transmissao'] > DATA_INICIO_NOVA_LEI_SEGURO){
                        $cronometros = $modelCronometro->getByProposta($proposta['id_proposta']);

                        if($cronometros){
                            foreach($cronometros as $cronometro){
                                $modelCronometro->zerar($cronometro['id'], 'Documentação obrigatória incompleta');
                            }
                        }
                        
                    }
                }

                $this->removerArquivosFilaTransmissao($idBeneficiario);
            }else{
                $this->removerArquivosFilaTransmissao($idBeneficiario);
            }

            $dadosLogBeneficiariosArquivosStatus = [
                'id_beneficiario' => $idBeneficiario,
                'id_status' => $idStatus,
            ];
  
            if (!(new Log_Model_LogBeneficiariosArquivosStatus())->save($dadosLogBeneficiariosArquivosStatus)) {
                throw new Exception('Erro ao salvar o log de alteração do status.');
            }

            if ((int) $idStatus === Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_PENDENTE) {
                $result['pendencias'] = $this->validarArquivosObrigatorios($Beneficiario, $this->getRequest()->getParam('tipos_arquivos_selecionados'));
            }

            $adapter->commit();
        } catch (Exception $e) {
            $adapter->rollback();
            $result = array('status'=>false,'error'=>$e->getMessage());
        }

        $this->getResponse()->setBody(Zend_Json::encode($result));
	}

    /**
     * Valida se os arquivos obrigatórios foram informados e retorna as pendências
     *
     * @param Zend_Db_Table_Row $beneficiario
     * @param array|null $tiposArquivosSelecionados
     * @param bool $validarStatusLiquidacao
     * @return array
     */
    private function validarArquivosObrigatorios(Zend_Db_Table_Row $beneficiario, ?array $tiposArquivosSelecionados, bool $validarStatusLiquidacao = true): array
    {
        $pendencias = [];
        $documentosObrigatorios = Seguro_Model_TiposBeneficiarios::getArquivosObrigatoriosByBeneficiario($beneficiario, $validarStatusLiquidacao);

        if ($beneficiario['id_tipo_beneficiario'] == Seguro_Model_TiposBeneficiarios::ID_PESSOA_FISICA) {
            if (in_array(Sistema_Model_TipoArquivoProcesso::CNH , $tiposArquivosSelecionados)) {
                if (($key = array_search(Sistema_Model_TipoArquivoProcesso::RG, $documentosObrigatorios)) !== false) {
                    unset($documentosObrigatorios[$key]);
                }
    
                if (($key = array_search(Sistema_Model_TipoArquivoProcesso::CPF, $documentosObrigatorios)) !== false) {
                    unset($documentosObrigatorios[$key]);
                }
            } else if (in_array(Sistema_Model_TipoArquivoProcesso::RG, $tiposArquivosSelecionados) && in_array(Sistema_Model_TipoArquivoProcesso::CPF, $tiposArquivosSelecionados)) {
                if (($key = array_search(Sistema_Model_TipoArquivoProcesso::CNH, $documentosObrigatorios)) !== false) {
                    unset($documentosObrigatorios[$key]);
                }
            }
        }

        $arquivosNaoInformados = $documentosObrigatorios;
        if (!empty($tiposArquivosSelecionados)) {
            $arquivosNaoInformados = array_diff($documentosObrigatorios, $tiposArquivosSelecionados);
        }

        foreach($arquivosNaoInformados as $documento) {
            $pendencias[] = Sistema_Model_TipoArquivoProcesso::DE_PARA_PENDENCIAS[$documento];
        }
        
        return $pendencias;
    }

    function formAction() {
        if ($this->getRequest()->isPost()) {
            $this->getRequest()->setParam('ds_beneficiario', $this->getRequest()->getParam('ds_nome_beneficiario'));
        }

        $this->view->restricoes = (new Seguro_Model_RestricoesTecnicas())->fetchAll()->toArray();

        parent::formAction();
    }

	public function conferidoAction() {
		$result = array('status' => false, 'message' => null);
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$Model = new Seguro_Model_BeneficiariosArquivos();
		try {
			$Model->update(array('fl_conferido' => $this->getRequest()->getParam('fl_conferido')), 'id = '.$this->getRequest()->getParam('id'));
			$result = array('status' => true, 'message' => 'Operação efetuada com sucesso!');
		} catch (Exception $e) {
			$result = array('status' => false, 'message' => $e->getMessage());
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function editararquivoAction() {
		$this->isAjax(true);
		$this->view->formUpload = new Seguro_Form_BeneficiarioArquivo();
		$this->view->formUpload->populate($this->getRequest()->getParams());
	}

	public function editfileAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$Model = new Seguro_Model_BeneficiariosArquivos();
        $modelBeneficiario = new Seguro_Model_Beneficiarios();
        $modelTipoArquivo = new Sistema_Model_TipoArquivoProcesso();
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

		try {
            $adapter->beginTransaction();

            $rowBeneficiario = $modelBeneficiario->getRow($this->getRequest()->getParam('id'));
            $rowTipoArquivo = $modelTipoArquivo->getRow($this->getRequest()->getParam('id_tipo_arquivo'));
		    $rowBeneficiarioArquivo = $Model->getRow($this->getRequest()->getParam('id_arquivo'));

            $cpf_cnpj = str_replace(".", "", $rowBeneficiario->cpf_cnpj);
            $cpf_cnpj = str_replace("-", "", $cpf_cnpj);
            $cpf_cnpj = str_replace("/", "", $cpf_cnpj);

            $countArquivos = $Model->getCountTipoArquivo(
              $this->getRequest()->getParam('id'),
              $this->getRequest()->getParam('id_tipo_arquivo')
            );

            if ($countArquivos < 1) {
                $countArquivos = 1;
            } else {
                $countArquivos += 1;
            }

            $nomeArquivo = $cpf_cnpj . "_" . $rowTipoArquivo->ds_chave_tipo_arquivo . "_" . $countArquivos . "." . end(explode(".",
                $rowBeneficiarioArquivo['ds_nome_arquivo']));

            $Model->update(
                array(
                    'id_tipo_arquivo' => $this->getRequest()->getParam('id_tipo_arquivo'),
                    'ds_nome_arquivo' => $nomeArquivo
                ),
                'id = '. $this->getRequest()->getParam('id_arquivo')
            );

            rename(
              APPLICATION_PATH . '/upload_files/beneficiarios/' . $rowBeneficiarioArquivo['ds_nome_arquivo'],
              APPLICATION_PATH . '/upload_files/beneficiarios/' . $nomeArquivo
            );

            $result = array(
                'status' => true,
                'message' => 'Operação efetuada com sucesso!',
                'id' => $this->getRequest()->getParam('id')
            );

            $adapter->commit();
		} catch (Exception $e) {
            $adapter->rollback();
			$result = array('status' => false, 'message' => $e->getMessage());
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function savependenciaAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

        $usuarioAgroLogado = Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro();
        $result = [
            'status' => true
            , 'message' => 'Pendência cadastrada com sucesso!'
            , 'usuarioAgro' => $usuarioAgroLogado
            , 'idStatusPendente' => Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_PENDENTE
        ];
		$ModelBeneficiariosPendencias = new Seguro_Model_BeneficiariosPendencias();
        $modelBeneficiariosPendenciasArquivos = new Seguro_Model_BeneficiariosPendenciasArquivos();
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        $msg = '';
		$pendencias = $this->getRequest()->getParam('pendencia');
		foreach ($pendencias as $pendencia) {
			$msg .= $pendencia."<br><br>";
		}
		$msg .= $this->getRequest()->getParam('ds_observacao_pendencia');

		$dados = array(
			'id_beneficiario' => $this->getRequest()->getParam('id_beneficiario'),
			'ds_descricao' => nl2br($msg)
		);

        $adapter->beginTransaction();

        $idBeneficiariosPendencias = $ModelBeneficiariosPendencias->save($dados);

		if($idBeneficiariosPendencias) {
            if (Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) {
                try {
                    $modelBeneficiariosPendenciasArquivos->delete($dados['id_beneficiario'], 'id_beneficiario');

                    $deParaPendencias = Sistema_Model_TipoArquivoProcesso::DE_PARA_PENDENCIAS;
                    $chavesPendencias = $this->getRequest()->getParam('ds_chaves_pendencias');
                    $chavesPendencias = explode(",", $chavesPendencias);
            
                    foreach ($chavesPendencias as $chavePendencia) {
                        
                        if (($idTipoArquivoProcesso = array_search($chavePendencia, $deParaPendencias)) !== false) {
                            $dados['id_tipo_arquivo'] = $idTipoArquivoProcesso;
                            $modelBeneficiariosPendenciasArquivos->save($dados);
                        }
                    }
                } catch (\Throwable $th) {
                    $result['message'] = 'Erro ao cadastrar os arquivos pendentes.';
                    $result['status'] = false;
                }
            }

            if (!$usuarioAgroLogado && $result['status']) {
                $usuarioLogado = Zend_Auth::getInstance()->getIdentity();
                $beneficiario = $this->getModel()->find($this->getRequest()->getParam('id_beneficiario'))->current();
                $corretor = (new Sistema_Model_Corretores())->fetchRow(["id_usuario = {$usuarioLogado->id}"]);

                if (empty($corretor)) {
                    $corretor = (new Sistema_Model_Prepostos())->getCorretorByUsuario($usuarioLogado->id);
                }

                $nomeBeneficiario = $beneficiario['ds_nome_beneficiario'];
                $cpfCnpj = $beneficiario['cpf_cnpj'];

                if ($beneficiario['tp_pessoa'] === 'F') {
                    $nomeBeneficiario = explode(" ", $nomeBeneficiario);
                    $nomeBeneficiario = $nomeBeneficiario[0] . str_repeat('.', 20);

                    $inicioCpf = explode('.', $cpfCnpj);
                    $fimCpf = explode('-', $cpfCnpj);

                    $cpfCnpj = "{$inicioCpf[0]}........-{$fimCpf[1]}";
                }

                $body = "Prezado(a),<br><br>";
                $body .= "Foi cadastrada uma nova pendência de documentos de beneficiários.<br><br>";
                $body .= "<i><u>Informações do Corretor</u></i><br>";
                $body .= "{$corretor['ds_nome_corretor']}<br><br>";
                $body .= "<i><u>Informações do Beneficiário</u></i><br>";
                $body .= "ID Beneficiário: {$beneficiario['id']}<br>";
                $body .= "CPF/CNPJ: {$cpfCnpj}<br>";
                $body .= "{$nomeBeneficiario}<br><br>";
                $body .= "Acesse o sistema Agronet 2.0 através do endereço: <a href='http://agronet.agrobrasilseguros.com.br/'>http://agronet.agrobrasilseguros.com.br/</a>";
                $body .= "<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 = new Agro_Mail();
                $email->addTo('tatiana.tondim@agrobrasilseguros.com.br');
                $email->addCc('tiago.zschornack@agrobrasilseguros.com.br');
                $email->addCc('aline.ribeiro@agrobrasilseguros.com.br');
                $email->setSubject("PENDÊNCIA DOCUMENTAÇÃO DE BENEFICIÁRIO");
                $email->setBody($body, 'html');
                $email->send();
            }
		} else {
			$result['message'] = 'Erro ao cadastrar pendência!';
            $result['status'] = false;
		}

        if (!$result['status']) {
            $adapter->rollback();
        } else {
            $adapter->commit();
        }


		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	//conta quantos arquivos já existem para o beneficiario
	public function contaarquivoAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$result = array('status' => false, 'message' => null);

		if ($this->getRequest()->getParam('id_beneficiario') != null) {
			$ModelBeneficiarioArquivo = new Seguro_Model_BeneficiariosArquivos();
			$totalArquivos = $ModelBeneficiarioArquivo->fetchAll("id_beneficiario = {$this->getRequest()->getParam('id_beneficiario')}")->count();


		$this->getResponse()->setBody(Zend_Json::encode($result));}
	}

    /**
     * @param int $idProcesso
     * @param int $idArquivo
     * @param int $idTipoArquivo
     * @param string $filename
     * @param string $fullFilename
     * @return array
     * @throws Exception
     */
    private function transmitirArquivoEssor(int $idProcesso, int $idArquivo, int $idTipoArquivo, string $filename, string $fullFilename) : array {
        if (!file_exists($fullFilename)) {
            return [
              'status' => false,
              'message' => 'Arquivo não encontrada para transmissão.'
            ];
        }

        $wsdl = (APPLICATION_ENV != 'production') ? WSDL_DEV : WSDL_PROD;
        $return = array('status' => false, 'message' => 'Erro na transmissão do arquivo para ESSOR.');

        $ModelProcesso = new Sinistro2_Model_Processos();
        $TipoArquivoProcessos = (new Sistema_Model_TipoArquivoProcesso())->find($idTipoArquivo)->current();
        $nm_chave_valores = $ModelProcesso->getIdentificadorSeguradora($ModelProcesso->getPropostaByProcesso($idProcesso));

        if (empty($nm_chave_valores)) {
            return [
              'status' => false,
              'message' => 'Número identificador do sinistro não encontrado. Verifique se o aviso referente a proposta foi transmitido para Essor.'
            ];
        }

        $base64file = base64_encode(file_get_contents($fullFilename));

        $args = array(
          'Executar' => array(
            'Servico' => 'InserirDocumentoECM',
            'conteudoXML' => '<i4proerp>
									<inserirecmws
										id_tp_documento="'.$TipoArquivoProcessos->id_tipo_documento_seguradora.'"
										id_dominio="4"
										nm_chave_valores="'.$nm_chave_valores.'"
										img_documento_arquivo="'.$filename.'"
										cd_usuario="AgroBrasil WS"
										cd_empresa="230"
										img_documento_content_type="'.mime_content_type($fullFilename).'"
										nm_observacao="'.$TipoArquivoProcessos->ds_tipo_arquivo.'"
										nr_ref="'.$nm_chave_valores.'"
										img_documento="'.$base64file.'"
									/>
								</i4proerp>'
          )
        );

        $client = new SoapClient($wsdl);
        $result = $client->__soapCall('Executar', $args, array('location' => explode('?', $wsdl)[0]));

        if ($result->ExecutarResult) {
            $result_xml  = simplexml_load_string(utf8_encode($result->ExecutarResult), 'SimpleXMLElement', LIBXML_NOCDATA);
            if ($result_xml->sucesso->attributes()->cd_retorno > 0) {
                $return = array('status' => false, 'message' => $result_xml->sucesso->attributes()->nm_retorno);
                return $return;
            } else {
                $LogSinistroArquivosTransmissao = new Log_Model_LogSinistroArquivosTransmissao();
                $dados['id_processo'] = $idProcesso;
                $dados['id_arquivo'] = $idArquivo;
                $dados['id_tipo_arquivo'] = $idTipoArquivo;
                $dados['id_documento_seguradora'] = $result_xml->sucesso->attributes()->id_documento;
                $dados['ds_mensagem'] = $result_xml->sucesso->attributes()->nm_retorno;

                if ($LogSinistroArquivosTransmissao->save($dados)) {
                    $return = array('status' => true, 'message' => 'Transmissão do arquivo para ESSOR efetuada com sucesso.');
                    return $return;
                }
            }
        }

        return $return;
    }

    public function transmitirarquivoessorAction()
    {
        $this->isAjax();

        $retorno = ['status' => true, 'message' => 'Transmissão concluída.'];
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        $modelLogTransmissao = new Log_Model_LogSinistroArquivosTransmissao();
        $modelBeneficiariosArquivosEnvio = new Seguro_Model_BeneficiariosArquivosEnvio();
        $rowsBeneficiariosArquivosEnvio = $modelBeneficiariosArquivosEnvio->fetchAll()->toArray();

        foreach ($rowsBeneficiariosArquivosEnvio as $beneficiarioArquivoEnvio) {
            try {
                $adapter->beginTransaction();

                $modelBeneficiarios = new Seguro_Model_Beneficiarios();
                $rowsProcessosBeneficiarios = $modelBeneficiarios->getProcessosArquivosPermitemTransmissao($beneficiarioArquivoEnvio['id_beneficiario']);

                if (empty($rowsProcessosBeneficiarios)) {
                    $mensagem = "Transmissão de arquivos não realizada. Para transmissão dos arquivos, é necessário";
                    $mensagem .= " que os seguintes requisito sejam atendidos:";
                    $mensagem .= "\n- Status dos arquivos esteja como '4 - Análise concluída'";
                    $mensagem .= "\n- Liquidação do processo como 'Pendente de Pagamento'";

                    throw new Exception($mensagem);
                }

                $modelBeneficiariosArquivos = new Seguro_Model_BeneficiariosArquivos();
                $rowBeneficiariosArquivo = $modelBeneficiariosArquivos->getRow($beneficiarioArquivoEnvio['id_arquivo']);

                if (empty($rowBeneficiariosArquivo)) {
                    throw new Exception('Arquivo não encontrado para o beneficiário.');
                }

                foreach ($rowsProcessosBeneficiarios as $dadosProcesso) {
                    $processo = (int)$dadosProcesso['id_processo'];

                    if (!empty($idProcesso) && (int)$idProcesso !== $processo) {
                        continue;
                    }

                    $rowTransmissao = $modelLogTransmissao->fetchRow([
                      "id_processo = {$processo}",
                      "id_arquivo = {$rowBeneficiariosArquivo['id']}",
                      "id_tipo_arquivo = {$rowBeneficiariosArquivo['id_tipo_arquivo']}"
                    ]);

                    if (!empty($rowTransmissao)) {
                        continue;
                    }

                    $retornoTransmissao = $this->transmitirArquivoEssor(
                      $processo,
                      (int)$rowBeneficiariosArquivo['id'],
                      (int)$rowBeneficiariosArquivo['id_tipo_arquivo'],
                      $rowBeneficiariosArquivo['ds_nome_arquivo'],
                      APPLICATION_PATH . "/upload_files/beneficiarios/{$rowBeneficiariosArquivo['ds_nome_arquivo']}"
                    );

                    if ($retornoTransmissao['status'] === false) {
                        continue;
                    }
                }

                $modelBeneficiariosArquivosEnvio = new Seguro_Model_BeneficiariosArquivosEnvio();
                $modelBeneficiariosArquivosEnvio->delete($beneficiarioArquivoEnvio['id_arquivo'], 'id_arquivo');

                $adapter->commit();
            } catch (Exception $erro) {
                $adapter->rollback();
            }
        }

        return $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    private function salvarArquivosFilaTransmissao(int $idBeneficiario)
    {
        $modelBeneficiariosArquivos = new Seguro_Model_BeneficiariosArquivos();
        $rowsBeneficiariosArquivos = $modelBeneficiariosArquivos->getArquivosVigenciaAtual($idBeneficiario);

        if (empty($rowsBeneficiariosArquivos)) {
            return false;
        }

        foreach ($rowsBeneficiariosArquivos as $beneficiarioArquivo) {
            $modelBeneficiariosArquivosEnvio = new Seguro_Model_BeneficiariosArquivosEnvio();

            $dados = [
              'id_arquivo' => $beneficiarioArquivo['id'],
              'id_beneficiario' => $idBeneficiario,
            ];
            if (!$modelBeneficiariosArquivosEnvio->save($dados)) {
                throw new Exception('Erro ao salvar o arquivo de beneficiário na fila de transmissão.');
            }
        }

        return true;
    }

    private function removerArquivosFilaTransmissao(int $idBeneficiario)
    {
        $modelBeneficiariosArquivos = new Seguro_Model_BeneficiariosArquivos();
        $rowsBeneficiariosArquivos = $modelBeneficiariosArquivos->getArquivos($idBeneficiario);

        if (empty($rowsBeneficiariosArquivos)) {
            return false;
        }

        foreach ($rowsBeneficiariosArquivos as $beneficiarioArquivo) {
            $modelBeneficiariosArquivosEnvio = new Seguro_Model_BeneficiariosArquivosEnvio();
            $modelBeneficiariosArquivosEnvio->delete($beneficiarioArquivo['id'], 'id_arquivo');
        }

        return true;
    }

    public function forcartransmissaoarquivobeneficiarioAction()
    {
        $this->isAjax();

        $idBeneficiario = $this->getRequest()->getParam('id_beneficiario');
        $idArquivo = $this->getRequest()->getParam('id_aquivo');

        try {
            $modelBeneficiariosArquivosEnvio = new Seguro_Model_BeneficiariosArquivosEnvio();
            $dados = ['id_arquivo' => $idArquivo, 'id_beneficiario' => $idBeneficiario];

            if (!$modelBeneficiariosArquivosEnvio->save($dados)) {
                throw new Exception('Erro ao salvar o arquivo de beneficiário na fila de transmissão.');
            }

            $this->transmitirarquivoessorAction();
        } catch (Exception $erro) {
            return $this->getResponse()->setBody(Zend_Json::encode([
              'status' => false, 'message' => 'Erro ao transmitir arquivo'
            ]));
        }
    }

    public function reaproveitararquivosAction()
    {
        $this->isAjax();

        $retorno = ['erro' => false, 'mensagem' => 'Arquivo(s) salvo(s) com sucesso.'];
        $parametros = $this->getRequest()->getParams();
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            $modelBeneficiariosArquivos = new Seguro_Model_BeneficiariosArquivos();
            $rowsBeneficiariosArquivos = $modelBeneficiariosArquivos->fetchAll(["id in (" . implode(', ', $parametros['arquivos']) . ")"])->toArray();

            foreach ($rowsBeneficiariosArquivos as $row) {
                $dados = [
                  'id_tipo_arquivo' => $row['id_tipo_arquivo'],
                  'arquivo' => $row['ds_nome_arquivo'],
                  'id_beneficiario' => $row['id_beneficiario'],
                  'fl_arquivo_reaproveitado' => true,
                  'fl_vigencia_atual' => true,
                ];

                if (!$modelBeneficiariosArquivos->save($dados)) {
                    throw new Exception('Erro ao salvar o arquivo.');
                }
            }

            $this->atualizarStatusArquivosNaoAnalisado($parametros['id_beneficiario'], $parametros['tipoPessoa']);

            $adapter->commit();
        } catch (Exception $erro) {
            $adapter->rollback();
            $retorno = ['erro' => false, 'mensagem' => $erro->getMessage()];
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    private function atualizarStatusArquivosNaoAnalisado(int $idBeneficiario, string $tipoPessoa)
    {
        $modelBeneficiarios = $this->getModel();
        $rowBeneficiario = $modelBeneficiarios->getRow($idBeneficiario);

        if ($rowBeneficiario['id_status_arquivos'] == Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_PENDENTE) {
            $arquivosPendentes = (new Seguro_Model_BeneficiariosPendenciasArquivos())->getArquivosPendentesByBeneficiario($idBeneficiario);

            if (!empty($arquivosPendentes)) {
                return;
            }
        }

        $tiposArquivosCadastrados = [];
        $rowsBeneficiariosArquivos = (new Seguro_Model_BeneficiariosArquivos())->getArquivosVigenciaAtual($idBeneficiario);

        foreach ($rowsBeneficiariosArquivos as $rowBeneficiarioArquivo) {
            $tiposArquivosCadastrados[$rowBeneficiarioArquivo['id_tipo_arquivo']] = $rowBeneficiarioArquivo['id_tipo_arquivo'];
        }

        $arquivosPendentes = $this->validarArquivosObrigatorios($rowBeneficiario, $tiposArquivosCadastrados, false);

        if (!$arquivosPendentes) {
            $informacoesBancarias = $this->getInformacoesBancarias($idBeneficiario);

            if (!empty($informacoesBancarias)) {

                $rowBeneficiario['id_status_arquivos'] = Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ANALISADO;
                $modelPropostas = new Seguro_Model_PropostasBeneficiarios();
                $modelCronometro = new Sinistro2_Model_CronometroRegulacao();
                $serviceAvisosEncerramento = new Sinistro2_Service_AvisoEncerramentoColheita();
                $propostas = $modelPropostas->getPropostasByBeneficiarioId($rowBeneficiario['id']);

                if (!$rowBeneficiario->save()) {
                    throw new Exception('Erro ao atualizar o status dos arquivos.');
                }

                foreach($propostas as $proposta){
                    if($proposta['dt_transmissao'] > DATA_INICIO_NOVA_LEI_SEGURO){
                        $cronometros = $modelCronometro->getByProposta($proposta['id_proposta']);

                        if($cronometros){
                            foreach($cronometros as $cronometro){
                                $modelCronometro->reativar($cronometro);
                            }
                        }
                        $serviceAvisosEncerramento->criaMultiplosCronometrosRegulacaoPorProposta($proposta['id_proposta']);
                        
                    }
                }

                $dadosLogBeneficiariosArquivosStatus = [
                  'id_beneficiario' => $idBeneficiario,
                  'id_status' => Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ANALISADO,
                ];

                if (!(new Log_Model_LogBeneficiariosArquivosStatus())->save($dadosLogBeneficiariosArquivosStatus)) {
                    throw new Exception('Erro ao salvar o log de alteração do status.');
                }
            }
        }
    }

    public function gethistoricoalteracoesstatusAction()
    {
        $this->isAjax();

        return $this->getResponse()->setBody(Zend_Json::encode(
          (new Log_Model_LogBeneficiariosArquivosStatus())->getDados((int) $this->getRequest()->getParam('idBeneficiario'))->toArray())
        );
    }

    private function getInformacoesBancarias(int $idBeneficiario)
    {
        $rowBeneficiario = (new Seguro_Model_InformacoesBancariasBeneficiarios())->fetchAll(["id_beneficiario = {$idBeneficiario}"])->current();

        if (empty($rowBeneficiario)) {
            return null;
        }

        $informacoesBancarias = (new Sistema_Model_InformacoesBancarias())->find($rowBeneficiario['id_informacoes_bancarias'])->current()->toArray();
        $informacoesBancarias['id_informacoes_bancarias_beneficiarios'] = $rowBeneficiario['id'];
        $informacoesBancarias['id_forma_pagamento'] = $rowBeneficiario['id_forma_pagamento'];

        return $informacoesBancarias;
    }

    public function salvarinformacoesbancariasAction()
    {
        $this->isAjax();

        $parametros = $this->getRequest()->getParams();
        $retorno = ['erro' => false, 'mensagem' => 'Dados bancários salvos com sucesso.'];
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            $temTodosDados = true;
            $mensagem = "Os seguintes campos são de preenchimento obrigatório:";
            $mensagem .= "\n- Forma de Pagamento";
            $mensagem .= "\n- Banco";
            $mensagem .= "\n- Agência (dígito não é obrigatório)";

            if (empty($parametros['id_banco']) || empty($parametros['ds_agencia']) || empty($parametros['id_forma_pagamento'])) {
                $temTodosDados = false;
            }

            if (empty($parametros['ds_conta']) && (int) $parametros['id_forma_pagamento'] !== Sistema_Model_FormasPagamento::ID_STATUS_ORDEM_PAGAMENTO) {
                $mensagem .= "\n- Conta (dígito não é obrigatório)";
                $temTodosDados = false;
            }

            if (!$temTodosDados) {
                throw new Exception($mensagem);
            }

            $parametros['id'] = $parametros['id_informacoes_bancarias'];
            $rowInformacoesBancarias = (new Sistema_Model_InformacoesBancarias())->save($parametros);

            if (!$rowInformacoesBancarias) {
                throw new Exception('Erro ao salvar as informações bancárias');
            }

            $parametros['id'] = $parametros['id_informacoes_bancarias_beneficiarios'];
            $parametros['id_informacoes_bancarias'] = $rowInformacoesBancarias['id'];

            $rowInformacoesBancariasBeneficiarios = (new Seguro_Model_InformacoesBancariasBeneficiarios())->save($parametros);

            if (!$rowInformacoesBancariasBeneficiarios) {
                throw new Exception('Erro ao salvar as informações bancárias');
            }

            $retorno['id_informacoes_bancarias'] = $rowInformacoesBancarias['id'];
            $retorno['id_informacoes_bancarias_beneficiarios'] = $rowInformacoesBancariasBeneficiarios['id'];

            $saveLogAlteracoesInformacoesBancarias = (new Log_Model_LogAlteracoesInformacoesBancariasBeneficiarios())->save([
              'id_informacoes_bancarias_beneficiarios' => $rowInformacoesBancariasBeneficiarios['id'],
              'ds_informacoes_bancarias' => json_encode([
                'id_banco' => $parametros['id_banco'],
                'ds_agencia' => $parametros['ds_agencia'],
                'ds_conta' => $parametros['ds_conta'],
                'ds_observacao' => $parametros['ds_observacao'],
                'ds_tipo_conta' => $parametros['ds_tipo_conta'],
                'nu_digito_agencia' => $parametros['nu_digito_agencia'],
                'nu_digito_conta' => $parametros['nu_digito_conta'],
              ])
            ]);

            if (!$saveLogAlteracoesInformacoesBancarias) {
                throw new Exception('Erro ao salvar o log das alterações bancárias');
            }

            $this->atualizarStatusArquivosNaoAnalisado($parametros['id_beneficiario'], $parametros['tipoPessoa']);

            $adapter->commit();
        } catch (Exception $erro) {
            $adapter->rollback();
            $retorno = ['erro' => true, 'mensagem' => $erro->getMessage()];
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    public function beneficiariosnaoanalisadosAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        $beneficiarios = $this->getModel()->fetchAll(["id_status_arquivos = " . Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ANALISADO], 'ds_nome_beneficiario');

        foreach($beneficiarios as $beneficiario){

            if($beneficiario['tp_pessoa'] == "F"){ // quando constar no cadastro que é pessoa física
                // Separa primeiro nome e trata
                $beneficiario['ds_nome_beneficiario'] = ucfirst(mb_strtolower(substr($beneficiario['ds_nome_beneficiario'], 0, strpos($beneficiario['ds_nome_beneficiario'], ' '))));
                // Adiciona máscara ao CPF;
                $beneficiario['cpf_cnpj'] = substr_replace($beneficiario['cpf_cnpj'], '***.***.***',0,11);
            }

        }

        if (!empty($beneficiarios->count())) {
            $csv = new Agro_Plugin_Rs2Csv();
            $csv->setRecordSet($beneficiarios);
            $csv->setType("application/octet-stream");
            $csv->setFileName("relatorio_beneficiarios_nao_analisados.csv"); 
            $csv->setDisposition("attachment");
            $csv->setTitles([
                'id' => 'ID',
                'cpf_cnpj' => 'CPF/CNPJ',
                'ds_nome_beneficiario' => 'Nome do Beneficiário'
            ]);
            $csv->setSeparator(";");

            $fileName = $csv->getFileName();
            $csv->getCsv(false);

            $agroMail = new Agro_Mail();
            $agroMail->addTo("tatiana.tondim@agrobrasilseguros.com.br");
            $agroMail->addCc("tiago.zschornack@agrobrasilseguros.com.br");
            $agroMail->addCc("aline.ribeiro@agrobrasilseguros.com.br");
            $agroMail->setSubject('Relatório de Beneficiários Não Analisados');
            $agroMail->setBody($this->view->render('beneficiario/emailbeneficiariosnaoanalisados.phtml'));

            $caminhoArquivo = APPLICATION_PATH . "/upload_files/relatorio/{$fileName}";
            $conteudoArquivo = file_get_contents($caminhoArquivo);

            $anexoCapacidade = new Zend_Mime_Part($conteudoArquivo);
            $anexoCapacidade->type = mime_content_type($caminhoArquivo);
            $anexoCapacidade->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
            $anexoCapacidade->encoding = Zend_Mime::ENCODING_BASE64;
            $anexoCapacidade->filename = basename($caminhoArquivo);

            $agroMail->addAttachment($anexoCapacidade);

            $agroMail->send();
        }
    }

    public function getalteracoesinformacoesbancariasAction()
    {
        $this->isAjax();

        $retorno = [];
        $rowLogAlteracoes = (new Log_Model_LogAlteracoesInformacoesBancariasBeneficiarios())->getDados((int) $this->getRequest()->getParam('idBeneficiario'))->toArray();

        foreach ($rowLogAlteracoes as $row) {
            $informacoesBancarias = json_decode($row['ds_informacoes_bancarias']);
            $rowBanco = (new Sistema_Model_Bancos())->find($informacoesBancarias->id_banco)->current();

            $retorno[] = [
              'data_hora_criacao' => $row['data_criacao'],
              'nome_usuario' => $row['ds_nome_usuario'],
              'forma_pagamento' => $row['ds_forma_pagamento'],
              'banco' => $rowBanco['ds_nome_banco'],
              'agencia_digito' => "{$informacoesBancarias->ds_agencia}-{$informacoesBancarias->nu_digito_agencia}",
              'conta_digito' => "{$informacoesBancarias->ds_conta}-{$informacoesBancarias->nu_digito_conta}",
            ];
        }

        return $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    private function atualizarInformacoesBancariasPropostas(int $idBeneficiario)
    {
        $rowsProcessosLiquidacoes = $this->getModel()->getProcessosLiquidacoesByBeneficiario($idBeneficiario);
        $propostasAlteracao = [];
        $propostasAnaliseDadosBancarios = [];
        $cpfCnpj = '';

        foreach ($rowsProcessosLiquidacoes as $row) {
            if (empty($row['id_processo'])) {
                continue;
            }

            $statusLiquidacaoInvalidos = [
              Sinistro2_Model_Liquidacoes::ID_STATUS_SEM_INDENIZACAO,
              Sinistro2_Model_Liquidacoes::ID_STATUS_INDENIZACAO_PAGA
            ];

            $statusLiquidacaoInvalidosAnaliseDadosBancarios = [
                Sinistro2_Model_Liquidacoes::ID_STATUS_ENVIADA_SEGURADORA,
                Sinistro2_Model_Liquidacoes::ID_STATUS_AGUARDANDO_ENVIO_SEGURADORA
            ];

            if (in_array($row['status_liquidacao'], $statusLiquidacaoInvalidos)) {
                continue;
            }

            /**
             * Status em que é possível ainda assim salvar os dados bancários, caso não haja registro na tabela
             * seguro.propostas_beneficiarios, ou haja mas sem as informações bancárias
             */
            if (in_array($row['status_liquidacao'], $statusLiquidacaoInvalidosAnaliseDadosBancarios)) {
                if (!in_array($row['id_proposta'], $propostasAnaliseDadosBancarios) && !in_array($row['id_proposta'], $propostasAlteracao)) {
                    $propostasAnaliseDadosBancarios[] = $row['id_proposta'];
                    $cpfCnpj = $row['cpf_cnpj'];
                }

                continue;
            }

            if (in_array($row['id_proposta'], $propostasAlteracao) || in_array($row['id_proposta'], $propostasAnaliseDadosBancarios)) {
                continue;
            }

            $cpfCnpj = $row['cpf_cnpj'];
            $propostasAlteracao[] = $row['id_proposta'];
        }

        if (!empty($propostasAlteracao) || !empty($propostasAnaliseDadosBancarios)) {
            $informacoesBancarias = $this->getInformacoesBancarias($idBeneficiario);

            $modelSeguroInformacoesBancarias = new Seguro_Model_InformacoesBancarias();
            $rowsSeguroInformacoesBancarias = $modelSeguroInformacoesBancarias->getInformacoesBancariasByCpfCnpj($cpfCnpj)->toArray();

            if (!empty($informacoesBancarias)) {
                $dadosBancarios = [
                    'cpf_cnpj' => $cpfCnpj,
                    'id_banco' => $informacoesBancarias['id_banco'],
                    'nu_conta_corrente' => $informacoesBancarias['ds_conta'],
                    'nu_digito_conta_corrente' => $informacoesBancarias['nu_digito_conta'],
                    'nu_agencia' => $informacoesBancarias['ds_agencia'],
                    'nu_digito_agencia' => $informacoesBancarias['nu_digito_agencia'],
                    'id_forma_pagamento' => $informacoesBancarias['id_forma_pagamento'],
                ];

                foreach ($propostasAlteracao as $proposta) {
                    $modelSeguroInformacoesBancarias->deleteByPropostaCpfCnpj($proposta, $cpfCnpj);
                    $dadosBancarios['id_proposta'] = $proposta;

                    if (!$modelSeguroInformacoesBancarias->save($dadosBancarios)) {
                        throw new Exception('Erro ao atualizar as informações bancárias.');
                    }
                }

                $propostasInseridas = [];

                foreach ($propostasAnaliseDadosBancarios as $proposta) {
                    if (in_array($proposta, $propostasInseridas)) {
                        continue;
                    }

                    $dadosBancarios['id'] = null;

                    $dadosInformacoesBancarias = array_filter($rowsSeguroInformacoesBancarias, function($registro) use ($proposta, $cpfCnpj) {
                        return (int) $registro['id_proposta'] === (int) $proposta && trim($registro['cpf_cnpj']) === trim($cpfCnpj);
                    });

                    $semDadosBancariosProposta = false;

                    if (!empty($dadosInformacoesBancarias)) {
                        $dados = current($dadosInformacoesBancarias);
                        $dadosBancarios['id'] = $dados['id'];
                        $semDadosBancariosProposta = array_filter($dadosInformacoesBancarias, function($registro) {
                            return empty($registro['id_banco']) && empty($registro['nu_conta_corrente']) && empty($registro['nu_digito_conta_corrente']) && empty($registro['nu_agencia']) && empty($registro['nu_digito_agencia']);
                        });
                    }

                    if (empty($dadosInformacoesBancarias) || $semDadosBancariosProposta) {
                        $propostasInseridas[] = $proposta;
                        $dadosBancarios['id_proposta'] = $proposta;

                        if (!$modelSeguroInformacoesBancarias->save($dadosBancarios)) {
                            throw new Exception('Erro ao atualizar as informações bancárias.');
                        }
                    }
                }
            }
        }
    }

    public function getarquivostipobeneficiarioAction()
    {
        $this->isAjax();

        $this->getResponse()->setBody(Zend_Json::encode(
            Seguro_Model_TiposBeneficiarios::getArquivosByTipoBeneficiario((int) $this->getRequest()->getParam('idTipoBeneficiario'))
        ));
    }

    public function validarclausulabeneficiariaAction()
    {
        $this->isAjax();

        $modelPropostaBeneficiarios = new Endosso_Model_Proposta_Beneficiarios();
        $totalQuantia = 0;

        try {
            foreach ($this->_requestParams['beneficiario'] as $item) {
                if ($item['change']) {
                    if ($item['ds_tipo_conta'] === 'n') {
                        if (!$item['ds_nome_beneficiarios']) {
                            throw new Exception('É necessário informar o nome do beneficiário para realizar o cadastro.');
                        }

                        if ((!$item['dt_nascimento_beneficiario']) && ($item['tp_pessoa'] == 'F')) {
                            throw new Exception('É necessário informar a data de nascimento para realizar o cadastro.');
                        }

                        if (!$item['id_tipo_beneficiario']) {
                            throw new Exception('É necessário informar o tipo de beneficiário para realizar o cadastro.');
                        }

                        if ($item['fl_nome_social'] && empty(trim($item['ds_nome_social']))) {
                            throw new Exception('É necessário informar o nome social do beneficiário para realizar o cadastro.');
                        }

                    } else if ($item['ds_tipo_conta'] == 's') {
                        if (!$item['id_banco']) {
                            throw new Exception('É necessário informar o banco para realizar o cadastro.');
                        }

                        if (!$item['ds_qualidade_beneficiario']) {
                            throw new Exception('É necessário informar a qualidade para realizar o cadastro.');
                        }
                    }

                    if (!trim($item['nr_cpf_cnpj'])) {
                        throw new Exception('É necessário informar o CPF/CNPJ para realizar o cadastro.');
                    }

                    if (!$item['vl_limite_beneficio'] || !Agro_Util::isNumeroMaiorQueZero($item['vl_limite_beneficio'])) {
                        throw new Exception('É necessário informar o valor do beneficio para realizar o cadastro.');
                    }

                    $Proposta = (new Seguro_Model_Propostas())->find($this->_requestParams['id_proposta'])->current();
                    $corretor = $Proposta->corretor();

                    if (!empty($item['ds_email_beneficiario'])) {
                        if ($corretor['ds_email'] == $item['ds_email_beneficiario'] ||
                            $corretor['ds_email_2'] == $item['ds_email_beneficiario'] ||
                            $corretor['ds_email_responsavel'] == $item['ds_email_beneficiario'] ||
                            $corretor['ds_email_contato_outros'] == $item['ds_email_beneficiario'] ||
                            $corretor['ds_email_contato_outros_2'] == $item['ds_email_beneficiario']) {
                            throw new Exception('Informar e-mail do Beneficiário, pois este e-mail está cadastrado para o Corretor.');
                        }
                    }

                    if (!empty($item['ds_email_instituicao_financeira'])) {
                        if ($corretor['ds_email'] == $item['ds_email_instituicao_financeira'] ||
                            $corretor['ds_email_2'] == $item['ds_email_instituicao_financeira'] ||
                            $corretor['ds_email_responsavel'] == $item['ds_email_instituicao_financeira'] ||
                            $corretor['ds_email_contato_outros'] == $item['ds_email_instituicao_financeira'] ||
                            $corretor['ds_email_contato_outros_2'] == $item['ds_email_instituicao_financeira']) {
                            throw new Exception('Informar e-mail do responsável vinculado ao financiamento, pois este e-mail está cadastrado para o Corretor.');
                        }
                    }

                    $totalQuantia = $totalQuantia + Agro_Util::formatCurrencyDb($item['vl_limite_beneficio']);
                }
            }

            if ($totalQuantia > $modelPropostaBeneficiarios->getLmgaProposta((int) $this->_requestParams['id_proposta'])) {
                throw new Exception('Não é possível salvar o beneficiário, pois a quantia ultrapassa o valor da LMGA.');
            }
        } catch (Exception $erro) {
            $this->_return['erro'] = true;
            $this->_return['mensagem'] = $erro->getMessage();
        }

        $this->getResponse()->setBody(Zend_Json::encode($this->_return));
    }

    public function liberaratualizacaodocumentacaoAction()
    {
        $this->isAjax();

        $modelBeneficiarios = $this->getModel();
        $beneficiarios = $modelBeneficiarios->getBeneficiariosPrazoDocumentacaoExpirada();
        $idSafraAtual = (new Produto_Model_Safras())->safraCurrent;
        $beneficiariosAtualizados = [];
        $beneficiariosAtualizar = [];
        $corretoresBeneficiarios = [];
        $retorno = ['erro' => false, 'mensagem' => 'Atualização concluída com sucesso.'];

        foreach ($beneficiarios as $beneficiario) {
            $rows = $modelBeneficiarios->getPropostasProcessoAvisoEncerramentoBeneficiarios(
                (int) $beneficiario['id'],
                [$idSafraAtual, $idSafraAtual - 1]
            )->toArray();

            if (empty($rows)) {
                continue;
            }

            foreach ($rows as $row) {
                if (empty($row['id_processo']) || (!empty($row['id_processo']) && empty($row['id_aviso_encerramento']))) {
                    if (!in_array($beneficiario['id'], $beneficiariosAtualizar)) {
                        $beneficiariosAtualizar[] = $beneficiario['id'];
                    }

                    $corretoresBeneficiarios[$row['id_usuario_proposta']][$beneficiario['id']] = [
                        'cpfCnpj' => $beneficiario['cpf_cnpj'],
                        'nome' => $beneficiario['ds_nome_beneficiario'],
                        'tipoPessoa' => $beneficiario['tp_pessoa'],
                    ];
                }
            }
        }

        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $modelBeneficiariosArquivos = new Seguro_Model_BeneficiariosArquivos();
            $modelLogBeneficiariosArquivosStatus = new Log_Model_LogBeneficiariosArquivosStatus();

            foreach ($beneficiariosAtualizar as $idBeneficiario) {
                $adapter->beginTransaction();

                $rowBeneficiario = $modelBeneficiarios->getRow($idBeneficiario);
                $rowBeneficiario->id_status_arquivos = Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ENVIADO;
                $rowBeneficiario->dt_arquivo_antigo_vigencia_atual = null;

                if (!$rowBeneficiario->save()) {
                    throw new Exception("Erro ao atualizar o status do beneficiário ID {$idBeneficiario}.");
                }

                $modelBeneficiariosArquivos->limparVigenciaAtualBeneficiario((int) $idBeneficiario);

                $dadosLogBeneficiariosArquivosStatus = [
                    'id_beneficiario' => $idBeneficiario,
                    'id_status' => Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ENVIADO,
                ];

                if (!$modelLogBeneficiariosArquivosStatus->save($dadosLogBeneficiariosArquivosStatus)) {
                    throw new Exception("Erro ao salvar o log de alteração do status do beneficiário ID {$idBeneficiario}.");
                }

                $beneficiariosAtualizados[] = $idBeneficiario;

                $adapter->commit();
            }
        } catch (Exception $erro) {
            $adapter->rollback();

            $retorno['mensagem'] .= " Porém, inconsistências foram encontradas em alguns beneficiários.";
        }

        $modelCorretores = new Sistema_Model_Corretores();
        $modelPrepostos = new Sistema_Model_Prepostos();

        foreach ($corretoresBeneficiarios as $idUsuarioCorretor => $beneficiarios) {
            $bodyDadosBeneficiario = '';

            foreach ($beneficiarios as $idBeneficiario => $beneficiario) {
                if (!in_array($idBeneficiario, $beneficiariosAtualizados)) {
                    continue;
                }

                $cpfCnpj = "CNPJ";

                if ($beneficiario['tipoPessoa'] === 'F') {
                    $cpfCnpj = "CPF";
                    $beneficiario['nome'] = Agro_Util::mascararNome($beneficiario['nome']);
                    $beneficiario['cpfCnpj'] = Agro_Util::mascararCpf($beneficiario['cpfCnpj']);
                }

                $bodyDadosBeneficiario .= "{$cpfCnpj}: {$beneficiario['cpfCnpj']}";
                $bodyDadosBeneficiario .= "<br>Nome: {$beneficiario['nome']}<br><br>";
            }

            if (empty($bodyDadosBeneficiario)) {
                continue;
            }

            $rowCorretor = $modelCorretores->findByUser($idUsuarioCorretor);

            if (empty($rowCorretor)) {
                $rowPreposto = $modelPrepostos->findByUser($idUsuarioCorretor);
                $rowCorretor = $modelCorretores->getRow($rowPreposto['id_corretor']);
            }

            $body = "Prezado Corretor,";
            $body .= "<br><br>O prazo de validade da documentação da cláusula beneficiária expirou. Favor verificar o sistema e inserir documentos atualizados.";
            $body .= "<br><br>No AgroNet:";
            $body .= "<br>-> Seguro > Beneficiários";
            $body .= "<br>- Selecionar o beneficiário e pesquisar";
            $body .= "<br>- Clicar em ‘Ações’";
            $body .= "<br>ou";
            $body .= "<br>-> Sinistro > Meus Processos";
            $body .= "<br>- Pesquisar proposta";
            $body .= "<br>- Clicar na lupa em ‘Ações’";
            $body .= "<br>- Campo ‘Dados dos beneficiários’ > clicar novamente na lupa";
            $body .= "<br><br>Informações do(s) beneficiário(s)<br>";

            $body .= $bodyDadosBeneficiario;

            $body .= "Acesse o sistema Agronet 2.0 através do endereço: <a href='http://agronet.agrobrasilseguros.com.br/'>http://agronet.agrobrasilseguros.com.br/</a>";
            $body .= "<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 = new Agro_Mail();
            $email->addTo($rowCorretor['ds_email']);
            $email->setSubject("Atualizar Documentação de Beneficiário");
            $email->setBody($body, 'html');
            $email->send();

            sleep(60);
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    private function salvarDataBasePagamento(int $idBeneficiario)
    {
        $modelAvisoEncerramentoDataBase = new Sinistro2_Model_AvisosEncerramentoDataBase();
        $registros = $this->getModel()->getDataBasePagamentoByBeneficiario($idBeneficiario);

        foreach ($registros as $registro) {
            $maiorData = $registro['data_aviso_encerramento'];

            if (!empty($registro['maior_data_arquivos_segurado']) && Agro_Util::contarDiasEntreDatas($maiorData, $registro['maior_data_arquivos_segurado']) > 0) {
                $maiorData = $registro['maior_data_arquivos_segurado'];
            }

            if (!empty($registro['maior_data_arquivos_beneficiario']) && Agro_Util::contarDiasEntreDatas($maiorData, $registro['maior_data_arquivos_beneficiario']) > 0) {
                $maiorData = $registro['maior_data_arquivos_beneficiario'];
            }

            $modelAvisoEncerramentoDataBase->save([
                'id_aviso_encerramento' => $registro['id_aviso_encerramento'],
                'dt_base' => $maiorData,
            ]);
        }
    }

    public function checkpropostaAction() {
		$this->isAjax();

		$result = array();

		$PropostasBeneficiarios = new Seguro_Model_PropostasBeneficiarios();
		$PropostasCorretores = new Seguro_Model_PropostasCorretores();

		$corretor = $PropostasCorretores->getIdCorredorByProposta($this->getRequest()->getParam('id_proposta'));

		$beneficiario = $PropostasBeneficiarios->fetchAll(
            'id_proposta = ' . $this->getRequest()->getParam('id_proposta')
            . ' and nr_cpf_cnpj = \'' . $this->getRequest()->getParam('cpf_cnpj') . '\''
        )->count();

		if ($beneficiario > 0) {
			$result = array('status' => true, 'message' => $corretor->id);
		} else {
			$result = array('status' => false, 'message' => 'Proposta informada não pertence a este beneficiário.');
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

    public function listrestricoesAction() {
		$this->getHelper('layout')->disableLayout();
		
		$this->view->paginator = (new Seguro_Model_BeneficiarioRestricaoTecnica())
            ->getRestricoesByBeneficiario((int) $this->getRequest()->getParam('id'));
	}

    public function deleterestricaoAction() {
		$this->isAjax();

		$modelBeneficiarioRestricaoTecnica = new Seguro_Model_BeneficiarioRestricaoTecnica();

		$modelBeneficiarioRestricaoTecnica->getDefaultAdapter()->beginTransaction();

		try {
			(new Seguro_Model_RestricaoTecnicaBeneficiarioRestricaoTecnica())
                ->delete($this->getRequest()->getParam('id'), 'id_beneficiario_restricao_tecnica');
            (new Seguro_Model_HistoricoBeneficiarioRestricaoTecnica())
                ->delete($this->getRequest()->getParam('id'), 'id_beneficiario_restricao_tecnica');
            (new Seguro_Model_BeneficiarioRestricaoTecnicaProposta())
                ->delete($this->getRequest()->getParam('id'), 'id_beneficiario_restricao_tecnica');
			$modelBeneficiarioRestricaoTecnica->delete($this->getRequest()->getParam('id'));

			$numRestricoes = $modelBeneficiarioRestricaoTecnica->fetchAll(
                'id_beneficiario = ' . $this->getRequest()->getParam('id_beneficiario')
            )->count();

			if($numRestricoes == 0) {
				(new Seguro_Model_Beneficiarios())->update(
                    array('fl_restricao' => 'false'),
                    'id = ' . $this->getRequest()->getParam('id_beneficiario')
                );
			}

			$modelBeneficiarioRestricaoTecnica->getDefaultAdapter()->commit();
			$result = array('status' => true, 'message' => 'Restrição removida com sucesso.', 'count' => $numRestricoes);
		} catch (Exception $e) {
			$modelBeneficiarioRestricaoTecnica->getDefaultAdapter()->rollBack();
			$result = array('status' => false, 'message' => 'Erro ao remover restrição: ('.$e->getMessage().').');
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

    public function editrestricaoAction() {
		$this->isAjax();

		$r = array();

		$idBeneficiarioRestricaoTecnica = $this->getRequest()->getParam('id');

		$beneficiarioRestricao = (new Seguro_Model_BeneficiarioRestricaoTecnica())
            ->fetchRow("id = {$idBeneficiarioRestricaoTecnica}")->toArray();
		$restricoes = (new Seguro_Model_RestricaoTecnicaBeneficiarioRestricaoTecnica())
			->fetchAll("id_beneficiario_restricao_tecnica = {$idBeneficiarioRestricaoTecnica}")
			->toArray();
		$restricoesPropostas = (new Seguro_Model_BeneficiarioRestricaoTecnicaProposta())
			->fetchAll("id_beneficiario_restricao_tecnica = {$idBeneficiarioRestricaoTecnica}")
			->toArray();
        
		foreach($restricoes as $res) {
			array_push($r, $res['id_restricao_tecnica']); 
		}
        
		$beneficiarioRestricao['restricoes'] = $r;
		$beneficiarioRestricao['propostas'] = !empty($restricoesPropostas) 
			? array_column($restricoesPropostas, 'id_proposta')
			: [];

		$this->getResponse()->setBody(Zend_Json::encode($beneficiarioRestricao));
	}

    public function historicorestricaotecnicaAction() {
		$this->getHelper('layout')->disableLayout();
		
		$this->view->historico = (new Seguro_Model_HistoricoBeneficiarioRestricaoTecnica())
			->getHistorico((int) $this->getRequest()->getParam('id'));
	}

    public function saverestricoesAction(): void
    {
        $this->isAjax();
		
		$params = $this->getRequest()->getParams();
		
        $modelProposta = new Seguro_Model_Propostas();
		$modelRestricao = new Seguro_Model_BeneficiarioRestricaoTecnica();
		$modelRestricaoProposta = new Seguro_Model_BeneficiarioRestricaoTecnicaProposta();
		$modelBeneficiarios = new Seguro_Model_Beneficiarios();
		$modelHistorico = new Seguro_Model_HistoricoBeneficiarioRestricaoTecnica();
		
		$adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

		$adapter->beginTransaction();

		try {
			$idRestricao = $modelRestricao->save($params);
			$modelHistorico->save(['id_beneficiario_restricao_tecnica' => $idRestricao]);
			
			$modelBeneficiarios->update(array('fl_restricao' => 'true'), 'id = '. $params['id_beneficiario']);
			
			$modelRestricaoProposta->deleteByIdBeneficiarioRestricaoTecnica($idRestricao);
			$idsPropostaInseridos = [];
			
			foreach ($params['ids_proposta'] as $id) {
				if (!empty($idsPropostaInseridos[$id]) || empty($id)) {
					continue;
				}

                if (empty($modelProposta->find($id)->current())) {
                    throw new Exception("Proposta {$id} não encontrada.");
                }
				
				$modelRestricaoProposta->save(array(
					'id_proposta' => $id,
					'id_beneficiario_restricao_tecnica' => $idRestricao
				));
				$idsPropostaInseridos[$id] = true;
			}

			$adapter->commit();
			$result = array('status' => true, 'message' => 'Restrição salva com sucesso', 'id' => $params['id_beneficiario']);
		} catch (Exception $e) {
			$adapter->rollback();
			$result = array('status' => false, 'message' => 'Erro ao salvar restrição. ('.$e->getMessage().')');
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
    }

    public function listbeneficiariosAction()
    {
        $this->getHelper('layout')->disableLayout();

        $cpfCnpj = htmlspecialchars($this->getRequest()->getParam('cpfCnpj'));

        try {
            $beneficiario = (new Seguro_Model_PropostasProponentes())->getProponenteByCpfCnpj($cpfCnpj);
            if (empty($beneficiario)) {
                $beneficiario = (new Seguro_Model_PropostasBeneficiarios())->getBeneficiarioByCpfCnpj($cpfCnpj);
            }
        
            $this->view->beneficiarios = [];

            if (!empty($beneficiario)) {
                $this->view->beneficiarios = [$beneficiario->toArray()];
            }
        } catch (Exception $e) {
            $this->view->mensagemErro = 'Erro ao buscar beneficiário.';
        }
    }

    public function buscarbeneficiarioAction()
    {
        $this->isAjax();

        $cpfCnpj = $this->getRequest()->getParam('cpf_cnpj');
    
        try {
            $cpfCnpj = htmlspecialchars($cpfCnpj);
            if (empty($cpfCnpj)) {
                throw new Exception('CPF/CNPJ não informado.', 1);
            }

            $lengthCpfCnpj = strlen($cpfCnpj);
            if (($lengthCpfCnpj > 14 && $lengthCpfCnpj != 18) || ($lengthCpfCnpj < 14)) {
                throw new Exception('CPF/CNPJ inválido.', 1);
            }

            $beneficiario = (new Seguro_Model_PropostasProponentes())->getProponenteByCpfCnpj($cpfCnpj);
            if (empty($beneficiario)) {
                $beneficiario = (new Seguro_Model_PropostasBeneficiarios())->getBeneficiarioByCpfCnpj($cpfCnpj);
            }
            
            if (empty($beneficiario)) {
                throw new Exception('Beneficiário não encontrado.', 1);
            }

            $retorno = [
                'erro' => false,
                'beneficiario' => $beneficiario->toArray()
            ];

        } catch (Throwable $e) {
            $retorno = [
                'erro' => true,
                'mensagem'=> $e->getCode() == 1 ? $e->getMessage() : 'Erro ao buscar o beneficiário.'
            ];
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    public function enderecobeneficiarioAction(){
		$this->getHelper('layout')->setLayout('popup');
		$this->view->title 	= 'Endereço do beneficiário';
        $params                 = $this->getRequest()->getParams();
        $ids                    = $params['id'];
        
        if($ids){
            $beneficiarios = array();
            $idsBeneficiarios = explode(',',$ids);
                    foreach($idsBeneficiarios as $id){
                        $beneficiario = ((new Seguro_Model_Beneficiarios())->fetchRow(["id = {$id}"]));
                        if($beneficiario){
                            $idMunicipio = $beneficiario->id_municipio;
			                if($idMunicipio){
				                $Municipio 			= ((new Sistema_Model_Municipios())->fetchRow(["id = {$idMunicipio}"]));
				                $Estado 			= ((new Sistema_Model_Estados())->fetchRow(["id = {$Municipio['id_estado']}"]));
			                }
                            $beneficiarios[$beneficiario['id']] = $beneficiario->toArray();
                            $beneficiarios[$beneficiario['id']]['estado'] = $Estado->ds_sigla;
                            $beneficiarios[$beneficiario['id']]['municipio'] = $Municipio->ds_nome_municipio;
                            $beneficiarios[$beneficiario['id']]['cpf_cnpj'] = $beneficiario->cpf_cnpj;
		                }
            }

            $this->view->beneficiarios = $beneficiarios;
        }

        $this->view->novoBeneficiario = $params['novo'];
	}

    public function isenderecovalidoAction()
    {
        try {
            $infoBeneficiarios = [];
            $this->isAjax();
            $model = $this->getModel();
            $cpfBeneficiarios = $this->getRequest()->getParam('cpf_beneficiarios');
            $todos_enderecos_validos = true;
            foreach ($cpfBeneficiarios as $cpf) {
                if (!Agro_Util::validarCpf($cpf)) {
                    continue;
                }

                $infoEndereco = $model->isEnderecoBeneficiarioValido($cpf);
                $infoBeneficiarios[] = $infoEndereco;
                if (!$infoEndereco['enderecoValido']) {
                    $todos_enderecos_validos = false;
                }
            }

            $retorno = [
                'status' => true,
                'info_beneficiarios' => $infoBeneficiarios,
                'todos_enderecos_validos' => $todos_enderecos_validos
            ];
        } catch (Exception $e) {
            $retorno = [
                'status' =>  false,
                'mensagem' => 'Erro ao validar o(s) beneficiário(s).'
            ];
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }
}
