<?php

class Seguro_Model_Beneficiarios extends Agro_Db_Table_Abstract {
    const ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA = 108;
    const ID_STATUS_ARQUIVOS_NAO_ANALISADO = 106;
    const ID_STATUS_ARQUIVOS_NAO_ENVIADO = 105;
    const ID_STATUS_ARQUIVOS_PENDENTE = 107;

	protected $_schema = 'seguro';
	protected $_name = 'beneficiarios';
	protected $_primary = 'id';
	public $_order = 'ds_nome_beneficiario asc';

	public $_columnExcel = array(
		'id' => 'Id',
		'ds_nome_beneficiario' => 'Nome',
		'cpf_cnpj' => 'CPF_CNPJ',
		'tp_pessoa' => 'Tipo',
		'dt_nascimento' => 'Data',
		'ds_status' => 'Status',
	);

	public function save($data) {
		try {
            $data['ds_tel']                 = $data['ds_endereco_tel'] ? $data['ds_endereco_tel'] : $data['ds_tel'] ;
            $data['ds_endereco_cep']        = $data['ds_endereco_cep'] ? $data['ds_endereco_cep'] : $data['ds_endereco_cep_propriedade_busca'];
			
            $Row = $this->fetchRow("cpf_cnpj = '".$data['cpf_cnpj']."'");
            if (!$Row) {
				$Row = $this->createRow();
			}

			$Row->tp_pessoa                 = $data['tp_pessoa'] ? $data['tp_pessoa'] : $Row->tp_pessoa;
			$Row->ds_nome_beneficiario      = $data['ds_beneficiario'] ? $data['ds_beneficiario'] : $Row->ds_nome_beneficiario;
			$Row->cpf_cnpj                  = $data['cpf_cnpj'] ? $data['cpf_cnpj'] : $Row->cpf_cnpj;
			$Row->id_banco                  = $data['id_banco'] ? $data['id_banco'] : $Row->id_banco;
			$Row->ds_agencia                = $data['ds_agencia'] ? $data['ds_agencia'] : (!empty($Row->ds_agencia) ? $Row->ds_agencia : '');
			$Row->dt_nascimento             = ($data['dt_nascimento'] ? Agro_Util::formatDate($data['dt_nascimento'], Zend_Date::W3C) : (!empty($Row->dt_nascimento) ? $Row->dt_nascimento : null));
			$Row->id_tipo_beneficiario      = $data['id_tipo_beneficiario'] ? $data['id_tipo_beneficiario'] : (!empty($Row->id_tipo_beneficiario) ? $Row->id_tipo_beneficiario : null);
            $Row->fl_restricao              = $data['fl_restricao'] ? 1 : 0;
            $Row->ds_endereco_cep           = $data['ds_endereco_cep'] ? $data['ds_endereco_cep'] : $Row->ds_endereco_cep;
            $Row->id_municipio              = $data['id_municipio'] ? $data['id_municipio'] : $Row->id_municipio;
            $Row->id_estado                 = $data['id_estado'] ? $data['id_estado'] : $Row->id_estado;
            $Row->ds_endereco_bairro        = $data['ds_endereco_bairro'] ? $data['ds_endereco_bairro'] : $Row->ds_endereco_bairro;
            $Row->ds_endereco_logradouro    = $data['ds_endereco_logradouro'] ? $data['ds_endereco_logradouro'] : $Row->ds_endereco_logradouro;
            $Row->ds_endereco_nro           = $data['ds_endereco_nro'] ? $data['ds_endereco_nro'] : $Row->ds_endereco_nro;
            $Row->ds_endereco_complem       = $data['ds_endereco_complem'];
            $Row->ds_tel                    = $data['ds_tel'] ? $data['ds_tel'] : $Row->ds_tel;
            $Row->ds_email                  = $data['ds_email'] ? $data['ds_email'] : $Row->ds_email;
            if (array_key_exists('dt_arquivo_antigo_vigencia_atual', $data)) {
                $Row->dt_arquivo_antigo_vigencia_atual = $data['dt_arquivo_antigo_vigencia_atual'];
            }

            $rowSave = $Row->save();

			return $rowSave ? $Row : false;

		} catch (Exception $e) {
			if ($e->getCode() == 23505) {
				$this->setMessage(MSG_CPFCNPJ_EXISTENTE);
			} else {
			    $this->setMessage($e->getMessage());
			}

			return false;
		}
	}

	public function saveByCpfCnpj($data) {
		$Row = $this->fetchRow("cpf_cnpj = '{$data['cpf_cnpj']}'");
		if (!$Row) $Row = $this->createRow();

		$Row->tp_pessoa = $data['tp_pessoa'] ? $data['tp_pessoa'] : null;
		$Row->ds_nome_beneficiario = $data['ds_nome_beneficiario'];
		$Row->cpf_cnpj = $data['cpf_cnpj'];
		$Row->id_banco = ($data['id_banco'] ? $data['id_banco'] : null);
		$Row->ds_agencia = ($data['ds_agencia'] ? $data['ds_agencia'] : '');
		$Row->dt_nascimento = ($data['dt_nascimento'] ? Agro_Util::formatDate($data['dt_nascimento'], Zend_Date::W3C) : null);
		$Row->id_tipo_beneficiario = ($data['id_tipo_beneficiario'] ? $data['id_tipo_beneficiario'] : null);
		$Row->ds_endereco_cep = ($data['ds_endereco_cep']) ? $data['ds_endereco_cep'] : $Row->ds_endereco_cep;
        $Row->id_municipio = ($data['id_municipio']) ? $data['id_municipio'] :  $Row->id_municipio; 
		$Row->id_estado = $data['id_estado'] ? $data['id_stado'] : $Row->id_estado;
		$Row->ds_endereco_bairro = $data['ds_endereco_bairro'] ? $data['ds_endereco_bairro'] : $Row->ds_endereco_bairro;
		$Row->ds_endereco_logradouro = $data['ds_endereco_logradouro'] ? $data['ds_endereco_logradouro'] : $Row->ds_endereco_logradouro;
		$Row->ds_endereco_nro = $data['ds_endereco_nro'] ? $data['ds_endereco_nro'] : $Row->ds_endereco_nro;
		$Row->ds_endereco_complem = $data['ds_endereco_complem'] ? $data['ds_endereco_complem'] : $Row->ds_endereco_complem;
        $Row->ds_tel = $data['ds_tel'] ? $data['ds_tel'] : $Row->ds_tel;
        $Row->ds_email = $data['ds_email'] ? $data['ds_email'] : $Row->ds_email;

		return $Row->save();
	}

    public function saveEnderecoByCpf($data){
  
        $Row = $this->fetchRow("cpf_cnpj = '{$data['cpf_cnpj']}'");

        if (!$Row) $Row = $this->createRow();
        
        $Row->ds_endereco_cep = ($data['ds_endereco_cep']) ? ($data['ds_endereco_cep']) : $Row->ds_endereco_cep; 
        $Row->id_municipio = ($data['id_municipio']) ? ($data['id_municipio']) : $Row->id_municipio; 
        $Row->id_estado = ($data['id_estado']) ? ($data['id_estado']) : $Row->id_estado; 
        $Row->ds_endereco_bairro = ($data['ds_endereco_bairro']) ? ($data['ds_endereco_bairro']) : $Row->ds_endereco_bairro; 
        $Row->ds_endereco_logradouro = ($data['ds_endereco_logradouro']) ? ($data['ds_endereco_logradouro']) : $Row->ds_endereco_logradouro; 
        $Row->ds_endereco_nro = ($data['ds_endereco_nro']) ? ($data['ds_endereco_nro']) : $Row->ds_endereco_nro; 
        $Row->ds_endereco_complem = ($data['ds_endereco_complem']) ? ($data['ds_endereco_complem']) : $Row->ds_endereco_complem; 
        $Row->ds_tel = ($data['ds_tel']) ? ($data['ds_tel']) : $Row->ds_tel; 
        $Row->ds_email = ($data['ds_email']) ? ($data['ds_email']) : $Row->ds_email;
        return $Row->save();

    }

	public function getData($where=false) {
	    $User = Zend_Auth::getInstance()->getIdentity();
        $id_empresa = (new Sistema_Model_Empresas())->getIdEmpresaUsuarioCorrente();
		$group = array('p.id', 'p.ds_nome_beneficiario', 'p.cpf_cnpj', 'p.tp_pessoa', 's.ds_status');

		$select = $this->select()->distinct()->setIntegrityCheck(false);
		$select->from(array('p' => "seguro.beneficiarios"), array('id', 'ds_nome_beneficiario', 'cpf_cnpj', 'tp_pessoa', 'dt_nascimento'));
        $select->joinLeft(array('s' => "sistema.status"), "s.id = p.id_status_arquivos", "ds_status");

		if($User->tp_usuario == 'P' || $User->tp_usuario == 'C'){
			$select->join(array('pb' => 'seguro.propostas_beneficiarios'), 'pb.nr_cpf_cnpj = p.cpf_cnpj', false);
			$select->join(array('pc' => 'seguro.propostas_corretores'), 'pc.id_proposta = pb.id_proposta', false);
			$select->joinLeft(array('b' => 'sistema.bancos'), 'b.id = pb.id_banco', false);

			if($User->tp_usuario == 'C') {
				$select->where("pc.id_usuario = ?", $User->id);
			}

			if($User->tp_usuario == 'P') {
				$select->where("pc.id_usuario_criacao = ?", $User->id);
			}

			array_push($group, 'pb.ds_agencia', 'b.ds_nome_banco');
		} elseif (($User->tp_usuario == 'F') && ($id_empresa == 20)){
			$select->joinLeft(array('pb' => 'seguro.propostas_beneficiarios'), 'pb.nr_cpf_cnpj = p.cpf_cnpj', false);
			$select->joinLeft(array('b' => 'sistema.bancos'), 'b.id = pb.id_banco', false);
			array_push($group, 'pb.ds_agencia', 'b.ds_nome_banco');
		}

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];

					$select->where("$field $operator ?", $value);
				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		$select->order($this->_order);
		$select->group(['p.id', 'p.ds_nome_beneficiario', 'p.cpf_cnpj', 'p.tp_pessoa', 's.ds_status']);

		return $select;
	}

	public function getBeneficiario($cpf_cnpj) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'seguro.beneficiarios'), array('*', "to_char(dt_nascimento,'dd/mm/yyyy') as dt_nascimento_benef"));
		$Select->where('cpf_cnpj = ?', $cpf_cnpj);
		
        $Row = $this->fetchRow($Select);
        
		if($Row){
		    return $Row->toArray();
		}
		return;
	}

	public function setValidado($cpf_cnpj) {
		$Row = $this->fetchRow("cpf_cnpj = '$cpf_cnpj'");
		if (!$Row) return false;

		$Row->tp_pessoa = $Row->tp_pessoa;
		$Row->ds_nome_beneficiario = $Row->ds_nome_beneficiario;
		$Row->cpf_cnpj = $Row->cpf_cnpj;
		$Row->id_banco = ($Row->id_banco ? $Row->id_banco : null);
		$Row->ds_agencia = $Row->ds_agencia;
		$Row->fl_validado = true;

		return $Row->save();
	}

	public function setValidadoByProposta($id_proposta) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('spb' => 'seguro.propostas_beneficiarios'), null);
		$Select->join(array('sb' => 'seguro.beneficiarios'), 'spb.nr_cpf_cnpj = sb.cpf_cnpj', 'cpf_cnpj');
		$Select->where('spb.id_proposta = ?', $id_proposta);

		$Row = $this->fetchAll($Select)->toArray();

		foreach ($Row as $beneficiario) {
			$this->setValidado($beneficiario['cpf_cnpj']);
		}
	}

	/*
	 * busca dados do banco na tabela sistema.agencias
	*/
	public function  getBanco($cnpj) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('sa' => 'sistema.agencias'));
		$Select->where('sa.ds_cnpj = ?', $cnpj);

		$Row = $this->fetchRow($Select);

		if ($Row) {
			return $Row->toArray();
		}
		return;
	}

    public function getProcessosArquivosPermitemTransmissao(int $idBeneficiario)
    {
        $select = $this->select()->distinct(true)->setIntegrityCheck(false);
        $select->from(['benef' => "{$this->_schema}.{$this->_name}"], false);
        $select->join(['pb' => "seguro.propostas_beneficiarios"], 'pb.nr_cpf_cnpj = benef.cpf_cnpj', false);
        $select->join(['prop' => 'seguro.propostas'], 'pb.id_proposta = prop.id', false);
        $select->join(['proc' => 'sinistro.processos'], 'proc.id_proposta = prop.id', ['id as id_processo']);
        $select->join(['liquid' => 'sinistro.liquidacoes'], 'liquid.id_processo = proc.id', false);
        $select->join(['ls' => 'sinistro.liquidacoes_status'], 'ls.id_liquidacao = liquid.id', false);
        $select->where('benef.id = ?', $idBeneficiario);
        $select->where('proc.id_status <> 35');
        $select->where('benef.id_status_arquivos = ?', Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA);
        $select->where('ls.id_status = ?', Sinistro2_Model_Liquidacoes::ID_STATUS_ENVIADA_SEGURADORA);
        $select->where('ls.fl_ativo is true');

        return $this->fetchAll($select)->toArray();
    }

    public function temTodosTiposArquivosObrigatoriosCnpj(array $tiposArquivos)
    {
        $temCnpj = false;
        $temComprovanteEndereco = false;
        $temDadosBancarios = false;

        foreach ($tiposArquivos as $tipoArquivo) {
            $tipoArquivo = (int)$tipoArquivo;

            if ($tipoArquivo === Sistema_Model_TipoArquivoProcesso::CNPJ) {
                $temCnpj = true;
                continue;
            }

            if ($tipoArquivo === Sistema_Model_TipoArquivoProcesso::COMPROVANTE_ENDERECO) {
                $temComprovanteEndereco = true;
                continue;
            }

            if ($tipoArquivo === Sistema_Model_TipoArquivoProcesso::DADOS_BANCARIOS) {
                $temDadosBancarios = true;
                continue;
            }
        }

        return $temCnpj && $temComprovanteEndereco && $temDadosBancarios;
    }

    public function temTodosTiposArquivosObrigatoriosCpf(array $tiposArquivos)
    {
        $temDocumentoPessoal = false;
        $temComprovanteEndereco = false;
        $temDadosBancarios = false;

        foreach ($tiposArquivos as $tipoArquivo) {
            $tipoArquivo = (int)$tipoArquivo;

            if (in_array($tipoArquivo, [Sistema_Model_TipoArquivoProcesso::CPF, Sistema_Model_TipoArquivoProcesso::RG])
              || $tipoArquivo === Sistema_Model_TipoArquivoProcesso::CNH
            ) {
                $temDocumentoPessoal = true;
                continue;
            }

            if ((int)$tipoArquivo === Sistema_Model_TipoArquivoProcesso::COMPROVANTE_ENDERECO) {
                $temComprovanteEndereco = true;
                continue;
            }

            if ((int)$tipoArquivo === Sistema_Model_TipoArquivoProcesso::DADOS_BANCARIOS) {
                $temDadosBancarios = true;
                continue;
            }
        }

        return $temDocumentoPessoal && $temComprovanteEndereco && $temDadosBancarios;
    }

    public function getProcessosLiquidacoesByBeneficiario(int $idBeneficiario, array $safras = [], bool $joinItensSegurados = true)
    {
        $campos = [
            'b.id',
            'b.cpf_cnpj',
            'b.ds_nome_beneficiario',
            'b.tp_pessoa',
            'prop.id as id_proposta',
            'prop.id_proposta_mae',
            'prop.id_usuario_criacao as id_usuario_proposta',
            'proc.id as id_processo',
            'liq.id_status as status_liquidacao',
        ];

        $select = $this->select()->setIntegrityCheck(false)->distinct(true);
        $select->from(['b' => "{$this->_schema}.{$this->_name}"], $campos);
        $select->join(['pb' => 'seguro.propostas_beneficiarios'], 'pb.nr_cpf_cnpj = b.cpf_cnpj', false);
        $select->join(['prop' => 'seguro.propostas'], 'prop.id = pb.id_proposta', false);
        $select->join(['prod' => 'produto.produtos'], 'prod.id = prop.id_produto', false);
        $select->joinLeft(['proc' => 'sinistro.processos'], 'proc.id_proposta = prop.id', false);
        $select->joinLeft(['liq' => 'sinistro.liquidacoes'], 'liq.id_processo = proc.id', false);

        if ($joinItensSegurados) {
            $select->joinLeft(['lisc' => 'sinistro.liquidacoes_itens_segurados_coberturas'], 'lisc.id_liquidacao = liq.id', false);
        }

        $select->where("b.id = {$idBeneficiario}");

        if (!empty($safras)) {
            $select->where('prod.id_safra in(' . implode(', ', $safras) . ')');
        }

        $select->group(['prop.id, b.id, b.cpf_cnpj, proc.id, liq.id_status']);

        return $this->fetchAll($select)->toArray();
    }

    public function atualizarDataDocumentoVigenciaAtual(int $idBeneficiario)
    {
        $rowBeneficiario = $this->getRow($idBeneficiario);
        $documentosObrigatorios = Seguro_Model_TiposBeneficiarios::getArquivosObrigatoriosByBeneficiario($rowBeneficiario, false);
        $arquivosVigenciaAtual = (new Seguro_Model_BeneficiariosArquivos())->getArquivosVigenciaAtual($idBeneficiario, $documentosObrigatorios)->current();

        if (!empty($arquivosVigenciaAtual)) {
            if (!$this->save([
                'cpf_cnpj' => $arquivosVigenciaAtual['cpf_cnpj'],
                'dt_arquivo_antigo_vigencia_atual' => Agro_Util::formatDate($arquivosVigenciaAtual['dt_criacao'], 'yyyy-MM-dd')])
            ) {
                throw new Exception('Erro ao atualizar as informações do beneficiário.');
            }
        } else {
            $rowBeneficiario = $this->getRow($idBeneficiario);
            $rowBeneficiario->dt_arquivo_antigo_vigencia_atual = null;

            if (!$rowBeneficiario->save()) {
                throw new Exception('Erro ao atualizar as informações do beneficiário.');
            }
        }
    }

    public function getBeneficiariosPrazoDocumentacaoExpirada() : array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sb' => "{$this->_schema}.{$this->_name}"], ['id', 'cpf_cnpj', 'ds_nome_beneficiario', 'tp_pessoa']);
        $select->where("to_char(now() - dt_arquivo_antigo_vigencia_atual, 'DDD')::integer > 365");

        return $this->fetchAll($select)->toArray();
    }

    public function getPropostasProcessoAvisoEncerramentoBeneficiarios(int $idBeneficiario, array $safras)
    {
        $campos = [
            'sp.id as id_proposta',
            'sp.id_usuario_criacao as id_usuario_proposta',
            'sproc.id as id_processo',
            'sae.id as id_aviso_encerramento',
        ];
        $statusPropostaValidos = [
            Seguro_Model_Propostas::ID_STATUS_APOLICE_EMITIDA,
            Seguro_Model_Propostas::ID_STATUS_AGUARDANDO_ENVIO_SEG,
            Seguro_Model_Propostas::ID_STATUS_CONF_PENDENCIAS,
            Seguro_Model_Propostas::ID_STATUS_ENVIADA_AGUARDANDO_CONF,
        ];
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sp' => 'seguro.propostas'], $campos);
        $select->join(['pp' => 'produto.produtos'], 'pp.id = sp.id_produto', false);
        $select->join(['spb' => 'seguro.propostas_beneficiarios'], 'spb.id_proposta = sp.id', false);
        $select->join(['sb' => "{$this->_schema}.{$this->_name}"], 'sb.cpf_cnpj = spb.nr_cpf_cnpj', false);
        $select->joinLeft(['sproc' => 'sinistro.processos'], 'sproc.id_proposta = sp.id', false);
        $select->joinLeft(['sae' => 'sinistro.avisos_encerramento'], 'sae.id_proposta = sp.id', false);
        $select->where('sb.id = ?', $idBeneficiario);
        $select->where('pp.id_safra in(' . implode(', ', $safras) . ')');
        $select->where('sp.id_status in(' . implode(', ', $statusPropostaValidos) . ')');
        $select->where('dt_vigencia_fim >= current_date');

        return $this->fetchAll($select);
    }

    public function getDataBasePagamentoByBeneficiario(int $idBeneficiario)
    {
        $sqlArquivosBeneficiarios = "SELECT to_char(MAX(sba.dt_criacao), 'YYYY-MM-DD') as maior_data_arquivos_beneficiario ";
        $sqlArquivosBeneficiarios .= "      , spb.id_proposta as id_proposta ";
        $sqlArquivosBeneficiarios .= "      , sb.cpf_cnpj ";
        $sqlArquivosBeneficiarios .= " FROM seguro.propostas_beneficiarios spb ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN seguro.beneficiarios sb ON sb.cpf_cnpj = spb.nr_cpf_cnpj ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN sistema.status ss ON ss.id = sb.id_status_arquivos ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN seguro.propostas sprop ON sprop.id = spb.id_proposta ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN sinistro.processos sproc ON sproc.id_proposta = sprop.id ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN produto.produtos pp ON pp.id = sprop.id_produto ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN seguro.beneficiarios_arquivos sba ON sba.id_beneficiario = sb.id ";
        $sqlArquivosBeneficiarios .= "WHERE sb.id_status_arquivos = " . Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA;
        $sqlArquivosBeneficiarios .= "  AND sba.fl_vigencia_atual is true ";
        $sqlArquivosBeneficiarios .= "AND sb.id =  $idBeneficiario";
        $sqlArquivosBeneficiarios .= " GROUP BY spb.id_proposta, sb.cpf_cnpj ";

        $sqlArquivosSegurado = "SELECT to_char(max(pa.dt_criacao), 'YYYY-MM-DD') as maior_data_arquivos_segurado ";
        $sqlArquivosSegurado .= "      , p.id as id_processo ";
        $sqlArquivosSegurado .= " FROM sinistro.processos_arquivos AS pa ";
        $sqlArquivosSegurado .= "      INNER JOIN sinistro.processos AS p ON p.id = pa.id_processo ";
        $sqlArquivosSegurado .= "      INNER JOIN seguro.propostas AS pr ON pr.id = p.id_proposta ";
        $sqlArquivosSegurado .= "      INNER JOIN seguro.propostas_endosso AS pe ON pe.id_proposta = pr.id ";
        $sqlArquivosSegurado .= "WHERE (pa.fl_del = false) ";
        $sqlArquivosSegurado .= "  AND (pa.fl_ativo = true) ";
        $sqlArquivosSegurado .= "  AND (pe.fl_proposta_vigente = true) ";
        $sqlArquivosSegurado .= "  AND pa.id_tipo_arquivo not in (18, 20) ";
        $sqlArquivosSegurado .= "  AND p.id_status_arquivos = " .  Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA;
        $sqlArquivosSegurado .= " GROUP BY p.id ";

        $campos = [
            'sp.id_proposta as id_proposta',
            'sae.id as id_aviso_encerramento',
            "to_char(sae.dt_criacao, 'YYYY-MM-DD') as data_aviso_encerramento",
            'data_arquivos_beneficiario.maior_data_arquivos_beneficiario',
            'data_arquivos_segurado.maior_data_arquivos_segurado',
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sp' => "sinistro.processos"], $campos);
        $select->join(['spb' => 'seguro.propostas_beneficiarios'], 'spb.id_proposta = sp.id_proposta', false);
        $select->join(['sb' => 'seguro.beneficiarios'], 'sb.cpf_cnpj = spb.nr_cpf_cnpj', false);
        $select->join(['data_arquivos_beneficiario' => new Zend_Db_Expr("({$sqlArquivosBeneficiarios})")], 'data_arquivos_beneficiario.id_proposta = sp.id_proposta AND data_arquivos_beneficiario.cpf_cnpj = sb.cpf_cnpj', false);
        $select->join(['data_arquivos_segurado' => new Zend_Db_Expr("({$sqlArquivosSegurado})")], 'data_arquivos_segurado.id_processo = sp.id', false);
        $select->join(['sae' => 'sinistro.avisos_encerramento'], 'sae.id_proposta = sp.id_proposta', false);
        $select->joinLeft(['spdp' => 'sinistro.avisos_encerramento_data_base'], 'spdp.id_aviso_encerramento = sae.id', false);
        $select->joinLeft(['cr' => 'sinistro.cronometro_regulacao'], 'cr.id_aviso_encerramento = sae.id', false);
        $select->where('sb.id = ?', $idBeneficiario);
        $select->where('spb.fl_del is false');
        $select->where('spdp.id is null');
        $select->where('cr.id IS NULL');
        $select->order('sp.id_proposta desc');
    
        return $this->fetchAll($select)->toArray();
    }

    public function getComboCnpjBeneficiario(): array
	{
		$rs = $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(['sb' => 'seguro.beneficiarios'], 'ds_nome_beneficiario, cpf_cnpj')
				->where("sb.tp_pessoa = 'J'")
				->where('sb.fl_ativo IS TRUE')
				->order('ds_nome_beneficiario ASC')
		);

		$map = [];
		foreach ($rs as $row) {
            $nomeBeneficiario = $row['ds_nome_beneficiario'];
            if (strlen($nomeBeneficiario) > 60) {
                $nomeBeneficiario = substr($row['ds_nome_beneficiario'], 0, 63) . '...';
            }

			$map[$row['cpf_cnpj']] = $nomeBeneficiario . " ({$row['cpf_cnpj']})";
		}

		asort($map);
		
		return $map;
	}

    public function isEnderecoBeneficiarioValido(string $cpf): array
    {
        $select = $this->select()
        ->setIntegrityCheck(false)
        ->from(['sb' => 'seguro.beneficiarios'], [
        'ds_endereco_cep', 'id_municipio', 'id_estado',
        'ds_endereco_bairro', 'ds_endereco_logradouro', 'ds_endereco_nro',
        'ds_endereco_complem', 'ds_tel', 'ds_email', 'id'
        ])
        ->where("sb.tp_pessoa = 'F'")
        ->where('sb.fl_ativo IS TRUE')
        ->where('sb.cpf_cnpj = ?', $cpf)
        ->order('ds_nome_beneficiario ASC');

        $rs = $this->fetchRow($select);
        
        if(!$rs){
            return [
                'beneficiario' => false,
                'enderecoValido'=> false,
                'novo_beneficiario' => true
                ];
        }

        if (in_array(null, $rs->toArray(), true)) {
            return [
                'beneficiario' => $rs['id'],
                'enderecoValido'=> false,
                'novo_beneficiario' => false
            ];
        } else {
            return [
                'beneficiario' => $rs['id'],
                'enderecoValido'=> true,
                'novo_beneficiario' => false
            ];
        }
    }
    public function isDocumentacaoValida($idProposta)
    {
        $modelBeneficiariosPropostas = new Seguro_Model_PropostasBeneficiarios();
        $sqlArquivosBeneficiarios = "SELECT spb.id_proposta as id_proposta, sb.cpf_cnpj 
        FROM seguro.propostas_beneficiarios spb
        INNER JOIN seguro.beneficiarios sb ON sb.cpf_cnpj = spb.nr_cpf_cnpj
        INNER JOIN sistema.status ss ON ss.id = sb.id_status_arquivos
        INNER JOIN seguro.propostas sprop ON sprop.id = spb.id_proposta
        INNER JOIN sinistro.processos sproc ON sproc.id_proposta = sprop.id
        INNER JOIN produto.produtos pp ON pp.id = sprop.id_produto
        INNER JOIN seguro.beneficiarios_arquivos sba ON sba.id_beneficiario = sb.id
        WHERE spb.id_proposta = {$idProposta} AND (sb.id_status_arquivos = " . Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA." OR sb.id_status_arquivos = ". Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ANALISADO . ")".
        " AND sba.fl_vigencia_atual is true group by spb.id_proposta, sb.cpf_cnpj";

        $beneficiarios = $modelBeneficiariosPropostas->getBeneficiariosNaoBanco($idProposta);
  
        $beneficiarioComDocValida = $this->_db->fetchAll($sqlArquivosBeneficiarios);
        $quantidadeBeneficiarios = count($beneficiarios);
        
        return count($beneficiarioComDocValida) > 0 && $quantidadeBeneficiarios === count($beneficiarioComDocValida);
    }

    /**
     * Retorna se deve ou não apresentar o termo de confirmação do sinistro
     *
     * @param int $idBeneficiario
     * @return bool
     */
    public static function apresentarTermoSinistro(int $idBeneficiario): bool
    {
        $model = new Seguro_Model_Beneficiarios();
        $row = $model->getRow($idBeneficiario);

        return Sistema_Model_Usuarios::isUsuarioLogadoCorretorPreposto() &&
               $row->id_status_arquivos == Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_NAO_ENVIADO &&
               $row->dt_arquivo_antigo_vigencia_atual == null;
    }

    public function getCpfCnpjByIdsBeneficiarios(array $idsBeneficiarios): array
    {
        $rs = $this->fetchAll(
            $this->select()
                ->setIntegrityCheck(false)
                ->from(['sb' => 'seguro.beneficiarios'], ['cpf_cnpj'])
                ->where('id IN (?)', $idsBeneficiarios)
        )->toArray();

        return array_map(function ($item) {
            return $item['cpf_cnpj'];
        }, $rs);
    }
}
