<?php

class Seguro_Model_PropostasBeneficiarios extends Agro_Db_Table_Abstract {
	protected $_log = true;
	protected $_schema = 'seguro';
	protected $_name = 'propostas_beneficiarios';
	protected $_primary = 'id';
	public $camposAlterados = array();

	public function save($data, $proposta) {
		$Row = $this->getRow($data['id']);

		$Row->id_proposta = $proposta;
		$Row->ds_nome_beneficiarios = $data['ds_nome_beneficiarios'] ? $data['ds_nome_beneficiarios'] : $Row->ds_nome_beneficiarios;
		$Row->ds_qualidade_beneficiario = $data['ds_qualidade_beneficiario'] ? $data['ds_qualidade_beneficiario'] : $Row->ds_qualidade_beneficiario;
		$Row->vl_limite_beneficio = $data['vl_limite_beneficio'] ? Agro_Util::formatCurrencyDb($data['vl_limite_beneficio']) : $Row->vl_limite_beneficio;
		$Row->nr_cpf_cnpj = $data['nr_cpf_cnpj'] ? $data['nr_cpf_cnpj'] : $Row->nr_cpf_cnpj;

		if ($data['id_banco'] > 0) $Row->id_banco = $data['id_banco'];

		$Row->ds_agencia = $data['ds_agencia'] ? $data['ds_agencia'] : $Row->ds_agencia;
		$Row->ds_conta = $data['ds_conta'] ? $data['ds_conta'] : $Row->ds_conta;
		$Row->ds_observacao = $data['ds_observacao'] ? $data['ds_observacao'] : $Row->ds_observacao;
		$Row->ds_tipo_conta = $data['ds_tipo_conta'] ? strtolower($data['ds_tipo_conta']) : $Row->ds_tipo_conta;
		$Row->dt_nascimento = $data['dt_nascimento'] ? Agro_Util::formatDate($data['dt_nascimento'], Zend_Date::W3C) : $Row->dt_nascimento;

		if (array_key_exists('fl_favorecido_autorizacao_credito', $data)) {
		    $Row->fl_favorecido_autorizacao_credito = $data['fl_favorecido_autorizacao_credito'];
        }

		$Row->tp_pessoa = $data['tp_pessoa'] ? $data['tp_pessoa'] : $Row->tp_pessoa;
		$Row->id_tipo_beneficiario = $data['id_tipo_beneficiario'] ? $data['id_tipo_beneficiario'] : $Row->id_tipo_beneficiario;
		$Row->ds_email_beneficiario = isset($data['ds_email_beneficiario']) ? $data['ds_email_beneficiario'] : $Row->ds_email_beneficiario;
		$Row->ds_email_instituicao_financeira = isset($data['ds_email_instituicao_financeira']) ? $data['ds_email_instituicao_financeira'] : $Row->ds_email_instituicao_financeira;

		$Row->fl_nome_social = $data['fl_nome_social'] ? $data['fl_nome_social'] : 0;
		$Row->ds_nome_social = $data['ds_nome_social'];

		return $Row->save();
	}

	/*
	 * Descobre quais campos foram alterados para informar o corretor
	 */
	public function comparaCampos($data, $Row) {
		if($data['ds_nome_beneficiarios'] != null) {
			if($Row->ds_nome_beneficiarios != $data['ds_nome_beneficiarios']) {
				$this->camposAlterados[] = "Nome Beneficiário \n- De: {$Row->ds_nome_beneficiarios} \n- Para: {$data['ds_nome_beneficiarios']}\n\n";
			}
		}
		if($data['ds_qualidade_beneficiario'] != null) {
			if($Row->ds_qualidade_beneficiario != $data['ds_qualidade_beneficiario']) {
				$this->camposAlterados[] = "Qualidade Beneficiário \n- De: {$Row->ds_qualidade_beneficiario} \n- Para: {$data['ds_qualidade_beneficiario']}\n\n";
			}
		}
		if($data['vl_limite_beneficio'] != null) {
			if($Row->vl_limite_beneficio != $data['vl_limite_beneficio']) {
				$this->camposAlterados[] = "Valor Limite Beneficio \n- De: {$Row->vl_limite_beneficio} \n- Para: {$data['vl_limite_beneficio']}\n\n";
			}
		}
		if($data['nr_cpf_cnpj'] != null) {
			if($Row->nr_cpf_cnpj != $data['nr_cpf_cnpj']) {
				$this->camposAlterados[] = "Cpf/CNPJ Beneficiário \n- De: {$Row->nr_cpf_cnpj} \n- Para: {$data['nr_cpf_cnpj']}\n\n";
			}
		}
		if($data['id_banco'] != null) {
			if($Row->id_banco != $data['id_banco']) {

				if($Row->id_banco) {
					$BancoAntigo = $this->_db->fetchOne("select ds_nome_banco from sistema.bancos where id = {$Row->id_banco}");
				} else {
					$BancoAntigo = "Não informado";
				}
				$BancoNovo   = $this->_db->fetchOne("select ds_nome_banco from sistema.bancos where id = {$data['id_banco']}");

				$this->camposAlterados[] = "Banco Beneficiário \n- De: $BancoAntigo -> $BancoNovo\n\n";
			}
		}
		if($data['ds_agencia'] != null) {
			if($Row->ds_agencia != $data['ds_agencia']) {
				$this->camposAlterados[] = "Agência Beneficiário \n- De: {$Row->ds_agencia} \n- Para: {$data['ds_agencia']}\n\n";
			}
		}
	}

	/*
	 * Monta o array para informar o corretor de que um novo beneficiario foi incluido
	 */
	public function novoBeneficiario($data) {
		$this->camposAlterados[] = "Novo beneficiario.";
		if($data['id_banco'] != null) {
			$BancoNovo   = $this->_db->fetchOne("select ds_nome_banco from sistema.bancos where id = {$data['id_banco']}");
			$this->camposAlterados[] = "Banco Beneficiário \n- De: $BancoNovo\n\n";
			$this->camposAlterados[] = "Agência Beneficiário \n- De: {$data['ds_agencia']}\n\n";
		} else {
			$this->camposAlterados[] = "Nome Beneficiário \n- De: {$data['ds_nome_beneficiarios']}\n\n";
		}
		$this->camposAlterados[] = "Qualidade Beneficiário \n- De: {$data['ds_qualidade_beneficiario']}\n\n";
		$this->camposAlterados[] = "Cpf/CNPJ Beneficiário \n- De: {$data['nr_cpf_cnpj']}";
		$this->camposAlterados[] = "Valor Limite Beneficio \n- De: {$data['vl_limite_beneficio']}\n\n";
	}

	public function deleteProposta($proposta) {
		if ($proposta) {
			$this->_db->query("delete from seguro.propostas_beneficiarios where id_proposta = $proposta");
		}
	}

	public function sumTotal($params) {
		$params['ds_quantia'] = Agro_Util::formatCurrencyDb($params['ds_quantia']);

		$Select = $this->select()->from('seguro.propostas_beneficiarios', 'sum(vl_limite_beneficio)');
		$Select->where('id_proposta = ?', $params['id_proposta']);

		if($params['cpf_cnpj']){
			$Select->where('nr_cpf_cnpj <> ?', $params['cpf_cnpj']);
		}

		$sum = $this->getAdapter()->fetchOne($Select);

		return $sum + ($params['ds_quantia'] ? $params['ds_quantia'] : 0);
	}

	public function verificaDocumentoBeneficiario($params) {
		if ($params['id_beneficiario']) {
			return $this->fetchAll("id_proposta = {$params['id_proposta']} and nr_cpf_cnpj = '{$params['cpf_cnpj']}' and id != {$params['id_beneficiario']}")->count();
		} else {
			return $this->fetchAll("id_proposta = {$params['id_proposta']} and nr_cpf_cnpj = '{$params['cpf_cnpj']}'")->count();
		}
	}

	public function fetchBeneficiarios($idProposta) {
		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('pb' => 'seguro.propostas_beneficiarios'), array(new Zend_Db_Expr(
			"case when (ds_tipo_conta) = 's' then bc.ds_nome_banco||' - '||pb.ds_agencia
			      when (ds_tipo_conta) = 'n' then pb.ds_nome_beneficiarios
			 end as ds_nome_beneficiarios"), 'id', 'id_proposta', 'nr_cpf_cnpj', 'ds_agencia','ds_conta','ds_observacao','ds_tipo_conta','vl_limite_beneficio','ds_qualidade_beneficiario','dt_nascimento', 'ds_email_beneficiario'));
		$Select->joinLeft(array('bc' => 'sistema.bancos'), 'bc.id = pb.id_banco', 'ds_nome_banco');
		$Select->where('id_proposta = ?', $idProposta);
		$Select->order('ds_nome_beneficiarios');
		$Rs = $this->fetchAll($Select);

		$return = array();
		foreach ($Rs as $Row) {
			$return[$Row->id] = $Row->toArray();
		}

		return $return;
	}

	public function getBeneficiarios($idProposta, array $where = []){
		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('pb' => 'seguro.propostas_beneficiarios'), array(new Zend_Db_Expr(
			"case when (ds_tipo_conta) = 's' then ba.ds_nome_banco
			      when (ds_tipo_conta) = 'n' then ds_nome_beneficiarios
			 end as ds_nome_beneficiarios"), 'id','vl_limite_beneficio','nr_cpf_cnpj','dt_nascimento', 'ds_nome_beneficiarios as nome_beneficiario', 'ds_nome_beneficiarios as texto_nome_responsavel_instituicao_financeira', 'nr_cpf_cnpj as texto_cpf_responsavel_instituicao_financeira'));
        $Select->joinLeft(array('b' => 'seguro.beneficiarios'), 'pb.nr_cpf_cnpj = cpf_cnpj', array('id as id_beneficiario', 'id_status_arquivos', 'tp_pessoa'));
        $Select->joinLeft(array('s' => 'sistema.status'), 's.id = b.id_status_arquivos', 'ds_status');
        $Select->joinLeft(array('ba' => 'sistema.bancos'), 'ba.id = pb.id_banco', false);
		$Select->where('id_proposta = ?', $idProposta);
		$Select->where('pb.fl_del = false');

		if (!empty($where)) {
		    foreach ($where as $valor) {
                $Select->where("{$valor}");
            }
        }

		$Rs = $this->fetchAll($Select);

		$return = array();
		foreach ($Rs as $Row) {
			$return[$Row->id] = $Row->toArray();
		}

		return $return;
	}

	public function getBeneficiariosNaoBanco($idProposta, array $where = []){
		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('pb' => 'seguro.propostas_beneficiarios'), array(new Zend_Db_Expr(
			"case when (ds_tipo_conta) = 's' then ba.ds_nome_banco
			      when (ds_tipo_conta) = 'n' then ds_nome_beneficiarios
			 end as ds_nome_beneficiarios"), 'id','vl_limite_beneficio','nr_cpf_cnpj','dt_nascimento', 'ds_nome_beneficiarios as nome_beneficiario', 'ds_nome_beneficiarios as texto_nome_responsavel_instituicao_financeira', 'nr_cpf_cnpj as texto_cpf_responsavel_instituicao_financeira'));
        $Select->joinLeft(array('b' => 'seguro.beneficiarios'), 'pb.nr_cpf_cnpj = cpf_cnpj', array('id as id_beneficiario', 'id_status_arquivos', 'tp_pessoa'));
        $Select->joinLeft(array('s' => 'sistema.status'), 's.id = b.id_status_arquivos', 'ds_status');
        $Select->joinLeft(array('ba' => 'sistema.bancos'), 'ba.id = pb.id_banco', false);
		$Select->joinLeft(array('sa'=>'sistema.agencias'), 'sa.ds_cnpj = pb.nr_cpf_cnpj', false);
		$Select->where('id_proposta = ?', $idProposta);
		$Select->where('pb.fl_del = false');
		$Select->where('sa.id IS NULL');

		if (!empty($where)) {
		    foreach ($where as $valor) {
                $Select->where("{$valor}");
            }
        }

		$Rs = $this->fetchAll($Select);

		$return = array();
		foreach ($Rs as $Row) {
			$return[$Row->id] = $Row->toArray();
		}

		return $return;
	}

	public function getPropostaBeneficiarioById(int $id)
    {
		$select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$select->from(['pb' => "{$this->_schema}.{$this->_name}"])
    		->join(['b' => 'seguro.beneficiarios'],'pb.nr_cpf_cnpj = b.cpf_cnpj',['id as id_beneficiario_origem','ds_endereco_cep','id_municipio','ds_endereco_bairro','ds_endereco_logradouro','ds_endereco_nro','ds_endereco_complem','ds_tel','ds_email','id_estado',
            new Zend_Db_Expr("
                (
                    NULLIF(TRIM(ds_endereco_cep), '') IS NULL OR
                    NULLIF(TRIM(ds_endereco_bairro), '') IS NULL OR
                    NULLIF(TRIM(ds_endereco_logradouro), '') IS NULL OR
                    NULLIF(TRIM(ds_endereco_nro), '') IS NULL OR
                    NULLIF(TRIM(ds_endereco_complem), '') IS NULL OR
                    NULLIF(TRIM(ds_tel), '' ) IS NULL OR
                    NULLIF(TRIM(ds_email), '') IS NULL
                ) AS endereco_incompleto
            "),])->where('pb.id = ?', $id);

		return $this->fetchRow($select);
    }

	public function removerAutorizacaoCreditoByProposta(int $idProposta)
    {
        $sql = "update seguro.propostas_beneficiarios set fl_favorecido_autorizacao_credito = 'f' where id_proposta = {$idProposta}";

        $this->_db->query($sql);
    }

	/**
	 * Retornas quais os estados que o beneficiario possui propostas sem staus de indenização paga.
	 * 
	 * @param string $cpfCnpj
	 * @return array
	 */
	public function getEstadosByCpfCnpj(string $cpfCnpj): array
	{	
		$modelSafras = new Produto_Model_Safras();
		$safraAtual = $modelSafras->fetchAll(["now() between dt_inicio AND dt_termino"])->current();

		$select = $this->select()->distinct(true)->setIntegrityCheck(false);
        $select->from(['pb' => "{$this->_schema}.{$this->_name}"], null);
		$select->join(['a' => 'sinistro.avisos'], 'a.id_proposta = pb.id_proposta', null);
		$select->join(['p' => 'seguro.propostas'], 'p.id = pb.id_proposta', null);
		$select->join(['prod' => 'produto.produtos'], 'prod.id = p.id_produto', null);
		$select->join(['sa' => 'produto.safras'], 'sa.id = prod.id_safra', null);
		$select->join(['pp' => 'seguro.propostas_propriedades'], 'pp.id_proposta = p.id', null);
		$select->join(['m' => 'sistema.municipios'], 'm.id = pp.id_municipio', null);
		$select->join(['e' => 'sistema.estados'], 'e.id = m.id_estado', 'ds_sigla');
		$select->join(['proc' => 'sinistro.processos'], 'proc.id_proposta = p.id', null);
		$select->join(['l' => 'sinistro.liquidacoes'], 'l.id_processo = proc.id', null);
		$select->where("pb.nr_cpf_cnpj = ?", $cpfCnpj);
		$select->where("prod.id_safra = ?", $safraAtual['id']);
		$select->where("l.id_status <> ?", Sinistro2_Model_Liquidacoes::ID_STATUS_INDENIZACAO_PAGA);
		$rs = $this->fetchAll($select);

		$return = array();
		foreach ($rs as $row) {
			$return[] = $row['ds_sigla'];
		}

		return $return;
	}
	/**
	 * Define a flag de autorização de crédito para o favorecido em uma proposta.
	 * 
	 * Esse método atualiza o valor da coluna "fl_favorecido_autorizacao_credito" na tabela
	 * `seguro.propostas_beneficiarios` com base no tipo de favorecido informado (Proponente ou Beneficiário).
	 * 
	 * @param string $favorecido Tipo de favorecido ('P' para proponente e 'B' para beneficiário)
	 * @param int $idProposta
	 * 
	 * @return void 
	 */
	public function setFlagFavorecidoAutorizacaoCredito($favorecido, int $idProposta){
    	$flag = ($favorecido === 'P') ? 'f' : 't';
    	$sql = "UPDATE seguro.propostas_beneficiarios 
        SET fl_favorecido_autorizacao_credito = '{$flag}'
        WHERE id_proposta = {$idProposta}";
    	
		$this->_db->query($sql);
	}


	public function getPropostasByBeneficiarioId2($id){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(['pb' => "{$this->_schema}.{$this->_name}"], null);	
		$select->join(['pr' => 'seguro.propostas'], 'pb.id_proposta = pr.id', null);
		$select->where("pb.id_beneficiario = ?", $id);
		$select->where("pr.fl_ativo = ?", 't');

		return $this->fetchAll($select);
	}

	
	public function getPropostasByBeneficiarioId($id)
	{
    	$select = $this->select()->setIntegrityCheck(false);

    	$select->from(
        	['pb' => "{$this->_schema}.{$this->_name}"],
        	null 
    	);
    	$select->join(
        	['pr' => 'seguro.propostas'],
        	'pb.id_proposta = pr.id',
        	'dt_transmissao'
    	);

		$select->join(
			['be' => 'seguro.beneficiarios'],
			'be.cpf_cnpj = pb.nr_cpf_cnpj'
		);
   
    	$select->where('be.id = ?', $id);
    	$select->where('pr.fl_ativo = ?', 't');

       	$select->columns(['pb.id_proposta']);
	   	$select->columns(['pr.dt_transmissao']);

    	return $this->fetchAll($select);
	}

	public function getBeneficiarioByCpfCnpj(string $documento)
	{
		return $this->fetchRow(
			$this->select()
				->from(['spb' => 'seguro.propostas_beneficiarios'], ['ds_nome_beneficiarios as nome', 'nr_cpf_cnpj as cpf_cnpj'])
				->where('spb.nr_cpf_cnpj = ?', $documento)
				->group('ds_nome_beneficiarios, nr_cpf_cnpj, dt_criacao')
				->order('ds_nome_beneficiarios IS NULL, ds_nome_beneficiarios DESC')
				->limit(1)
		);
	}
	
	public function todosDocumentosAnalisados(int $idProposta): bool
	{
		$rs = $this->_db->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(['spb' => "{$this->_schema}.{$this->_name}"], null)
				->join(['sb' => 'seguro.beneficiarios'], 'sb.cpf_cnpj = spb.nr_cpf_cnpj', 'sb.id_status_arquivos')
				->join(['ss' => 'sistema.status'], 'ss.id = sb.id_status_arquivos', false)
				->join(['sproc' => 'sinistro.processos'], 'sproc.id_proposta = spb.id_proposta', false)
				->join(['sba' => 'seguro.beneficiarios_arquivos'], 'sba.id_beneficiario = sb.id', false)
				->where('spb.id_proposta = ?', $idProposta)
				->where('sba.fl_vigencia_atual IS TRUE')
		);
		
		foreach($rs as $row) {
			if ($row['id_status_arquivos'] != 108) {
				return false;
			}
		}
	
		return true;
	}
}
