<?php

class Seguro_Model_Row_Proposta extends Agro_Db_Table_Row_Proposta {

	public function tipo_endosso() {
		if ($this->id_endosso) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('p' => 'seguro.propostas'), false);
			$Select->join(array('e' => 'seguro.propostas_endosso'), 'p.id = e.id_proposta', false);
			$Select->join(array('o' => 'seguro.propostas_endosso_opcoes'), 'o.id_proposta = p.id', false);
			$Select->join(array('te' => 'seguro.tipo_endosso'), 'o.id_endosso_opcao = te.id', 'ds_tipo');
			$Select->where('p.id = ?', $this->id);

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
	}

	public function deleta_quadras() {
		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->query("delete from seguro.itens_segurados where id_proposta = {$this->id}");
		} catch (Exception $e) {
			die($e);
		}
	}

	public function deleta_quadra($id) {
		Agro_Db_Table_Abstract::getDefaultAdapter()->query("delete from seguro.itens_segurados where id = $id");
	}

	public function produto_coberturas() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'produto.produtos_coberturas'));
		$Select->join(array('c' => 'produto.coberturas'), 'c.id = p.id_cobertura');
		$Select->where('p.id_produto = ?', $this->id_produto);
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function produto_cobertura_principal() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'produto.produtos_coberturas'));
		$Select->join(array('c' => 'produto.coberturas'), 'c.id = p.id_cobertura');
		$Select->where('p.fl_cobertura_principal = true');
		$Select->where('p.id_produto = ?', $this->id_produto);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function proposta_coberturas_validacao_capacidade() {
		$dateTime = (new Seguro_Model_Propostas())->getDataTransmissaoPropostaMae($this->id);
		
		$configuracoes = (new Produto_Model_ProdutoCoberturaConfig())->getConfiguracoesPorProdutoData(
			$this->id_produto,
			$dateTime
		);

		if (empty($configuracoes)) {
			return [];
		}

		$idsConfiguracoes = array_column($configuracoes, 'id');

	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('p' => 'produto.produtos_coberturas'), array('id_cobertura'));
		$Select->join(
			array('pcconfig' => 'produto.produto_cobertura_config'),
			'pcconfig.id_produto = p.id_produto AND pcconfig.id_cobertura = p.id_cobertura',
			array('ds_frase_outros_riscos_excluidos', 'ds_frase_condicoes_particulares')
		);
	    $Select->join(array('s' => 'seguro.propostas_coberturas'), 's.id_cobertura = p.id_cobertura', false);
	    $Select->where('p.id_produto = ?', $this->id_produto);
	    $Select->where('s.id_proposta = ?', $this->id);
		$Select->where('pcconfig.id IN (?)', $idsConfiguracoes);
	    $Select->where('p.fl_validar_capacidade = true');

	    return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function getComercializacao() {
        $Row = false;
		$propriedade = $this->propriedade();

        $Select = $this->select()->setIntegrityCheck(false);
        $Select->from(array('c' => 'comercializacao.comercializacoes'), array('dt_comercializacao_inicio', 'dt_comercializacao_fim'));
        $Select->join(array('p' => 'comercializacao.comercializacoes_proponentes'), 'c.id = p.id_comercializacao', false);
        $Select->joinLeft(array('m' => 'comercializacao.comercializacoes_municipios'), 'c.id = m.id_comercializacao', ['id_municipio']);
        $Select->where('p.id_proponente = ?', $this['id_proponente']);
        $Select->where('c.id_produto = ?', $this['id_produto']);
        $Select->where('c.fl_ativo = true');
        $Select->where("c.tp_comercializacao = 'P'");

        $rows = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

        if (!empty($rows)) {
            $Row = $rows[0];
            $usuarioComComercializacao = false;
            $temMunicipio = false;

            if (!empty($rows[0]['id_municipio'])) {
                $temMunicipio = true;

                foreach ($rows as $registro) {
                    if ($registro['id_municipio'] === $propriedade['id_municipio']) {
                        $Row = $registro;
                        $usuarioComComercializacao = true;
                    }
                }
            }

            if ($temMunicipio && !$usuarioComComercializacao) {
                $Row = false;
            }
        }

		if (!$Row) {
            $Select = $this->select()->setIntegrityCheck(false);
            $Select->from(array('c' => 'comercializacao.comercializacoes'), array('dt_comercializacao_inicio', 'dt_comercializacao_fim'));
            $Select->join(array('u' => 'comercializacao.comercializacoes_usuarios'), 'c.id = u.id_comercializacao', false);
            $Select->joinLeft(array('m' => 'comercializacao.comercializacoes_municipios'), 'c.id = m.id_comercializacao', ['id_municipio']);
            $Select->joinLeft(array('ccp' => 'comercializacao.comercializacoes_proponentes'), 'c.id = ccp.id_comercializacao', ['id_proponente']);
            $Select->where('u.id_usuario = ?', $this['id_usuario_criacao']);
            $Select->where('c.id_produto = ?', $this['id_produto']);
            $Select->where('c.fl_ativo = true');
            $Select->where("c.tp_comercializacao = 'U'");

            $rows = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

            if (!empty($rows)) {
                if (empty($rows[0]['id_municipio']) && empty($rows[0]['id_proponente'])) {
                    $Row = $rows[0];
                } else {
                    foreach ($rows as $row) {
                        if (empty($row['id_municipio']) && $row['id_proponente'] === $this['id_proponente']) {
                            $Row = $row;
                        }

                        if (!empty($row['id_municipio']) && $row['id_municipio'] === $propriedade['id_municipio']) {
                            $Row = $row;

                            if (!empty($row['id_proponente']) && $row['id_proponente'] !== $this['id_proponente']) {
                                $Row = false;
                            }
                        }
                    }
                }
            }
        }

		if (!$Row) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('c' => 'comercializacao.comercializacoes'), array('dt_comercializacao_inicio', 'dt_comercializacao_fim'));
			$Select->join(array('m' => 'comercializacao.comercializacoes_municipios'), 'c.id = m.id_comercializacao', false);
			$Select->where('m.id_municipio = ?', $propriedade['id_municipio']);
			$Select->where('c.id_produto = ?', $this->id_produto);
			$Select->where('c.fl_ativo = true');
            $Select->where("c.tp_comercializacao = 'M'");
			$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		if (!$Row) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('c' => 'comercializacao.comercializacoes'), array('dt_comercializacao_inicio', 'dt_comercializacao_fim'));
			$Select->join(array('e' => 'comercializacao.comercializacoes_estados'), 'c.id = e.id_comercializacao', false);
			$Select->where('c.id_produto = ?', $this->id_produto);
			$Select->where('e.id_estado = ?', $propriedade['id_estado']);
			$Select->where('c.fl_ativo = true');
            $Select->where("c.tp_comercializacao = 'E'");
			$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		}

		return $Row;
	}

	public function editHabilitado() {
		switch ($this->ds_chave) {
			case 'PROPOSTA_INCOMPLETA':
			case 'NAO_ENVIADA':
			case 'DEVOLVIDA':
				$return = true;
				break;
			default:
				$return = false;
				break;
		}

		if (($this->ds_nome_produto == "Pastagem Protegida - Índice") && ($this->ds_nome_municipio == 'NULO') && ($this->ds_sigla == 'NL') && ($return)) return true;
		
		$comercializacao = $this->getComercializacao();

		if ($return === true) {
			$Habilitacoes = new Produto_Model_Habilitacoes();
			$Corretor = $this->corretor();
			$Preposto = $this->preposto();
			
			if($Preposto['id_usuario']){
			    $id_usuario = $Preposto['id_usuario'];
			} else {
			    $id_usuario = $Corretor['id_usuario'];
			}
			

			if ($comercializacao) {
				if (Agro_Util::checkBetweenDatas(date('Y-m-d'), $comercializacao['dt_comercializacao_inicio'], $comercializacao['dt_comercializacao_fim'])) {
					$return = true;
				} else {
					$return = false;
				}
			} else {
				$return = false;
			}
			
			$propriedade = $this->propriedade();
			if ($return && !$Habilitacoes->habilitado($id_usuario, $this->id_usuario_criacao, $this->id_produto, $propriedade['id_estado'])) {
				$return = false;
			}
		}
		
		return $return;
	}

	public function checkCobertura($chave) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('c' => 'produto.coberturas'), array('id'));
		$Select->join(array('p' => 'seguro.propostas_coberturas'), 'c.id = p.id_cobertura', null);
		$Select->where('ds_chave_cobertura = ?', $chave);
		$Select->where('p.id_proposta = ?', $this->id);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function getProdutos() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'produto.produtos'), array('id', 'ds_nome_produto'));
		$Select->where('id_safra= ?', $this->id_safra);
		$Select->order('ds_nome_produto');
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
		$return = array('');

		if (count($Rs)) {
			foreach ($Rs as $Row) {
				$return[$Row['id']] = $Row['ds_nome_produto'];
			}
		}

		return $return;
	}

	public function getPrepostos() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'sistema.prepostos'), array('id', 'id_usuario', 'ds_nome_preposto'));
		$Select->join(array('c' => 'sistema.corretores'), 'p.id_corretor = c.id', false);
		$Select->join(array('pc' => 'seguro.propostas_corretores'), 'c.id_usuario = pc.id_usuario', false);
		$Select->where('id_proposta = ?', $this->id);
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

		if (count($Rs)) {
			$return = array('');
			foreach ($Rs as $Row) {
				$return[$Row['id_usuario']] = $Row['ds_nome_preposto'];
			}
		} else {
			$return = array('--- Nenhum corretor vinculado para o preposto selecionado ---');
		}

		return $return;
	}

	public function checkStatusHistorico($chave) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('ps' => 'seguro.propostas_status'));
		$Select->join(array('s' => 'sistema.status'), 'ps.id_status = s.id');
		$Select->where('upper(s.ds_chave) = upper(?)', $chave);
		$Select->where('ps.id_proposta = ?', $this->id);

		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
		return count($Rs);
	}

	public function configuracoes() {
		$Produto = $this->produto();
		return $Produto->configuracao();
	}

    public function valoresCoberturas() {
		$Coberturas = new Seguro_Model_PropostasCoberturas();
		return $Coberturas->get($this->id);
	}

	public function questionarios() {
    	$Model = new Produto_Model_Atributos();
    	$proponente = $this->proponente();
    	$corretor = $this->corretor();
    	$preposto = $this->preposto();

    	return $Model->getGrupoAtributo($this->id_produto, 'QUESTIONARIO', $corretor['id_usuario'], $preposto['id_usuario'], $proponente['cpf_cnpj']);
    }

    public function respostas($chave='') {
    	if ($chave == '') {
	    	$Model = new Seguro_Model_PropostasQuestionarios();
	    	return $Model->getRespostas($this->id);
    	} else {
    		$Model = new Seguro_Model_PropostasQuestionarios();
	    	return $Model->getResposta($this->id, $chave);
    	}
    }

    public function segurado($field=false) {
    	$Model = new Seguro_Model_PropostasQuestionarios();

    	if ($field) {
    		$Row = $Model->fetchRow("id_proposta = {$this->id}");
    		return $Row->{$field};
    	} else {
    		return $Model->fetchAll("id_proposta = {$this->id}")->count();
    	}
    }

	public function itens() {
    	$Model = new Produto_Model_Atributos();
    	$corretor = $this->corretor();
    	$preposto = $this->preposto();

    	if (array_key_exists('cpf_cnpj_proponente', $this)) {
    		return $Model->getGrupoAtributo($this->id_produto, 'UNIDADE_SEGURADA', $corretor['id_usuario'], $preposto['id_usuario'], $this->cpf_cnpj_proponente);
    	} else {
    		$Proponente = $this->proponente();
    		$corretor = $this->corretor();
    		$preposto = $this->preposto();

    		return $Model->getGrupoAtributo($this->id_produto, 'UNIDADE_SEGURADA', $corretor['id_usuario'], $preposto['id_usuario'], $Proponente->cpf_cnpj);
    	}
    }

	public function unidades($count=true, $lmgaZerado = false) {
    	$Model = new Seguro_Model_ItensSegurados();

    	if ($count) {
    		return $Model->fetchAll("id_proposta = {$this->id}")->count();
    	} else {
    		return $Model->fetchItensProposta($this->id, $lmgaZerado);
    	}
    }

    public function parcelamento() {
        $Produto = $this->produto();

        if($this->id_versao && $Produto['ds_nome_fantasia'] == 'ESSOR SEGUROS'){
            $where = ' b.id_versao = '.$this->id_versao.' and b.id_versao = pr.id_versao and ';
			$wherePropostasBoletosProrrogacoes = ' max_pbp.id_versao = '.$this->id_versao.' AND max_pbp.id_versao = pr.id_versao AND ';
        }

    	$Select = $this->select()->setIntegrityCheck(false);
    	$Select->from(array('p' => 'seguro.propostas_parcelas'),array('p.fl_pago as fl_pago_parcela', '*'));
    	$Select->join(array('pr' => 'seguro.propostas'), 'p.id_proposta = pr.id and pr.id_endosso = p.id_endosso and pr.id_endosso = '.$this->id_endosso, null);
    	$Select->join(array('pd' => 'produto.produtos'), 'pr.id_produto = pd.id', 'id_safra');
    	$Select->joinLeft(array('b' => 'seguro.proposta_boletos'), $where .'p.id_proposta = b.id_proposta and p.nr_parcela = b.nr_parcela and b.fl_ativo = true', array('nu_boleto', 'ds_identificador', 'fl_pago'));
		$Select->joinLeft(
			['max_pbp' => "(SELECT max(id) AS id
							  	  ,id_proposta
							  	  ,nr_parcela
							  	  ,id_versao
							  FROM seguro.propostas_boletos_prorrogacoes
							 WHERE fl_ativo is true
							 GROUP BY id_proposta, nr_parcela, id_versao)"],
			"{$wherePropostasBoletosProrrogacoes} max_pbp.id_proposta = p.id_proposta AND max_pbp.nr_parcela = p.nr_parcela",
			false
		);
		$Select->joinLeft(
			['pbp' => 'seguro.propostas_boletos_prorrogacoes'],
			"pbp.id = max_pbp.id",
			[
				'id_versao as id_versao_prorrogacao',
				'vl_total as vl_total_prorrogacao',
				'vl_segurado as vl_segurado_prorrogacao',
				'vl_juros as vl_juros_prorrogacao',
				'vl_multa as vl_multa_prorrogacao',
				'dt_vencimento as dt_vencimento_prorrogacao',
				'ds_nome_arquivo as ds_nome_arquivo_prorrogacao']);
		$Select->where('p.id_proposta = ?', $this->id);
    	$Select->order('p.nr_parcela');

    	return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
    }

	public function area() {
		$Select = $this->select()->setIntegrityCheck(false)->from(array('i' => 'sumario.itens_segurados'), 'vl_area')->where('i.id_proposta = ?', $this->id);
		$area = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		return ($area ? $area : 0);
	}

	public function area_liquida() {
    	$Model = new Seguro_Model_ItensSegurados();
    	return $Model->getAreaTotal($this->id,true);
    }

	public function cultura() {
    	$Model = new Produto_Model_Produtos();
    	return $Model->getCultura($this->id_produto);
	}

	public function taxas($idAgrupamento, $producaoGarantida, bool $retornarTipoTaxa = false) {
		$agrupamento = $this->agrupamento();
		$Taxas = new Comercializacao_Model_Taxas();
        $retornoTaxas = $Taxas->getTaxasProposta($agrupamento['id'], $producaoGarantida, $this->id_proposta_renovada);

        if ($retornarTipoTaxa && is_array($retornoTaxas)) {
            $retornoTaxas['tp_taxa_agrupamento'] = $agrupamento['tp_taxa_agrupamento'];
        }

		return $retornoTaxas;
	}

	public function taxa_cobertura_principal() {
		$Taxas = new Seguro_Model_PropostasCoberturas();
		$Row = $Taxas->fetchRow("id_proposta = {$this->id} and fl_principal = true");
		return $Row->vl_taxa;
	}

	public function taxas_relacionadas($fl_renovada=false) {
		$agrupamento = $this->agrupamento();

		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('ta' => 'comercializacao.taxas_agrupamento'));
		$Select->join(array('tv' => 'comercializacao.taxas_valores'), 'ta.id = tv.id_taxa_agrupamento');
		$Select->where('ta.id = ?', $agrupamento['id']);
		if ($fl_renovada) {
			$Select->where("tv.fl_franquia_disponivel in ('S', 'R')");
		} else {
			$Select->where("tv.fl_franquia_disponivel in ('S', 'N')");
		}
		$Select->order("tv.vl_franquia asc");
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
		$return = array();

		if (count($Rs)) {
			foreach ($Rs as $Row) {
				$return[] = $Row;
			}
		}

		return $return;
	}

	public function taxa_gratuita($idCobertura) {
		$agrupamento = $this->agrupamento();

		$Select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$Select->from(array('ta' => 'comercializacao.taxas_agrupamento'),false);
		$Select->join(array('tv' => 'comercializacao.taxas_valores'), 'ta.id = tv.id_taxa_agrupamento', array('max(vl_taxa) as vl_taxa', 'max(vl_taxa_renovacao) as vl_taxa_renovacao'));
		$Select->where('ta.id = ?', $agrupamento['id']);
		$Select->where('tv.id_cobertura = ?', $idCobertura);
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

		$return = false;
		if (count($Rs)) {
		    if($this->id_proposta_renovada){
		        $return = ($Rs[0]['vl_taxa_renovacao'] == 0 ? true : false);
		    } else {
		        $return = ($Rs[0]['vl_taxa'] == 0 ? true : false);
		    }
		}
		return $return;
	}

	public function comissoes() {
		$Model = new Seguro_Model_Propostas();

		return $Model->getComissoesCoberturaPrincipal($this->id_produto);
	}

	public function beneficiarios() {
		$Model = new Seguro_Model_PropostasBeneficiarios();

        //subselect para pegar o último arquivo inserido para o beneficiário
        $subSelect = $Model->select()->setIntegrityCheck(false);
        $subSelect->from(array('sba' => 'seguro.beneficiarios_arquivos'), array('id_beneficiario', 'max(dt_criacao) as dt_criacao'));
        $subSelect->where('sba.fl_ativo = true');
        $subSelect->group('id_beneficiario');
        $subSelect->order('dt_criacao DESC');

		$subSelectAssinatura = " SELECT arr->>'id' AS id_proposta_beneficiario, 
									    arr->>'email' AS email
								   FROM seguro.propostas_email_assinatura_documento,
								        jsonb_array_elements(ds_email_beneficiarios) as arr
	   							  WHERE fl_ativo is true";

		$Select = $Model->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'seguro.propostas_beneficiarios'));
		$Select->joinLeft(array('bf' => 'seguro.beneficiarios'), 'bf.cpf_cnpj = p.nr_cpf_cnpj', ['id as id_beneficiario, fl_restricao', 'ds_endereco_cep', 'ds_endereco_bairro', 'ds_endereco_logradouro', 'ds_endereco_nro', 'ds_endereco_complem']);
		$Select->joinLeft(array('st' => 'sistema.status'), 'st.id = bf.id_status_arquivos', 'ds_status');
		$Select->joinLeft(array('b' => 'sistema.bancos'), 'p.id_banco = b.id', 'ds_nome_banco');
		$Select->joinLeft(array('ib' => 'seguro.informacoes_bancarias'), 'ib.id_proposta = '.$this->id.' and ib.cpf_cnpj = p.nr_cpf_cnpj', array('nu_conta_corrente','nu_digito_conta_corrente','nu_agencia','nu_digito_agencia','id_forma_pagamento'));
		$Select->joinLeft(array('bc' => 'sistema.bancos'), 'bc.id = ib.id_banco', 'nr_banco');
        $Select->joinLeft(array('ba' => $subSelect), 'ba.id_beneficiario = bf.id', "to_char(ba.dt_criacao, 'DD/MM/YYYY') as dt_ultimo_arquivo_beneficiario");
		$Select->joinLeft(array('email_assinatura_documento' => new Zend_Db_Expr("($subSelectAssinatura)")), 'email_assinatura_documento.id_proposta_beneficiario = p.id::text', "email_assinatura_documento.email as email_assinatura");
        $Select->joinLeft(['sm' => 'sistema.municipios'], 'sm.id = bf.id_municipio', ['ds_nome_municipio']);
        $Select->joinLeft(['se' => 'sistema.estados'], 'se.id = sm.id_estado', ['ds_sigla']);
		$Select->where("p.id_proposta = ?", $this->id);
		$Select->where("p.fl_del = ?", "false");
		$Select->order('id asc');
		
		$Rs = $Model->fetchAll($Select);
		$Beneficiarios = $Rs->toArray();

		if ($Beneficiarios) {
			$result = array();
			foreach ($Beneficiarios as $beneficiario) {
				$arr = $beneficiario;

				if (strlen($beneficiario['nr_cpf_cnpj']) > 14){
					$arr['tp_pessoa'] = 'J';
				} else {
					$arr['tp_pessoa'] = 'F';
				}

				$result[] = $arr;
			}

			return $result;
		}
	}
	
	public function beneficiariosRelatorio($Model = null) {
		if (empty($Model)) {
	        $Model = new Seguro_Model_PropostasBeneficiarios();
        }

		//subselect para pegar o último arquivo inserido para o beneficiário
		$subSelect = $Model->select()->setIntegrityCheck(false);
		$subSelect->from(array('sba' => 'seguro.beneficiarios_arquivos'), array('id_beneficiario', 'max(dt_criacao) as dt_criacao'));
		$subSelect->where('sba.fl_ativo = true');
		$subSelect->group('id_beneficiario');
		$subSelect->order('dt_criacao DESC');

        $camposSelect = [
            'p.*',
			'bf.tp_pessoa',
			'bf.id as id_beneficiario',
            'st.ds_status',
            'b.ds_nome_banco',
            'ib.nu_conta_corrente',
            'ib.nu_digito_conta_corrente',
            'ib.nu_agencia',
            'ib.nu_digito_agencia',
            'ib.id_forma_pagamento',
			"(CASE WHEN ib.ds_tipo_conta = 'C' THEN 'Conta Corrente' WHEN ib.ds_tipo_conta = 'P' THEN 'Conta Poupança' WHEN ib.ds_tipo_conta = 'O' THEN 'Ordem de Pagamento' ELSE '' END) AS ds_tipo_conta",
			"(CASE WHEN ib.fl_conta_conjunta IS TRUE THEN 'Sim' ELSE 'Não' END) AS fl_conta_conjunta",
            'bc.nr_banco',
            "to_char(ba.dt_criacao, 'DD/MM/YYYY') as dt_ultimo_arquivo_beneficiario",
            new Zend_Db_Expr("false as banco"),
        ];

		$Select = $Model->select()->setIntegrityCheck(false);
		$Select->from(array('p' => 'seguro.propostas_beneficiarios'), $camposSelect);
		$Select->join(array('bf' => 'seguro.beneficiarios'), 'bf.cpf_cnpj = p.nr_cpf_cnpj', null);
		$Select->joinLeft(array('st' => 'sistema.status'), 'st.id = bf.id_status_arquivos', null);
		$Select->joinLeft(array('b' => 'sistema.bancos'), 'p.id_banco = b.id', null);
		$Select->joinLeft(array('ib' => 'seguro.informacoes_bancarias'), 'ib.cpf_cnpj = p.nr_cpf_cnpj AND ib.id_proposta = p.id_proposta', null);
		$Select->joinLeft(array('bc' => 'sistema.bancos'), 'bc.id = ib.id_banco', null);
		$Select->joinLeft(array('ba' => $subSelect), 'ba.id_beneficiario = bf.id', null);
		$Select->where("p.id_proposta = ?", $this->id);
		$Select->where("p.fl_del = ?", "false");
		
        $camposSelectBanco = [
            'p.*',
			'bf.tp_pessoa',
			'bf.id as id_beneficiario',
            new Zend_Db_Expr("'' as ds_status"),
            'b.ds_nome_banco',
            'ib.nu_conta_corrente',
            'ib.nu_digito_conta_corrente',
            'ib.nu_agencia',
            'ib.nu_digito_agencia',
            'ib.id_forma_pagamento',
			"(CASE WHEN ib.ds_tipo_conta = 'C' THEN 'Conta Corrente' WHEN ib.ds_tipo_conta = 'P' THEN 'Conta Poupança' WHEN ib.ds_tipo_conta = 'O' THEN 'Ordem de Pagamento' ELSE '' END) AS ds_tipo_conta",
			"(CASE WHEN ib.fl_conta_conjunta IS TRUE THEN 'Sim' ELSE 'Não' END) AS fl_conta_conjunta",
            'bc.nr_banco',
            new Zend_Db_Expr("'' as dt_ultimo_arquivo_beneficiario"),
            new Zend_Db_Expr("true as banco"),
        ];

        $SelectBanco = $Model->select()->setIntegrityCheck(false);
        $SelectBanco->from(array('p' => 'seguro.propostas_beneficiarios'), $camposSelectBanco);
		$SelectBanco->joinLeft(array('bf' => 'seguro.beneficiarios'), 'bf.cpf_cnpj = p.nr_cpf_cnpj', null);
        $SelectBanco->joinLeft(array('b' => 'sistema.bancos'), 'p.id_banco = b.id', null);
        $SelectBanco->joinLeft(array('ib' => 'seguro.informacoes_bancarias'), 'ib.cpf_cnpj = p.nr_cpf_cnpj AND ib.id_proposta = p.id_proposta', null);
        $SelectBanco->joinLeft(array('bc' => 'sistema.bancos'), 'bc.id = ib.id_banco', null);
        $SelectBanco->where("p.id_proposta = ?", $this->id);
        $SelectBanco->where("p.fl_del = ?", "false");
		$SelectBanco->where("bf.id is null");
        
        $selectTotal = $this->select()->setIntegrityCheck(false);
        $selectTotal->union(array($Select, $SelectBanco));
        $selectTotal->order('id asc');
		
		$Rs = $Model->fetchAll($selectTotal);
		$Beneficiarios = $Rs->toArray();
		
		if ($Beneficiarios) {
			return $Beneficiarios;
		}
	}

	public function subvencaoCultura()
    {
        $cultura = $this->cultura();
        $comercial = $this->comercial();
        $corretor = $this->corretor();

        $idGrupoLimiteSubvencao = (new Produto_Model_ValidacoesSubvencaoGrupos())->getGrupoLimiteSubvencao(
            (int)$comercial['id_comercial'],
            (int)$cultura['id'],
            (int)$corretor['id_usuario'],
            date('Y')
        );

        if ($idGrupoLimiteSubvencao['id'] > 0) {
            $select = $this->select()->setIntegrityCheck(false);
            $select->from(
                array('vls' => 'produto.validacoes_limites_subvencao_grupos'),
                array('vl_limite_subvencao', 'seguro.soma_subvencao_utilizada(vls.id) as vl_subvencao_utilizada')
            );
            $select->where('id = ?', $idGrupoLimiteSubvencao['id']);
            $row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

            return array(
                'grupo' => $idGrupoLimiteSubvencao['id'],
                'liberado' => $row['vl_limite_subvencao'],
                'usado' => $row['vl_subvencao_utilizada']
            );
        } else {
            return array(
                'grupo' => null,
                'liberado' => 0,
                'usado' => 0
            );
        }
    }

	public function subvencaoCulturaGrupoCorretores() {
		$cultura = $this->cultura();
		$corretor = $this->corretor();

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('v' => 'seguro.v_subvencao_federal_corretor_grupo'), array('vl_liberado', 'vl_usado'));
		$Select->where('id_validacao in (select id_validacao_subvencao_grupo from produto.validacoes_limites_subvencao_grupos_usuarios where id_usuario = '.$corretor['id_usuario'].')');
		$Select->where('v.id_cultura = ?', $cultura['id']);
		$Select->where('v.fl_ativo = true');

		$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('pp' => 'seguro.propostas_parcelas'), 'sum(pp.vl_subvencao_federal)');
		$Select->where('id_proposta = ?', $this->id);
		$sum = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);

		return array(
			'liberado' => $Row['vl_liberado'],
			'usado' => $Row['vl_usado']
		);
	}

	public function croquis($returnCount=false) {
		$Model = new Seguro_Model_PropostasArquivos();
		
		//if ($this->safra()->id <= 22) {
			// não mostrar croqui georeferenciado que foram gerados para ser utilizados na renovação safra 23
			//$filter = ' and id_proposta not in (select id_proposta from seguro.propostas_croquis)';
		//}

		$filter = " and ds_nome_arquivo <> 'croqui_georref_renovacao' ";

		if ($returnCount) {
    		return $Model->fetchAll("id_proposta = {$this->id} {$filter}")->count();
    	} else {
    		return $Model->fetchAll("id_proposta = {$this->id} {$filter}");
    	}
	}

	public function croquigeo($returnCount=false, $flPastagem=false) {
		if ($returnCount) {
			return (new Seguro_Model_PropostasCroquis())->fetchAll("id_proposta = {$this->id} and fl_vigente = true")->count();
		} else {
			return (new Seguro_Model_PropostasCroquis())->fetchAll("id_proposta = {$this->id} and fl_vigente = true")->toArray()[0];
		}
	}

	public function observacoes() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('o'=>'seguro.propostas_observacoes'));
		$Select->joinLeft(array('po' => 'seguro.propostas_observacoes_arquivos'), 'po.id_observacao = o.id', array('id as id_arquivo','ds_nome_arquivo'));
		$Select->joinLeft(array('u' => 'sistema.usuarios'), 'o.id_usuario_criacao = u.id', 'ds_nome_usuario');
		$Select->where('o.id_proposta = ?', $this->id);
		$Select->order('o.dt_criacao');

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function countTaxasCobertura($id_agrupamento,$id_cobertura,$fl_renovada=false) {
	    if($fl_renovada){
	        $where = " and tv.fl_franquia_disponivel in ('S', 'R')";
	    } else {
	        $where = " and tv.fl_franquia_disponivel in ('S', 'N')";
	    }
		$Select = "select count(*) from comercializacao.taxas_agrupamento ta, comercializacao.taxas_valores tv where tv.id_cobertura=".$id_cobertura." and ta.id=".$id_agrupamento." and tv.id_taxa_agrupamento = ta.id $where";
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function franquia_cobertura_principal() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select vl_franquia from seguro.propostas_coberturas where fl_principal=true and id_proposta = {$this->id}");
	}

	public function premio_liquido() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select sum(vl_premio) as liquido from seguro.propostas_coberturas where id_proposta = {$this->id} and fl_ativo = true");
	}

	public function premio_liquido_parcelas() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select sum(vl_total) as liquido_parcelas from seguro.propostas_parcelas where id_endosso = {$this->id_endosso} and id_proposta = {$this->id} and fl_ativo = true");
	}

	public function premio_segurado() {
	    return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select sum(vl_segurado) as vl_segurado from seguro.propostas_parcelas where id_proposta = {$this->id} and fl_ativo = true");
	}
	
	public function subvencao_federal() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select sum(vl_subvencao_federal) as vl_subvencao_federal from seguro.propostas_parcelas where id_proposta = {$this->id} and fl_ativo = true");
	}

	public function subvencao_federal_endosso() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne(
				"select
					sum(pp.vl_subvencao_federal) as vl_subvencao_federal
				from
					seguro.propostas_parcelas pp,
				    seguro.propostas pr,
					sistema.status st
				where
				    pp.id_proposta = pr.id and
				    pr.id_status = st.id and
				    st.ds_chave in ('APOLICE_EMITIDA','AGUARDANDO_ENVIO_SEG','TRANSMITIDA_SEGURADORA','AGUARDANDO_EMISSAO') and
					pp.id_proposta in (select id_proposta from seguro.propostas_endosso where id_endosso=".$this->id_endosso.")");
	}

	public function subvencao_estadual() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select sum(vl_subvencao_estadual) as vl_subvencao_estadual from seguro.propostas_parcelas where id_proposta = {$this->id} and fl_ativo = true");
	}

	public function subvencao_estadual_endosso() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne(
				"select
					sum(pp.vl_subvencao_estadual) as vl_subvencao_estadual
				from
					seguro.propostas_parcelas pp,
				    seguro.propostas pr,
					sistema.status st
				where
				    pp.id_proposta = pr.id and
				    pr.id_status = st.id and
				    st.ds_chave in ('APOLICE_EMITIDA','AGUARDANDO_ENVIO_SEG','TRANSMITIDA_SEGURADORA','AGUARDANDO_EMISSAO') and
					pp.id_proposta in (select id_proposta from seguro.propostas_endosso where id_endosso=".$this->id_endosso.")");
	}

	public function taxa_cobertura_endossada($id_proposta, $id_cobertura) {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select vl_taxa from seguro.propostas_coberturas where id_cobertura = {$id_cobertura} and id_proposta = {$id_proposta}");
	}

	public function lmga_item_endossado($id_proposta, $nr_item) {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select vl_lmga from seguro.itens_segurados where nr_item_segurado = {$nr_item} and id_proposta = {$id_proposta}");
	}


	public function comissao() {
		/*
		$Corretores = new Seguro_Model_PropostasCorretores();
		$Corretor = $Corretores->fetchRow("id_proposta = {$this->id}");
		return $Corretor->vl_comissao;
		*/
		return 1;
	}

	public function comissaoOriginal() {
		$Corretores = new Seguro_Model_PropostasCorretores();
		$ComissaoCorretor = $Corretores->fetchRow("id_proposta = {$this->id}");
		return $ComissaoCorretor;
	}

	public function comissaoCorretor() {
		$Corretores = new Seguro_Model_PropostasCorretores();
		$Corretor = $Corretores->fetchRow("id_proposta = {$this->id}");
		return $Corretor->vl_comissao ? $Corretor->vl_comissao : '0';
	}

	public function franquia() {
		$Coberturas = $this->coberturas();

		if ($Coberturas) {
			foreach ($Coberturas as $Cobertura) {
				if ($Cobertura['fl_principal']) {
					return $Cobertura['vl_franquia'];
				}
			}
		}
	}

	public function countParcelas() {
		$Parcelas = new Seguro_Model_PropostasParcelas();
		return $Parcelas->fetchAll("id_proposta = {$this->id} and vl_segurado > 0")->count();
	}

	public function unidadesSemCiclo() {
		$Validacoes = new Produto_Model_Validacoes();
		$Produtos = new Produto_Model_Produtos();

		$Produto = $Produtos->find($this->id_produto)->current();
		$unidades = $this->unidades(false);
		$Validacao = $Produto->validacao('VALIDACAO_ZONEAMENTO');
		$propriedade = $this->propriedade();

		$ret = array();
		if (is_array($unidades)) {
			foreach ($unidades as $unidade) {
				if ($unidade['IS_CICLO_VARIEDADE']) {
					$rsZoneamento = $Validacoes->verificaZoneamento(
							($this->respostas('QUEST_TIPO_SOLO') ? $this->respostas('QUEST_TIPO_SOLO') : $unidade['IS_TIPO_SOLO']), 
							$this->id_produto, 
							$unidade['IS_CICLO_VARIEDADE'], 
							$propriedade['id_municipio'], 
							$unidade['IS_DATA_SEMEADURA'],
							$unidade['IS_ALTITUDE'],
							$unidade['IS_SISTEMA_PLANTIO']
							);
					if ($rsZoneamento['status'] == false) {
						$ret[] = $unidade['IS_ITEM'];
					}
				}
			}
		}

		return $ret;
	}

	public function atualizaPremio($premio, $cobertura) {
		if ($premio && $cobertura) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->query("update seguro.propostas_coberturas set vl_premio = $premio where id_cobertura = $cobertura and id_proposta = {$this->id}");

		}
	}

	/**
	 * Atualiza o parcelamento com o retorno da Agro_Regras::RN_CALC_06
	 *
	 * @param array $parcelas - retorno do calculo
	 */
	public function atualizaParcelas($parcelas) {
		if ($parcelas['status']) {
			$PropostaParcelas = new Seguro_Model_PropostasParcelas();
			$PropostaParcelas->deleteProposta($this->id, $this->id_endosso);

			foreach ($parcelas['itens'] as $nro => $parcela) {
				$row = array(
					'federal' => $parcela['premio_federal'],
					'estadual' => $parcela['premio_estadual'],
					'segurado' => $parcela['premio_segurado'],
					'vencimento' => $parcela['vencimento'],
				    'id_endosso' => $this->id_endosso
				);

				$PropostaParcelas->save($row, $nro, $this->id);
			}
		}

	}

	public function recalcula($nroParcelas=false, $bloquearParcelamento=false, $flAtendimento=false) {
		$Regras = new Agro_Regras();
		return $Regras->calcula($this->id, $nroParcelas, $bloquearParcelamento, $flAtendimento);
	}

	public function getValidacaoLimiteCapacidade() {
		$propriedade = $this->propriedade();
		$return = array();

		$Select = $this->select()->setIntegrityCheck(false)->distinct();
		$Select->from(array('l' => 'produto.validacoes_limites_capacidade'), array('id', 'ds_nome_grupo', 'vl_limite_capacidade', 'fl_agrupar_municipios', 'fl_limite_corretor', 'vl_reserva_tecnica'));
		$Select->join(array('p' => 'produto.validacoes_limites_capacidade_produtos'), 'l.id = p.id_grupo_limite_capacidade', false);
		$Select->joinLeft(array('e' => 'produto.validacoes_limites_capacidade_estados'), 'l.id = e.id_grupo_limite_capacidade', false);
		$Select->joinLeft(array('m' => 'produto.validacoes_limites_capacidade_municipios'), 'l.id = m.id_grupo_limite_capacidade', false);
		$Select->join(array('c' => 'produto.validacoes_limites_capacidade_coberturas'), 'l.id = c.id_grupo_limite_capacidade', false);
		$Select->where('e.id_estado = '.$propriedade['id_estado']. ' or m.id_municipio = '.$propriedade['id_municipio']);
		$Select->where('p.id_produto = ?', $this->id_produto);
		$Select->where('l.fl_ativo = true');
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

		if (count($Rs)) {
			foreach ($Rs as $Row) {
				$return[$Row['id']] = array(
					'id' => $Row['id'],
					'ds_nome_grupo' => $Row['ds_nome_grupo'],
					'vl_limite_capacidade' => $Row['vl_limite_capacidade'],
					'fl_agrupar_municipios' => $Row['fl_agrupar_municipios'],
				    'fl_limite_corretor' => $Row['fl_limite_corretor'],
				    'vl_reserva_tecnica' => $Row['vl_reserva_tecnica'],
					'coberturas' => Agro_Db_Table_Abstract::getDefaultAdapter()->fetchPairs("select id_cobertura, id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = {$Row['id']}"),
					'municipios' => Agro_Db_Table_Abstract::getDefaultAdapter()->fetchPairs("select id_municipio, id_municipio from produto.validacoes_limites_capacidade_municipios where id_grupo_limite_capacidade = {$Row['id']}"),
					'uf' => Agro_Db_Table_Abstract::getDefaultAdapter()->fetchPairs("select id_estado, id_estado from produto.validacoes_limites_capacidade_estados where id_grupo_limite_capacidade = {$Row['id']}"),
					'corretores' => Agro_Db_Table_Abstract::getDefaultAdapter()->fetchPairs("select id_usuario, id_usuario from produto.validacoes_limites_capacidade_usuarios where id_grupo_limite_capacidade = {$Row['id']}")
				);
			}
		}

		return $return;
	}

	public function getValidacaoLimiteCapacidadeCompleto() {
		$propriedade = $this->propriedade();
		$coberturas = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchPairs("select id_cobertura, id_cobertura from seguro.propostas_coberturas where id_proposta = {$this->id}");

		foreach($coberturas as $cobertura){
			$Select = $this->select()->setIntegrityCheck(false)->distinct();
			$Select->from(array('l' => 'produto.validacoes_limites_capacidade'), array('id', 'ds_nome_grupo', 'vl_limite_capacidade', 'fl_agrupar_municipios', 'fl_limite_corretor'));
			$Select->join(array('p' => 'produto.validacoes_limites_capacidade_produtos'), 'l.id = p.id_grupo_limite_capacidade', false);
			$Select->join(array('e' => 'produto.validacoes_limites_capacidade_estados'), 'l.id = e.id_grupo_limite_capacidade', false);
			$Select->join(array('c' => 'produto.validacoes_limites_capacidade_coberturas'), 'l.id = c.id_grupo_limite_capacidade', false);
			$Select->join(array('u' => 'produto.validacoes_limites_capacidade_usuarios'), 'l.id = u.id_grupo_limite_capacidade', false);
			$Select->where('e.id_estado = ?', $propriedade['id_estado']);
			$Select->where('p.id_produto = ?', $this->id_produto);
			$Select->where('u.id_usuario = ?', $this->id_usuario_criacao);
			$Select->where('c.id_cobertura = ?', $cobertura);
			$Select->where('l.fl_ativo = true');
			$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			if (!count($Rs)) {
				return false;
			}
		}

		return true;
	}

	public function getValorUsadoLimiteCapacidade($idValidacao, $coberturas=null, $municipio=null, $agruparMunicipios=null, $validarCorretor=null, $proposta=null, $debug=false) {
        //atualiza campo vl_lmga_capacidade na tabela sumario.itens_segurados
        //$this->_db->query("SELECT seguro.valor_retido(0);");
        Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll("SELECT seguro.valor_retido(0);");
        
		// Monta o SQL do IN de produtos
		$inProdutos = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$inProdutos->from(array('p' => 'produto.validacoes_limites_capacidade_produtos'), 'id_produto');
		$inProdutos->where('id_grupo_limite_capacidade = ?', $idValidacao);

		// Monta o SQL do IN de estados
		$inEstados = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$inEstados->from(array('p' => 'produto.validacoes_limites_capacidade_estados'), 'id_estado');
		$inEstados->where('id_grupo_limite_capacidade = ?', $idValidacao);

	    $inUsuarios = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$inUsuarios->from(array('p' => 'produto.validacoes_limites_capacidade_usuarios'), 'id_usuario');
		$inUsuarios->where('id_grupo_limite_capacidade = ?', $idValidacao);

		// Monta o SQL do IN de municipios
		if($agruparMunicipios == true){
		    $inMunicipios = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		    $inMunicipios->from(array('p' => 'produto.validacoes_limites_capacidade_municipios'), 'id_municipio');
		    $inMunicipios->where('id_grupo_limite_capacidade = ?', $idValidacao);
		}

		if (is_array($coberturas)) {
			$inCoberturas = array();
			foreach ($coberturas as $cobertura) {
				array_push($inCoberturas, $cobertura);
			}
		}

		$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$Select->from(array('p' => 'seguro.propostas'), false);
		$Select->join(array('pe' => 'seguro.propostas_endosso'), 'p.id = pe.id_proposta and pe.fl_proposta_vigente = true', false);
		$Select->join(array('st' => 'sistema.status'), 'p.id_status = st.id', false);
		$Select->join(array('pr' => 'seguro.propostas_propriedades'), 'p.id = pr.id_proposta', false);
		$Select->join(array('pc' => 'seguro.propostas_corretores'), 'p.id = pc.id_proposta', false);
		$Select->join(array('m' => 'sistema.municipios'), 'm.id = pr.id_municipio', false);
		$Select->join(array('e' => 'sistema.estados'), 'e.id = m.id_estado', false);
		$Select->join(array('pp' => 'sumario.itens_segurados'), 'p.id = pp.id_proposta', 'sum(vl_lmga_capacidade)');
		$Select->where("st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA','APOLICE_CANCELADA','ENDOSSO_ANULADO','ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')");
		$Select->where('p.id_produto in (?)', $inProdutos);

		if(!$municipio){
		    $Select->where('m.id_estado in (?)', $inEstados);
		}

		$Select->where('p.id_usuario_criacao in (?)', $inUsuarios);

		if($proposta){
		    $Select->where('p.id <> (?)', $proposta);
		}

		if (is_array($coberturas)) {
			$Select->where('(p.id in  (select id_proposta from seguro.propostas_coberturas where id_cobertura in ('.implode(',', $inCoberturas).')))');
		}

		if ($municipio) {
		    if($agruparMunicipios == true){
		        $Select->where('pr.id_municipio in (?)', $inMunicipios);
		    } else {
		        $propriedade = $this->propriedade();
		        $Select->where('pr.id_municipio = ?', $propriedade['id_municipio']);
		    }
		}

		$Select->where('pc.id_usuario not in (487, 488)'); // Usuários de teste

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function verificaCoberturas($coberturas_validacao) {
		$coberturas_proposta = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchPairs("select id_cobertura, id_cobertura from seguro.propostas_coberturas where id_proposta = {$this->id}");

		if (count($coberturas_validacao)) {
			foreach ($coberturas_validacao as $cobertura_validacao) {
				if (is_array($coberturas_proposta) && !in_array($cobertura_validacao, $coberturas_proposta)) {
					return false;
				}
			}
		} else {
			return false;
		}

		return true;
	}

	public function verificaMunicipio($municipios_validacao) {
		$propriedade = $this->propriedade();

		return in_array($propriedade['id_municipio'], $municipios_validacao);
	}

	public function verificaCorretor($corretores_validacao) {
		$corretor = $this->corretor();
		$preposto = $this->preposto();
		if($preposto['id_usuario']){
			$id_usuario = $preposto['id_usuario'];
		} else {
			$id_usuario = $corretor['id_usuario'];
		}
		return in_array($id_usuario, $corretores_validacao);
	}

	public function coberturaPrincipal() {
		$PropostaCoberturas = new Seguro_Model_PropostasCoberturas();
		$Row = $PropostaCoberturas->fetchRow("id_proposta = {$this->id} and fl_principal = true");
		return $Row->id_cobertura;
	}

	public function chamados($tipo=null,$dpto=null, $where=null) {
		$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$select->from(array('c' => 'atendimento.chamados'), array('c.id', 'c.id_usuario_criacao', 'c.id_usuario_alteracao', 'c.dt_alteracao', 'c.fl_ativo', 'c.fl_del', 'c.id_prioridade', 'c.id_tipo_chamado', 'c.id_status', 'c.id_departamento', 'c.id_proposta', 'c.ds_descricao', "c.id_parent", "c.dt_criacao","fl_lido"));
		$select->join(array('tc' => 'atendimento.tipo_chamado'), 'c.id_tipo_chamado = tc.id', array('tc.ds_chave as tipo_chamado', 'tc.ds_tipo_chamado'));
		$select->join(array('p' => 'atendimento.prioridade'), 'c.id_prioridade = p.id', array('ds_chave as prioridade'));
		$select->join(array('s' => 'sistema.status'), 'c.id_status = s.id', array('s.ds_status'));
		$select->join(array('d' => 'sistema.departamentos'), 'c.id_departamento = d.id', array('d.ds_nome_departamento'));
		$select->join(array('u' => 'sistema.usuarios'), 'c.id_usuario_criacao = u.id', array('u.ds_nome_usuario'));
		$select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = c.id_proposta', array('pp.ds_nome_proponente'));
		$select->join(array('cd' => 'atendimento.chamados_destinatario'), 'c.id = cd.id_chamado', false);
		$select->join(array('pr2' => 'seguro.propostas'), 'pr2.id = c.id_proposta', false);
		$select->joinLeft(array('e' => 'sistema.empresas'), 'e.id = cd.id_empresa', 'ds_nome_fantasia');
		$select->where('c.id_proposta = ?', $this->id);
		if ($tipo) {
			$select->where('tc.ds_chave = ?', $tipo);
		}
		if	($dpto) {
			$select->where('c.id_departamento = ?', $dpto);
		}
		if ($where) {
			$select->where($where);
		}

		$select->order('c.id desc');

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);

		//return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Chamados->getData(""));
	}

	public function vistoria() {
		$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select()->distinct(true);
		$select->from(array('pvp' => 'seguro.propostas_vistorias_previas'), 'emp.ds_nome_fantasia');
		$select->joinLeft(array('prop' => 'seguro.propostas'), 'pvp.id_proposta = prop.id', null);
		$select->joinLeft(array('vis' => 'sistema.vistorias'), 'vis.id= pvp.id_vistoria', null);
		$select->joinLeft(array('vemp' => 'sistema.vistorias_empresas'), 'vemp.id_vistoria= pvp.id_vistoria', null);
		$select->joinLeft(array('emp' => 'sistema.empresas'), 'emp.id= vemp.id_empresa', null);
		$select->where('prop.id = ?', $this->id);
		$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

		return ($Row ? $Row : array());
	}

	public function premio() {
		$ret = array();
		$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$select->from(array('p' => 'seguro.propostas'), 'vl_comissao');
		$select->join(array('pc' => 'seguro.propostas_coberturas'), 'p.id = pc.id_proposta', array('id_cobertura', 'fl_principal', 'vl_franquia', 'vl_taxa', 'vl_premio'));
		$select->join(array('c' => 'produto.coberturas'), 'c.id = pc.id_cobertura', 'ds_nome_cobertura');
		$select->where('pc.id_proposta = ?', $this->id);
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);

		if ($Rs) {
			foreach ($Rs as $Row) {
				$ret['dados']['comissao'] = $Row->vl_comissao;
				$ret['dados']['coberturas'][$Row->id_cobertura] = $Row;
			}
		}

		$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$select->distinct(true);
		$select->from(array('p' => 'seguro.propostas_parcelas'));
		$select->where('p.id_proposta = ?', $this->id);
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);

		if ($Rs) {
			foreach ($Rs as $Row) {
				$ret['vl_segurado_total'] += $Row->vl_segurado;
				$ret['vl_subvencao_federal_total'] += $Row->vl_subvencao_federal;
				$ret['vl_subvencao_estadual_total'] += $Row->vl_subvencao_estadual;


				$ret['dados']['parcela'][$Row->nr_parcela] = array(
					'premio_liquido' => $Row->vl_total,
					'premio_federal' => $Row->vl_subvencao_federal,
					'premio_estadual' => $Row->vl_subvencao_estadual,
					'premio_segurado' => $Row->vl_segurado,
					'vencimento' => date('d/m/Y', strtotime($Row->dt_vencimento))
				);
			}
		}
		$ret['vl_premio_total'] = $ret['vl_segurado_total'] + $ret['vl_subvencao_federal_total'] + $ret['vl_subvencao_estadual_total'];

		$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$select->distinct(true);
		$select->from(array('b' => 'seguro.propostas_beneficiarios'), array('id as id_beneficiario', '*'));
		$select->where('b.id_proposta = ?', $this->id);
		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);

		if ($Rs) {
			$i = 0;
			foreach ($Rs as $Row) {
				$ret['beneficiarios'][$i] = $Row;
				$i++;
			}
		}

		$select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$select->distinct(true);
		$select->from(array('o' => 'seguro.propostas_observacoes'));
		$select->where('o.id_proposta = ?', $this->id);
		$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

		if ($Row) {
			$ret['dados']['observacao'] = $Row->ds_observacao;
		}

		return $ret;
	}

	public function atributosCompleto() {
		$Atributos = new Produto_Model_Atributos();
		$Proponente = $this->proponente();
		$Corretor = $this->corretor();

		$return = array();
		$return['questionario'] = $Atributos->getGrupoAtributo($this->id_produto, 'QUESTIONARIO', $Corretor["id"], $this->id_usuario_criacao, $Proponente['cpf_cnpj']);
		$return['propriedades'] = $Atributos->getGrupoAtributo($this->id_produto, 'PROPRIEDADE', $Corretor["id"], $this->id_usuario_criacao, $Proponente['cpf_cnpj']);
		$return['unidades_seguradas'] = $Atributos->getGrupoAtributo($this->id_produto, 'UNIDADE_SEGURADA', $Corretor["id"], $this->id_usuario_criacao, $Proponente['cpf_cnpj']);

		return $return;
	}

	public function produto()
	{
		$dateTime = (new Seguro_Model_Propostas())->getDataTransmissaoPropostaMae($this->id);
		$configuracao = (new Produto_Model_ProdutoConfig())->getConfiguracaoByData($this->id_produto, $dateTime);
		
		if (empty($configuracao)) {
			return null;
		}

		$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$Select->from(array('p'=>'produto.produtos'), array('id','nr_susep','ds_nome_produto','cd_produto_seguradora','ar_condicoes_gerais','id_safra','id_produto_geral','ds_chave_produto', 'cd_mapa'));
		$Select->join(array('produtoconfig' => 'produto.produto_config'), 'produtoconfig.id_produto = p.id', array('ds_frase_padrao_orcamento', 'ds_frase_restricoes', 'ds_frase_risco', 'ds_url_condicoes'));
		$Select->join(array('s'=>'produto.safras'), 'p.id_safra = s.id', array('ds_nome_safra', 'dt_inicio', 'dt_termino', 'ds_chave'));
		$Select->join(array('se'=>'sistema.empresas'), 'p.id_seguradora = se.id', array('ds_nome_fantasia', 'cpf_cnpj', 'ds_razao_social'));
		$Select->join(array('pg'=>'produto.produtos_geral'), 'p.id_produto_geral = pg.id', array('id_tipo_produto','ds_nome_produto_geral','cd_produto_geral_seguradora'));
		$Select->join(array('tp'=>'produto.tipo_produto'), 'pg.id_tipo_produto = tp.id', array('ds_tipo_produto', 'ds_chave_rn'));
		$Select->join(
            array('c'=>'produto.culturas'),
            'pg.id_cultura = c.id',
            array('id as id_cultura', 'ds_nome_cultura', 'nr_ibge', 'cd_cultura_seguradora', 'cd_cultura_seguradora_2', "lpad(cast(c.cd_bacen as text), 10, '0') as cd_bacen", 'c.cd_bacen as codigo_bacen_cultura'));
		$Select->join(array('n'=>'produto.nomenclaturas'), 'c.id_nomenclatura = n.id', array('ds_nomenclatura', 'ds_descricao_nomenclatura'));
		$Select->join(array('r'=>'produto.ramos'), 'pg.id_ramo = r.id', array('ds_nome_ramo'));
		$Select->joinLeft(array('pv'=>'produto.produtos_validacoes'), 'p.id = pv.id_produto', 'id_validacao');
		$Select->joinLeft(array('v'=>'produto.validacoes'), "pv.id_validacao = v.id and v.ds_chave = 'VALIDACAO_ZONEAMENTO'", false);
		$Select->where("p.id = ?", $this->id_produto);
		$Select->where('produtoconfig.id = ?', $configuracao['id']);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}

	public function isPg(){

		$modelProposta = new Seguro_Model_Propostas();
		return $modelProposta->isProdutoMultirrisco($this->id);
	}

	public function possuiEndosso($fl_ocultar_item=false){
		$Produto = $this->produto();
		if($Produto['ds_nome_fantasia'] == 'ESSOR SEGUROS'){
			$count = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select count(*) from seguro.propostas pr, sistema.status st, seguro.propostas_endosso pe where pe.id_proposta = pr.id and st.id = pr.id_status and st.ds_chave not in ('ENDOSSO_INCOMPLETO','ORCAMENTO_ENDOSSO', 'SOLICITACAO_ENDOSSO', 'SOLICITACAO_CANCELADA') and pr.id_endosso={$this->id_endosso}");
			return ($count > 1 ? true : false);
		} else {
		    if($fl_ocultar_item == true){
			    $count = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select count(*) from seguro.propostas_observacoes where fl_observacao_endosso = true and id_proposta = $this->id");
		    } else {
	            $count = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select count(*) from seguro.propostas_observacoes where fl_ocultar_itens_segurados = true and fl_observacao_endosso = true and id_proposta = $this->id");
		    }
		    return ($count > 0 ? true : false);
		}
	}
	
	public function possuiEndossoRecente($id){
        $count = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select count(*) from seguro.propostas pr, sistema.status st, seguro.propostas_endosso pe where pe.id_proposta = pr.id and st.id = pr.id_status and st.ds_chave not in ('ENDOSSO_INCOMPLETO','ORCAMENTO_ENDOSSO','SOLICITACAO_ENDOSSO', 'SOLICITACAO_CANCELADA') and pe.id_proposta > {$id} and pr.id_endosso={$this->id_endosso}");
        return ($count >= 1 ? true : false);
	}

	public function atualizaAnaliseTransmissao($motivo) {
		$Proposta_Analise_Transmissao = new Seguro_Model_PropostasAnaliseTransmissao();
		$itens = array();
		$itens['id_proposta'] = $this->id;
		$itens['ds_motivo'] = $motivo;
		return $Proposta_Analise_Transmissao->insert($itens);
	}

	public function verifica_duplicidade_cpf() {
	    $Cultura = $this->cultura();
        $Proponente = $this->proponente();
        $Safra = $this->safra();
        $Produto = $this->produto();

	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('pr' => 'seguro.propostas'), array('pr.id'));
	    $Select->join(array('st' => 'sistema.status'), 'st.id = pr.id_status', null);
	    $Select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = pr.id', null);
	    $Select->join(array('po' => 'seguro.propostas_propriedades'), 'po.id_proposta = pr.id', array('po.ds_coordenadas', 'id_municipio'));
	    $Select->join(array('pd' => 'produto.produtos'), 'pd.id = pr.id_produto', null);
	    $Select->join(array('pg' => 'produto.produtos_geral'), 'pg.id = pd.id_produto_geral', null);
	    $Select->join(array('cu' => 'produto.culturas'), 'cu.id = pg.id_cultura', null);
	    $Select->where("st.ds_chave in ('APOLICE_EMITIDA', 'ENVIADA_AGUARDANDO_CONF', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO', 'AGUARDANDO_ENVIO_SEG', 'AGUARDANDO_VISTORIA_PREVIA', 'CONF_PENDENCIAS')");
	    //$Select->where('cu.id = ?', $Cultura['id']);
	    $Select->where('pd.id = ?', $Produto['id']);
	    $Select->where('pp.cpf_cnpj = ?', $Proponente['cpf_cnpj']);
	    $Select->where('pd.id_safra = ?', $Safra['id']);
	    $Select->where('pr.id <> ?', $this->id);
	    
	    return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function verifica_duplicidade_coordenada() {
	    $Cultura = $this->cultura();
	    $Propriedade = $this->propriedade();
	    $Safra = $this->safra();
	    $Produto = $this->produto();

	    $Select = $this->select()->setIntegrityCheck(false);
	    //$Select->from(array('pr' => 'seguro.propostas'), array("count(*) as total"));
	    $Select->from(array('pr' => 'seguro.propostas'), array("id"));
	    $Select->join(array('st' => 'sistema.status'), 'st.id = pr.id_status', null);
	    $Select->join(array('pp' => 'seguro.propostas_propriedades'), 'pp.id_proposta = pr.id', null);
	    $Select->join(array('pd' => 'produto.produtos'), 'pd.id = pr.id_produto', null);
	    $Select->join(array('pg' => 'produto.produtos_geral'), 'pg.id = pd.id_produto_geral', null);
	    $Select->join(array('cu' => 'produto.culturas'), 'cu.id = pg.id_cultura', null);
	    $Select->where("st.ds_chave in ('APOLICE_EMITIDA', 'ENVIADA_AGUARDANDO_CONF', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO', 'AGUARDANDO_ENVIO_SEG', 'AGUARDANDO_VISTORIA_PREVIA', 'CONF_PENDENCIAS')");
	    $Select->where('pd.id = ?', $Produto['id']);
	    $Select->where('pp.ds_coordenadas = ?', $Propriedade['ds_coordenadas']);
	    $Select->where('pd.id_safra = ?', $Safra['id']);
	    $Select->where('pr.id <> ?', $this->id);
	    
	    return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function buscaUsuarioPropostaPorUsuarioLogado($idUsuarioCorretor = null){
		$User = Zend_Auth::getInstance()->getIdentity();

		$sql = "select id_usuario from seguro.propostas_corretores where id_proposta = $this->id";
		if ($idUsuarioCorretor) {
			$sql .= " and id_usuario = $idUsuarioCorretor";
		}
		$id_usuario = Zend_Db_Table::getDefaultAdapter()->fetchOne($sql);
		
		$return = array();
		$result["id_usuario_corretor"] = -1;
		$result["id_usuario_preposto"] = -1;
		
		
		if ($id_usuario){
			$ModelPreposto = new Sistema_Model_Prepostos();
			$ModelCorretor = new Sistema_Model_Corretores();
			
			$Preposto = $ModelPreposto->fetchRow("id_usuario=$id_usuario");
			
			if ($Preposto){
				$Corretor = $ModelCorretor->find($Preposto->id_corretor)->current();
				
				$result["id_usuario_corretor"] = $Corretor->id_usuario;
				$result["id_usuario_preposto"] = $id_usuario;
				
			} else {
				$result["id_usuario_corretor"] = $id_usuario;
			}
			
		} 
		
		return $result;
	}
	
	public function buscaProdutosVinculados($idProdutoGeral){
	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('pr' => 'produto.produtos'), array("id", "ds_nome_produto"));
	    $Select->where('pr.id_produto_geral <> ?', $idProdutoGeral);
	    
	    return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function permite_alterar_comissao() {
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select fl_permite_alterar_comissao from sistema.prepostos where id_usuario = {$this->id_usuario_criacao} and fl_ativo = true");
	}
}
