<?php

class Relatorio_Model_Tecnica extends Agro_Db_Table_Relatorios {

	protected $_schema = 'seguro';
	protected $_name = 'propostas';

	public function getCoberturasAdicionais($id_proposta){
		$sql = "select pc.id_cobertura, pc.vl_taxa from seguro.propostas_coberturas pc
                INNER JOIN
                (
                   select id_cobertura from produto.produtos_coberturas pco, seguro.propostas pr
                   where pco.id_produto = pr.id_produto and pr.id=".$id_proposta." and pco.fl_contratacao_automatica=false and pco.fl_cobertura_principal=false
                ) as pco ON pc.id_cobertura = pco.id_cobertura and pc.id_proposta=".$id_proposta." and pc.fl_del=false order by pc.id_cobertura";
		return $this->_db->fetchAll($sql);
	}

	public function getCoberturasAdicionaisByIdsProposta(array $idsProposta): array {
		if (empty($idsProposta)) {
			return [];
		}

		$ids = implode(', ', $idsProposta);

		$sql = "
			SELECT
				pc.id_cobertura,
				pc.vl_taxa,
				pco.id_proposta,
				c.ds_nome_cobertura
			FROM seguro.propostas_coberturas pc
                INNER JOIN
                (
                	SELECT 
				   		id_cobertura,
						pr.id as id_proposta
					FROM 
						produto.produtos_coberturas pco
				   	INNER JOIN seguro.propostas pr
						ON pco.id_produto = pr.id_produto 
                   	WHERE 
						pr.id IN ({$ids})
						AND pco.fl_contratacao_automatica IS FALSE 
						AND pco.fl_cobertura_principal IS FALSE
                ) as pco ON pc.id_cobertura = pco.id_cobertura
					AND pco.id_proposta = pc.id_proposta
					AND pc.fl_del IS FALSE 
				INNER JOIN produto.coberturas c
					ON c.id = pc.id_cobertura
				ORDER BY 
					pc.id_cobertura
		";

		$rs = $this->_db->fetchAll($sql);
		$coberturas = [];

		foreach ($rs as $row) {
			$coberturas[$row['id_proposta']][] = $row;
		}

		return $coberturas;
	}

	public function getCoberturasConfiguradas($id_produto){
		$sql = "select
				    co.ds_nome_cobertura,
				    pc.id_cobertura,
				    pc.cd_cobertura_seguradora,
				    pc.vl_lmi,
				    case when pc.fl_validar_capacidade=true then 'Sim' else 'Não' end as fl_validar_capacidade
				from
				    produto.produtos pd,
				    produto.produtos_coberturas pc,
				    produto.coberturas co
				where
				    pd.id = ".$id_produto." and
				    pd.fl_ativo = true and
				    pc.id_produto = pd.id and
				    pc.fl_cobertura_principal = false and
				    co.id = pc.id_cobertura
				order by
				    co.ds_nome_cobertura";
		return $this->_db->fetchAll($sql);
	}


	public function getParcelasPropostas($id_proposta){
		$sql = "select fl_pago, vl_total, vl_segurado, vl_subvencao_federal, vl_subvencao_estadual, to_char(dt_vencimento,'DD/MM/YYYY') as dt_vencimento from seguro.propostas_parcelas where id_proposta=".$id_proposta." order by nr_parcela asc";
		return $this->_db->fetchAll($sql);
	}

	public function getParcelasPropostasBoletos($id_proposta, $id_versao){
		if($id_versao){
			$sql = "select fl_pago, vl_total, vl_segurado, vl_subvencao_federal, vl_subvencao_estadual, to_char(dt_vencimento,'DD/MM/YYYY') as dt_vencimento from seguro.proposta_boletos where id_versao=".$id_versao." and id_proposta=".$id_proposta." order by nr_parcela asc";
			return $this->_db->fetchAll($sql);
		}
		return false;
	}

	public function getCulturasVariedades($id_variedade){
		$sql = "select c.id, c.ds_nome_cultura from produto.culturas c, produto.culturas_variedades cv where cv.id_cultura = c.id and cv.id_variedade=".$id_variedade." order by c.ds_nome_cultura asc";
		return $this->_db->fetchAll($sql);
	}

	public function getSocios($cpf_cnpj){
		$sql = "select ds_nome_socio from seguro.propostas_proponentes_socios where cnpj_segurado='".$cpf_cnpj."'";
		return $this->_db->fetchAll($sql);
	}

	public function getPrepostoProposta($id_usuario){
		$sql = "select ds_nome_preposto from sistema.prepostos where id_usuario=".$id_usuario;
		return $this->_db->fetchOne($sql);
	}

	public function getRelacionamentoPPE($id_proposta){
		$sql = "select 
					ds_nome_socio, 
					ds_nro_cpf, 
					CASE 
						WHEN tp_relacionamento = 'S' THEN 'Sócio' 
						WHEN tp_relacionamento = 'C' THEN 'Controlador'
						WHEN tp_relacionamento = 'A' THEN 'Administrador'
						WHEN tp_relacionamento = 'P' THEN 'Procurador'
					END AS tp_relacionamento
				from 
					seguro.propostas_proponentes_relacionamento_ppe 
				where id_proposta=$id_proposta
		";
		return $this->_db->fetchAll($sql);
	}
	
	public function relatorioVendas (
        $id_safra = "",
        $arProduto = "",
        $dt_inicio = "",
        $dt_fim = "",
        array $filtrarStatus = [],
        bool $somentePropostasCorretor = false,
        bool $exibirAreaTotal = true
    ) {
        $safra = is_array($id_safra) ? implode(',', $id_safra) : $id_safra;
		$filtro = "pd.id_safra in (" . $safra . ") and ";
	
		$this->_db->query("CREATE temp TABLE tmp_propostas AS (
                                SELECT pr.id
                                     , pr.id as id_proposta
                                     , pr.id_endosso
                                     , id_proposta_renovada
                                     , id_versao
                                     , id_secao
                                     , seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso
                                     , nr_apolice
                                     , to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
                                     , to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim
                                     , to_char(dt_transmissao, 'DD/MM/YYYY') as dt_transmissao
                                     , vl_custo_apolice
                                     , id_status
                                     , pr.id_usuario_criacao
                                     , nr_digito_verificador
                                     , id_produto
                                     , to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original
                                     , pr.id_proposta_mae
                                FROM seguro.propostas pr
                                     inner join produto.produtos pd ON {$filtro} pd.id = pr.id_produto)");
	
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}
	
		$filtro .= ($dt_inicio) ? "pr.dt_vigencia_inicio >= '".Agro_Util::formatDate($dt_inicio,'yyyy-MM-dd')."' and " : '';
		$filtro .= ($dt_fim)    ? "pr.dt_vigencia_inicio <= '".Agro_Util::formatDate($dt_fim,'yyyy-MM-dd')."' and " : '';

        if ($somentePropostasCorretor) {
            $usuarioLogado = Zend_Auth::getInstance()->getIdentity();

            if ($usuarioLogado->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_PREPOSTO) {
                $filtro .= "pr.id_usuario_criacao = {$usuarioLogado->id} and ";
            }

            if ($usuarioLogado->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_CORRETOR) {
                $sublogins = (new Sistema_Model_Corretores())->getPrepostosUsuario($usuarioLogado->id, false)->toArray();
                $idsCorretorSublogins = [];

                if (!empty($sublogins)) {
                    $idsCorretorSublogins = array_map(function($sublogin) {
                        return $sublogin['id_usuario'];
                    }, $sublogins);
                }

                $idsCorretorSublogins[] = $usuarioLogado->id;

                $filtro .= "pr.id_usuario_criacao in(" . implode(', ', $idsCorretorSublogins) . ") and ";
            }
        }

        if (!empty($filtrarStatus)) {
            $filtro .= "pr.id_status in(" . implode(', ', $filtrarStatus) . ") and ";
        }

		$this->_db->query("CREATE temp TABLE premio_adicional AS (
                                SELECT id_proposta,sum(vl_premio) as premio_adicional
                                  FROM seguro.propostas_coberturas
                                  JOIN seguro.propostas pr ON pr.id = propostas_coberturas.id_proposta
                                  JOIN sistema.status ON status.id = pr.id_status
                                  JOIN produto.produtos pd ON pd.id = pr.id_produto
                                   AND status.ds_chave NOT IN (
                                           'PROPOSTA_INCOMPLETA',
                                           'NAO_ENVIADA',
                                           'DEVOLVIDA',
                                           'PROPOSTA_CANCELADA',
                                           'APOLICE_CANCELADA',
                                           'ORCAMENTO_ENDOSSO',
                                           'ENDOSSO_INCOMPLETO',
                                           'ENDOSSO_ANULADO',
                                           'SOLICITACAO_CANCELADA',
                                           'SOLICITACAO_ENDOSSO'
                                       )
                                where {$filtro}
                                      propostas_coberturas.fl_del = false
                                  and propostas_coberturas.fl_principal = false
                                group by propostas_coberturas.id_proposta)");
	
		$this->_db->query("CREATE temp TABLE premio_pago_segurado AS (
                                SELECT propostas_parcelas.id_endosso,sum(propostas_parcelas.vl_segurado) as premio_pago_segurado
                                  FROM seguro.propostas_parcelas
                                       JOIN seguro.propostas pr ON pr.id = propostas_parcelas.id_proposta
                                       JOIN sistema.status ON status.id = pr.id_status
                                       JOIN produto.produtos pd ON pd.id = pr.id_produto
                                       LEFT JOIN seguro.proposta_boletos ON proposta_boletos.id_proposta = pr.id
                                                                        AND proposta_boletos.nr_parcela = propostas_parcelas.nr_parcela
                                       LEFT JOIN seguro.propostas_versoes ON propostas_versoes.id = proposta_boletos.id_versao
                                 WHERE {$filtro}
                                       propostas_parcelas.fl_del=false
                                   AND (propostas_parcelas.fl_pago = true
                                        or propostas_parcelas.vl_segurado < 0 or proposta_boletos.fl_pago=true)
                                   AND status.ds_chave NOT IN (
                                            'PROPOSTA_INCOMPLETA',
                                            'NAO_ENVIADA',
                                            'DEVOLVIDA',
                                            'PROPOSTA_CANCELADA',
                                            'APOLICE_CANCELADA',
                                            'ORCAMENTO_ENDOSSO',
                                            'ENDOSSO_INCOMPLETO',
                                            'ENDOSSO_ANULADO',
                                            'SOLICITACAO_CANCELADA',
                                            'SOLICITACAO_ENDOSSO'
                                       )
                                 GROUP BY propostas_parcelas.id_endosso)");

        $this->_db->query("CREATE TEMP TABLE temp_itens_segurados AS (
                                SELECT sis.id_proposta
                                     , sum(sis.vl_area) as vl_area
                                     , sum(sis.vl_lmga) as vl_lmga
                                     , sum(sis.vl_area * vl_rendimento_tonelada) as area_pe
                                  FROM seguro.itens_segurados sis
                                       INNER JOIN seguro.propostas pr ON pr.id = sis.id_proposta
                                       INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
                                 WHERE {$filtro}
                                       sis.vl_lmga > 0
                                 GROUP BY sis.id_proposta)");

		$this->_db->query("SELECT seguro.sumario_parcelas(0);");
	
		$sql = "SELECT pr.id AS id_proposta
                     , pr.id_proposta_renovada
                     , pr.id_versao
                     , pr2.id_secao --trazer sempre a informacao da proposta mae
                     , pr.nr_endosso
                     , pr.nr_apolice
                     , pr.dt_vigencia_inicio
                     , pr.dt_vigencia_fim
                     , pr.id_status
                     , pr.vl_custo_apolice
                     , pr.id_usuario_criacao
                     , pr.dt_vigencia_inicio_original
                     , pr.id_proposta_mae
                     , seguro.id_proposta_mae_completo(pr.id) as id_proposta_composto
                     , CASE
                         WHEN seguro.nr_endosso(pr.id, pr.id_endosso) > 0
                           THEN TO_CHAR(pr2.dt_transmissao, 'DD/MM/YYYY')
                           ELSE pr.dt_transmissao
                        END AS dt_transmissao
                     , po.ds_coordenadas
                     , case
                         when pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
				           then 'FRUTAS E HORTALIÇAS'
				         when pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . "
				           then case
				                  when pg.tp_epoca_cultivo = 'I'
				                    then ptp.ds_tipo_produto || ' RN - INVERNO'
				                    else ptp.ds_tipo_produto || ' RN - VERÃO'
				                 end
				         when pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . "
				           then case
				                  when pg.tp_epoca_cultivo = 'I'
				                    then 'GRÃOS PG - INVERNO'
				                    else 'GRÃOS PG - VERÃO'
				                 end
				         else ptp.ds_tipo_produto
                       end as tipo_produto
				     , sp.id as id_proponente
                     , co.ds_nome_abreviado as ds_nome_fantasia
                     , pc.vl_comissao
                     , pd.ds_nome_produto
                     , sf.ds_nome_safra
                     , c.ds_nome_cultura
                     , st.ds_status
                     , pb.nu_boleto
                     , CASE
                         WHEN pb.fl_pago = true
                           THEN 'Pago'
                           ELSE 'Pendente'
                        END AS fl_boleto_pago
                     , u.tp_usuario
                     , pre.ds_nome_preposto ";

        if ($exibirAreaTotal) {
            $sql .= "    , ist.vl_area as total_area ";
        } else {
            $sql .= "    , tis.vl_area as total_area ";
        }

        $sql .= "    , ist.vl_lmga as total_lmga
                     , m1.ds_nome_municipio as municipio_propriedade
                     , e1.ds_sigla as estado_propriedade
                     , m1.nr_ibge
                     , pat.valor_total
                     , pat.valor_segurado
                     , pat.valor_subvencao_federal
                     , pat.valor_subvencao_estadual
                     , CASE
                        WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                          THEN '-'
                        ELSE ss_subvencao_federal.ds_status
                       END AS subvencao_concedida
                     , tmp_adicional.premio_adicional
                     , tmp_pg_segurado.premio_pago_segurado
                     , pco.vl_premio as premio_principal
                     , pco.vl_franquia as valor_franquia
                     , v_parcela.valor_primeira_parcela
                     , v_parcela.vencto_primeira_parcela
                     , q_pronamp.quest_pronamp
                     , q_organico.quest_organico
                     , CASE
                         WHEN q_sub_est.quest_sub_estadual = '' OR q_sub_est.quest_sub_estadual IS NULL
                           THEN 'Não'
                           ELSE q_sub_est.quest_sub_estadual
                        END AS quest_sub_estadual
                     , tis.area_pe
                     , ist.vl_area as valor_area_sumario
                     , CASE
                         WHEN ptp.ds_chave_rn = '" . Produto_Model_Tipos::DS_CHAVE_MULTIRRISCO . "'
                           THEN 1
                           ELSE 0
                        END as is_pg
					 , cr.ds_nome as ds_nome_contrato
                 FROM seguro.propostas_endosso pe
                      INNER JOIN tmp_propostas pr ON pe.id_proposta = pr.id
                      INNER JOIN seguro.propostas pr2 ON pr2.id = pr.id_proposta_mae
                      INNER JOIN seguro.propostas_propriedades po ON po.id_proposta = pr.id
                      INNER JOIN sumario.itens_segurados ist ON ist.id_proposta = pr.id
                      INNER JOIN temp_itens_segurados tis ON tis.id_proposta = pr.id
                      INNER JOIN sumario_parcelas pat ON pat.id_endosso = pr.id_endosso
                      INNER JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr.id
                      INNER JOIN seguro.proponentes sp ON sp.cpf_cnpj = pp.cpf_cnpj
                      INNER JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
                      INNER JOIN sistema.corretores co ON co.id_usuario = pc.id_usuario
                      INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
                      INNER JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
                      INNER JOIN produto.tipo_produto ptp ON ptp.id = pg.id_tipo_produto
                      INNER JOIN produto.culturas c ON c.id = pg.id_cultura
                      INNER JOIN produto.safras sf ON sf.id = pd.id_safra
                      INNER JOIN sistema.municipios m1 ON m1.id = po.id_municipio
                      INNER JOIN sistema.estados e1 ON e1.id = m1.id_estado
                      INNER JOIN sistema.status st ON st.id = pr.id_status
                      INNER JOIN sistema.usuarios u ON pr.id_usuario_criacao = u.id
                      INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
                      INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
                      LEFT JOIN premio_pago_segurado AS tmp_pg_segurado ON tmp_pg_segurado.id_endosso = pr.id_endosso
                      LEFT JOIN seguro.propostas_consulta_cadin pca ON pca.fl_ativo = true
                                                                   AND pca.id_proposta = pr.id_proposta_mae
                      LEFT JOIN seguro.proposta_boletos pb ON pb.id_proposta = pr.id
                                                          AND pb.fl_ativo = true
                                                          AND pb.id_versao = pr.id_versao
                                                          AND pb.nr_parcela = 1
                      LEFT JOIN (SELECT CASE
                                          WHEN ds_resposta='1'
                                            THEN 'Sim'
                                            ELSE 'Não'
                                         END AS quest_pronamp
                                      , id_proposta
                                   FROM seguro.propostas_questionario
                                  WHERE id_atributo_rn = 145) AS q_pronamp ON q_pronamp.id_proposta = pr.id
                      LEFT JOIN (SELECT CASE
                                          WHEN ds_resposta='1'
                                            THEN 'Sim'
                                            ELSE 'Não'
                                         END AS quest_organico
                                      , id_proposta
                                   FROM seguro.propostas_questionario
                                  WHERE id_atributo_rn = 146) AS q_organico ON q_organico.id_proposta = pr.id
                      LEFT JOIN (SELECT CASE
                                WHEN ss.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                                  THEN '-'
                                ELSE ss.ds_status
                               END AS quest_sub_estadual
                            , sps.id_proposta
                         FROM seguro.propostas_subvencao sps
                              INNER JOIN sistema.status ss ON ss.id = sps.id_status_subvencao_estadual) AS q_sub_est ON q_sub_est.id_proposta = pr.id_proposta_mae
                      LEFT JOIN premio_adicional AS tmp_adicional ON tmp_adicional.id_proposta = pr.id
                      LEFT JOIN seguro.propostas_coberturas pco ON pco.fl_principal = true
                                                               AND pco.id_proposta = pr.id
                                                               AND pco.fl_del = false
                      LEFT JOIN (SELECT id_proposta
                                      , vl_segurado AS valor_primeira_parcela
                                      , TO_CHAR(dt_vencimento, 'DD/MM/YYYY') AS vencto_primeira_parcela
                                   FROM seguro.propostas_parcelas
                                  WHERE nr_parcela = 1) AS v_parcela ON v_parcela.id_proposta = pr.id
                      LEFT JOIN sistema.prepostos pre ON pre.id_usuario = u.id
					  LEFT JOIN seguro.propostas_contratos_resseguro pcr ON pcr.id_proposta = pr.id
					  LEFT JOIN produto.contratos_resseguro cr ON cr.id = pcr.id_contrato_resseguro
                WHERE {$filtro}
				      st.ds_chave not in (
				        'PROPOSTA_INCOMPLETA',
				        'NAO_ENVIADA',
				        'DEVOLVIDA',
				        'PROPOSTA_CANCELADA',
				        'APOLICE_CANCELADA',
				        'ORCAMENTO_ENDOSSO',
				        'ENDOSSO_INCOMPLETO',
				        'ENDOSSO_ANULADO',
				        'SOLICITACAO_CANCELADA',
				        'SOLICITACAO_ENDOSSO'
                      )
                  AND pe.fl_proposta_vigente = true
                  AND pc.id_usuario  <> 487
             ORDER BY pr.id
				";

		return $this->fetchAll($sql);
	}

	public function relatorioSubvencaoFederalEstadualConcedidas($id_safra = ""){
	    
	    $filtro = ($id_safra == 'TODAS' || $id_safra < 16) ? "pd.id_safra >= 16 and " : "pd.id_safra = ".$id_safra." and ";

	    $this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							id_secao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							to_char(dt_transmissao, 'DD/MM/YYYY') as dt_transmissao,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							pr.id_proposta_mae
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");
	    
	    
	    $this->_db->query("SELECT seguro.sumario_parcelas(0);");
	    
	    $sql = "SELECT
                      pr.id AS id_proposta
                    , pr.id_proposta_mae
                    , pr.nr_apolice
                    , st.ds_status
                    , pat.valor_total
                    , pat.valor_segurado
                    , pat.valor_subvencao_federal
                    , pat.valor_subvencao_estadual
                    , CASE WHEN pca.fl_sucesso = true THEN
                          'Sim'
                      ELSE
                          'Não'
                      END AS subvencao_concedida
                    , CASE
                        WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                          THEN '-'
                        ELSE ss_subvencao_federal.ds_status
                       END AS quest_sub_estadual
                FROM seguro.propostas_endosso pe
                
                INNER JOIN tmp_propostas pr
                   ON pe.id_proposta = pr.id
                INNER JOIN seguro.propostas pr2
                   ON pr2.id = pr.id_proposta_mae
                INNER JOIN sumario_parcelas pat
                   ON pat.id_endosso = pr.id_endosso
                INNER JOIN seguro.propostas_corretores pc
                   ON pc.id_proposta = pr.id
                INNER JOIN sistema.corretores co
                   ON co.id_usuario = pc.id_usuario
                INNER JOIN produto.produtos pd
                   ON pd.id = pr.id_produto
                INNER JOIN produto.safras sf
                   ON sf.id = pd.id_safra
                INNER JOIN sistema.status st
                   ON st.id = pr.id_status
                INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
                INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
                LEFT JOIN seguro.propostas_consulta_cadin pca
                   ON pca.fl_ativo = true
                   AND pca.id_proposta = pr.id_proposta_mae
                LEFT JOIN (SELECT CASE
                                    WHEN ss.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                                      THEN '-'
                                    ELSE ss.ds_status
                                   END AS quest_sub_estadual
                                , sps.id_proposta
                             FROM seguro.propostas_subvencao sps
                                  INNER JOIN sistema.status ss ON ss.id = sps.id_status_subvencao_estadual) AS q_sub_est
                   ON q_sub_est.id_proposta = pr.id_proposta_mae
                WHERE
                    ".$filtro."
				    pe.fl_proposta_vigente = true
                    AND pc.id_usuario  <> 487
                ORDER BY pr.id
				";
	    return $this->fetchAll($sql);
	}
	
	public function relatorioArrozInundacao($id_safra="",$arProduto="", $dt_inicio="", $dt_fim=""){
	
		$filtro = ($id_safra) ? "pd.id_safra = ".$id_safra." and " : '';
	
		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							id_secao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							to_char(dt_transmissao, 'DD/MM/YYYY') as dt_transmissao,
							dt_transmissao as dt_date_transmissao,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							pr.id_proposta_mae
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");

		if(is_array($arProduto) && !empty($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		} else {
			$filtro .= "c.ds_chave_cultura = 'ARROZ IRRIGADO' and "; //filtra pela cultura arroz irrigado
		}

		//traz somente as propriedades do rio grande do sul
		$filtro .= "e1.ds_sigla = 'RS' and ";
	
		$filtro .= ($dt_inicio) ? "pr.dt_vigencia_inicio >= '".Agro_Util::formatDate($dt_inicio,'yyyy-MM-dd')."' and " : '';
		$filtro .= ($dt_fim)    ? "pr.dt_vigencia_inicio <= '".Agro_Util::formatDate($dt_fim,'yyyy-MM-dd')."' and " : '';
	
		$this->_db->query("CREATE temp TABLE premio_adicional AS (
			SELECT id_proposta,sum(vl_premio) as premio_adicional
			  FROM seguro.propostas_coberturas
			  JOIN seguro.propostas ON propostas.id = propostas_coberturas.id_proposta
			  JOIN sistema.status ON status.id = propostas.id_status
               AND status.ds_chave NOT IN ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
			 where propostas_coberturas.fl_del=false and propostas_coberturas.fl_principal=false group by propostas_coberturas.id_proposta)");
	
		$this->_db->query("CREATE temp TABLE premio_pago_segurado AS (
			SELECT propostas_parcelas.id_endosso,sum(propostas_parcelas.vl_segurado) as premio_pago_segurado
			FROM seguro.propostas_parcelas
			  JOIN seguro.propostas ON propostas.id = propostas_parcelas.id_proposta
			  JOIN sistema.status ON status.id = propostas.id_status
	          LEFT JOIN seguro.proposta_boletos ON propostas.id = proposta_boletos.id_proposta AND propostas_parcelas.nr_parcela = proposta_boletos.nr_parcela
              LEFT JOIN seguro.propostas_versoes ON propostas_versoes.id = proposta_boletos.id_versao
			WHERE 
			  propostas_parcelas.fl_del=false 
			  AND (propostas_parcelas.fl_pago=true or propostas_parcelas.vl_segurado < 0 or proposta_boletos.fl_pago=true)
			  AND status.ds_chave NOT IN ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
			GROUP BY 
			  propostas_parcelas.id_endosso)");
		
		$this->_db->query("SELECT seguro.sumario_parcelas(0);");
	
		$sql = "SELECT pr.id AS id_proposta
                    , pr.id_proposta_renovada
                    , pr.id_versao
                    , pr2.id_secao --trazer sempre a informacao da proposta mae
                    , pr.nr_endosso
                    , pr.nr_apolice
                    , pr.dt_vigencia_inicio
                    , pr.dt_vigencia_fim
                    , pr.id_status
                    , pr.vl_custo_apolice
                    , pr.id_usuario_criacao
                    , pr.dt_vigencia_inicio_original
                    , pr.id_proposta_mae
                    , pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr2.id||'-'||pr2.nr_digito_verificador as id_proposta_composto
                    , CASE WHEN seguro.nr_endosso(pr.id, pr.id_endosso) > 0 THEN
                            TO_CHAR(pr2.dt_transmissao, 'DD/MM/YYYY')
                        ELSE
                            pr.dt_transmissao
                        END AS dt_transmissao
                    , po.ds_coordenadas
                    , sp.id as id_proponente
                    , co.ds_nome_abreviado as ds_nome_fantasia
                    , pc.vl_comissao
                    , pd.ds_nome_produto
                    , sf.ds_nome_safra
                    , c.ds_nome_cultura
                    , st.ds_status
                    , pb.nu_boleto
                    , CASE WHEN pb.fl_pago = true THEN
                            'Pago'
                        ELSE
                            'Pendente'
                        END AS fl_boleto_pago
                    , u.tp_usuario
                    , pre.ds_nome_preposto
                    , ist.vl_area as total_area
                    , ist.vl_lmga as total_lmga
                    , m1.ds_nome_municipio as municipio_propriedade
                    , e1.ds_sigla as estado_propriedade
                    , m1.nr_ibge
                    , pat.valor_total
                    , pat.valor_segurado
                    , pat.valor_subvencao_federal
                    , pat.valor_subvencao_estadual
                    , CASE
                        WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                          THEN '-'
                        ELSE ss_subvencao_federal.ds_status
                       END AS subvencao_concedida
                    , tmp_adicional.premio_adicional
                    , tmp_pg_segurado.premio_pago_segurado
                    , pco.vl_premio as premio_principal
                    , pco.vl_franquia as valor_franquia
                    , v_parcela.valor_primeira_parcela
                    , v_parcela.vencto_primeira_parcela
                    , q_pronamp.quest_pronamp
                    , q_organico.quest_organico
                    , CASE
                        WHEN ss_subvencao_estadual.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                          THEN '-'
                        ELSE ss_subvencao_estadual.ds_status
                       END AS quest_sub_estadual
                    , CASE WHEN pat.valor_subvencao_federal > 0 THEN
                        to_char(pr.dt_date_transmissao + INTERVAL '45 day','DD/MM/YYYY')
                      ELSE
                        to_char(pr.dt_date_transmissao + INTERVAL '15 day','DD/MM/YYYY')
                      END AS dt_prazo_aceitacao
                    , st2.cd_status AS status_proposta_mae
                    , status_pvp.status AS status_vistoria_previa
                    , pobs.obs AS informacoes_adicionais
                 FROM seguro.propostas_endosso pe
           INNER JOIN tmp_propostas pr
                   ON pe.id_proposta = pr.id
           INNER JOIN seguro.propostas pr2
                   ON pr2.id = pr.id_proposta_mae
           INNER JOIN seguro.propostas_propriedades po
                   ON po.id_proposta = pr.id
           INNER JOIN sumario.itens_segurados ist
                   ON ist.id_proposta = pr.id
           INNER JOIN sumario_parcelas pat
                   ON pat.id_endosso = pr.id_endosso
           INNER JOIN seguro.propostas_proponentes pp
                   ON pp.id_proposta = pr.id
           INNER JOIN seguro.proponentes sp
                   ON sp.cpf_cnpj = pp.cpf_cnpj
           INNER JOIN seguro.propostas_corretores pc
                   ON pc.id_proposta = pr.id
           INNER JOIN sistema.corretores co
                   ON co.id_usuario = pc.id_usuario
           INNER JOIN produto.produtos pd
                   ON pd.id = pr.id_produto
           INNER JOIN produto.produtos_geral pg
                   ON pg.id = pd.id_produto_geral
           INNER JOIN produto.culturas c
                   ON c.id = pg.id_cultura
           INNER JOIN produto.safras sf
                   ON sf.id = pd.id_safra
           INNER JOIN sistema.municipios m1
                   ON m1.id = po.id_municipio
           INNER JOIN sistema.estados e1
                   ON e1.id = m1.id_estado
           INNER JOIN sistema.status st
                   ON st.id = pr.id_status
           INNER JOIN sistema.status st2
                   ON st2.id = pr2.id_status
           INNER JOIN sistema.usuarios u
                   ON pr.id_usuario_criacao = u.id
           INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
           INNER JOIN sistema.status ss_subvencao_estadual ON ss_subvencao_estadual.id = sps.id_status_subvencao_estadual
           INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
            LEFT JOIN premio_pago_segurado AS tmp_pg_segurado
                   ON tmp_pg_segurado.id_endosso = pr.id_endosso
            LEFT JOIN seguro.propostas_consulta_cadin pca
                   ON pca.fl_ativo = true
                  AND pca.id_proposta = pr.id_proposta_mae
            LEFT JOIN seguro.proposta_boletos pb
                   ON pb.id_proposta = pr.id
                  AND pb.fl_ativo = true
                  AND pb.id_versao = pr.id_versao
                  AND pb.nr_parcela = 1
            LEFT JOIN (SELECT CASE WHEN ds_resposta='1' THEN
                                'Sim'
                              ELSE
                                'Não'
                              END AS quest_pronamp
                            , id_proposta
                         FROM seguro.propostas_questionario
                        WHERE id_atributo_rn = 145) AS q_pronamp
                   ON q_pronamp.id_proposta = pr.id
            LEFT JOIN (SELECT CASE WHEN ds_resposta='1' THEN
                                'Sim'
                              ELSE
                                'Não'
                              END AS quest_organico
                            , id_proposta
                         FROM seguro.propostas_questionario
                        WHERE id_atributo_rn = 146) AS q_organico
                   ON q_organico.id_proposta = pr.id
            LEFT JOIN premio_adicional AS tmp_adicional
                   ON tmp_adicional.id_proposta = pr.id
            LEFT JOIN seguro.propostas_coberturas pco
                   ON pco.fl_principal = true
                  AND pco.id_proposta = pr.id
                  AND pco.fl_del = false
            LEFT JOIN (SELECT id_proposta
                            , vl_segurado AS valor_primeira_parcela
                            , TO_CHAR(dt_vencimento, 'DD/MM/YYYY') AS vencto_primeira_parcela
                         FROM seguro.propostas_parcelas
                        WHERE nr_parcela = 1) AS v_parcela
                   ON v_parcela.id_proposta = pr.id
            LEFT JOIN sistema.prepostos pre
                   ON pre.id_usuario = u.id
            LEFT JOIN ( SELECT string_agg('Status Vistoria Prévia: '||spvp.id_vistoria||' '||stpvp.cd_status||' - '||stpvp.ds_status, ' | ') AS status
                             , pe2.id_endosso
                          FROM seguro.propostas_vistorias_previas spvp
                    INNER JOIN seguro.propostas_endosso pe2
                            ON pe2.id_proposta = spvp.id_proposta
                     LEFT JOIN sistema.status stpvp
                            ON spvp.id_status = stpvp.id
                      GROUP BY pe2.id_endosso
                    ) AS status_pvp
                   ON status_pvp.id_endosso = pe.id_endosso
            LEFT JOIN ( SELECT string_agg(spo.ds_observacao, ' | ') AS obs
                             , pe3.id_endosso
                          FROM seguro.propostas_observacoes spo
                    INNER JOIN seguro.propostas_endosso pe3
                            ON pe3.id_proposta = spo.id_proposta
                         WHERE spo.ds_observacao <> ''
                           AND spo.fl_principal = false
                      GROUP BY pe3.id_endosso
                    ) AS pobs
                   ON pe.id_endosso = pobs.id_endosso
                WHERE ".$filtro."
				      st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
				  AND st2.ds_chave IN ('APOLICE_EMITIDA', 'ENVIADA_AGUARDANDO_CONF', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO', 'AGUARDANDO_ENVIO_SEG', 'AGUARDANDO_VISTORIA_PREVIA', 'CONF_PENDENCIAS')
                AND ((pco.id_cobertura = 32 OR pco.id_cobertura = 18)
                        OR (pco.id_cobertura = 1 AND EXISTS(
                             SELECT 1
                               FROM seguro.propostas_coberturas spc2
                              WHERE pco.id_proposta = spc2.id_proposta
                                AND spc2.id_cobertura = 31
                                AND spc2.fl_principal = false
                            )
                        )
                    )
                  AND pe.fl_proposta_vigente = true
                  AND pc.id_usuario  <> 487
             ORDER BY pr.id
				";

		return $this->fetchAll($sql);
	}

	public function relatorioVendasCompleto($id_safra="",$arProduto="", $dt_inicio="", $dt_fim=""){
	
		$filtro = ($id_safra) ? "pd.id_safra >= ".$id_safra." and " : '';
	
		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							id_secao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							to_char(dt_transmissao, 'DD/MM/YYYY') as dt_transmissao,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							pr.id_proposta_mae
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");
	
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}
	
		$filtro .= ($dt_inicio) ? "pr.dt_vigencia_inicio >= '".Agro_Util::formatDate($dt_inicio,'yyyy-MM-dd')."' and " : '';
		$filtro .= ($dt_fim)    ? "pr.dt_vigencia_inicio <= '".Agro_Util::formatDate($dt_fim,'yyyy-MM-dd')."' and " : '';
	
		$this->_db->query("CREATE temp TABLE premio_adicional AS (
			SELECT id_proposta,sum(vl_premio) as premio_adicional
			  FROM seguro.propostas_coberturas
			  JOIN seguro.propostas ON propostas.id = propostas_coberturas.id_proposta
			  JOIN sistema.status ON status.id = propostas.id_status
			WHERE propostas_coberturas.fl_del=false and propostas_coberturas.fl_principal=false group by propostas_coberturas.id_proposta)");
	
		$this->_db->query("CREATE temp TABLE premio_pago_segurado AS (
			SELECT propostas_parcelas.id_endosso,sum(vl_segurado) as premio_pago_segurado
			  FROM seguro.propostas_parcelas
			  JOIN seguro.propostas ON propostas.id = propostas_parcelas.id_proposta
			  JOIN sistema.status ON status.id = propostas.id_status
			 WHERE propostas_parcelas.fl_del=false and (propostas_parcelas.fl_pago=true or vl_segurado < 0) group by propostas_parcelas.id_endosso)");
		$this->_db->query("SELECT seguro.sumario_parcelas(0);");
	
		$sql = "SELECT pr.id AS id_proposta
					, pr.id_proposta_renovada
					, pr.id_versao
					, pr2.id_secao --trazer sempre a informacao da proposta mae
					, pr.nr_endosso
					, pr.nr_apolice
					, pr.dt_vigencia_inicio
					, pr.dt_vigencia_fim
					, pr.id_status
					, pr.vl_custo_apolice
					, pr.id_usuario_criacao
					, pr.dt_vigencia_inicio_original
					, pr.id_proposta_mae
					, pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr2.id||'-'||pr2.nr_digito_verificador as id_proposta_composto
					, CASE WHEN seguro.nr_endosso(pr.id, pr.id_endosso) > 0 THEN
						TO_CHAR(pr2.dt_transmissao, 'DD/MM/YYYY')
					  ELSE
						pr.dt_transmissao
					  END AS dt_transmissao
					, po.ds_coordenadas
					, pp.cpf_cnpj
					, pp.ds_nome_proponente
					, co.ds_nome_abreviado AS ds_nome_fantasia
					, pc.vl_comissao
					, pd.ds_nome_produto
					, sf.ds_nome_safra
					, c.ds_nome_cultura
					, st.ds_status
					, pb.nu_boleto
					, CASE WHEN pb.fl_pago = true THEN
							'Pago'
						ELSE
							'Pendente'
						END AS fl_boleto_pago
					, u.tp_usuario
					, pre.ds_nome_preposto
					, ist.vl_area as total_area
					, ist.vl_lmga as total_lmga
					, m1.ds_nome_municipio as municipio_propriedade
					, e1.ds_sigla as estado_propriedade
					, m1.nr_ibge
					, pat.valor_total
					, pat.valor_segurado
					, pat.valor_subvencao_federal
					, pat.valor_subvencao_estadual
					, CASE
                        WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                          THEN '-'
                        ELSE ss_subvencao_federal.ds_status
                       END AS subvencao_concedida
					, tmp_adicional.premio_adicional
					, tmp_pg_segurado.premio_pago_segurado
					, pco.vl_premio as premio_principal
					, pco.vl_franquia as valor_franquia
					, v_parcela.valor_primeira_parcela
					, v_parcela.vencto_primeira_parcela
					, q_pronamp.quest_pronamp
					, q_organico.quest_organico
					, CASE
                        WHEN ss_subvencao_estadual.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                          THEN '-'
                        ELSE ss_subvencao_estadual.ds_status
                       END AS quest_sub_estadual
			     FROM seguro.propostas_endosso pe
		   INNER JOIN tmp_propostas pr
			       ON pe.id_proposta = pr.id
		   INNER JOIN seguro.propostas pr2
			       ON pr2.id = pr.id_proposta_mae
		   INNER JOIN seguro.propostas_propriedades po
			       ON po.id_proposta = pr.id
		   INNER JOIN sumario.itens_segurados ist
			       ON ist.id_proposta = pr.id
		   INNER JOIN sumario_parcelas pat
			       ON pat.id_endosso = pr.id_endosso
		   INNER JOIN seguro.propostas_proponentes pp
			       ON pp.id_proposta = pr.id
		   INNER JOIN seguro.propostas_corretores pc
			       ON pc.id_proposta = pr.id
		   INNER JOIN sistema.corretores co
			       ON co.id_usuario = pc.id_usuario
		   INNER JOIN produto.produtos pd
			       ON pd.id = pr.id_produto
		   INNER JOIN produto.produtos_geral pg
			       ON pg.id = pd.id_produto_geral
		   INNER JOIN produto.culturas c
			       ON c.id = pg.id_cultura
		   INNER JOIN produto.safras sf
		           ON sf.id = pd.id_safra
		   INNER JOIN sistema.municipios m1
			       ON m1.id = po.id_municipio
		   INNER JOIN sistema.estados e1
			       ON e1.id = m1.id_estado
		   INNER JOIN sistema.status st
			       ON st.id = pr.id_status
		   INNER JOIN sistema.usuarios u
			       ON pr.id_usuario_criacao = u.id
           INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
		   INNER JOIN sistema.status ss_subvencao_estadual ON ss_subvencao_estadual.id = sps.id_status_subvencao_estadual
		   INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
		    LEFT JOIN premio_pago_segurado AS tmp_pg_segurado
			       ON tmp_pg_segurado.id_endosso = pr.id_endosso
			LEFT JOIN seguro.propostas_consulta_cadin pca
			       ON pca.fl_ativo = true
			      AND pca.id_proposta = pr.id_proposta_mae
			LEFT JOIN seguro.proposta_boletos pb
				   ON pb.id_proposta = pr.id
			      AND pb.fl_ativo = true
			      AND pb.id_versao = pr.id_versao
			      AND pb.nr_parcela = 1
			LEFT JOIN (SELECT CASE WHEN ds_resposta='1' THEN
									'Sim'
										ELSE
											'Não'
										END AS quest_pronamp
								, id_proposta
							FROM seguro.propostas_questionario
							WHERE id_atributo_rn = 145) AS q_pronamp
				   ON q_pronamp.id_proposta = pr.id
			LEFT JOIN (SELECT CASE WHEN ds_resposta='1' THEN
											'Sim'
										ELSE
											'Não'
										END AS quest_organico
								, id_proposta
							FROM seguro.propostas_questionario
							WHERE id_atributo_rn = 146) AS q_organico
				   ON q_organico.id_proposta = pr.id
			LEFT JOIN premio_adicional AS tmp_adicional
				   ON tmp_adicional.id_proposta = pr.id
			LEFT JOIN seguro.propostas_coberturas pco
				   ON pco.fl_principal = true
			      AND pco.id_proposta = pr.id
			      AND pco.fl_del = false
			LEFT JOIN (SELECT id_proposta
								, vl_segurado AS valor_primeira_parcela
								, TO_CHAR(dt_vencimento, 'DD/MM/YYYY') AS vencto_primeira_parcela
							FROM seguro.propostas_parcelas
						WHERE nr_parcela = 1) AS v_parcela
				   ON v_parcela.id_proposta = pr.id
			LEFT JOIN sistema.prepostos pre
				   ON pre.id_usuario = u.id
			    WHERE ".$filtro."
				      pe.fl_proposta_vigente = true
				  AND pc.id_usuario  <> 487
			 ORDER BY pr.id
				";
		return $this->fetchAll($sql);
	}
	
    public function relatorioVendasItem($id_safra="",$arProduto="", $dt_inicio="", $dt_fim=""){

		$filtro = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';

		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							to_char(dt_transmissao, 'DD/MM/YYYY') as dt_transmissao,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							pr.id_proposta_mae,
							seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
                        
				");

		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$filtro .= ($dt_inicio) ? "pr.dt_vigencia_inicio >= '".Agro_Util::formatDate($dt_inicio,'yyyy-MM-dd')."' and " : '';
		$filtro .= ($dt_fim)    ? "pr.dt_vigencia_inicio <= '".Agro_Util::formatDate($dt_fim,'yyyy-MM-dd')."' and " : '';

		$this->_db->query("CREATE temp TABLE premio_pago_segurado AS (
			SELECT propostas_parcelas.id_endosso,sum(vl_segurado) as premio_pago_segurado
			  FROM seguro.propostas_parcelas
			  JOIN seguro.propostas ON propostas.id = propostas_parcelas.id_proposta
			  JOIN sistema.status ON status.id = propostas.id_status
			   AND status.ds_chave NOT IN ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
			 where propostas_parcelas.fl_del=false and (propostas_parcelas.fl_pago=true or vl_segurado < 0) group by propostas_parcelas.id_endosso)");
		$this->_db->query("SELECT seguro.sumario_parcelas(0);");

		$sql = "select pr.id as id_proposta
				      ,pr.id_proposta_renovada
				      ,pr.id_versao
				      ,pr.nr_endosso
				      ,pr.nr_apolice
				      ,pr.dt_vigencia_inicio
				      ,pr.dt_vigencia_fim
				      ,pr.id_status
				      ,pr.vl_custo_apolice
				      ,pr.id_usuario_criacao
				      ,pr.dt_vigencia_inicio_original
				      ,pr.id_proposta_mae
				      ,pr.id_proposta_mae_completo
				      ,case when seguro.nr_endosso(pr.id, pr.id_endosso) > 0 then
				      	(select to_char(dt_transmissao, 'DD/MM/YYYY') from seguro.propostas pr2 where pr2.id = pr.id_proposta_mae) 
				      else pr.dt_transmissao
				      end as dt_transmissao
				      ,po.ds_coordenadas
				      ,pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr.id||'-'||pr.nr_digito_verificador as id_proposta_composto
				      ,case 
				          when pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
				              then 'FRUTAS E HORTALIÇAS'
				          when pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . " 
				              then case 
				                      when pg.tp_epoca_cultivo = 'I'
				                          then ptp.ds_tipo_produto || ' RN - INVERNO' 
				                      else ptp.ds_tipo_produto || ' RN - VERÃO' 
				                   end
				          when pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . " 
				              then case 
				                      when pg.tp_epoca_cultivo = 'I'
				                          then 'GRÃOS PG - INVERNO' 
				                      else 'GRÃOS PG - VERÃO' 
				                   end
				          else ptp.ds_tipo_produto 
                       end as tipo_produto
				      ,sp.id as id_proponente
				      ,co.ds_nome_abreviado as ds_nome_fantasia
				      ,pc.vl_comissao
				      ,pd.ds_nome_produto
				      ,sf.ds_nome_safra
				      ,c.ds_nome_cultura
				      ,st.ds_status
				      ,pb.nu_boleto
				      ,case when pb.fl_pago = true then 'Pago' else 'Pendente' end as fl_boleto_pago
				      ,u.tp_usuario
					  ,pre.ds_nome_preposto
				      ,ist.vl_area as total_area
				      ,ist.vl_lmga as total_lmga
				      ,iseg.nr_item_segurado
					  ,iseg.vl_area as area_item
					  ,iseg.vl_lmga as vl_lmga_item
					  ,pco.vl_taxa as taxa_proposta
				      ,m1.ds_nome_municipio as municipio_propriedade
				      ,e1.ds_sigla as estado_propriedade
				      ,m1.nr_ibge
				      ,pat.valor_segurado
				      ,pat.valor_subvencao_federal
				      ,pat.valor_subvencao_estadual
				      ,CASE
                         WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                           THEN '-'
                           ELSE ss_subvencao_federal.ds_status
                       END AS subvencao_concedida
				      ,tmp_pg_segurado.premio_pago_segurado
				      ,pco.vl_franquia as valor_franquia
				      ,v_parcela.valor_primeira_parcela
				      ,v_parcela.vencto_primeira_parcela
				      ,q_pronamp.quest_pronamp
				      ,q_organico.quest_organico
				      ,CASE
                         WHEN ss_subvencao_estadual.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                           THEN '-'
                           ELSE ss_subvencao_estadual.ds_status
                       END AS quest_sub_estadual
					  ,va.ds_nome_variedade
					  ,CASE
                          WHEN sigc.id_sistema_plantio = 1 THEN 'D'::text
                          WHEN sigc.id_sistema_plantio = 2 THEN 'C'::text
                          WHEN sigc.id_sistema_plantio = 3 THEN 'AL'::text
                          ELSE NULL::text
                        END AS sistema_plantio
                      ,CASE
                          WHEN sigc.ds_primeiro_ano_plantio = '1' THEN 'Sim'
                          WHEN sigc.ds_primeiro_ano_plantio = '2' THEN 'Não'
                          ELSE ''
                        END AS primeiro_ano_plantio
                      ,iseg.id as id_item_segurado
					  ,pe.id_endosso
				 from seguro.propostas_endosso pe
				      INNER JOIN tmp_propostas pr ON pr.id = pe.id_proposta
                      left join premio_pago_segurado as tmp_pg_segurado on tmp_pg_segurado.id_endosso = pr.id_endosso
                      left join seguro.propostas_consulta_cadin pca on pca.fl_ativo = true and pca.id_proposta = pr.id_proposta_mae
                      left join seguro.proposta_boletos pb
                                on pb.id_proposta = pr.id and pb.fl_ativo = true and pb.id_versao = pr.id_versao and
                                   pb.nr_parcela = 1
                      left join (select case when ds_resposta = '1' then 'Sim' else 'Não' end as quest_pronamp, id_proposta
                                 from seguro.propostas_questionario
                                 where id_atributo_rn = 145) as q_pronamp on q_pronamp.id_proposta = pr.id
                      left join (select case when ds_resposta = '1' then 'Sim' else 'Não' end as quest_organico, id_proposta
                                 from seguro.propostas_questionario
                                 where id_atributo_rn = 146) as q_organico on q_organico.id_proposta = pr.id
                      left join seguro.propostas_coberturas pco
                                ON pco.fl_principal = true and pco.id_proposta = pr.id and pco.fl_del = false
                      left join (select id_proposta,
                                        vl_segurado                          as valor_primeira_parcela,
                                        to_char(dt_vencimento, 'DD/MM/YYYY') as vencto_primeira_parcela
                                 from seguro.propostas_parcelas
                                 where nr_parcela = 1) as v_parcela on v_parcela.id_proposta = pr.id
                      INNER JOIN seguro.propostas_propriedades po on po.id_proposta = pr.id
                      INNER JOIN sumario.itens_segurados ist on ist.id_proposta = pr.id
                      INNER JOIN seguro.itens_segurados iseg on iseg.id_proposta = pr.id
                      INNER JOIN seguro.itens_segurados_complemento sigc on sigc.id_item_segurado = iseg.id
                      INNER JOIN produto.variedades va on va.id = iseg.id_variedade
                      INNER JOIN sumario_parcelas pat on pat.id_endosso = pr.id_endosso
                      INNER JOIN seguro.propostas_proponentes pp on pp.id_proposta = pr.id
                      INNER JOIN seguro.proponentes sp on sp.cpf_cnpj = pp.cpf_cnpj
                      INNER JOIN seguro.propostas_corretores pc on pc.id_proposta = pr.id
                      INNER JOIN sistema.corretores co on co.id_usuario = pc.id_usuario
                      INNER JOIN produto.produtos pd on pd.id = pr.id_produto
                      INNER JOIN produto.produtos_geral pg on pg.id = pd.id_produto_geral
                      INNER JOIN produto.tipo_produto ptp on ptp.id = pg.id_tipo_produto
                      INNER JOIN produto.culturas c on c.id = pg.id_cultura
                      INNER JOIN produto.safras sf on sf.id = pd.id_safra
                      INNER JOIN sistema.municipios m1 on m1.id = po.id_municipio
                      INNER JOIN sistema.estados e1 on e1.id = m1.id_estado
                      INNER JOIN sistema.status st on st.id = pr.id_status
                      INNER JOIN sistema.usuarios u on u.id = pr.id_usuario_criacao
                      INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
                      INNER JOIN sistema.status ss_subvencao_estadual ON ss_subvencao_estadual.id = sps.id_status_subvencao_estadual
                      INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
                      left join sistema.prepostos pre ON pre.id_usuario = u.id
			    where ".$filtro."
				      st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
				      and pe.fl_proposta_vigente = true
				      and pc.id_usuario  <> 487
				order by pr.id, iseg.nr_item_segurado";

		return $this->fetchAll($sql);
	}

    public function relatorioDadosPropriedade($id_safra="",$arProduto=""){

		$filtro = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		//$this->_db->query("CREATE temp TABLE itens_segurados_temp AS (SELECT id_proposta,sum(vl_lmga) AS soma_lmga, sum(vl_area) AS soma_area FROM seguro.itens_segurados GROUP BY id_proposta)");
		$this->_db->query("CREATE temp TABLE parcelas_temp AS (SELECT id_proposta,sum(vl_total) AS valor_total, sum(vl_segurado) AS valor_segurado, sum(vl_subvencao_federal) AS valor_subvencao_federal, sum(vl_subvencao_estadual) AS valor_subvencao_estadual FROM seguro.propostas_parcelas GROUP BY id_proposta)");

		$sql = "
				select
				     pr.id as id_proposta
				    ,pr.nr_apolice
				    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
				    ,to_char(pr.dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim
				    ,pr.id_status
				    ,pr.vl_custo_apolice
				    ,pr.id_usuario_criacao

				    ,po.ds_coordenadas
				    ,po.ds_nome_propriedade
				    ,po.ds_endereco
				    ,po.ds_endereco_cep
				    ,po.ds_endereco_complemento
				    ,po.ds_endereco_nro
				    ,po.ds_endereco_bairro

				    ,sp.id as id_proponente
				    ,case when pp.tp_segurado='A' then 'Arrendatário' else 'Proprietário' end as tp_segurado

				    ,co.ds_nome_abreviado as ds_nome_fantasia

				    ,pc.vl_comissao
				    ,pd.ds_nome_produto
				    ,sf.ds_nome_safra
				    ,c.ds_nome_cultura
				    ,st.ds_status
				    ,u.tp_usuario

				    ,ist.vl_area as total_area
				    ,ist.vl_lmga as total_lmga

				    ,m1.ds_nome_municipio as municipio_propriedade
				    ,e1.ds_sigla as estado_propriedade
				    ,m1.nr_ibge

				    ,pat.valor_total
				    ,pat.valor_segurado
				    ,pat.valor_subvencao_federal
				    ,pat.valor_subvencao_estadual
				from
				     seguro.propostas pr
					left join seguro.propostas_pessoa_autorizada_vistoria pav on pav.id_proposta = pr.id
				    ,seguro.propostas_propriedades po
				    ,sumario.itens_segurados ist
				    ,parcelas_temp pat
				    ,seguro.propostas_proponentes pp
				    ,seguro.proponentes sp
				    ,sistema.municipios m2
				    ,sistema.estados e2
				    ,seguro.propostas_corretores pc
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.produtos_geral pg
				    ,produto.culturas c
				    ,produto.safras sf
				    ,sistema.municipios m1
				    ,sistema.estados e1
				    ,sistema.status st
				    ,sistema.usuarios u
				where
				        ".$filtro."
					    st.ds_chave not in ('PROPOSTA_INCOMPLETA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pc.id_usuario  <> 487
				    and ist.id_proposta = pr.id
				    and pat.id_proposta = pr.id
				    and po.id_proposta = pr.id
				    and pp.id_proposta = pr.id
				    and sp.cpf_cnpj    = pp.cpf_cnpj
				    and pc.id_proposta = pr.id
				    and co.id_usuario  = pc.id_usuario
				    and pd.id          = pr.id_produto
				    and pg.id          = pd.id_produto_geral
				    and c.id           = pg.id_cultura
				    and sf.id          = pd.id_safra
				    and m1.id          = po.id_municipio
				    and e1.id          = m1.id_estado
				    and m2.id          = pp.id_municipio
				    and e2.id          = m2.id_estado
				    and st.id          = pr.id_status
				    and pr.id_usuario_criacao = u.id
				order by
				    pr.id
				";

		return $this->fetchAll($sql);
	}

	public function relatorioPropostasCanceladas(
        $id_safra = "",
        $arProduto = "",
        bool $exibirAreaTotal = true
    ) {
		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';

		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
				            pr_mae.id_secao, -- sempre traz da proposta mae
							pr.id_proposta_renovada,
							pr.id_versao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							pr.nr_apolice,
							to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(pr.dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							pr.vl_custo_apolice,
							pr.id_status,
							pr.id_usuario_criacao,
							pr.nr_digito_verificador,
							pr.id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							pr.id_proposta_mae,
							seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
						FROM
							seguro.propostas pr
							inner join seguro.propostas pr_mae ON pr.id_proposta_mae = pr_mae.id
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");

		$this->_db->query("
					CREATE temp TABLE tmp_parcela_restituicao AS (
						SELECT
						    coalesce(sum(vl_segurado),0.0) as vl_restituido,
						    pe.id_endosso
						FROM
						    seguro.propostas pr
						    inner join seguro.propostas_endosso pe on pe.id_proposta = pr.id
						    inner join produto.produtos pd ON pd.id = pr.id_produto
						    inner join seguro.propostas_parcelas pp on pp.id_proposta = pr.id
						    inner join sistema.status st on st.id = pr.id_status and st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
						WHERE {$filtro}
						      pp.vl_segurado < 0
						GROUP BY pe.id_endosso
					)
				");

		$this->_db->query("
					CREATE temp TABLE tmp_parcela_cobranca AS (
						SELECT
						    sum(vl_segurado) as vl_pago,
						    pe.id_endosso
						FROM
						    seguro.propostas pr
						    inner join seguro.propostas_endosso pe on pe.id_proposta = pr.id
						    inner join produto.produtos pd ON pd.id = pr.id_produto
						    inner join seguro.propostas_parcelas pp on pp.id_proposta = pr.id
						    inner join sistema.status st on st.id = pr.id_status and st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
						WHERE {$filtro}
						      pp.vl_segurado > 0 and pp.fl_pago = true
						GROUP BY pe.id_endosso
					)
				");

        $this->_db->query("CREATE TEMP TABLE temp_itens_segurados AS (
                                SELECT sis.id_proposta
                                     , sum(sis.vl_area) as vl_area
                                     , sum(sis.vl_lmga) as vl_lmga
                                     , sum(sis.vl_area * vl_rendimento_tonelada) as area_pe
                                  FROM seguro.itens_segurados sis
                                       INNER JOIN seguro.propostas pr ON pr.id = sis.id_proposta
                                       INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
                                 WHERE {$filtro}
                                       sis.vl_lmga > 0
                                 GROUP BY sis.id_proposta)");

		$this->_db->query("SELECT seguro.sumario_parcelas_canceladas(0);");

		$sql = "select seguro.fn_proposta_motivos_cancelamento(pr.id) as motivo_cancelamento,
				     pr.id as id_proposta
				    ,id_proposta_mae
					,pr.id_secao
					,id_proposta_mae_completo
				    ,nr_endosso
				    ,pr.id_proposta_renovada
				    ,pr.nr_apolice
				    ,pr.dt_vigencia_inicio_original as dt_vigencia_inicio
				    ,pr.dt_vigencia_fim
				    ,pr.id_status
				    ,pr.vl_custo_apolice
				    ,pr.id_usuario_criacao
				    ,po.ds_coordenadas
				    ,pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr.id||'-'||pr.nr_digito_verificador as id_proposta_composto
				    ,case
				        when pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
				            then 'FRUTAS E HORTALIÇAS'
				        when pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . "
				            then case 
				                    when pg.tp_epoca_cultivo = 'I'
				                        then ptp.ds_tipo_produto || ' RN - INVERNO'
				                    else ptp.ds_tipo_produto || ' RN - VERÃO'
				                 end
				        when pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . "
				            then case
				                    when pg.tp_epoca_cultivo = 'I'
				                        then 'GRÃOS PG - INVERNO'
				                    else 'GRÃOS PG - VERÃO'
				                 end
				        else ptp.ds_tipo_produto
                     end as tipo_produto
				    ,sp.id as id_proponente
				    ,co.ds_nome_abreviado as ds_nome_fantasia
				    ,pc.vl_comissao
				    ,pd.ds_nome_produto
				    ,sf.ds_nome_safra
				    ,c.ds_nome_cultura
				    ,st.ds_status
				    ,pb.nu_boleto
				    ,u.tp_usuario ";

        if ($exibirAreaTotal) {
            $sql .= "    , ist.vl_area as total_area ";
        } else {
            $sql .= "    , tis.vl_area as total_area ";
        }

		$sql .= "   ,ist.vl_lmga as total_lmga
				    ,m1.ds_nome_municipio as municipio_propriedade
				    ,e1.ds_sigla as estado_propriedade
					,m1.nr_ibge
				    ,pat.valor_total
				    ,pat.valor_segurado
				    ,pat.valor_subvencao_federal
				    ,pat.valor_subvencao_estadual
				    ,(select sum(vl_premio) from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=false) as premio_adicional
				    ,(select sum(vl_premio) from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=true) as premio_principal
				    ,(select vl_franquia from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=true) as valor_franquia
				    ,(select vl_segurado from seguro.propostas_parcelas where id_proposta = pr.id and nr_parcela = 1) as valor_primeira_parcela
				    ,(select to_char(dt_vencimento, 'DD/MM/YYYY') from seguro.propostas_parcelas where id_proposta = pr.id and nr_parcela = 1) as vencto_primeira_parcela
				    ,ps.ds_observacao
				    ,ps.dt_criacao as dt_cancelamento
				    ,case when pat.valor_subvencao_federal > 0 then
				        case when pca.fl_sucesso = true then 'Sim' else 'Não' end
				        else
				        ''
				      end as subvencao_concedida,
					 ps.ds_observacao as ds_observacao
					 ,case when st.ds_chave in ('PROPOSTA_CANCELADA', 'DEVOLVIDA')  then 0 else coalesce(tmp_cobranca.vl_pago,0) + coalesce(tmp_restituicao.vl_restituido,0) end as vl_retido
					 , tis.area_pe
                     , ist.vl_area as valor_area_sumario
                     , CASE
                         WHEN ptp.ds_chave_rn = '" . Produto_Model_Tipos::DS_CHAVE_MULTIRRISCO . "'
                           THEN 1
                           ELSE 0
                        END as is_pg
					 , cr.ds_nome as ds_nome_contrato
				from
				    seguro.propostas_endosso pe,
				    tmp_propostas pr
			        left join seguro.proposta_boletos pb on pb.id_proposta = pr.id and pb.fl_ativo=true
					left join seguro.propostas_consulta_cadin pca on pca.fl_ativo=true and pca.id_proposta = id_proposta_mae
					left join seguro.propostas_status ps on ps.id_proposta = pr.id
				    left join tmp_parcela_restituicao as tmp_restituicao on tmp_restituicao.id_endosso = pr.id_endosso
				    left join tmp_parcela_cobranca as tmp_cobranca on tmp_cobranca.id_endosso = pr.id_endosso
					LEFT JOIN seguro.propostas_contratos_resseguro pcr ON pcr.id_proposta = pr.id
					LEFT JOIN produto.contratos_resseguro cr ON cr.id = pcr.id_contrato_resseguro
				    INNER JOIN temp_itens_segurados tis ON tis.id_proposta = pr.id
				    ,seguro.propostas_propriedades po
				    ,sumario.itens_segurados ist
				    ,sumario_parcelas pat
				    ,seguro.propostas_proponentes pp
				    ,seguro.proponentes sp
				    ,seguro.propostas_corretores pc
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.produtos_geral pg
				    ,produto.tipo_produto ptp
				    ,produto.culturas c
				    ,produto.safras sf
				    ,sistema.municipios m1
				    ,sistema.estados e1
				    ,sistema.status st
				    ,sistema.usuarios u
				where
				    	".$filtro."
				        st.ds_chave in ('PROPOSTA_CANCELADA', 'DEVOLVIDA', 'APOLICE_CANCELADA')
					and pc.id_usuario  <> 487
				    and pe.id_proposta = pr.id
					and pe.fl_proposta_vigente = true
					and ps.fl_ativo = true
				    and ist.id_proposta = pr.id
				    and pat.id_endosso = pr.id_endosso
				    and po.id_proposta = pr.id
				    and pp.id_proposta = pr.id
				    and sp.cpf_cnpj    = pp.cpf_cnpj
				    and pc.id_proposta = pr.id
				    and co.id_usuario  = pc.id_usuario
				    and pd.id          = pr.id_produto
				    and pg.id          = pd.id_produto_geral
				    and ptp.id         = pg.id_tipo_produto
				    and c.id           = pg.id_cultura
				    and sf.id          = pd.id_safra
				    and m1.id          = po.id_municipio
				    and e1.id          = m1.id_estado
				    and st.id          = pr.id_status
				    and pr.id_usuario_criacao = u.id
				    and ps.id_status   = st.id
				    and ps.id_proposta = pr.id
				order by
				    pr.id
				";

		return $this->fetchAll($sql);
	}

    public function relatorioVistoriaPreviaNaoEncaminhadas($id_safra = "", $arProduto = "", array $estados = [], array $municipios = [])
    {
        $filtro = [
            "(sst.ds_chave IN ('AGUARDANDO_ENVIO_SEG','AGUARDANDO_VISTORIA_PREVIA', 'APOLICE_EMITIDA', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO'))",
            "saf.id >= 15",
            "vp.id_status is null",
            "coberturas.count > 0"
        ];

        if (!empty($id_safra)) {
            array_push($filtro, "prod.id_safra = {$id_safra}");
        }

		if(is_array($arProduto)){
            array_push($filtro, "prod.id in (".implode("," , $arProduto).")");
		}

		if (!empty($estados)) {
            array_push($filtro, 'e.id in(' . implode(', ', $estados) . ')');
        }

        if (!empty($municipios)) {
            array_push($filtro, 'm.id in(' . implode(', ', $municipios) . ')');
        }

		$this->_db->query("DROP TABLE IF EXISTS itens_segurados_temp");
		$this->_db->query("CREATE temp
				           TABLE itens_segurados_temp AS (
				           SELECT id_proposta,
				                  sum(its.vl_lmga) AS lmga_total
						   	    , max(itsc.dt_semeadura) AS data_semeadura
						   FROM seguro.itens_segurados its,
						        seguro.itens_segurados_complemento itsc
						   WHERE itsc.id_item_segurado=its.id
						   GROUP BY id_proposta)");
		$this->_db->query("DROP TABLE IF EXISTS boletos_temp");
		$this->_db->query("CREATE temp
			                TABLE boletos_temp AS (
			               SELECT CASE WHEN fl_pago = true THEN 'Sim' ELSE 'Não' END as fl_boleto
			                      ,dt_vencimento
			                      ,id_proposta
			                      ,p.id_endosso
			                 FROM seguro.proposta_boletos pb
			                 JOIN seguro.propostas p
			                   ON p.id = pb.id_proposta
			                WHERE nr_parcela = 1
			                  AND pb.fl_ativo = true
			                  AND seguro.nr_endosso(id_proposta,p.id_endosso) = 0
							 )");
							 
		$this->_db->query("DROP TABLE IF EXISTS vistorias_previas_temp");
		$this->_db->query("CREATE temp TABLE vistorias_previas_temp AS (
								SELECT
									id_endosso, id_vistoria, vp.id, vp.id_status, id_proposta_solicitacao, id_status_analise, vp.dt_criacao
								FROM
									seguro.propostas p
								INNER JOIN seguro.propostas_vistorias_previas vp ON vp.id_proposta = p.id
								)");

		$this->_db->query("DROP TABLE IF EXISTS count_coberturas");
		$this->_db->query("CREATE TEMP TABLE count_coberturas AS (
								SELECT count(*) AS count, pr.id AS id_proposta
									FROM seguro.propostas pr
							INNER JOIN seguro.propostas_coberturas prc
										ON pr.id = prc.id_proposta
							INNER JOIN produto.produtos_coberturas pdc
										ON pr.id_produto = pdc.id_produto
									AND pdc.id_cobertura = prc.id_cobertura
								WHERE pdc.fl_vistoria_previa = true
							GROUP BY pr.id
							)");

		$sql = "SELECT  p . *
					 ,	seguro.nr_endosso(p.id, p.id_endosso) as nr_endosso
					 ,	p.id_proposta_mae
				     ,  sub . lmga_total
				     ,  sub . data_semeadura
				     ,  prop . ds_nome_proponente
				     ,  prod . ds_nome_abreviado as ds_nome_produto
				     ,  m . ds_nome_municipio
				     ,  e . ds_sigla
				     ,  vp . id  AS  id_proposta_vistoria
				     ,  vp . id_status
				     ,  usu . ds_nome_usuario
				     ,  pe . id_proposta  AS  id_proposta_endosso
				     ,  bol . fl_boleto
				     ,  TO_CHAR(bol.dt_vencimento, 'DD/MM/YYYY') AS vencto_primeira_parcela
				FROM  seguro . propostas  AS  p
				INNER JOIN  itens_segurados_temp  AS  sub
				    ON sub.id_proposta = p.id
				INNER JOIN  seguro . propostas_propriedades  AS  pp
				    ON p.id = pp.id_proposta
				INNER JOIN  seguro . propostas_proponentes  AS  prop
				    ON p.id = prop.id_proposta
				INNER JOIN  sistema . status  AS  sst
				    ON sst.id = p.id_status
				INNER JOIN  produto . produtos  AS  prod
				    ON p.id_produto = prod.id
				INNER JOIN  produto . safras  AS  saf
				    ON saf.id = prod.id_safra
				INNER JOIN  sistema . municipios  AS  m
				    ON pp.id_municipio = m.id
				INNER JOIN  sistema . estados  AS  e
				    ON m.id_estado = e.id
				INNER JOIN  sistema . usuarios  AS  usu
				    ON usu.id = p.id_usuario_criacao
				INNER JOIN (SELECT  pe . id_proposta ,  pe . id_endosso
							FROM  seguro . propostas_endosso  AS  pe
							WHERE (pe.fl_proposta_vigente = true)) AS  pe
				    ON pe.id_proposta = p.id
				LEFT JOIN  vistorias_previas_temp  AS  vp
				    ON p.id_endosso = vp.id_endosso
				LEFT JOIN  sistema . vistorias  AS  vis
				    ON vp.id_vistoria = vis.id
				LEFT JOIN  seguro . proposta_boletos  AS  pb
				    ON p.id = pb.id_proposta
				   and pb.id_versao = p.id_versao
				   and nr_parcela = 1
				   and pb.fl_ativo = true
				LEFT JOIN boletos_temp bol
				    ON bol.id_endosso = p.id_endosso
				LEFT JOIN count_coberturas AS coberturas
					ON coberturas.id_proposta = p.id
				WHERE
				    " . implode(' AND ', $filtro) . "
				ORDER BY
					sub.data_semeadura , prod.ds_nome_abreviado , e.ds_sigla , m.ds_nome_municipio , sub.lmga_total";

		return $this->fetchAll($sql);
	}

    public function relatorioVistoriaPrevia($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';

		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
				    pr.id,
				    s1.ds_chave,
				    ep.ds_nome_fantasia,
				    sa.dt_agendamento,
				    pp.ds_nome_proponente,
				    pd.ds_nome_produto,
				    m.ds_nome_municipio,
				    e.ds_sigla,
				    ve.dt_criacao as dt_encaminhamento,
				    CASE
				        WHEN s2.ds_chave = 'ENC' THEN 'ENCAMINHADA'
				        ELSE s2.ds_chave
				    END as ds_status_vistoria,
				    CASE
				        WHEN sa.ds_turno = 'M' THEN 'Manhã'
				        WHEN sa.ds_turno = 'T' THEN 'Tarde'
				        WHEN sa.ds_turno = 'N' THEN 'Noite'
				    END as ds_turno,
				    u.tp_usuario,
				    co.ds_nome_abreviado,
				    pr.id_usuario_criacao
				from
				    seguro.propostas pr,
				    seguro.propostas_vistorias_previas  pv
				    left join sistema.vistorias_agendamentos va on
				        va.id_vistoria = pv.id_vistoria
				    left join sistema.agendamentos sa on
				        sa.id = va.id_agendamento,
				    sistema.vistorias_empresas ve,
				    produto.produtos pd,
				    sistema.status s1,
				    sistema.status s2,
				    sistema.empresas ep,
				    seguro.propostas_proponentes pp,
				    seguro.propostas_propriedades po,
				    sistema.municipios m,
				    sistema.estados e,
				    sistema.usuarios u,
				    seguro.propostas_corretores pc,
				    sistema.corretores co
				where
				    ".$filtro."
				    s1.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA') and
				    pd.id = pr.id_produto and
				    pv.id_proposta = pr.id and
				    ve.id_vistoria = pv.id_vistoria and
				    s1.id = pr.id_status and
				    s2.id = pv.id_status and
				    ve.id_empresa = ep.id and
				    pp.id_proposta = pr.id and
				    po.id_proposta = pr.id and
				    m.id = po.id_municipio and
				    e.id = m.id_estado and
				    ve.fl_ativo = true and
				    pr.id_usuario_criacao = u.id and
				    pc.id_proposta = pr.id and
				    co.id_usuario  = pc.id_usuario
				";

		return $this->fetchAll($sql);
	}

	public function relatorioVistoriaPreviaFinalizada($id_safra = "", $arProduto = "")
    {
        $aliasSafra = 'regulacao';
        if (($id_safra) && ($id_safra <= 17)) {
            $aliasSafra = "safra" . $id_safra;
        }

        $filtro = '';
        $filtroChamados = ' vc.id_status in (73, 58) AND vc.dt_prazo_retorno IS NOT NULL ';

        if (!empty($id_safra)) {
            $filtro = "pd.id_safra=" . $id_safra . " and ";
            $filtroChamados .= " AND vc.id_safra = {$id_safra} ";
        }

        if (is_array($arProduto)) {
            $filtro .= "pd.id in (" . implode(",", $arProduto) . ") and ";
        }

        $this->_db->query(
            "CREATE temp TABLE chamados_temp AS (
                  SELECT DISTINCT vc.id_proposta, max(vc.dt_prazo_retorno) AS dt_prazo_retorno
                    FROM atendimento.v_chamados vc
                   WHERE {$filtroChamados}
                   GROUP BY vc.id_proposta
          )"
        );

        $regex = '\\"(.*?)\\"';
        $this->_db->query("
          CREATE temp TABLE observacoes_itens_segurados_temp AS (
            SELECT x.id_laudo_previa,
                   array_to_string(array_agg(x.motivos_negacao), ', ') as motivos_negacao
              FROM (
                SELECT DISTINCT lis.id_laudo_previa,
                       btrim(REGEXP_MATCHES(lis.motivos_negacao, '". $regex ."', 'g')::TEXT, '{}\"') as motivos_negacao
                  FROM regulacao.lvp001 l
                  JOIN ".$aliasSafra.".lvp001_itens_segurados lis ON lis.id_laudo_previa = l.id
                  WHERE (lis.motivos_negacao <> '".'{""}'."' OR lis.motivos_negacao <> NULL)
                  ORDER BY lis.id_laudo_previa
              ) AS x GROUP BY x.id_laudo_previa
          )
        ");

        $sql = "select pr.id_proposta_mae as id,
                	   sp.id as id_proponente,
                	   sf.ds_nome_safra,
                	   pd.ds_nome_produto,
                	   lvp001is.nr_quadra,
                	   v.ds_nome_variedade,
                	   ci.ds_nome_ciclo,
                	   lvp001is.dt_inicio_semeadura,
                	   lvp001is.dt_final_semeadura,
                	   lvp001is.vl_area_declarada,
                	   lvp001is.vl_area_vistoriada,
                	   lvp001is.vl_area_asseguravel,
                	   lvp001is.vl_area_excluida,
	                   lvp001is.tipo_solo,
                	   m.ds_nome_municipio,
                	   e.ds_sigla,
                	   ep.ds_nome_fantasia,
                	   lvp001.ds_vistoriador,
                	   to_char(lvp001.dt_laudo,'dd/mm/yyyy') AS dt_vistoria,
                	   to_char(lvp001.dt_transmissao,'dd/mm/yyyy') AS dt_transmissao,
                	   co.ds_nome_abreviado as corretor,
                	   pre.ds_nome_preposto as preposto,
                	   s1.ds_chave as status_proposta,
                	   s2.ds_chave as status_laudo,
                	   s3.ds_status as ds_status_analise,
	    			   seguro.count_endosso(pr.id_endosso) as nr_endosso,
					   case lvp001.fl_reavaliacao when false then 'Não' else 'Sim' end as fl_reavaliacao,
					   case when pv.fl_transmitido_tablet = true and pv.fl_transmitido = true then 'Digital' 
					        when pv.fl_transmitido_tablet is null and pv.fl_transmitido = true then 'Manual' else '' end as tp_preenchimento,
                       TO_CHAR(ct.dt_prazo_retorno,'dd/mm/yyyy') AS dt_prazo_retorno,
                       pv.id_vistoria AS id_vistoria_previa,
                       lvp001is.nro_item AS item,
                       lvp001is.ds_coordenadas AS coordenadas,
                       ef.ds_nome_estadio_fenologico AS estadio_fenologico,
                       lvp001is.tamanho_planta,
                       lvp001is.tipo_semeadura
                      , lvp001is.espacamento_linhas
                      , 'Metro ' || INITCAP(lvp001is.unid_medida_stand_plantas) as unidade_stand_plantas
                      , lvp001is.amostra_1
                      , lvp001is.amostra_2
                      , lvp001is.amostra_3
                      , lvp001is.amostra_4
                      , lvp001is.media_amostras
                      , lvp001is.populacao_ha
                      , lvp001is.vl_rendimento_proposta
                      , CASE WHEN lvp001is.fl_rendimento_inferior is true THEN 'Sim' ELSE 'Não' END AS rendimento_inferior
                      , CASE WHEN lvp001is.fl_rendimento_inferior is true THEN lvp001is.vl_rendimento_estimado ELSE NULL END AS vl_rendimento_estimado
                      , CASE WHEN lvp001is.baixo_stand is true THEN 'Sim' ELSE '' END AS baixo_stand
                      , CASE WHEN lvp001is.incidencia_doencas is true THEN 'Sim' ELSE '' END AS incidencia_doencas
                      , CASE WHEN lvp001is.incidencia_pragas is true THEN 'Sim' ELSE '' END AS incidencia_pragas
                      , CASE WHEN lvp001is.incidencia_invasores is true THEN 'Sim' ELSE '' END AS incidencia_invasores
                      , CASE WHEN lvp001is.desuniformidade_plantio is true THEN 'Sim' ELSE '' END AS desuniformidade_plantio
                      , CASE WHEN lvp001is.erosao is true THEN 'Sim' ELSE '' END AS erosao
                      , CASE WHEN lvp001is.toxidez is true THEN 'Sim' ELSE '' END AS toxidez
                      , CASE
                          WHEN lvp001.ds_nivel_tecnologico = '1'
                              THEN 'Irregular'
                          WHEN lvp001.ds_nivel_tecnologico = '2'
                              THEN 'Regular'
                          WHEN lvp001.ds_nivel_tecnologico = '3'
                              THEN 'Bom'
                          WHEN lvp001.ds_nivel_tecnologico = '4'
                              THEN 'Ótimo'
                          ELSE ''
                         END AS ds_nivel_tecnologico
                      , regexp_replace(regexp_replace(lvp001.ds_observacao, '[\n\r]+', '', 'g' ), ';', ',', 'g' ) as ds_observacao
                      , CONCAT_WS(
                          ', ',
                          CASE WHEN lvp001is.inundacao is true THEN 'Inundação' ELSE NULL END,
                          CASE WHEN lvp001is.geada is true THEN 'Geada' ELSE NULL END,
                          CASE WHEN lvp001is.outros is true THEN 'Outros' ELSE NULL END
                        ) AS restricoes_tecnicas
                      , regexp_replace(regexp_replace(oist.motivos_negacao, '[\n\r]+', '', 'g' ), ';', ',', 'g' ) as obs_app
            	  from seguro.propostas pr
                       LEFT JOIN chamados_temp ct ON ct.id_proposta = pr.id_proposta_mae
                  	   left join sistema.prepostos pre on pre.id_usuario = pr.id_usuario_criacao
                  	   INNER JOIN seguro.propostas_vistorias_previas pv ON pv.id_proposta = pr.id
                  	   INNER JOIN sistema.vistorias_empresas ve ON ve.id_vistoria = pv.id_vistoria
                  	   INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
                  	   INNER JOIN produto.safras sf ON sf.id = pd.id_safra
                  	   INNER JOIN sistema.status s1 ON s1.id = pr.id_status
                  	   INNER JOIN sistema.status s2 ON s2.id = pv.id_status
                  	   INNER JOIN sistema.status s3 ON s3.id = pv.id_status_analise
                  	   INNER JOIN sistema.empresas ep ON ep.id = ve.id_empresa
                  	   INNER JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr.id
                  	   INNER JOIN seguro.proponentes sp ON sp.cpf_cnpj = pp.cpf_cnpj
                  	   INNER JOIN seguro.propostas_propriedades po ON po.id_proposta = pr.id
                  	   INNER JOIN sistema.municipios m ON m.id = po.id_municipio
                  	   INNER JOIN sistema.estados e ON e.id = m.id_estado
                  	   INNER JOIN sistema.usuarios u ON u.id = pr.id_usuario_criacao
                  	   INNER JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
                  	   INNER JOIN sistema.corretores co ON co.id_usuario  = pc.id_usuario
                  	   INNER JOIN " . $aliasSafra . ".lvp001 lvp001 ON lvp001.id_proposta_vistoria = pv.id
                  	   INNER JOIN " . $aliasSafra . ".lvp001_itens_segurados lvp001is ON lvp001is.id_laudo_previa = lvp001.id
                  	   left join produto.variedades v on v.id = lvp001is.id_variedade
                  	   left join produto.ciclos ci on ci.id = lvp001is.id_ciclo
                  	   left join produto.estadios_fenologicos ef on ef.id = lvp001is.estadio_fenologico
                  	   left join observacoes_itens_segurados_temp oist ON oist.id_laudo_previa = lvp001.id
            	 where " . $filtro . "
                        ve.fl_ativo = true
                    AND s1.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
                    AND (s2.ds_chave = 'TRANSMITIDA' or s2.ds_chave = 'DIGITACAO_FINALIZADA' or s2.ds_chave = 'TRANSMITIDA_SEM_FOTOS')
            	  order by pr.id, lvp001is.nr_quadra";

        $result = $this->fetchAll($sql);

        //remove as temp tables
        $this->_db->query("DROP TABLE IF EXISTS chamados_temp");

        return $result;
    }

    public function relatorioVistoriaPreviaCompleto(
      $id_safra = "",
      $arProduto = "",
      $flRelatorioEmpresas = false,
      array $estados = [],
      array $municipios = [],
      array $statusVistoriaAnalise = [],
      int $statusVistoriaAlteracoes = null
    )
    {
        $filtro = [
          's1.ds_chave NOT IN (\'PROPOSTA_INCOMPLETA\' , \'NAO_ENVIADA\' , \'DEVOLVIDA\' , \'ORCAMENTO_ENDOSSO\', \'ENDOSSO_INCOMPLETO\', \'SOLICITACAO_CANCELADA\')'
        ];
        $filtroChamados = ' vc.id_status in (73, 58) AND vc.dt_prazo_retorno IS NOT NULL ';

        if (!empty($id_safra)) {
            array_push($filtro, "pd.id_safra = {$id_safra}");
            $filtroChamados .= " AND vc.id_safra = {$id_safra} ";
        }

        if(is_array($arProduto)){
            array_push($filtro, "pd.id in (".implode("," , $arProduto).") ");
        }

        $User    = Zend_Auth::getInstance()->getIdentity();
        if($flRelatorioEmpresas && $User->id_empresa != '20'){
            array_push($filtro, "ve.id_empresa = {$User->id_empresa}");
            $filtroChamados .= " AND vc.id_empresa = {$User->id_empresa} ";
        }

        if (!empty($estados)) {
            array_push($filtro, 'e.id in(' . implode(', ', $estados) . ')');
        }

        if (!empty($municipios)) {
            array_push($filtro, 'm.id in(' . implode(', ', $municipios) . ')');
        }

        $filtroStatusVistoria = [];
        if (!empty($statusVistoriaAnalise)) {
            $filtroStatusVistoria[] = "vp.id_status_analise in(" . implode(', ', $statusVistoriaAnalise) . ")";
        }

        if (!empty($statusVistoriaAlteracoes)) {
            if ($statusVistoriaAlteracoes === 99999) {
                $filtroStatusVistoria[] = "vp.id_status_alteracao is null";
            } else {
                $filtroStatusVistoria[] = "vp.id_status_alteracao = {$statusVistoriaAlteracoes}";
            }
        }

        $filtroStatusVistoria = !empty($filtroStatusVistoria) ? ' WHERE ' . implode(' AND ', $filtroStatusVistoria) : '';

        $this->_db->query("CREATE temp TABLE itens_segurados_temp AS (SELECT count(its.id) as total_itens, id_proposta, max(itsc.dt_semeadura) AS data_semeadura FROM seguro.itens_segurados its, seguro.itens_segurados_complemento itsc where itsc.id_item_segurado=its.id GROUP BY id_proposta)");

        $this->_db->query("
        		CREATE temp TABLE processos_temp AS (
				select
				    pr.id_endosso,
				    sp.id as id_processo
				from
				    seguro.propostas pr
				    inner join seguro.propostas_endosso pe on pe.id_proposta = pr.id and pe.fl_proposta_vigente=true
				    inner join sinistro.processos sp on sp.id_proposta = pr.id
        		)
        ");

        $this->_db->query(
	        "CREATE temp TABLE vistorias_previas_temp AS (
		          SELECT
		              id_endosso, id_vistoria, vp.id, vp.id_status, id_proposta_solicitacao, id_status_analise, vp.dt_criacao
		              , id_status_alteracao
					  , CASE WHEN vp.fl_transmitido_tablet = true AND vp.fl_transmitido = true THEN
					  	'Digital'
					  WHEN vp.fl_transmitido_tablet is null and vp.fl_transmitido = true THEN
					    'Manual'
					  ELSE '' END AS tp_preenchimento 
		          FROM
		              seguro.propostas p
		          INNER JOIN seguro.propostas_vistorias_previas vp ON vp.id_proposta = p.id
		          {$filtroStatusVistoria}
		    )"
	    );

      $this->_db->query(
        "CREATE temp TABLE chamados_temp AS (
            SELECT 
              DISTINCT vc.id_proposta, max(vc.dt_prazo_retorno) AS dt_prazo_retorno 
            FROM atendimento.v_chamados vc 
            WHERE  {$filtroChamados}
            GROUP BY vc.id_proposta
          )"
      );

		$sql = "SELECT DISTINCT pr.id_proposta_mae AS id
							, s1.ds_chave
							, ep.ds_nome_fantasia
							, sa.dt_agendamento
							, pp.ds_nome_proponente
							, sprop.id as id_proponente
							, pd.ds_nome_produto
							, m.ds_nome_municipio
							, e.ds_sigla
							, TO_CHAR(ve.dt_criacao,'dd/mm/yyyy') AS dt_encaminhamento
							, sub.total_itens
							, CASE WHEN s2.ds_chave = 'ENC' THEN
								'ENCAMINHADA'
							ELSE
								s2.ds_chave
							END AS ds_status_vistoria
							, s3.ds_status AS ds_status_analise
							, TO_CHAR(pvh.dt_analise,'dd/mm/yyyy HH24:MI:SS') AS dt_analise
							, CASE WHEN sa.ds_turno = 'M' THEN
								'Manhã'
									WHEN sa.ds_turno = 'T' THEN
								'Tarde'
									WHEN sa.ds_turno = 'N' THEN
								'Noite'
							END AS ds_turno
							, CASE WHEN pd.id_safra = '13' THEN
									TO_CHAR(sf13.dt_laudo, 'dd/mm/yyyy')
								WHEN pd.id_safra = '14' THEN
									TO_CHAR(sf14.dt_laudo, 'dd/mm/yyyy')
								WHEN pd.id_safra = '15' THEN
									TO_CHAR(sf15.dt_laudo, 'dd/mm/yyyy')
								WHEN pd.id_safra = '16' THEN
									TO_CHAR(sf16.dt_laudo, 'dd/mm/yyyy')
											WHEN pd.id_safra = '17' THEN
									TO_CHAR(sf17.dt_laudo, 'dd/mm/yyyy')
										ELSE
								TO_CHAR(l.dt_laudo, 'dd/mm/yyyy')
							END as dt_vistoria
							, CASE WHEN pd.id_safra = '13' THEN
									TO_CHAR(sf13.dt_criacao,'dd/mm/yyyy')
								WHEN pd.id_safra = '14' THEN
									TO_CHAR(sf14.dt_criacao,'dd/mm/yyyy')
								WHEN pd.id_safra = '15' THEN
									TO_CHAR(sf15.dt_criacao,'dd/mm/yyyy')
								WHEN pd.id_safra = '16' THEN
									TO_CHAR(sf16.dt_criacao,'dd/mm/yyyy')
											WHEN pd.id_safra = '17' THEN
									TO_CHAR(sf13.dt_criacao,'dd/mm/yyyy')
										ELSE
								TO_CHAR(l.dt_criacao,'dd/mm/yyyy')
							END as dt_digitacao
							, CASE WHEN pd.id_safra = '14' THEN
									TO_CHAR(sf14.dt_transmissao,'dd/mm/yyyy')
								WHEN pd.id_safra = '15' THEN
									TO_CHAR(sf15.dt_transmissao,'dd/mm/yyyy')
								WHEN pd.id_safra = '16' THEN
									TO_CHAR(sf16.dt_transmissao,'dd/mm/yyyy')
											WHEN pd.id_safra = '17' THEN
									TO_CHAR(sf17.dt_transmissao,'dd/mm/yyyy')
										ELSE
								TO_CHAR(l.dt_transmissao,'dd/mm/yyyy')
							END as dt_transmissao
						, CASE WHEN sp.id_processo IS NOT NULL THEN
								'Sim'
							ELSE
								'Não'
							END AS fl_sinistro
						, seguro.count_endosso(pr.id_endosso) AS nr_endosso
						, CASE WHEN u.tp_usuario = 'P' THEN
								prep.ds_nome_preposto
							ELSE
								''
							END AS ds_nome_preposto
						, u.tp_usuario
						, co.ds_nome_abreviado
						, pr.id_usuario_criacao
						, sub.data_semeadura AS dt_semeadura
						, ist.vl_area
						, l.prioridade_conferencia
						, tp_preenchimento
                        , TO_CHAR(ct.dt_prazo_retorno,'dd/mm/yyyy') AS dt_prazo_retorno
                        , usuario_historico.ds_nome_usuario as alterado_por
                        , s4.ds_status AS ds_status_alteracao
						, regexp_replace(spo.ds_observacao, '[\n\r]+', '', 'g' ) as observacao
						FROM seguro.propostas_endosso pre
					INNER JOIN seguro.propostas pr
						ON pre.id_proposta = pr.id
					INNER JOIN itens_segurados_temp sub
						ON sub.id_proposta = pr.id
                    INNER JOIN vistorias_previas_temp pv
						ON pr.id_endosso = pv.id_endosso
                       AND pre.fl_proposta_vigente = true
					INNER JOIN sistema.vistorias_empresas ve
						ON ve.fl_ativo = true
						AND ve.id_vistoria = pv.id_vistoria
					INNER JOIN produto.produtos pd
						ON pd.id = pr.id_produto
					INNER JOIN sistema.status s1
						ON s1.id = pr.id_status
					INNER JOIN sistema.status s2
						ON s2.id = pv.id_status
					INNER JOIN sistema.status s3
						ON s3.id = pv.id_status_analise
					LEFT JOIN sistema.status s4
						ON s4.id = pv.id_status_alteracao
					INNER JOIN sistema.empresas ep
						ON ve.id_empresa = ep.id
					INNER JOIN seguro.propostas_proponentes pp
						ON pp.id_proposta = pr.id
                    INNER JOIN seguro.proponentes sprop
						ON sprop.cpf_cnpj = pp.cpf_cnpj
					INNER JOIN seguro.propostas_propriedades po
						ON po.id_proposta = pr.id
					INNER JOIN sistema.municipios m
						ON m.id = po.id_municipio
					INNER JOIN sistema.estados e
						ON e.id = m.id_estado
					INNER JOIN sistema.usuarios u
						ON pr.id_usuario_criacao = u.id
					INNER JOIN seguro.propostas_corretores pc
						ON pc.id_proposta = pr.id
					INNER JOIN sistema.corretores co
						ON co.id_usuario = pc.id_usuario
					INNER JOIN sumario.itens_segurados ist
						ON ist.id_proposta = pr.id
					LEFT JOIN (SELECT id_usuario
								, ds_nome_preposto
								FROM sistema.prepostos) AS prep
							ON prep.id_usuario = pr.id_usuario_criacao
					LEFT JOIN processos_temp sp
						ON sp.id_endosso = pr.id_endosso
					LEFT JOIN sistema.vistorias_agendamentos va
						ON va.id_vistoria = pv.id_vistoria
					LEFT JOIN sistema.agendamentos sa
						ON sa.id = va.id_agendamento
                    LEFT JOIN (select dt_criacao as dt_analise, pvph.id_proposta_vistoria, id_usuario_criacao, pvph.id as id_propostas_vistorias_previas_historico
                                  from (SELECT MAX(vph.id) AS id, vph.id_proposta_vistoria
                                          FROM seguro.propostas_vistorias_previas_historico vph
										 WHERE vph.id_usuario_criacao <> 2068 
							             GROUP BY vph.id_proposta_vistoria) as x 
                                  left join seguro.propostas_vistorias_previas_historico pvph on pvph.id = x.id) AS pvh
						ON pv.id = pvh.id_proposta_vistoria
					LEFT JOIN seguro.vistorias_previas_historico_observacoes svpho ON svpho.id_propostas_vistorias_previas_historico = pvh.id_propostas_vistorias_previas_historico
					LEFT JOIN seguro.propostas_observacoes spo ON spo.id = svpho.id_propostas_observacoes
					LEFT JOIN sistema.usuarios usuario_historico
					    ON usuario_historico.id = pvh.id_usuario_criacao
					LEFT JOIN regulacao.lvp001 l
						ON l.id_proposta_vistoria = pv.id
					LEFT JOIN safra13.lvp001 sf13
						ON sf13.id_proposta_vistoria = pv.id
					LEFT JOIN safra14.lvp001 sf14
						ON sf14.id_proposta_vistoria = pv.id
					LEFT JOIN safra15.lvp001 sf15
						ON sf15.id_proposta_vistoria = pv.id
					LEFT JOIN safra16.lvp001 sf16
						ON sf16.id_proposta_vistoria = pv.id
					LEFT JOIN safra17.lvp001 sf17
						ON sf17.id_proposta_vistoria = pv.id
          LEFT JOIN chamados_temp ct 
            ON ct.id_proposta = pr.id_proposta_mae
					WHERE " . implode(' AND ', $filtro);
        
        $result = $this->fetchAll($sql);

        //remove as temp tables
        $this->_db->query("DROP TABLE IF EXISTS itens_segurados_temp");
        $this->_db->query(" DROP TABLE IF EXISTS processos_temp");
        $this->_db->query("DROP TABLE IF EXISTS vistorias_previas_temp");
        $this->_db->query("DROP TABLE IF EXISTS chamados_temp");

		return $result;
	}

	public function relatorioItensSegurados($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';

		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
			select
			     pr.id as id_proposta
			    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
			    ,pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr.id||'-'||pr.nr_digito_verificador as id_proposta_composto
			    ,ist.nr_item_segurado
			    ,ist.vl_rendimento_tonelada
			    ,ist.vl_area
			    ,ist.vl_lmga
				,va.ds_nome_variedade
				,co.ds_nome_corretor
				,cu.ds_nome_cultura
				,e.ds_sigla
				,m.ds_nome_municipio
				,m.nr_ibge
			from
			     seguro.propostas pr
			    ,seguro.itens_segurados ist
				,produto.variedades va
			    ,seguro.propostas_corretores pc
				,sistema.corretores co
			    ,produto.produtos pd
			    ,produto.produtos_geral pg
				,produto.culturas cu
				,seguro.propostas_propriedades po
				,sistema.municipios m
				,sistema.estados e
			    ,sistema.status st
			where
				".$filtro."
					st.ds_chave    not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
			    and pc.id_usuario  <> 487
			    and ist.id_proposta = pr.id
				and va.id          = ist.id_variedade
			    and pc.id_proposta = pr.id
				and co.id_usuario  = pc.id_usuario
			    and pd.id          = pr.id_produto
			    and pg.id          = pd.id_produto_geral
				and cu.id          = pg.id_cultura
				and po.id_proposta = pr.id
				and m.id           = po.id_municipio
				and e.id           = m.id_estado
			    and st.id          = pr.id_status
			order by
			     pr.id
			    ,ist.nr_item_segurado";

		return $this->fetchAll($sql);
	}

    public function relatorioConferencia($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$this->_db->query("CREATE temp TABLE parcelas_temp AS (SELECT id_proposta,sum(vl_total) AS valor_total, sum(vl_segurado) AS valor_segurado, sum(vl_subvencao_federal) AS valor_subvencao_federal, sum(vl_subvencao_estadual) AS valor_subvencao_estadual FROM seguro.propostas_parcelas GROUP BY id_proposta)");
		$this->_db->query("CREATE temp TABLE itens_segurados_temp AS (SELECT id_proposta,count(id) AS nr_itens_segurados FROM seguro.itens_segurados GROUP BY id_proposta)");
		
		$sql = "select
				     pr.id as id_proposta
				    ,pr.id_proposta_renovada
				    ,pr.nr_apolice
				    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
				    ,to_char(pr.dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim
				    ,pr.id_status
				    ,pr.vl_custo_apolice
				    ,pr.id_usuario_criacao
				    ,pr.id_produto
				    ,(select ds_classe from seguro.propostas where id = pr.id_proposta_renovada) as ds_classe
				    ,po.ds_coordenadas

				    ,pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr.id||'-'||pr.nr_digito_verificador as id_proposta_composto

				    ,case 
				        when pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
				            then 'FRUTAS E HORTALIÇAS'
				        when pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . " 
				            then case 
				                    when pg.tp_epoca_cultivo = 'I'
				                        then ptp.ds_tipo_produto || ' RN - INVERNO' 
				                    else ptp.ds_tipo_produto || ' RN - VERÃO' 
				                 end
				        when pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . " 
				            then case 
				                    when pg.tp_epoca_cultivo = 'I'
				                        then 'GRÃOS PG - INVERNO' 
				                    else 'GRÃOS PG - VERÃO' 
				                 end
				        else ptp.ds_tipo_produto 
                     end as tipo_produto
				    ,sp.id as id_proponente

				    ,co.ds_nome_abreviado as ds_nome_fantasia

				    ,pc.vl_comissao
				    ,pd.ds_nome_produto
				    ,sf.ds_nome_safra
				    ,c.ds_nome_cultura
				    ,st.ds_status
				    ,u.tp_usuario

				    ,ist.vl_area as total_area
				    ,ist.vl_lmga as total_lmga

				    ,m1.ds_nome_municipio as municipio_propriedade
				    ,e1.ds_sigla as estado_propriedade
					,m1.nr_ibge

				    ,pat.valor_total
				    ,pat.valor_segurado
				    ,pat.valor_subvencao_federal
				    ,pat.valor_subvencao_estadual

                    ,itt.nr_itens_segurados

				    ,(select sum(vl_premio) from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=false) as premio_adicional
				    ,(select sum(vl_premio) from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=true) as premio_principal
				    ,(select vl_franquia from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=true) as valor_franquia
				from
				     seguro.propostas pr
				    ,seguro.propostas_propriedades po
				    ,sumario.itens_segurados ist
				    ,parcelas_temp pat
                    ,itens_segurados_temp itt
				    ,seguro.propostas_proponentes pp
				    ,seguro.proponentes sp
				    ,seguro.propostas_corretores pc
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.produtos_geral pg
				    ,produto.tipo_produto ptp
				    ,produto.culturas c
				    ,produto.safras sf
				    ,sistema.municipios m1
				    ,sistema.estados e1
				    ,sistema.status st
				    ,sistema.usuarios u
				where
				    ".$filtro."
				        st.ds_chave    not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pc.id_usuario  <> 487 --(corretor teste)
				    and ist.id_proposta = pr.id
				    and pat.id_proposta = pr.id
                    and itt.id_proposta = pr.id
				    and po.id_proposta = pr.id
				    and pp.id_proposta = pr.id
				    and sp.cpf_cnpj    = pp.cpf_cnpj
				    and pc.id_proposta = pr.id
				    and co.id_usuario  = pc.id_usuario
				    and pd.id          = pr.id_produto
				    and pg.id          = pd.id_produto_geral
				    and ptp.id         = pg.id_tipo_produto
				    and c.id           = pg.id_cultura
				    and sf.id          = pd.id_safra
				    and m1.id          = po.id_municipio
				    and e1.id          = m1.id_estado
				    and st.id          = pr.id_status
				    and pr.id_usuario_criacao = u.id
				order by
				    pr.id
				";

		return $this->fetchAll($sql);
	}

    public function relatorioConferenciaGraos($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "select
				     pr.id as id_proposta
				    ,pr.id_proposta_renovada
				    ,pr.nr_apolice
				    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
				    ,to_char(pr.dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim
				    ,pr.id_status
				    ,pr.vl_custo_apolice
				    ,pr.id_usuario_criacao
				    ,pr.id_produto
				    ,(select ds_classe from seguro.propostas where id = pr.id_proposta_renovada) as ds_classe
				    ,po.ds_coordenadas

				    ,pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr.id||'-'||pr.nr_digito_verificador as id_proposta_composto

				    ,case 
				        when pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
				            then 'FRUTAS E HORTALIÇAS'
				        when pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . " 
				            then case 
				                    when pg.tp_epoca_cultivo = 'I'
				                        then ptp.ds_tipo_produto || ' RN - INVERNO' 
				                    else ptp.ds_tipo_produto || ' RN - VERÃO' 
				                 end
				        when pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . " 
				            then case 
				                    when pg.tp_epoca_cultivo = 'I'
				                        then 'GRÃOS PG - INVERNO' 
				                    else 'GRÃOS PG - VERÃO' 
				                 end
				        else ptp.ds_tipo_produto 
                     end as tipo_produto
				    ,sp.id as id_proponente

				    ,co.ds_nome_abreviado as ds_nome_fantasia

				    ,pc.vl_comissao
				    ,pd.ds_nome_produto
				    ,sf.ds_nome_safra
				    ,c.ds_nome_cultura
				    ,st.ds_status
				    ,u.tp_usuario

				    ,m1.ds_nome_municipio as municipio_propriedade
				    ,e1.ds_sigla as estado_propriedade
					,m1.nr_ibge

					,isg.nr_item_segurado
		            ,isg.ds_item_segurado
					,isg.vl_area
					,isg.vl_lmga
					,isg.vl_rendimento_tonelada
					,isc.vl_producao_garantida
					,isg.vl_valor_tonelada
				    ,isc.dt_semeadura as dt_plantio
            ,isc.id_tipo_solo

				    ,ci.ds_nome_ciclo
					,v.ds_nome_variedade

				    ,(select vl_franquia from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=true) as valor_franquia
				    ,(select sum(vl_franquia) from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=false) as valor_franquia_adicional
				    ,(select vl_taxa from seguro.propostas_coberturas where id_proposta = pr.id and fl_principal=true) as valor_taxa
				from
				     seguro.propostas pr
				    ,seguro.propostas_propriedades po
				    ,seguro.propostas_proponentes pp
				    ,seguro.proponentes sp
				    ,seguro.propostas_corretores pc
				    ,seguro.itens_segurados isg
				    ,seguro.itens_segurados_complemento isc
				    left join produto.ciclos ci on ci.id = isc.id_ciclo
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.produtos_geral pg
				    ,produto.tipo_produto ptp
				    ,produto.culturas c
				    ,produto.safras sf
				    ,sistema.municipios m1
				    ,sistema.estados e1
				    ,sistema.status st
				    ,sistema.usuarios u
				    ,produto.variedades v
				where
				        ".$filtro."
				        st.ds_chave     not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pc.id_usuario   <> 487 --(corretor teste)
				    and po.id_proposta  = pr.id
				    and pp.id_proposta  = pr.id
				    and sp.cpf_cnpj    = pp.cpf_cnpj
				    and pc.id_proposta  = pr.id
				    and isg.id_proposta = pr.id
				    and isc.id_item_segurado = isg.id
				    and co.id_usuario   = pc.id_usuario
				    and pd.id           = pr.id_produto
				    and pg.id           = pd.id_produto_geral
				    and ptp.id         = pg.id_tipo_produto
				    and c.id            = pg.id_cultura
				    and sf.id           = pd.id_safra
				    and m1.id           = po.id_municipio
				    and e1.id           = m1.id_estado
				    and st.id           = pr.id_status
				    and pr.id_usuario_criacao = u.id
				    and v.id            = isg.id_variedade
				    and ((pg.id_tipo_produto = 2 AND pg.id <> 75) OR (pg.id_tipo_produto = 3 AND pg.id <> 41))
				order by
				    pr.id,isg.nr_item_segurado
				";

		return $this->fetchAll($sql);
	}

    public function relatorioSubvencaoCadin($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							pr.id_proposta_mae,
							seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");

		//$this->_db->query("CREATE temp TABLE parcelas_temp AS (SELECT id_proposta,sum(vl_total) AS valor_total, sum(vl_segurado) AS valor_segurado, sum(vl_subvencao_federal) AS valor_subvencao_federal, sum(vl_subvencao_estadual) AS valor_subvencao_estadual FROM seguro.propostas_parcelas GROUP BY id_proposta)");
		$this->_db->query("SELECT seguro.sumario_parcelas_consulta_cadin(0);");

		$sql = "select
					pr.id,
					lpad(replace(replace(seguro.id_proposta_mae_completo(pr.id),'.',''),'-',''),30,'0') as id_proposta_composto,
				    pr.id_proposta_mae,
				    pr.nr_endosso,
					pr.dt_vigencia_inicio,
					replace(replace(replace(po.cpf_cnpj, '-',''),'.',''),'/','') as cpf_cnpj,
					po.ds_nome_proponente,
					pat.valor_total,
					pat.valor_subvencao_federal,
					pr.vl_custo_apolice,
					c.cd_bacen,
					m.cd_bacen as cd_bacen_municipio,
					CASE
					    WHEN pq.ds_resposta = '1' THEN 'Sim'
					    ELSE 'Não'
					END as zoneamento_mapa
				    ,'12' as codigo_seguradora
				    ,case when q_pronamp.quest_pronamp is null then 'Não' else q_pronamp.quest_pronamp end as quest_pronamp
				    ,case when q_organico.quest_organico is null then 'Não' else q_pronamp.quest_pronamp end as quest_organico
					,case when pat.valor_subvencao_federal > 0 then
				        case when pca.fl_sucesso = true then 'Sim' else 'Não' end
				    else
				        ''
				    end as subvencao_concedida
					,case when pb.fl_pago = true then 'Pago' else 'Pendente' end as fl_boleto_pago
					,st.ds_status
				from
				     seguro.propostas_endosso pe
					,tmp_propostas pr
				    left join (select case when ds_resposta='1' then 'Sim' else 'Não' end as quest_pronamp, id_proposta from seguro.propostas_questionario where id_atributo_rn=145) as q_pronamp on q_pronamp.id_proposta = pr.id
				    left join (select case when ds_resposta='1' then 'Sim' else 'Não' end as quest_organico, id_proposta from seguro.propostas_questionario where id_atributo_rn=146) as q_organico on q_organico.id_proposta = pr.id
					left join seguro.propostas_consulta_cadin pca on pca.fl_ativo=true and pca.id_proposta = pr.id_proposta_mae
					left join seguro.proposta_boletos pb on pb.id_proposta = pr.id and pb.fl_ativo=true and pb.id_versao = pr.id_versao and pb.nr_parcela = 1
					,seguro.propostas_propriedades pp
					,seguro.propostas_proponentes po
					,seguro.propostas_corretores pc
					,sistema.municipios m
					,produto.produtos pd
					,produto.produtos_geral pg
					,produto.culturas c
					,sumario_parcelas pat
					,seguro.propostas_questionario pq
				    ,sistema.status st
				    ,sistema.usuarios u
				where
					    ".$filtro."
				        st.ds_chave            not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
                    and pe.id_proposta         = pr.id
					and pe.fl_proposta_vigente = true
				    and pc.id_usuario          <> 487 --(corretor teste)
					and pp.id_proposta         = pr.id
					and po.id_proposta         = pr.id
					and pc.id_proposta         = pr.id
					and m.id                   = pp.id_municipio
					and pd.id                  = pr.id_produto
					and pg.id                  = pd.id_produto_geral
					and c.id                   = pg.id_cultura
					and pat.id_endosso         = pr.id_endosso
					and pq.id_proposta         = pr.id
					and pq.id_atributo_rn      = 153
				    and st.id                  = pr.id_status
				    and pr.id_usuario_criacao  = u.id
				order by
					pr.id
				";

		return $this->fetchAll($sql);
	}

	public function relatorioSubvencaoEstadual($id_safra="",$arProduto=""){

		if (strtolower($id_safra) == 'todas') {
      $filtro = "pd.id_safra >= 16 and ";
    } else if (strtolower($id_safra) == 'tres_ultimas') {
      $modelSafra = new Produto_Model_Safras();
      $safraAtual = $modelSafra->getSafraAtual();
      $safraAtual = $safraAtual['id'];

      $filtro = "pd.id_safra IN (".$safraAtual.", ".($safraAtual-1).", ".($safraAtual-2).") and ";
    } else if ($id_safra) {
      $filtro = "pd.id_safra=".$id_safra." and ";
    } else {
      $filtro = "";
    }
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							to_char(dt_transmissao, 'DD/MM/YYYY') as dt_transmissao,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							seguro.id_proposta_mae(pr.id) as id_proposta_mae,
							seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");

		$this->_db->query("CREATE temp TABLE tmp_produtividade_estimada AS (select AVG(vl_rendimento_tonelada) as prod_estimada,it.id_proposta from seguro.itens_segurados it where it.vl_rendimento_tonelada > 0 group by it.id_proposta)");
		$this->_db->query("CREATE temp TABLE tmp_produtividade_garantida AS (select AVG(vl_producao_garantida) as prod_garantida,it.id_proposta from seguro.itens_segurados_complemento  isc, seguro.itens_segurados it where it.id = isc.id_item_segurado and isc.vl_producao_garantida > 0 group by it.id_proposta)");

		//$this->_db->query("CREATE temp TABLE parcelas_temp AS (SELECT id_proposta,sum(vl_total) AS valor_total, sum(vl_segurado) AS valor_segurado, sum(vl_subvencao_federal) AS valor_subvencao_federal, sum(vl_subvencao_estadual) AS valor_subvencao_estadual FROM seguro.propostas_parcelas GROUP BY id_proposta)");
		$this->_db->query("SELECT seguro.sumario_parcelas_consulta_cadin(0);");

		$sql = "select
						pr.id,
						lpad(replace(replace(seguro.id_proposta_mae_completo(pr.id),'.',''),'-',''),30,'0') as id_proposta_composto,
					    pr.id_proposta_mae,
					    pr.nr_endosso,
						pr.dt_transmissao,
						pr.dt_vigencia_inicio,
				        to_char(seguro.dt_emissao_apolice(pr.id_proposta_mae), 'DD/MM/YYYY') as dt_apolice,
						po.cpf_cnpj as cpf_cnpj,
						po.ds_nome_proponente,
						pat.valor_total,
						pat.valor_subvencao_federal,
						pat.valor_subvencao_estadual,
						pr.vl_custo_apolice,
						c.cd_bacen,
				        c.ds_nome_cultura,
					    m.cd_bacen as cd_bacen_municipio,
					    CASE
					        WHEN pq.ds_resposta = '1' THEN 'Sim'
					    ELSE 'Não'
						END as zoneamento_mapa
						,pq_cadpro.ds_resposta as cadpro
				       ,'12' as codigo_seguradora
				       ,case when q_pronamp.quest_pronamp is null then 'Não' else q_pronamp.quest_pronamp end as quest_pronamp
				       ,case when q_organico.quest_organico is null then 'Não' else q_organico.quest_organico end as quest_organico
				       ,case when pat.valor_subvencao_federal > 0 then
				       case when pca.fl_sucesso = true then 'Sim' else 'Não' end
				       else
				       ''
				       end as subvencao_concedida
				       ,case when pb.fl_pago = true then 'Pago' else 'Pendente' end as fl_boleto_pago

				       ,st.ds_status
				       ,pr.nr_apolice

				       ,emp.ds_razao_social as ds_razao_social_seguradora
				       ,replace(replace(replace(emp.cpf_cnpj, '-',''),'.',''),'/','') as cpf_cnpj_seguradora

				       ,pp.ds_nome_propriedade
				       ,pp.ds_endereco as ds_endereco_propriedade
				       ,pp.ds_endereco_nro as ds_endereco_nro_propriedade
				       ,case when pp.ds_endereco_complemento is null or pp.ds_endereco_complemento = '' then pp.ds_endereco_bairro
				        else pp.ds_endereco_complemento
				        end as ds_endereco_complemento_propriedade
				       ,m.ds_nome_municipio as ds_nome_municipio_propriedade
				       ,e.ds_sigla as ds_sigla_propriedade
				       ,pp.ds_endereco_cep as ds_endereco_cep_propriedade

				       ,substring(pp.ds_coordenadas from 2 for 2) as coord1
				       ,substring(pp.ds_coordenadas from 5 for 2) as coord2
				       ,substring(pp.ds_coordenadas from 8 for 2) as coord3
				       ,'S' as coord4
				       ,substring(pp.ds_coordenadas from 14 for 2) as coord5
				       ,substring(pp.ds_coordenadas from 17 for 2) as coord6
				       ,substring(pp.ds_coordenadas from 20 for 2)  as coord7
				       ,'W' as coord8

				       ,po.ds_endereco_rua as ds_endereco_segurado
				       ,po.ds_endereco_nro as ds_endereco_nro_segurado
				       ,case when po.ds_endereco_complem is null or po.ds_endereco_complem = '' then po.ds_endereco_bairro
				        else po.ds_endereco_complem
				        end as ds_endereco_complemento_segurado
				       ,m2.ds_nome_municipio as ds_nome_municipio_segurado
				       ,e2.ds_sigla as ds_sigla_segurado
				       ,po.ds_endereco_cep as ds_endereco_cep_segurado

				       ,' '||pr.nr_endosso

				       ,ist.vl_area
				       ,ist.vl_lmga

				       ,pd.nr_susep

				       ,case when pg.id_tipo_produto = '3' then
				           round(tpg.prod_garantida, 3)
				       else
				           round(tpe.prod_estimada, 3)
				       end as produtividade_garantida
				       ,round(tpe.prod_estimada, 3) as produtividade_estimada
				
				       ,case when pg.id_tipo_produto = '3' then
				           'Multirrisco'
				       else
				           'Risco Nomeado'
				       end as ds_caracterizacao_cobertura			
				
				       ,case when pg.id_tipo_produto = '3' then
				           pco.vl_franquia||'%'
				       else
				           '-'
				       end as vl_nivel_cobertura	
				
					   ,round((pat.valor_subvencao_federal/pat.valor_total) * 100 ,2)||'%' as vl_percentual_subvencao
				from
				    seguro.propostas_endosso pe
				    ,tmp_propostas pr
				    left join (select case when ds_resposta='1' then 'Sim' else 'Não' end as quest_pronamp, id_proposta from seguro.propostas_questionario where id_atributo_rn=145) as q_pronamp on q_pronamp.id_proposta = pr.id
				    left join (select case when ds_resposta='1' then 'Sim' else 'Não' end as quest_organico, id_proposta from seguro.propostas_questionario where id_atributo_rn=146) as q_organico on q_organico.id_proposta = pr.id
					left join seguro.propostas_consulta_cadin pca on pca.fl_ativo=true and pca.id_proposta = pr.id_proposta_mae
					left join seguro.proposta_boletos pb on pb.id_proposta = pr.id and pb.fl_ativo=true and pb.id_versao = pr.id_versao and pb.nr_parcela = 1
					left join tmp_produtividade_garantida tpg on tpg.id_proposta = pr.id
					left join tmp_produtividade_estimada tpe on tpe.id_proposta = pr.id
					inner join seguro.propostas_coberturas pco on pco.id_proposta = pr.id and pco.fl_principal = true
					left join (
						select id_proposta, ds_resposta
						from seguro.propostas_questionario
						where id_atributo_rn = 177 --verificar em produção se esse será o código do novo atributo
					) as pq_cadpro ON pq_cadpro.id_proposta = pr.id
					,seguro.propostas_propriedades pp
					,seguro.propostas_proponentes po
					,seguro.propostas_corretores pc
					,sistema.municipios m
					,sistema.estados e
					,sistema.municipios m2
					,sistema.estados e2
					,produto.produtos pd
					inner join (
						select 
						   pa.ds_valor, pga.id_produto
						from 
						    produto.produtos_grupos_atributos_rn pga
						    inner join produto.produtos_atributos_rn pa on pa.id_grupo_atributo_rn = pga.id
						where
						    pga.fl_grupo_padrao = true and
						    pga.ds_tipo = 'p' and
						    pa.id_atributo_rn = 8
			        ) as pdatributo ON pdatributo.id_produto = pd.id					
					,sistema.empresas emp
					,produto.produtos_geral pg
					,produto.culturas c
					,sumario_parcelas pat
					,seguro.propostas_questionario pq
				    ,sistema.status st
				    ,seguro.propostas_status ps
				    ,sistema.usuarios u
					,sumario.itens_segurados ist
				where
						".$filtro."
					    st.ds_chave            in ('APOLICE_EMITIDA', 'ENVIADA_AGUARDANDO_CONF', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO', 'AGUARDANDO_ENVIO_SEG', 'AGUARDANDO_VISTORIA_PREVIA', 'CONF_PENDENCIAS')
				    and pe.id_proposta         = pr.id
					and pe.fl_proposta_vigente = true
					and pp.id_proposta         = pr.id
					and po.id_proposta         = pr.id
					and pc.id_proposta         = pr.id
					and m.id                   = pp.id_municipio
					and e.id                   = m.id_estado
					and m2.id                  = po.id_municipio
					and e2.id                  = m2.id_estado
					and pd.id                  = pr.id_produto
					and emp.id                 = pd.id_seguradora
					and pg.id                  = pd.id_produto_geral
					and c.id                   = pg.id_cultura
					and pat.id_endosso         = pr.id_endosso
					and pq.id_proposta         = pr.id
				    and st.id                  = pr.id_status
					and ps.id_proposta         = pr.id
					and ps.id_status           = st.id
				    and ps.fl_ativo            = true
				    and pr.id_usuario_criacao  = u.id
				    and ist.id_proposta        = pr.id
								
					--and pat.valor_subvencao_estadual > 0 solicitacao 3895
					and pq.id_atributo_rn = 153
				    and pc.id_usuario <> 487 --(corretor teste)		
					and e.id = 16
				order by
					pr.id
				";

		return $this->fetchAll($sql);
	}

	public function relatorioSubvencaoEstadualSP($id_safra="",$arProduto=""){
	
		if (strtolower($id_safra) == 'todas') {
      $filtro = "pd.id_safra >= 16 and ";
    } else if (strtolower($id_safra) == 'tres_ultimas') {
      $modelSafra = new Produto_Model_Safras();
      $safraAtual = $modelSafra->getSafraAtual();
      $safraAtual = $safraAtual['id'];

      $filtro = "pd.id_safra IN (".$safraAtual.", ".($safraAtual-1).", ".($safraAtual-2).") and ";
    } else if ($id_safra) {
      $filtro = "pd.id_safra=".$id_safra." and ";
    } else {
      $filtro = "";
    }
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}
	
		$this->_db->query("
				CREATE temp TABLE tmp_endossos AS (
					SELECT
					    pr.id,
					    pr.id_endosso,
					    seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
					    te.ds_tipo,
					    st.ds_chave,
					    ps_endosso.dt_criacao as dt_transmissao
					FROM
					    seguro.propostas pr
					    left join seguro.propostas_status ps_endosso on ps_endosso.id_proposta = pr.id and ps_endosso.id_status=8,
					    seguro.propostas_endosso_opcoes peo,
					    seguro.tipo_endosso te,
					    sistema.status st
					WHERE
					   pr.id = peo.id_proposta and
					   te.id = peo.id_endosso_opcao and
					   st.id = pr.id_status and
					   st.ds_chave in ('ENVIADA_AGUARDANDO_CONF','CONF_PENDENCIAS','AGUARDANDO_ENVIO_SEG','PROPOSTA_CANCELADA','APOLICE_CANCELADA','APOLICE_EMITIDA') and
					   te.ds_tipo != 'SEM_MOVIMENTO'
					)
				");

		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
				            pr.dt_transmissao,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							seguro.id_proposta_mae(pr.id) as id_proposta_mae,
							seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");

		$this->_db->query("SELECT seguro.sumario_parcelas_geral(0);");
	
		$sql = "SELECT pr.id AS id_proposta
					 , pr.id_proposta_mae
					 , c.ds_nome_cultura
					 , LPAD(REPLACE(REPLACE(seguro.id_proposta_mae_completo(pr.id),'.',''),'-',''),30,'0') AS id_proposta_composto
					 , pr.nr_apolice
					 , pr.dt_vigencia_fim
					 , seguro.dt_vigencia_inicio_original(pr.id) AS dt_inicio_vigencia_original
					 , TO_CHAR(apolice.dt_criacao_max, 'DD/MM/YYYY') AS dt_apolice
					 , po.cpf_cnpj AS cpf_cnpj
					 , po.ds_nome_proponente
					 , pat.valor_subvencao_estadual
					 , CASE WHEN st.cd_status >=3 AND st.cd_status <= 6 
					        THEN 'Proposta Transmitida'
					        ELSE st.ds_status
					   END AS ds_chave
				     , COALESCE(TO_CHAR(ultimo_endosso.dt_transmissao,'DD/MM/YYYY'), TO_CHAR(pr.dt_transmissao,'DD/MM/YYYY')) AS dt_emissao_endosso
					 , CASE WHEN tmp_est.ds_resposta = '1'
                            THEN 'Sim'
                            ELSE 'Não'
                       END AS quest_sub_estadual,
					   po.ds_tel_residencia,
					   po.ds_email_proponente
				  FROM seguro.propostas_endosso pe
			INNER JOIN tmp_propostas pr ON pe.id_proposta = pr.id AND pe.fl_proposta_vigente = true
			INNER JOIN seguro.propostas p_mae ON p_mae.id = pr.id_proposta_mae
			INNER JOIN seguro.propostas_propriedades pp ON pp.id_proposta = pr.id
			INNER JOIN seguro.propostas_proponentes po ON po.id_proposta = pr.id
			INNER JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
			INNER JOIN sistema.municipios m ON m.id = pp.id_municipio
			INNER JOIN sistema.estados e ON e.id = m.id_estado
			INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
			INNER JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
			INNER JOIN produto.culturas c ON c.id = pg.id_cultura
			INNER JOIN sumario_parcelas pat ON pat.id_endosso = pr.id_endosso
			INNER JOIN sistema.status st ON st.id = pr.id_status
		    LEFT JOIN (
						SELECT MAX(ps.dt_criacao) AS dt_criacao_max
							 , pr.id AS id_proposta
						  FROM seguro.propostas pr
					INNER JOIN seguro.propostas_status ps ON ps.id_proposta = pr.id
					INNER JOIN sistema.status st ON st.id = ps.id_status
						 WHERE st.ds_chave = 'APOLICE_EMITIDA'
					  GROUP BY pr.id
			) apolice ON apolice.id_proposta = pr.id_proposta_mae
            LEFT JOIN (
				 		SELECT MAX(dt_transmissao) AS dt_transmissao,id_endosso
						  FROM tmp_endossos
					  GROUP BY id_endosso
			) AS ultimo_endosso ON ultimo_endosso.id_endosso = pr.id_endosso
			LEFT JOIN (
				 		SELECT ds_resposta
						     , id_proposta
						  FROM seguro.propostas_questionario
						 WHERE id_atributo_rn = 154
			) AS tmp_est ON tmp_est.id_proposta = pr.id_proposta_mae
				WHERE
						".$filtro."
					    st.ds_chave            in ('ENVIADA_AGUARDANDO_CONF','CONF_PENDENCIAS','AGUARDANDO_ENVIO_SEG','PROPOSTA_CANCELADA','APOLICE_CANCELADA','APOLICE_EMITIDA')
					AND pc.id_usuario          <> 487 --(corretor teste)
					AND e.id                   = 25
					AND CASE WHEN tmp_est.ds_resposta = '0' OR tmp_est.ds_resposta IS NULL THEN 
						    pat.valor_subvencao_estadual > 0
                        ELSE 
						    tmp_est.ds_resposta = '1'
                        END
			  ORDER BY p_mae.dt_transmissao
					 , ultimo_endosso.dt_transmissao
				";
		return $this->fetchAll($sql);
	}
	
	public function relatorioSubvencaoApoliceCadin($id_safra="",$arProduto=""){
		
		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}
		
		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							seguro.id_proposta_mae(pr.id) as id_proposta_mae,
							seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");
		
		$this->_db->query("CREATE temp TABLE tmp_produtividade_estimada AS (select AVG(vl_rendimento_tonelada) as prod_estimada,it.id_proposta from seguro.itens_segurados it where it.vl_rendimento_tonelada > 0 group by it.id_proposta)");
		$this->_db->query("CREATE temp TABLE tmp_produtividade_garantida AS (select AVG(vl_producao_garantida) as prod_garantida,it.id_proposta from seguro.itens_segurados_complemento  isc, seguro.itens_segurados it where it.id = isc.id_item_segurado and isc.vl_producao_garantida > 0 group by it.id_proposta)");
		
		//$this->_db->query("CREATE temp TABLE parcelas_temp AS (SELECT id_proposta,sum(vl_total) AS valor_total, sum(vl_segurado) AS valor_segurado, sum(vl_subvencao_federal) AS valor_subvencao_federal, sum(vl_subvencao_estadual) AS valor_subvencao_estadual FROM seguro.propostas_parcelas GROUP BY id_proposta)");
		$this->_db->query("SELECT seguro.sumario_parcelas_consulta_cadin(0);");
		
		$sql = "select
						pr.id,
						lpad(replace(replace(seguro.id_proposta_mae_completo(pr.id),'.',''),'-',''),30,'0') as id_proposta_composto,
					    pr.id_proposta_mae,
					    pr.nr_endosso,
						seguro.dt_vigencia_inicio_original(pr.id) as dt_vigencia_inicio,
				        to_char(seguro.dt_emissao_apolice(pr.id_proposta_mae), 'DD/MM/YYYY') as dt_apolice,
						po.cpf_cnpj as cpf_cnpj,
						po.ds_nome_proponente,
						pat.valor_total,
						pat.valor_subvencao_federal,
						pr.vl_custo_apolice,
						c.cd_bacen,
					    m.cd_bacen as cd_bacen_municipio,
					    CASE
					        WHEN pq.ds_resposta = '1' THEN 'Sim'
					    ELSE 'Não'
					    END as zoneamento_mapa
				       ,'12' as codigo_seguradora
				       ,case when q_pronamp.quest_pronamp is null then 'Não' else q_pronamp.quest_pronamp end as quest_pronamp
				       ,case when q_organico.quest_organico is null then 'Não' else q_organico.quest_organico end as quest_organico
				       ,case when pat.valor_subvencao_federal > 0 then
				       case when pca.fl_sucesso = true then 'Sim' else 'Não' end
				       else
				       ''
				       end as subvencao_concedida
				       ,case when pb.fl_pago = true then 'Pago' else 'Pendente' end as fl_boleto_pago
				
				       ,st.ds_status
				       ,pr.nr_apolice
				
				       ,emp.ds_razao_social as ds_razao_social_seguradora
				       ,replace(replace(replace(emp.cpf_cnpj, '-',''),'.',''),'/','') as cpf_cnpj_seguradora
				
				       ,pp.ds_nome_propriedade
				       ,pp.ds_endereco as ds_endereco_propriedade
				       ,pp.ds_endereco_nro as ds_endereco_nro_propriedade
				       ,case when pp.ds_endereco_complemento is null or pp.ds_endereco_complemento = '' then pp.ds_endereco_bairro
				        else pp.ds_endereco_complemento
				        end as ds_endereco_complemento_propriedade
				       ,m.ds_nome_municipio as ds_nome_municipio_propriedade
				       ,e.ds_sigla as ds_sigla_propriedade
				       ,pp.ds_endereco_cep as ds_endereco_cep_propriedade
				
				       ,substring(pp.ds_coordenadas from 2 for 2) as coord1
				       ,substring(pp.ds_coordenadas from 5 for 2) as coord2
				       ,substring(pp.ds_coordenadas from 8 for 2) as coord3
				       ,'S' as coord4
				       ,substring(pp.ds_coordenadas from 14 for 2) as coord5
				       ,substring(pp.ds_coordenadas from 17 for 2) as coord6
				       ,substring(pp.ds_coordenadas from 20 for 2)  as coord7
				       ,'W' as coord8
				
				       ,po.ds_endereco_rua as ds_endereco_segurado
				       ,po.ds_endereco_nro as ds_endereco_nro_segurado
				       ,case when po.ds_endereco_complem is null or po.ds_endereco_complem = '' then po.ds_endereco_bairro
				        else po.ds_endereco_complem
				        end as ds_endereco_complemento_segurado
				       ,m2.ds_nome_municipio as ds_nome_municipio_segurado
				       ,e2.ds_sigla as ds_sigla_segurado
				       ,po.ds_endereco_cep as ds_endereco_cep_segurado
				
				       ,' '||pr.nr_endosso
				
				       ,ist.vl_area
				       ,ist.vl_lmga
				
				       ,pd.nr_susep
				
				       ,case when pg.id_tipo_produto = '3' then
				           round(tpg.prod_garantida, 3)
				       else
				           round(tpe.prod_estimada, 3)
				       end as produtividade_garantida
				       ,round(tpe.prod_estimada, 3) as produtividade_estimada
				from
				    seguro.propostas_endosso pe
				    ,tmp_propostas pr
				    left join (select case when ds_resposta='1' then 'Sim' else 'Não' end as quest_pronamp, id_proposta from seguro.propostas_questionario where id_atributo_rn=145) as q_pronamp on q_pronamp.id_proposta = pr.id
				    left join (select case when ds_resposta='1' then 'Sim' else 'Não' end as quest_organico, id_proposta from seguro.propostas_questionario where id_atributo_rn=146) as q_organico on q_organico.id_proposta = pr.id
					left join seguro.propostas_consulta_cadin pca on pca.fl_ativo=true and pca.id_proposta = pr.id_proposta_mae
					left join seguro.proposta_boletos pb on pb.id_proposta = pr.id and pb.fl_ativo=true and pb.id_versao = pr.id_versao and pb.nr_parcela = 1
					left join tmp_produtividade_garantida tpg on tpg.id_proposta = pr.id
					left join tmp_produtividade_estimada tpe on tpe.id_proposta = pr.id
					,seguro.propostas_propriedades pp
					,seguro.propostas_proponentes po
					,seguro.propostas_corretores pc
					,sistema.municipios m
					,sistema.estados e
					,sistema.municipios m2
					,sistema.estados e2
					,produto.produtos pd
					,sistema.empresas emp
					,produto.produtos_geral pg
					,produto.culturas c
					,sumario_parcelas pat
					,seguro.propostas_questionario pq
				    ,sistema.status st
				    ,seguro.propostas_status ps
				    ,sistema.usuarios u
				    ,sumario.itens_segurados ist
				where
						".$filtro."
					    st.ds_chave            in ('APOLICE_EMITIDA', 'ENVIADA_AGUARDANDO_CONF', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO', 'AGUARDANDO_ENVIO_SEG', 'AGUARDANDO_VISTORIA_PREVIA', 'CONF_PENDENCIAS')
				    and pe.id_proposta         = pr.id
					and pe.fl_proposta_vigente = true
				    and pc.id_usuario          <> 487 --(corretor teste)
					and pp.id_proposta         = pr.id
					and po.id_proposta         = pr.id
					and pc.id_proposta         = pr.id
					and m.id                   = pp.id_municipio
					and e.id                   = m.id_estado
					and m2.id                  = po.id_municipio
					and e2.id                  = m2.id_estado
					and pd.id                  = pr.id_produto
					and emp.id                 = pd.id_seguradora
					and pg.id                  = pd.id_produto_geral
					and c.id                   = pg.id_cultura
					and pat.id_endosso         = pr.id_endosso
					and pq.id_proposta         = pr.id
					and pq.id_atributo_rn      = 153
				    and st.id                  = pr.id_status
					and ps.id_proposta         = pr.id
					and ps.id_status           = st.id
				    and ps.fl_ativo            = true
				    and pr.id_usuario_criacao  = u.id
				    and ist.id_proposta        = pr.id
				order by
					pr.id
				";
		
		return $this->fetchAll($sql);
	}
	
	
	public function relatorioConsultaSubvencaoMapa($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$this->_db->query("CREATE temp TABLE propostas_retorno_mapa AS (select ds_retorno
				            , pcc1.id_proposta
				            , case when fl_solicitacao_pendente = true then 'Sim' else 'Não' end as fl_solicitacao_pendente
				            , case when fl_retorno_pendente = true then 'Sim' else 'Não' end as fl_retorno_pendente
				            , case when fl_sucesso = true then 'Sim' else 'Não' end as fl_sucesso
				            , pcc1.dt_criacao
				       from seguro.propostas_consulta_cadin pcc1
				       join (select id_proposta, max(dt_criacao) as dt_criacao from seguro.propostas_consulta_cadin group by id_proposta ) as pcc2
				       on pcc1.dt_criacao = pcc2.dt_criacao and pcc1.id_proposta = pcc2.id_proposta)");

		$sql = "select
				     seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso
				    ,seguro.id_proposta_mae(pr.id) as id_proposta_mae
				    ,pr.id as id_proposta
				    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
				    ,to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original
				    ,pp.ds_nome_proponente
				    ,co.ds_nome_fantasia
				    ,pd.ds_nome_produto
				    ,st.ds_status
				    ,fl_solicitacao_pendente
				    ,fl_retorno_pendente
				    ,fl_sucesso
				    ,replace(pcc.ds_retorno, '||', ' ; ') as ds_retorno
				    ,pcc.dt_criacao
				    ,qmapa.quest_zoneamento_mapa
				from
				     seguro.propostas_endosso pe
				    ,seguro.propostas pr
                    left join ( select case when ds_resposta='1' then 'Sim' else 'Não' end as quest_zoneamento_mapa,
                       id_proposta from seguro.propostas_questionario where id_atributo_rn  = 153
                    ) as qmapa on qmapa.id_proposta = pr.id
				    ,seguro.propostas_proponentes pp
				    ,seguro.propostas_corretores pc
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.safras sf
				    ,sistema.status st
				    ,propostas_retorno_mapa as pcc
				where
					".$filtro."
					st.ds_chave in ('ENVIADA_AGUARDANDO_CONF', 'AGUARDANDO_VISTORIA_PREVIA', 'AGUARDANDO_ENVIO_SEG', 'TRANSMITIDA_SEGURADORA', 'APOLICE_EMITIDA', 'CONF_PENDENCIAS')
				    and pc.id_usuario  <> 487 --(corretor teste)
				    and pe.id_proposta = pr.id
				    and pp.id_proposta = pr.id
				    and pc.id_proposta = pr.id
				    and co.id_usuario  = pc.id_usuario
				    and pd.id          = pr.id_produto
				    and sf.id          = pd.id_safra
				    and st.id          = pr.id_status
				    and pcc.id_proposta = pr.id
				order by
				    seguro.id_proposta_mae(pr.id), pr.id, pcc.dt_criacao desc
				";

		return $this->fetchAll($sql);
	}

	public function relatorioPPE($id_safra="",$arProduto=""){
	
		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}
	
		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
							to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
				            pr.dt_transmissao,
							vl_custo_apolice,
							id_status,
							pr.id_usuario_criacao,
							nr_digito_verificador,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							seguro.id_proposta_mae(pr.id) as id_proposta_mae,
							seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							)
				");
	
		$sql = "SELECT
					pr.id as id_proposta,
				    pr.id_proposta_mae,
                    pr.nr_endosso,
					lpad(replace(replace(seguro.id_proposta_mae_completo(pr.id),'.',''),'-',''),30,'0') as id_proposta_composto,
					pr.nr_apolice,
					seguro.dt_vigencia_inicio_original(pr.id) as dt_inicio_vigencia_original,
					po.cpf_cnpj as cpf_cnpj,
					po.ds_nome_proponente,
				    po.tp_pessoa,
				    po.ds_profissao,
				    fr.ds_faixa_remuneracao,
				    fre.ds_faixa_receita as ds_receita_operacional,
				    fre2.ds_faixa_receita as ds_patrimonio_liquido,
				    CASE WHEN po.tp_pessoa = 'J' THEN ae.ds_nome_atividade_economica ELSE '' END as ds_nome_atividade_economica,
				    CASE WHEN fl_politicamente_exposto = '2' THEN 'Sim' else 'Não' END as fl_politicamente_exposto,
					CASE WHEN st.cd_status >=3 AND st.cd_status <= 6 THEN 'Proposta Transmitida' ELSE st.ds_status END as ds_chave
				FROM
					 seguro.propostas_endosso pe
					,tmp_propostas pr
					,seguro.propostas_propriedades pp
					,seguro.propostas_proponentes po
				    left join sistema.faixa_remuneracao fr on fr.id = po.id_renda
				    left join sistema.faixa_receita fre on fre.id = po.id_renda_bruta
				    left join sistema.faixa_receita fre2 on fre2.id = po.id_patrimonio
				    left join sistema.atividades_economicas ae on ae.id = po.id_atividade_economica
					,seguro.propostas_corretores pc
					,produto.produtos pd
					,produto.produtos_geral pg
					,produto.culturas c
					,sistema.status st
				WHERE
						".$filtro."
					    st.ds_chave            in ('ENVIADA_AGUARDANDO_CONF','CONF_PENDENCIAS','AGUARDANDO_ENVIO_SEG','PROPOSTA_CANCELADA','APOLICE_CANCELADA','APOLICE_EMITIDA')
					and pe.id_proposta         = pr.id
					and pe.fl_proposta_vigente = true
					and pp.id_proposta         = pr.id
					and po.id_proposta         = pr.id
					and pc.id_proposta         = pr.id
					and pd.id                  = pr.id_produto
					and pg.id                  = pd.id_produto_geral
					and c.id                   = pg.id_cultura
					and st.id                  = pr.id_status
				order by
					pr.id
				";
	
		return $this->fetchAll($sql);
	}
	
    public function relatorioEmissao($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		//$this->_db->query("CREATE temp TABLE itens_segurados_temp AS (SELECT id_proposta,sum(vl_lmga) AS soma_lmga FROM seguro.itens_segurados GROUP BY id_proposta)");
		$this->_db->query("SELECT seguro.sumario_parcelas(0);");

		$sql = "select
				     pr.id as id_proposta
				    ,pr.id_proposta_renovada
				    ,pr.nr_apolice
				    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
				    ,to_char(pr.dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim
				    ,pr.id_status
				    ,pr.vl_custo_apolice
				    ,pr.id_usuario_criacao
				    ,pr.id_produto
				    ,po.ds_coordenadas

				    ,pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr.id||'-'||pr.nr_digito_verificador as id_proposta_composto

				    ,pp.cpf_cnpj
				    ,pp.ds_nome_proponente

				    ,co.ds_nome_fantasia
				    ,pc.vl_comissao
				    ,pd.ds_nome_produto
				    ,sf.ds_nome_safra
				    ,c.ds_nome_cultura
				    ,st.ds_status
				    ,st.cd_status
				    ,pb.nu_boleto
				    ,pb.fl_pago
				    ,u.tp_usuario

				    ,m1.ds_nome_municipio as municipio_propriedade
				    ,e1.ds_sigla as estado_propriedade

				    ,ist.vl_lmga as total_lmga

				    ,CASE
  					     WHEN pb.fl_pago = true THEN 'S'
 					     ELSE 'N'
				     END as fl_pago
					 ,pb.nu_boleto

					,pat.valor_total
				    ,pat.valor_segurado
				    ,pat.valor_subvencao_federal
				    ,pat.valor_subvencao_estadual

					,(select to_char(dt_vencimento, 'DD/MM/YYYY') from seguro.propostas_parcelas where id_proposta = pr.id and nr_parcela = 1) as vencto_primeira_parcela
				from
					 seguro.propostas_endosso pe
				    ,seguro.propostas pr
				         left join seguro.proposta_boletos pb on pb.id_proposta = pr.id and pb.fl_ativo = true and pb.id_versao = pr.id_versao and pb.nr_parcela = 1
				    ,seguro.propostas_propriedades po
				    ,sumario.itens_segurados ist
				    ,seguro.propostas_proponentes pp
				    ,seguro.propostas_corretores pc
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.produtos_geral pg
				    ,produto.culturas c
				    ,produto.safras sf
				    ,sistema.municipios m1
				    ,sistema.estados e1
				    ,sistema.status st
				    ,sistema.usuarios u
				    ,sumario_parcelas pat
				where
				    ".$filtro."
				        st.ds_chave    not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pc.id_usuario  <> 487 --(corretor teste)
                    and pe.fl_proposta_vigente = true
				    and pe.id_proposta = pr.id
				    and po.id_proposta = pr.id
				    and ist.id_proposta = pr.id
				    and pp.id_proposta = pr.id
				    and pc.id_proposta = pr.id
				    and co.id_usuario  = pc.id_usuario
				    and pd.id          = pr.id_produto
				    and pg.id          = pd.id_produto_geral
				    and c.id           = pg.id_cultura
				    and sf.id          = pd.id_safra
				    and m1.id          = po.id_municipio
				    and e1.id          = m1.id_estado
				    and st.id          = pr.id_status
				    and pr.id_usuario_criacao = u.id
				    and pat.id_endosso = pr.id_endosso
				order by
				    pr.id
				";
		return $this->fetchAll($sql);
	}

    public function relatorioAnaliseSubscricao($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$this->_db->query("CREATE temp TABLE itens_segurados_temp AS (SELECT id_proposta, count(*) as count_is, sum(vl_idade) AS soma_idade FROM seguro.itens_segurados GROUP BY id_proposta)");

		$sql = "select
				     pr.id as id_proposta
				    ,pr.id_proposta_renovada
				    ,pr.vl_custo_apolice
				    ,pr.id_usuario_criacao

				    ,co.ds_nome_fantasia
				    ,pc.vl_comissao
				    ,pd.ds_nome_produto
				    ,sf.ds_nome_safra
				    ,st.cd_status
				    ,u.tp_usuario

				    ,ist.soma_idade as total_idade
				    ,ist.count_is as nro_itens_segurados

				from
				     seguro.propostas pr
				    ,itens_segurados_temp ist
				    ,seguro.propostas_corretores pc
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.safras sf
				    ,sistema.status st
				    ,sistema.usuarios u
				where
				    ".$filtro."
				        st.ds_chave    not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pc.id_usuario  <> 487
				    and ist.id_proposta = pr.id
				    and pc.id_proposta = pr.id
				    and co.id_usuario  = pc.id_usuario
				    and pd.id          = pr.id_produto
				    and sf.id          = pd.id_safra
				    and st.id          = pr.id_status
				    and pr.id_usuario_criacao = u.id
				order by
				    pr.id
				";

		return $this->fetchAll($sql);
	}

    public function relatorioParcelas($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "select
				     pr.id as id_proposta
		            ,pr.nr_apolice
				    ,pr.id_versao
				    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
				    ,pr.id_status
				    ,c.ds_nome_cultura
				    ,st.ds_status
				    ,(select pq.ds_resposta from seguro.propostas_questionario pq, produto.atributos_rn ar where pq.id_atributo_rn = ar.id and ar.ds_chave_rn='QUEST_SUBVENCAO_ESTADUAL' and pq.id_proposta=pr.id) as quest_sub_estadual
				    ,(select pq.ds_resposta from seguro.propostas_questionario pq, produto.atributos_rn ar where pq.id_atributo_rn = ar.id and ar.ds_chave_rn='QUEST_SUBVENCAO_FEDERAL' and pq.id_proposta=pr.id) as quest_sub_federal
				from
				     seguro.propostas pr
				    ,seguro.propostas_corretores pc
				    ,produto.produtos pd
				    ,produto.produtos_geral pg
				    ,produto.culturas c
				    ,sistema.status st
				    ,sistema.usuarios u
				where
				    ".$filtro."
				        st.ds_chave    not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pc.id_usuario  <> 487 --(corretor teste)
				    and pd.id          = pr.id_produto
                    and pc.id_proposta = pr.id
				    and pg.id          = pd.id_produto_geral
				    and c.id           = pg.id_cultura
				    and st.id          = pr.id_status
				    and pr.id_usuario_criacao = u.id
				order by
				    pr.id
				";
		return $this->fetchAll($sql);
	}

	public function relatorioParcelasLinhas($id_safra="",$arProduto="",$canceladas=""){
		$filtro  = ($id_safra)   ? "pd.id_safra IN(".implode(',',$id_safra).") and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		if ($canceladas == false) {
			$this->_db->query("SELECT seguro.sumario_parcelas(0);");
		} else {
			$this->_db->query("SELECT seguro.sumario_parcelas_geral(0);");
		}

		$this->_db->query("
					CREATE temp TABLE tmp_propostas AS (
						SELECT
							pr.id,
							ps.ds_nome_safra,
							pr.id as id_proposta,
							pr.id_endosso,
							id_proposta_renovada,
							id_versao,
							pr.ds_identificador_seguradora,
							seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
							nr_apolice,
							pr.id_status,
				            pr.id_usuario_criacao,
							id_produto,
							to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
							seguro.id_proposta_mae(pr.id) as id_proposta_mae
						FROM
							seguro.propostas pr
							inner join produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
							inner join produto.safras ps ON pd.id_safra = ps.id
							)
				");

		$sql = "select
				     pr.id as id_proposta
                    ,pr.id_versao
		            ,pr.nr_endosso
					,pr.ds_nome_safra
		            ,pr.id_proposta_mae
		            ,pr.nr_apolice
				    ,pr.ds_identificador_seguradora
				    ,pr.dt_vigencia_inicio_original as dt_vigencia_inicio
				    ,pr.id_status
				    ,c.ds_nome_cultura
				    ,st.ds_status
				    ,co.ds_nome_abreviado as ds_nome_fantasia
				    ,u.tp_usuario
				    ,u.ds_nome_usuario
					,tblvencimento.nr_parcela
					,tblvencimento.vl_total
					,tblvencimento.vl_segurado
					,tblvencimento.vl_subvencao_federal
					,tblvencimento.vl_subvencao_estadual
					,tblvencimento.fl_pago
				    ,pb.nu_boleto
					,pc.vl_comissao
					,tblvencimento.dt_vencimento
					,CASE
                       WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                         THEN '-'
                         ELSE ss_subvencao_federal.ds_status
                     END AS subvencao_federal_concedida
					,CASE
                       WHEN ss_subvencao_estadual.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                         THEN '-'
                         ELSE ss_subvencao_estadual.ds_status
                      END AS subvencao_estadual_concedida
				from
					 seguro.propostas_endosso pe
					,tmp_propostas pr
				    left join seguro.propostas_parcelas as tblvencimento on tblvencimento.id_proposta = pr.id_proposta
					left join seguro.proposta_boletos pb on pb.id_proposta  = pr.id and pb.id_versao = pr.id_versao and tblvencimento.nr_parcela = pb.nr_parcela
					left join seguro.propostas_consulta_cadin pca on pca.fl_ativo=true and pca.id_proposta = pr.id_proposta_mae
					INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
                    INNER JOIN sistema.status ss_subvencao_estadual ON ss_subvencao_estadual.id = sps.id_status_subvencao_estadual
                    INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
					,sumario_parcelas pat
					,seguro.propostas_corretores pc
					,produto.produtos pd
					,produto.produtos_geral pg
					,produto.culturas c
					,sistema.status st
					,sistema.usuarios u
					,sistema.corretores co
				where
				        ".$filtro."
				        st.ds_chave     not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
				    and pe.id_proposta  = pr.id
				    and pc.id_usuario   <> 487 --(corretor teste)
				    and pd.id           = pr.id_produto
                    and pc.id_proposta  = pr.id
				    and pg.id           = pd.id_produto_geral
				    and c.id            = pg.id_cultura
				    and st.id           = pr.id_status
				    and pr.id_usuario_criacao = u.id
				    and co.id_usuario   = pc.id_usuario
				    and pat.id_endosso  = pr.id_endosso
				    and tblvencimento.vl_total > 0
				order by
				    pr.id asc, tblvencimento.nr_parcela asc
				";
		return $this->fetchAll($sql);
	}

    public function relatorioPremioLiquido($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "select
				     pr.id as id_proposta
				    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
				    ,pr.id_status
				    ,pr.vl_custo_apolice

				    ,pg.id_ramo||'.'||pd.id_seguradora||'.'||pr.id_produto||'.'||pr.id||'-'||pr.nr_digito_verificador as id_proposta_composto

				    ,pp.cpf_cnpj
				    ,pp.ds_nome_proponente

				    ,co.ds_nome_fantasia
				    ,pd.ds_nome_produto
				    ,c.ds_nome_cultura
				    ,st.ds_status

				    ,m1.ds_nome_municipio as municipio_propriedade
				    ,e1.ds_sigla as estado_propriedade

					,CASE
				         WHEN pr.id_proposta_renovada > 0 THEN 'Sim'
				         ELSE 'Não'
				     END as fl_renovacao

				    ,(select sum(vl_area) from seguro.itens_segurados where id_proposta = pr.id) as total_area
				    ,(select sum(vl_lmga) from seguro.itens_segurados where id_proposta = pr.id) as total_lmga
				    ,(select sum(vl_total) - pr.vl_custo_apolice from seguro.propostas_parcelas where id_proposta = pr.id) as valor_premio_liquido
					,(select sum(vl_subvencao_federal) from seguro.propostas_parcelas where id_proposta = pr.id) as valor_subvencao_federal

				from
				     seguro.propostas pr
				    ,seguro.propostas_propriedades po
				    ,seguro.propostas_proponentes pp
				    ,seguro.propostas_corretores pc
				    ,sistema.corretores co
				    ,produto.produtos pd
				    ,produto.produtos_geral pg
				    ,produto.culturas c
				    ,produto.safras sf
				    ,sistema.municipios m1
				    ,sistema.estados e1
				    ,sistema.status st
				    ,sistema.usuarios u
				where
						".$filtro."
				        st.ds_chave    not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pc.id_usuario  <> 487 --(corretor teste)
				    and po.id_proposta = pr.id
				    and pp.id_proposta = pr.id
				    and pc.id_proposta = pr.id
				    and co.id_usuario  = pc.id_usuario
				    and pd.id          = pr.id_produto
				    and pg.id          = pd.id_produto_geral
				    and c.id           = pg.id_cultura
				    and sf.id          = pd.id_safra
				    and m1.id          = po.id_municipio
				    and e1.id          = m1.id_estado
				    and st.id          = pr.id_status
				    and pr.id_usuario_criacao = u.id
				order by
				    pr.id
				";
		return $this->fetchAll($sql);
	}

    public function relatorioBoletos($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "select
				     pr.id as id_proposta
				    ,pd.ds_nome_produto
				    ,pb.nu_boleto
				    ,pb.nr_parcela
				    ,pb.ds_identificador
				    ,'<a target=_blank href=http://www.nobre.com.br/Recurso/Relatorio/frmBoletoPA.aspx?Identificador='||pb.ds_identificador||'>'||pb.nu_boleto as url
				    ,CASE
					 WHEN pb.fl_pago = true THEN 'S'
					 ELSE 'N'
				     END as fl_pago
				    ,CASE
					 WHEN pb.fl_ativo = true THEN 'S'
					 ELSE 'N'
				     END as fl_ativo
				    ,st.ds_chave
				from
				     seguro.propostas pr
					 left join seguro.proposta_boletos pb on pb.id_proposta = pr.id
				    ,seguro.propostas_corretores pc
				    ,produto.produtos pd
				    ,sistema.status st
				where
						".$filtro."
						st.ds_chave    not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA')
				    and pc.id_usuario  <> 487 --(corretor teste)
				    and pc.id_proposta = pr.id
				    and pd.id          = pr.id_produto
					and st.id          = pr.id_status
				order by
				    pr.id, fl_ativo, pb.nr_parcela
				";
		return $this->fetchAll($sql);
	}

    public function relatorioCoordenadas($idSafra = "", $idsProdutos = "")
    {
		$filtros = [];

		if ($idSafra) {
			$filtros[] = "pd.id_safra = {$idSafra}";
		}

		if(is_array($idsProdutos)){
			$idsProdutos = implode(", " , $idsProdutos);
			$filtros[] = "pd.id in ({$idsProdutos})";
		}

        $statusNotIn = [
            "'" . Seguro_Model_Propostas::DS_CHAVE_APOLICE_CANCELADA . "'",
            "'" . Seguro_Model_Propostas::DS_CHAVE_DEVOLVIDA . "'",
            "'" . Seguro_Model_Propostas::DS_CHAVE_ENDOSSO_INCOMPLETO . "'",
            "'" . Seguro_Model_Propostas::DS_CHAVE_NAO_ENVIADA . "'",
            "'" . Seguro_Model_Propostas::DS_CHAVE_ORCAMENTO_ENDOSSO . "'",
            "'" . Seguro_Model_Propostas::DS_CHAVE_PROPOSTA_CANCELADA . "'",
            "'" . Seguro_Model_Propostas::DS_CHAVE_PROPOSTA_INCOMPLETA . "'",
            "'" . Seguro_Model_Propostas::DS_CHAVE_SOLICITACAO_CANCELADA . "'",
        ];

		$statusNotIn = implode(", ", $statusNotIn);
		$filtros[] = "st.ds_chave NOT IN ({$statusNotIn})";
		$filtros[] = "pc.id_usuario <> 487";

		$filtro = implode(" AND ", $filtros);

        /**
         * ATENÇÃO!
         * AO REALIZAR ALTERAÇÕES NESTE SQL, VERIFICAR A NECESSIDADE DE ALTERAR TAMBÉM A VIEW MATERIALIZADA:
         * geo.v_coordenadas
         */
		$sql = "SELECT id_proposta
                     , dt_vigencia_inicio
                     , ds_nome_municipio
                     , ds_sigla
                     , nr_item_segurado
                     , ds_coordenadas_geograficas
                     , ds_coordenadas
                     , ds_chave
                     , cd_status
                     , nr_ibge
                     , btrim(coordenadas_decimais[1]) as latitude
                     , btrim(coordenadas_decimais[2]) as longitude
                  FROM (SELECT pr.id as id_proposta
                             , pr.dt_vigencia_inicio
                             , m.ds_nome_municipio
                             , e.ds_sigla
                             , it.nr_item_segurado
                             , itc.ds_coordenadas_geograficas
                             , pp.ds_coordenadas
                             , st.ds_chave
                             , st.cd_status
                             , m.nr_ibge
                             ,  string_to_array(coordenadas_dms_para_decimal(pp.ds_coordenadas), ' ') as coordenadas_decimais
                        FROM seguro.propostas pr
                                 JOIN seguro.propostas_propriedades pp ON pp.id_proposta = pr.id
                                 JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
                                 JOIN sistema.municipios m ON m.id = pp.id_municipio
                                 JOIN sistema.estados e ON e.id = m.id_estado
                                 JOIN produto.produtos pd ON pd.id = pr.id_produto
                                 JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
                                 JOIN produto.culturas c ON c.id = pg.id_cultura
                                 JOIN sistema.status st ON st.id = pr.id_status
                                 JOIN seguro.itens_segurados it ON it.id_proposta = pr.id
                                 JOIN seguro.itens_segurados_complemento itc ON itc.id_item_segurado = it.id
                                 JOIN seguro.propostas_endosso spe ON spe.id_proposta = pr.id AND spe.fl_proposta_vigente IS TRUE
                                 JOIN produto.safras ps ON ps.id = pd.id_safra
                        WHERE {$filtro}
                        ORDER BY pr.id, it.nr_item_segurado) as result
				";
		
		return $this->fetchAll($sql);
	}

    public function relatorioBeneficiarios($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$this->_db->query("
			CREATE temp TABLE tmp_transmissao_propostas_mae AS (
				SELECT
					pr.id as id_proposta_mae,
					to_char(pr.dt_transmissao, 'DD/MM/YYYY') as dt_transmissao
				FROM seguro.propostas pr
				JOIN produto.produtos pd ON ".$filtro." pd.id = pr.id_produto
				WHERE pr.id = seguro.id_proposta_mae(pr.id)
				GROUP BY pr.id, dt_transmissao
			)
		");

		$sql = "
			select
					seguro.id_proposta_mae(pr.id) as id_proposta
				,pr.nr_apolice
				,to_char(pr.dt_vigencia_inicio, 'DD/MM/YYYY') as dt_vigencia_inicio
				,to_char(pr.dt_vigencia_fim, 'DD/MM/YYYY') as dt_vigencia_fim
				,tmp_transmissao_propostas_mae.dt_transmissao as dt_transmissao
				,to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original
				,pb.id_banco
				,CASE
						WHEN pb.id_banco > 0 THEN (select ds_nome_banco from sistema.bancos where id = pb.id_banco)
						ELSE pb.ds_nome_beneficiarios
					END as ds_nome_beneficiario
				,CASE
						WHEN pb.id_banco > 0 THEN 'Sim'
						ELSE 'Não'
					END as ds_banco
				,pb.ds_qualidade_beneficiario
				,pb.vl_limite_beneficio
				,pb.ds_agencia
				,pb.nr_cpf_cnpj
				,CASE WHEN b.dt_nascimento IS NOT NULL THEN b.dt_nascimento ELSE pb.dt_nascimento END as dt_nascimento
				,st.ds_chave as cd_status
				,case when b.fl_validado = false then 'Sim' else 'Não' end as fl_validado
				,CASE WHEN sb.fl_validado = false THEN 'Sim' ELSE 'Não' END as fl_validado
			from
					seguro.propostas_endosso pe
				,seguro.propostas pr
				,seguro.propostas_corretores pc
				,produto.produtos pd
				,seguro.propostas_beneficiarios pb left join seguro.beneficiarios sb on pb.nr_cpf_cnpj = sb.cpf_cnpj
				,seguro.beneficiarios b
				,sistema.status st
				,tmp_transmissao_propostas_mae
			where
					".$filtro."
					st.ds_chave not in ('PROPOSTA_INCOMPLETA'  , 'NAO_ENVIADA',  'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				and pe.fl_proposta_vigente = true
				and pe.id_proposta = pr.id
				and pc.id_usuario  <> 487
				and pd.id          = pr.id_produto
				and pc.id_proposta = pr.id
				and pb.id_proposta = pr.id
				and b.cpf_cnpj     = pb.nr_cpf_cnpj
				and st.id          = pr.id_status
				and pb.fl_del      = false
				and tmp_transmissao_propostas_mae.id_proposta_mae = pr.id_proposta_mae
			order by
				pr.id
		";
		
		$result = $this->fetchAll($sql);
		$this->_db->query("DROP TABLE IF EXISTS tmp_transmissao_propostas_mae");
		
		return $result;
	}

    public function relatorioSubvencao($id_cultura="", $ds_ano){

		$filtro .= ($id_cultura) ? "WHERE l.id_cultura=".$id_cultura : '';

		$sql = "
			 SELECT DISTINCT
			    c.id_usuario,
			    c.id AS id_corretor,
			    c.ds_nome_abreviado,
			    l.id_cultura,
			    cu.ds_nome_cultura,
			    l.vl_limite_subvencao AS vl_liberado,
			    ( SELECT seguro.soma_parcelas(c.id_usuario, l.id_cultura, to_char(now(), '$ds_ano')) AS soma_parcelas) AS vl_usado,
			    case when l.fl_ativo = true then 'Sim' else 'Não' end as fl_ativo
   			FROM
   			    produto.validacoes_limites_subvencao l
   		        JOIN sistema.corretores c ON c.id = l.id_corretor
   		        JOIN produto.culturas cu ON cu.id = l.id_cultura
   		        ".$filtro."
  			ORDER BY
  				c.id_usuario, c.id, l.id_cultura, l.vl_limite_subvencao
				";

		return $this->fetchAll($sql);
	}

    public function relatorioSubvencaoPropostas($id_cultura="", $ds_ano){

		$filtro    = ($id_cultura) ? "l.id_cultura=".$id_cultura." and " : '';
		$dt_filtro = $ds_ano."-01-01";

		$sql = "
                select
                     pr.id,
                     pp.ds_nome_proponente,
                     pp.cpf_cnpj,
                     pr.dt_vigencia_inicio,
                     cu.ds_nome_cultura,
                     sf.ds_nome_safra,
                     (select sum(vl_subvencao_federal) from seguro.propostas_parcelas where id_proposta=pr.id) as subvencao_federal,
                     (select sum(vl_subvencao_estadual) from seguro.propostas_parcelas where id_proposta=pr.id) as subvencao_estadual
                from
                    seguro.propostas pr,
                    seguro.propostas_proponentes pp,
                    produto.produtos pd,
                    produto.produtos_geral pg,
                    produto.culturas cu,
                    produto.safras sf,
                    sistema.status st
                where
                		".$filtro."
                        pp.id_proposta = pr.id
                    and pd.id = pr.id_produto
                    and pg.id = pd.id_produto_geral
                    and cu.id = pg.id_cultura
                    and sf.id = pd.id_safra
                    and pr.dt_vigencia_inicio >= '".$dt_filtro."'
                    and st.id = pr.id_status
                    and st.ds_chave in ('APOLICE_EMITIDA', 'ENVIADA_AGUARDANDO_CONF', 'APOLICE_CANCELADA', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO', 'AGUARDANDO_ENVIO_SEG', 'AGUARDANDO_VISTORIA_PREVIA', 'CONF_PENDENCIAS')
                 order by
                    pr.dt_vigencia_inicio
				";

		return $this->fetchAll($sql);
	}

    public function relatorioSubvencaoGrupos($id_cultura="", $ds_ano){

		$filtro .= ($id_cultura) ? "l.id_cultura=".$id_cultura : '';

		$sql = "SELECT
					*
				FROM
					seguro.v_subvencao_federal_corretor_grupo
				ORDER BY
					ds_nome_validacao
				";

		return $this->fetchAll($sql);
	}

    public function relatorioStatusNobre($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
					pr.id,
					pr.ds_status_seguradora
				from
				    seguro.propostas pr,
				    produto.produtos pd
				where
					pr.ds_status_seguradora != '' and
					".$filtro."
				    pd.id = pr.id_produto
				order by
				    pr.id
				";
		return $this->fetchAll($sql);
	}

    public function relatorioPremioCobertura($id_safra="",$arProduto=""){

		//$this->_db->query("CREATE temp TABLE itens_segurados_temp AS (SELECT id_proposta, sum(vl_lmga) AS soma_lmga, sum(vl_area) AS soma_area FROM seguro.itens_segurados GROUP BY id_proposta)");

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
				    seguro.id_proposta_mae(pr.id) as id_proposta,
				    pc.vl_premio,
				    CASE
				        WHEN pc.fl_principal = true THEN ist.vl_lmga
					    WHEN c.ds_chave_cobertura = 'COB_PROTECAO_FITO' THEN ist.vl_area * 100
					    ELSE round((ist.vl_lmga * pc.vl_lmi )/100,2)
				    END as vl_lmga,
                    ist.vl_area,
				    c.ds_nome_cobertura,
				    CASE
				        WHEN (select fl_exibir_franquia from produto.produtos_coberturas where id_cobertura=c.id and id_produto=pd.id) = false THEN null
				        ELSE pc.vl_franquia
				    END as vl_franquia,
				    st.ds_chave,
				    pd.ds_nome_produto,
				    cu.ds_nome_cultura,
				    mu.nr_ibge,
				    pco.vl_comissao,
                    sf.ds_nome_safra,
                    coalesce(sum(lisc.vl_prejuizo_total),0.00) as vl_prejuizo,
                    coalesce(sum(lisc.vl_indenizacao),0.00) as vl_indenizacao,
					prc.id as id_processo
				from
				    seguro.propostas pr
				    INNER JOIN seguro.propostas_endosso AS pe ON pr.id = pe.id_proposta AND pe.fl_proposta_vigente = true,
				    produto.produtos pd,
				    produto.produtos_geral pg,
				    produto.culturas cu,
				    produto.safras sf,
				    seguro.propostas_corretores pco,
				    seguro.propostas_coberturas pc
                    LEFT JOIN sinistro.processos AS prc ON prc.id_proposta = pc.id_proposta
                    LEFT JOIN sinistro.liquidacoes AS li ON li.id_processo = prc.id
                    LEFT JOIN sinistro.liquidacoes_itens_segurados_coberturas AS lisc ON lisc.id_liquidacao = li.id and lisc.id_cobertura = pc.id_cobertura,				    produto.coberturas c,
				    sistema.status st,
				    sumario.itens_segurados ist,
				    seguro.propostas_propriedades pp,
				    sistema.municipios mu
  				where
				        ".$filtro."
				        st.ds_chave     not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
				    and pco.id_usuario  <> 487
				    and pd.id           = pr.id_produto
				    and pg.id           = pd.id_produto_geral
				    and cu.id           = pg.id_cultura
				    and sf.id           = pd.id_safra
				    and pco.id_proposta = pr.id
				    and pc.id_proposta  = pr.id
				    and c.id            = pc.id_cobertura
				    and st.id           = pr.id_status
				    and ist.id_proposta = pr.id
				    and pp.id_proposta  = pr.id
				    and mu.id           = pp.id_municipio
                group by
                	pr.id,
                	pc.vl_premio,
                	pc.fl_principal,
                	c.ds_chave_cobertura,
                	ist.vl_lmga,
                	ist.vl_area,
                	pc.vl_lmi,
                	c.ds_nome_cobertura,
                	c.id,
                	pd.id,
                	pc.vl_franquia,
                	st.ds_chave,
                	pd.ds_nome_produto,
                	cu.ds_nome_cultura,
                	mu.nr_ibge,
                	pco.vl_comissao,
                	sf.ds_nome_safra,
					prc.id
				order by
				   pr.id, pc.fl_principal desc, c.ds_nome_cobertura
				";

		return $this->fetchAll($sql);
	}

    public function relatorioCapacidade($id_safra="",$arProduto="", $idValidacao="", $idEstado=""){

		$this->_db->query("SELECT seguro.valor_retido(0)");

    	if(is_array($arProduto)){
			$filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (".implode("," , $arProduto).")) and ";
		}

		if($id_safra){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (select id from produto.produtos where id_safra=".$id_safra.")) and ";
		}

		if($idEstado){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_estados where id_estado = ".$idEstado.") and ";
		}
		
		if($idValidacao){
		    $filtro .= "vlc.id = ".$idValidacao." and ";
		    $this->_db->query("CREATE temp TABLE validacoes_limites_capacidade_tmp AS (SELECT * FROM produto.validacoes_limites_capacidade where id=".$idValidacao." )");
		} else {
		    $this->_db->query("CREATE temp TABLE validacoes_limites_capacidade_tmp AS (SELECT * FROM produto.validacoes_limites_capacidade)");
		}
	
		$sql = "select
				    vlc.id,
				    vlc.ds_nome_grupo,
				    vlc.vl_limite_capacidade,
				    (
				        SELECT
				            sum(vl_lmga_capacidade)
				        FROM
				        seguro.propostas_endosso pe
						INNER JOIN seguro.propostas AS p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
					    INNER JOIN sistema.status AS st ON p.id_status = st.id
					    INNER JOIN seguro.propostas_propriedades AS pr ON p.id = pr.id_proposta
					    INNER JOIN sistema.municipios AS m ON m.id = pr.id_municipio
					    INNER JOIN sistema.estados AS e ON e.id = m.id_estado
					    INNER JOIN sumario.itens_segurados AS pp ON p.id = pp.id_proposta
						INNER JOIN seguro.propostas_corretores spc ON spc.id_proposta = p.id
					WHERE
						spc.id_usuario not in (487, 488) AND
					    (p.id_produto in ((SELECT p.id_produto FROM produto.validacoes_limites_capacidade_produtos AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
					    (m.id_estado in ((SELECT p.id_estado FROM produto.validacoes_limites_capacidade_estados AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
					    (st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA', 'ENDOSSO_INCOMPLETO', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')) AND
						(
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 1 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 2 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id)
				)
				    ) as vl_utilizado,
				    vlc.vl_reserva_tecnica
				from
				    validacoes_limites_capacidade_tmp vlc
				where
					    ".$filtro."
				        vlc.fl_ativo = true
				    and vlc.fl_agrupar_municipios = false
				    and vlc.fl_limite_corretor = false
	    		    and vlc.id not in (SELECT id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_municipios)
				order by
				    vlc.ds_nome_grupo
				";

		return $this->fetchAll($sql);
	}

	public function relatorioCapacidadeGruposMuncipios($id_safra="",$arProduto="", $idValidacao="", $idEstado=""){

		if(is_array($arProduto)){
			$filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (".implode("," , $arProduto).")) and ";
		}

		if($id_safra){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (select id from produto.produtos where id_safra=".$id_safra.")) and ";
		}

		if($idEstado){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_estados where id_estado = ".$idEstado.") and ";
		}
		
		if($idValidacao){
		    $filtro .= "vlc.id = ".$idValidacao." and ";
		}
		
		$this->_db->query("SELECT seguro.valor_retido(0)");

		$sql = "select
				    vlc.id,
				    vlc.ds_nome_grupo,
				    vlc.vl_limite_capacidade,
				    (
				        SELECT
				            sum(vl_lmga_capacidade)
				        FROM
				        seguro.propostas_endosso pe
						INNER JOIN seguro.propostas AS p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
					    INNER JOIN sistema.status AS st ON p.id_status = st.id
					    INNER JOIN seguro.propostas_propriedades AS pr ON p.id = pr.id_proposta
					    INNER JOIN sistema.municipios AS m ON m.id = pr.id_municipio
					    INNER JOIN sistema.estados AS e ON e.id = m.id_estado
					    INNER JOIN sumario.itens_segurados AS pp ON p.id = pp.id_proposta
						INNER JOIN seguro.propostas_corretores spc ON spc.id_proposta = p.id
					WHERE
						spc.id_usuario not in (487, 488) AND
						(p.id_usuario_criacao in ((SELECT u.id_usuario FROM produto.validacoes_limites_capacidade_usuarios AS u WHERE (u.id_grupo_limite_capacidade = vlc.id)))) AND
						(pr.id_municipio in ((SELECT m.id_municipio FROM produto.validacoes_limites_capacidade_municipios AS m WHERE (m.id_grupo_limite_capacidade = vlc.id)))) AND
					    (p.id_produto in ((SELECT p.id_produto FROM produto.validacoes_limites_capacidade_produtos AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
					    (st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA', 'ENDOSSO_INCOMPLETO', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')) AND
						(
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 1 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 2 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id)
				)
				    ) as vl_utilizado,
				    vlc.vl_reserva_tecnica
				from
				    validacoes_limites_capacidade_tmp vlc
				where
					    ".$filtro."
				        vlc.fl_ativo = true
				    and vlc.fl_agrupar_municipios = true
				order by
				    vlc.ds_nome_grupo
				";

		return $this->fetchAll($sql);
	}

	public function relatorioCapacidadeGruposCorretores($id_safra="",$arProduto="", $idValidacao="", $idEstado=""){

		if(is_array($arProduto)){
			$filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (".implode("," , $arProduto).")) and ";
		}

		if($id_safra){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (select id from produto.produtos where id_safra=".$id_safra.")) and ";
		}

		if($id_safra){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (select id from produto.produtos where id_safra=".$id_safra.")) and ";
		}
		
		if($idEstado){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_estados where id_estado = ".$idEstado.") and ";
		}
		
		if($idValidacao){
		    $filtro .= "vlc.id = ".$idValidacao." and ";
		} 
		
		$this->_db->query("SELECT seguro.valor_retido(0)");

		$sql = "select
				    vlc.id,
				    vlc.ds_nome_grupo,
				    vlc.vl_limite_capacidade,
				    (
				        SELECT
				            sum(vl_lmga_capacidade)
				        FROM
				        seguro.propostas_endosso pe
						INNER JOIN seguro.propostas AS p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
					    INNER JOIN sistema.status AS st ON p.id_status = st.id
					    INNER JOIN seguro.propostas_propriedades AS pr ON p.id = pr.id_proposta
					    INNER JOIN seguro.propostas_corretores AS pc ON p.id = pc.id_proposta
					    INNER JOIN sistema.municipios AS m ON m.id = pr.id_municipio
					    INNER JOIN sistema.estados AS e ON e.id = m.id_estado
					    INNER JOIN sumario.itens_segurados AS pp ON p.id = pp.id_proposta
					WHERE
						pc.id_usuario not in (487, 488) AND
						(p.id_usuario_criacao in ((SELECT u.id_usuario FROM produto.validacoes_limites_capacidade_usuarios AS u WHERE (u.id_grupo_limite_capacidade = vlc.id)))) AND
					    (p.id_produto in ((SELECT p.id_produto FROM produto.validacoes_limites_capacidade_produtos AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
                        (
                	        (m.id_estado in ((SELECT p.id_estado FROM produto.validacoes_limites_capacidade_estados AS p WHERE (id_grupo_limite_capacidade = vlc.id))))
                	        OR
                	        (m.id in ((SELECT p.id_municipio FROM produto.validacoes_limites_capacidade_municipios AS p WHERE (id_grupo_limite_capacidade = vlc.id))))
                	    ) AND
					    (st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA', 'ENDOSSO_INCOMPLETO', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')) AND

						(
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 1 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 2 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id)
			 	        )

				    ) as vl_utilizado,
				    vlc.vl_reserva_tecnica
				from
				     validacoes_limites_capacidade_tmp vlc
				where
					    ".$filtro."
				        vlc.fl_ativo = true
				    and vlc.fl_limite_corretor = true
                    and vlc.id not in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_municipios)
				order by
				    vlc.ds_nome_grupo
				";

		return $this->fetchAll($sql);
	}

	public function relatorioCapacidadeMunicipios($id_safra="",$arProduto="", $idValidacao="", $idEstado="", $criarTabelaTemporaria = true){

		if(is_array($arProduto)){
			$filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (".implode("," , $arProduto).")) and ";
		}

    	if($id_safra){
		    $filtro .= "vlc.id in (select id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_produtos where id_produto in (select id from produto.produtos where id_safra=".$id_safra.")) and ";
		}
		
		if($idEstado){
		    $filtro .= "e.id = ".$idEstado." and ";
		}

		if ($criarTabelaTemporaria) {
            if($idValidacao){
                $filtro .= "vlc.id = ".$idValidacao." and ";
                $this->_db->query("CREATE temp TABLE validacoes_limites_capacidade_tmp AS (SELECT * FROM produto.validacoes_limites_capacidade where id=".$idValidacao." )");
            } else {
                $this->_db->query("CREATE temp TABLE validacoes_limites_capacidade_tmp AS (SELECT * FROM produto.validacoes_limites_capacidade)");
            }
        }

		$this->_db->query("SELECT seguro.valor_retido(0)");

		$sql = "
				select
				    vlc.id,
				    vlc.ds_nome_grupo,
				    m.id as id_municipio,
				    m.ds_nome_municipio,
				    e.ds_sigla,
				    vlc.vl_limite_capacidade,
				    utilizado_usuario.vl_utilizado as vl_utilizado,
				    trim(to_char((CASE WHEN vlc.vl_limite_capacidade > 0 THEN
				    	(100/vlc.vl_limite_capacidade)*utilizado_usuario.vl_utilizado
				    ELSE 0 END ), '99999999999999999999999999999999999D99')) AS percentual_utilizado,
				    vlc.vl_reserva_tecnica
				from
					validacoes_limites_capacidade_tmp vlc
					inner join produto.validacoes_limites_capacidade_municipios vlcm on vlc.id = vlcm.id_grupo_limite_capacidade
					inner join sistema.municipios m on m.id = vlcm.id_municipio
					inner join sistema.estados e on e.id = m.id_estado
					left join
					(
					    SELECT
						    prv.id_grupo_limite_capacidade,
						    pr.id_municipio,
						    sum(ist.vl_lmga_capacidade) as vl_utilizado
					    FROM
						    seguro.propostas_endosso pe
							INNER JOIN seguro.propostas AS p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
							INNER JOIN sistema.status AS st ON p.id_status = st.id
							INNER JOIN seguro.propostas_propriedades AS pr ON p.id = pr.id_proposta
							INNER JOIN sumario.itens_segurados AS ist ON p.id = ist.id_proposta
							INNER JOIN produto.validacoes_limites_capacidade_produtos AS prv ON p.id_produto = prv.id_produto
							INNER JOIN produto.validacoes_limites_capacidade_usuarios AS u ON u.id_usuario = p.id_usuario_criacao
						    INNER JOIN seguro.propostas_coberturas pc on pc.id_proposta = p.id and pc.id_cobertura in (select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade=prv.id_grupo_limite_capacidade)
							INNER JOIN seguro.propostas_corretores spc ON spc.id_proposta = p.id
						WHERE
							(st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA', 'ENDOSSO_INCOMPLETO', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA'))
							AND prv.id_grupo_limite_capacidade = u.id_grupo_limite_capacidade
							AND spc.id_usuario not in (487, 488)
					    GROUP BY pr.id_municipio, prv.id_grupo_limite_capacidade
					) as utilizado_usuario
					on utilizado_usuario.id_municipio = vlcm.id_municipio and utilizado_usuario.id_grupo_limite_capacidade = vlc.id
				where
					".$filtro."
					vlc.fl_ativo = true
					and vlc.fl_agrupar_municipios = false
				order by
					vlc.ds_nome_grupo
				";
		return $this->fetchAll($sql);
	}

    public function relatorioLmiCobertura($id_safra="",$arProduto=""){

        $this->_db->query("CREATE temp TABLE itens_segurados_temp AS (SELECT id_proposta,sum(vl_lmga) AS soma_lmga, sum(vl_area) as soma_area FROM seguro.itens_segurados GROUP BY id_proposta)");
        $this->_db->query("CREATE temp TABLE itens_segurados_temp2 AS (SELECT id_proposta, sum(vl_area) AS soma_area_parcial FROM seguro.itens_segurados WHERE vl_lmga > 0 GROUP BY id_proposta)");

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
                select
                    pr.id,
                    co.ds_nome_cobertura,
                    case
                        when co.id in (5,11,15,16) then '-'
                        else ''||pc.vl_franquia
                    end as vl_franquia,
                    pd.ds_nome_produto,
                    cu.ds_nome_cultura,
                    ist.soma_lmga,
                    ist2.soma_area_parcial,
                    case
                        when co.ds_chave_cobertura = 'COB_PROTECAO_FITO' then (ist2.soma_area_parcial * 100)
                        else (pc.vl_lmi * ist.soma_lmga)/100
                    end as vl_lmi
                from
                    seguro.propostas pr,
                    sistema.status st,
                    seguro.propostas_coberturas pc,
                    produto.coberturas co,
                    produto.produtos pd,
                    produto.produtos_geral pg,
                    produto.culturas cu,
                    itens_segurados_temp ist,
                    itens_segurados_temp2 ist2
                where
                	".$filtro."
					st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA') and
                	st.id = pr.id_status and
                    pc.id_proposta = pr.id and
                    co.id = pc.id_cobertura and
                    pd.id = pr.id_produto and
                    pg.id = pd.id_produto_geral and
                    cu.id = pg.id_cultura and
                    pr.id = ist.id_proposta and
                    pr.id = ist2.id_proposta
                order by
                    pr.id,pc.id_cobertura
				";
		return $this->fetchAll($sql);
	}

    public function relatorioCircularLavagemDinheiro($id_safra="",$arProduto=""){

		$filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
                select
                    pr.id as id_proposta,
                    pp.cpf_cnpj,
                    case
                        when pp.fl_politicamente_exposto='1' then 'Não'
                        when pp.fl_politicamente_exposto='2' then 'Sim'
                        else '-'
                    end as fl_politicamente_exposto,
                    case
                        when pp.fl_parentesco_politicamente_exposto='1' then 'Não'
                        when pp.fl_parentesco_politicamente_exposto='2' then 'Sim'
                        when pp.fl_parentesco_politicamente_exposto='3' then 'Não desejo responder'
                        else '-'
                    end as fl_parentesco_politicamente_exposto,
                    pp.fl_optante_nao_informar_patrimonio,
                    pp.vl_faturamento_anual,
                    pp.vl_patrimonio,
                    fr.ds_faixa_remuneracao
                from
                    seguro.propostas pr,
                    produto.produtos pd,
                    seguro.propostas_proponentes pp,
                    sistema.faixa_remuneracao fr
                where
                	".$filtro."
                    pd.id = pr.id_produto and
                    pp.id_proposta = pr.id and
                    fr.id = pp.id_renda
			";
		return $this->fetchAll($sql);
	}

	public function relatorioVariedades($id_cultura=""){

		$filtro  = ($id_cultura) ? "where v.id in (select id_variedade from produto.culturas_variedades where id_cultura=".$id_cultura.")" : "";

		$sql = "
                select
		            v.ds_nome_variedade,
		            case when v.fl_ativo=true then 'Sim' else 'Não' end as fl_ativo,
		            v.id,
                    v.cd_variedade_seguradora
                from
                    produto.variedades v
               	".$filtro."
                order by
                    v.ds_nome_variedade
			";
		return $this->fetchAll($sql);
	}

	public function relatorioAnaliseDuplicadas($id_safra="",$arProduto=""){

	    $filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
	    if(is_array($arProduto)){
	        $filtro .= "pd.id in (".implode("," , $arProduto).") and ";
	    }

	    $User = Zend_Auth::getInstance()->getIdentity();
	    if ($User->tp_usuario == 'C') {
	    	$filtro .= "pc.id_usuario = $User->id and ";
	    }elseif ($User->tp_usuario == 'P') {
	    	$filtro .= "pr.id_usuario_criacao = $User->id and ";
	    }

	    $sql = "   SELECT  pr.id as id_proposta
	    				   ,to_char(pr.dt_vigencia_inicio, 'DD/MM/YYYY') as dt_vigencia_inicio
						   ,co.ds_nome_fantasia
						   ,pd.ds_nome_produto
						   ,sf.ds_nome_safra
						   ,pat.ds_motivo
						   ,st.cd_status
						   ,u.ds_nome_usuario
			         FROM seguro.propostas pr
			    LEFT JOIN seguro.propostas_analise_transmissao pat
			           ON pr.id = pat.id_proposta
			         JOIN seguro.propostas_corretores pc
			           ON pc.id_proposta = pr.id
			         JOIN sistema.corretores co
			           ON co.id_usuario = pc.id_usuario
			         JOIN produto.produtos pd
			           ON pd.id = pr.id_produto
			         JOIN produto.safras sf
			           ON sf.id = pd.id_safra
			         JOIN sistema.status st
			           ON st.id = pr.id_status
			         JOIN sistema.usuarios u
			           ON u.id = pr.id_usuario_criacao
			        WHERE ".$filtro." st.ds_chave in ('NAO_ENVIADA' , 'DEVOLVIDA')
			    ORDER BY pr.id
		";

	    return $this->fetchAll($sql);
	}

	public function valoresAceitacaoMaca($id_safra="",$arProduto=""){

		$filtro  = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
					pd.id_safra,
					pd.ds_nome_produto,
					v.ds_nome_validacao,
					vgd.ds_nome_grupo_densidade,
					vgp.ds_nome_grupo_portaenxerto,
					vpv.ds_nome_grupo_variedade,
					pv.id as id_valor,
					pv.nu_idade,
					pv.vl_minimo,
					pv.vl_maximo,
					pv.nr_plantas,
					pv.nr_plantas_regiao,
					pv.id_validacao
				from
					produto.validacoes_is_valores  pv
					left join produto.validacoes_grupo_densidade vgd on vgd.id = pv.id_grupo_densidade
					left join produto.validacoes_grupo_portaenxerto vgp on vgp.id = pv.id_grupo_portaenxerto
					left join produto.validacoes_grupo_variedade vpv on vpv.id = pv.id_grupo_variedade
					inner join produto.validacoes v on v.id = pv.id_validacao
					inner join produto.produtos_validacoes pov on pov.id_validacao = v.id
					inner join produto.produtos pd on pd.id = pov.id_produto
                where
					".$filtro."
					v.id in (1,7)
				order by
					v.id, pd.id_safra, pd.ds_nome_produto, vgd.ds_nome_grupo_densidade, vgp.ds_nome_grupo_portaenxerto, pv.nu_idade
				";

		return $this->fetchAll($sql);
	}

	public function valoresAceitacaoVariedades($id_safra="",$arProduto=""){

		$filtro  = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
				   pd.id_safra,
				   pd.id as id_produto,
				   pd.ds_nome_produto,
				   cu.ds_nome_cultura,
				   v.id as id_variedade,
				   v.ds_nome_variedade,
				   pv.vl_importancia_segurada_minima,
				   pv.vl_importancia_segurada_maxima,
				   pva.id_validacao,
				   va.ds_nome_validacao,
				   vll.ds_nome_grupo
				from
				    produto.produtos pd,
				    produto.produtos_geral pg,
				    produto.culturas cu,
				    produto.produtos_variedades pv,
				    produto.variedades v,
					produto.validacoes_limites_lmga vll,
				    produto.produtos_validacoes pva
					inner join produto.validacoes va on va.id = pva.id_validacao
				where
				    ".$filtro. "
				    pv.id_produto = pd.id and
				    pg.id = pd.id_produto_geral and
				    cu.id = pg.id_cultura and
				    v.id = pv.id_variedade and
				    pva.id_produto = pd.id and
					pva.id_validacao = 3 and
					pv.id_validacao_limites_lmga = vll.id
				order by
				   pd.id_safra,
				   pd.ds_nome_produto,
				   v.ds_nome_variedade
				";

		return $this->fetchAll($sql);
	}

	public function valoresAceitacaoDensidades($id_safra="",$arProduto=""){

		$filtro  = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
				   pd.id_safra,
				   pd.id as id_produto,
				   pd.ds_nome_produto,
				   cu.ds_nome_cultura,
				   vgd.ds_nome_grupo_densidade,
				   vgd.vl_densidade_minima,
				   vgd.vl_densidade_maxima,
				   pva.id_validacao,
				   viv.nu_idade,
				   viv.vl_minimo,
				   viv.vl_maximo,
                   viv.id as id_valor,
				   va.ds_nome_validacao
				from
				    produto.produtos pd,
				    produto.produtos_geral pg,
				    produto.culturas cu,
				    produto.produtos_validacoes pva
				    inner join produto.validacoes va on va.id = pva.id_validacao,
				    produto.validacoes_grupo_densidade vgd,
				    produto.validacoes_is_valores viv
				where
				    ".$filtro."
				    pg.id = pd.id_produto_geral and
				    cu.id = pg.id_cultura and
				    pva.id_produto = pd.id and
				    vgd.id_validacao = pva.id_validacao and
				    viv.id_grupo_densidade = vgd.id and
				    pva.id_validacao = viv.id_validacao and
				    pva.id_validacao = 6
				order by
				   pd.id_safra,
				   pd.ds_nome_produto,
				   vgd.id
				";

		return $this->fetchAll($sql);
	}

	public function valoresAceitacaoIdades($id_safra="",$arProduto=""){

		$filtro  = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
				   pd.ds_nome_produto,
				   cu.ds_nome_cultura,
				   pd.id_safra,
				   viv.vl_minimo,
				   viv.vl_maximo,
				   viv.nu_idade,
                   viv.id as id_valor,
				   vgv.ds_nome_grupo_variedade,
				   pva.id_validacao,
				   va.ds_nome_validacao
				from
				    produto.validacoes_is_valores viv,
				    produto.validacoes_grupo_variedade vgv,
				    produto.produtos_validacoes pva
				    inner join produto.validacoes va on va.id = pva.id_validacao,
				    produto.produtos pd,
				    produto.produtos_geral pg,
				    produto.culturas cu
				where
				    ".$filtro."
				    viv.id_validacao = 2 and
				    vgv.id = viv.id_grupo_variedade and
				    pva.id_validacao = viv.id_validacao and
				    pva.id_produto = pd.id and
				    pg.id = pd.id_produto_geral and
				    cu.id = pg.id_cultura and
					(select id_variedade from produto.validacoes_grupo_variedade_variedades where id_grupo_variedade=viv.id_grupo_variedade limit 1) in (select id_variedade from produto.produtos_variedades where id_produto=pd.id)
				order by
				    pd.id_safra,pd.ds_nome_produto, vgv.ds_nome_grupo_variedade,viv.nu_idade
				";

		return $this->fetchAll($sql);
	}

	public function historicoStatus($id_safra=[],$arProduto=""){

		$filtro  = ($id_safra) ? "pd.id_safra IN (".implode(',', $id_safra).") and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
				   pd.ds_nome_produto,
				   pd.id_safra,
				   seguro.id_proposta_mae(pr.id) as id_proposta,
				   u.ds_nome_usuario,
				   st.dt_criacao,
				   s.ds_status,
				   case when st.fl_ativo = true then 'Sim' else 'Não' end as fl_ativo,
				   seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
				   ps.ds_nome_safra
				from
				    seguro.propostas pr,
				    seguro.propostas_status st,
				    sistema.status s,
				    produto.produtos pd inner join produto.safras ps on pd.id_safra = ps.id,
				    sistema.usuarios u
				where
				    ".$filtro."
				    st.id_proposta = pr.id and
				    pd.id = pr.id_produto and
				    u.id = st.id_usuario_criacao and
				    s.id = st.id_status
				order by
				    pd.id_safra, pr.id, st.dt_criacao desc
				";

		return $this->fetchAll($sql);
	}

	public function endossosParcelas($id_safra=[],$arProduto="",$arStatus=""){

		$filtro  = ($id_safra) ? "pd.id_safra IN (".implode(',',$id_safra).") and " : '';
		//2010021943 - included new paremeter filter
		$filtro .= " po.fl_principal = true and ";

		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		if(is_array($arStatus)){
			$filtro .= "pr.id_status in (".implode(",", $arStatus).") ";
		} else {
			$filtro .= "st.ds_chave IN (
				'APOLICE_EMITIDA',
				'AGUARDANDO_ENVIO_SEG',
				'TRANSMITIDA_SEGURADORA',
				'APOLICE_CANCELADA',
				'ENDOSSO_CANCELADO',
				'ENDOSSO_ANULADO'
			)";
		}

		$sql = "
           SELECT seguro.id_proposta_mae(pr.id) AS id_proposta_mae
                , seguro.id_proposta_mae_completo(pr.id) AS id_proposta_completo
                , pr.id AS id_proposta
                , seguro.nr_endosso(pr.id, pr.id_endosso) AS nr_endosso
                , pr.nr_apolice
                , CASE WHEN te.ds_tipo='SEM_MOVIMENTO' THEN
                      0.00
                  ELSE
                      pp.vl_total
                  END AS vl_total
                , CASE WHEN te.ds_tipo='SEM_MOVIMENTO' THEN
                      0.00
                  ELSE
                      pp.vl_segurado
                  END AS vl_segurado
                , CASE WHEN te.ds_tipo='SEM_MOVIMENTO' THEN
                      0.00
                  ELSE
                      pp.vl_subvencao_federal
                  END AS vl_subvencao_federal
                , CASE WHEN te.ds_tipo='SEM_MOVIMENTO' THEN
                      0.00
                  ELSE
                      pp.vl_subvencao_estadual
                  END AS vl_subvencao_estadual
                , pp.nr_parcela
                , te.ds_tipo
                , st.ds_chave
                , pr.ds_identificador_seguradora
				, c.ds_nome_abreviado AS ds_nome_corretor
				, u.ds_nome_usuario
				, po.ds_observacao 
				, uu.ds_nome_usuario as ds_nome_usuario_alteracao
				, to_char(pr.dt_criacao,'DD/MM/YYYY') as dt_criacao
				, to_char(pr.dt_alteracao, 'DD/MM/YYYY') as dt_alteracao
				, ps.ds_nome_safra
             FROM seguro.propostas pr
       INNER JOIN seguro.propostas_endosso_opcoes peo
			   ON pr.id = peo.id_proposta
	   LEFT JOIN seguro.propostas_observacoes po
			   ON po.id_proposta = pr.id
       INNER JOIN seguro.tipo_endosso te
               ON te.id = peo.id_endosso_opcao
       INNER JOIN produto.produtos pd
               ON pd.id = pr.id_produto
		INNER JOIN produto.safras ps
			   ON pd.id_safra = ps.id
       INNER JOIN sistema.status st
               ON st.id = pr.id_status
       INNER JOIN seguro.propostas_corretores pc
               ON pc.id_proposta = pr.id
       INNER JOIN sistema.corretores c
			   ON c.id_usuario = pc.id_usuario
	   INNER JOIN sistema.usuarios u
			   ON pr.id_usuario_criacao = u.id
	   INNER JOIN sistema.usuarios uu
	           ON pr.id_usuario_alteracao = uu.id
	    LEFT JOIN seguro.propostas_parcelas pp
               ON pp.id_proposta = pr.id
            WHERE {$filtro} 
         ORDER BY pr.id
                , seguro.nr_endosso(pr.id, pr.id_endosso)
                , pp.nr_parcela
				";

		return $this->fetchAll($sql);
	}

	public function premioEndosso($id_safra="",$arProduto=""){

		$this->_db->query("CREATE temp TABLE propostas_status_temp AS (SELECT distinct(id_proposta) FROM seguro.propostas_status where id_status=8)");

		$filtro  = ($id_safra) ? "ppr.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "ppr.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
			SELECT
			    seguro.id_proposta_mae_completo(spr.id) AS id_proposta_completo,
			    seguro.id_proposta_mae(spr.id) AS id_proposta,
			    spr.id as id_proposta_endosso,
			    spr.nr_apolice,
			    seguro.nr_endosso(spr.id, spr.id_endosso) AS nr_endosso,
			    sst.ds_chave as status,
				spt.ds_nome_proponente,
				spt.cpf_cnpj,
				ppr.ds_nome_produto,
			    case when te.ds_tipo is null then 'APOLICE' else te.ds_tipo end as tipo,
			    COALESCE((select sum(vl_segurado) from seguro.propostas_parcelas where id_proposta=spr.id),'0.00') as vl_segurado,
			    COALESCE((select sum(vl_subvencao_federal) from seguro.propostas_parcelas where id_proposta=spr.id),'0.00') as vl_subvencao_federal,
			    COALESCE((select sum(vl_subvencao_estadual) from seguro.propostas_parcelas where id_proposta=spr.id),'0.00') as vl_subvencao_estadual
			FROM
			    seguro.propostas_endosso AS spe
			    INNER JOIN seguro.propostas AS spr ON spr.id = spe.id_proposta
				INNER JOIN propostas_status_temp as pst ON pst.id_proposta = spr.id
			    INNER JOIN seguro.propostas_proponentes AS spt ON spr.id = spt.id_proposta
			    INNER JOIN seguro.propostas_corretores AS spc ON spr.id = spc.id_proposta and spc.id_usuario  <> 487
			    INNER JOIN produto.produtos AS ppr ON ppr.id = spr.id_produto AND ppr.id_seguradora = 181
			    INNER JOIN seguro.propostas_propriedades AS spd ON spr.id = spd.id_proposta
			    INNER JOIN sistema.municipios AS smu ON smu.id = spd.id_municipio
			    INNER JOIN sistema.estados AS suf ON suf.id = smu.id_estado
			    INNER JOIN sistema.corretores AS scr ON spc.id_usuario = scr.id_usuario
			    INNER JOIN sistema.status AS sst ON sst.id = spr.id_status
			    INNER JOIN sistema.usuarios AS sus ON sus.id = spr.id_usuario_criacao
			    INNER JOIN seguro.propostas_versoes AS pv ON spr.id_versao = pv.id
			    LEFT JOIN seguro.propostas_endosso_opcoes AS peo ON peo.id_proposta = spr.id
			    LEFT JOIN seguro.tipo_endosso AS te ON te.id = peo.id_endosso_opcao
			WHERE
				".$filtro."
			    (sst.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO, 'SOLICITACAO_CANCELADA''))
			ORDER BY
			    spr.id, seguro.nr_endosso(spr.id, spr.id_endosso)
		";

		return $this->fetchAll($sql);
	}

	public function relatorioConfigProdutos($id_safra="",$arProduto=""){

		$filtro  = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				select
				    pd.ds_nome_produto,
				    pd.nr_susep,
				    pd.id as id_produto,
				    pd.cd_produto_seguradora,
				    co.ds_nome_cobertura,
				    pc.id_cobertura,
				    pc.cd_cobertura_seguradora,
				    pc.vl_lmi
				from
				    produto.produtos pd,
				    produto.produtos_coberturas pc,
				    produto.coberturas co
				where
					".$filtro."
				    pd.fl_ativo = true and
				    pc.id_produto = pd.id and
				    pc.fl_cobertura_principal = true and
				    co.id = pc.id_cobertura
				order by
				    pd.ds_nome_produto
				";

		return $this->fetchAll($sql);
	}

	public function relatorioProrrogacaoBoletos($id_safra=[], $arProduto=""){

		$filtro  = ($id_safra) ? "pd.id_safra IN (".implode(',',$id_safra).") and " : '';
		if(is_array($arProduto)){
			$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
		}

		$sql = "
				SELECT  seguro.id_proposta_mae(pr.id) as id_proposta
				       ,pbp.nr_parcela
				       ,pbp.nu_boleto
				       ,pbp.vl_total
				       ,pbp.vl_segurado
				       ,pbp.vl_juros
				       ,pbp.vl_multa
				       ,to_char(pbp.dt_vencimento,'DD/MM/YYYY') as dt_vencimento
               ,to_char(pbp.dt_criacao,'DD/MM/YYYY') as dt_prorrogacao
               ,to_char(pb.dt_vencimento,'DD/MM/YYYY') as dt_vencimento_original
				       ,pd.ds_nome_produto
				       ,sp.id as id_proponente
					   ,ps.ds_nome_safra
				  FROM
				            seguro.propostas_boletos_prorrogacoes pbp
				       JOIN seguro.propostas pr ON pbp.id_proposta = pr.id
					   JOIN seguro.propostas_endosso pe ON pe.id_proposta = pr.id
				       JOIN produto.produtos pd ON pd.id = pr.id_produto
					   JOIN produto.safras ps ON pd.id_safra = ps.id
				       JOIN seguro.propostas_proponentes pp ON pr.id = pp.id_proposta
				       JOIN seguro.proponentes sp ON sp.cpf_cnpj = pp.cpf_cnpj
                       JOIN seguro.proposta_boletos pb ON pb.id_proposta = pr.id AND pb.nr_parcela = pbp.nr_parcela
				 WHERE
				 	   ".$filtro."
				 	   pbp.fl_del = 'f'
				   AND pbp.fl_ativo = 't'
		";
                
		return $this->fetchAll($sql);
	}

    public function relatorioArquivosDigitalizados($params, $tp_usuario='',$user_id='') {

        if ($params['id_safra']) {
            $filtro .= ' AND sf.id = '.$params['id_safra'];
        }

        if (count($params['id_produto']) > 0) {
            $filtro .= ' AND pd.id in ('.implode(',', $params['id_produto']).') ';
        }

        if ($tp_usuario) {
            if ($tp_usuario == 'C') {
                $filtro .= ' AND co.id_usuario = '.$user_id.' ';
            } elseif ($tp_usuario == 'P') {
                $filtro .= ' AND pr.id_usuario_criacao = '.$user_id.' ';
            }
	   }

        $sql = "SELECT pr.id
                    ,seguro.id_proposta_mae(pr.id) as id_proposta
                    ,pr.nr_apolice
                    ,coalesce(seguro.nr_endosso(pr.id, pr.id_endosso),0) as nr_endosso
                    ,pp.ds_nome_proponente
                    ,pre.ds_nome_preposto
                    ,trim(co.ds_nome_abreviado) as ds_nome_fantasia
                    ,c.ds_nome_cultura
                    ,st_doc.ds_status
                    ,string_agg(ds_nome_pendencia, ', ') as ds_pendencia
                    ,to_char(prop_status_doc.dt_criacao,'DD/MM/YYYY') as dt_alteracao_status
                    ,to_char(pr.dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio
                    ,to_char(pr.dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim
                FROM seguro.propostas pr
                JOIN sistema.status stprop
                  ON stprop.id = pr.id_status
                JOIN seguro.propostas_proponentes pp
                  ON pr.id = pp.id_proposta
                JOIN seguro.propostas_propriedades po
                  ON pr.id = po.id_proposta
                JOIN seguro.propostas_corretores pc
                  ON pr.id = pc.id_proposta
                JOIN sistema.corretores co
                  ON pc.id_usuario = co.id_usuario
                JOIN produto.produtos pd
                  ON pr.id_produto = pd.id
                JOIN produto.produtos_geral ppg
                  ON pd.id_produto_geral = ppg.id
                JOIN produto.culturas c
                  ON c.id = ppg.id_cultura
                JOIN produto.safras sf
                  ON pd.id_safra = sf.id
                JOIN sistema.municipios sm
                  ON po.id_municipio = sm.id
                JOIN sistema.estados se
                  ON sm.id_estado = se.id
                JOIN sistema.status st
                  ON pr.id_status = st.id
                 AND st.ds_chave NOT IN ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
                JOIN sistema.usuarios u
                  ON pr.id_usuario_criacao = u.id
                LEFT JOIN ( select id_proposta,
                              sum(vl_subvencao_estadual) as vl_subvencao_estadual,
			                  sum(vl_subvencao_federal) as vl_subvencao_federal
		               from seguro.propostas_parcelas
		               group by id_proposta ) as sppef
                  ON sppef.id_proposta = pr.id
                LEFT JOIN seguro.propostas_status_documento_digitalizado prop_status_doc 
                  ON pr.id = prop_status_doc.id_proposta 
                  AND prop_status_doc.fl_ativo is TRUE
                LEFT JOIN sistema.status st_doc 
                  ON st_doc.id = prop_status_doc.id_status

                LEFT JOIN seguro.propostas_pendencias_documento_digitalizado prop_p 
                  ON prop_p.id_proposta_status_documento_digitalizado = prop_status_doc.id
                LEFT JOIN atendimento.pendencias atend_p 
                  ON atend_p.id = prop_p.id_pendencia

                LEFT JOIN sistema.prepostos pre
                  ON u.id = pre.id_usuario
                WHERE pc.id_usuario <> 487 
                {$filtro}
                GROUP BY
                    pr.id
                    ,pr.nr_apolice
                    ,nr_endosso
                    ,pp.ds_nome_proponente
                    ,pre.ds_nome_preposto
                    ,co.ds_nome_abreviado
                    ,c.ds_nome_cultura
                    ,st_doc.ds_status
                    ,dt_alteracao_status
                    ,dt_vigencia_inicio
                    ,dt_vigencia_fim

                ORDER BY id_proposta
            ";

        return $this->fetchAll($sql);
	}

    public function relatorioSolicitacaoEndossos($params) {

        $case  = 'CASE ';
        $sqlCase = $this->getAdapter();
        $case .= $sqlCase->quoteInto('WHEN ds_nome_arquivo is NULL THEN \'Não\' ', '', Zend_Db::INT_TYPE);
        $case .= 'ELSE \'Sim\' END ';

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('spes' => 'seguro.propostas_endosso_solicitacao'), array('id','ds_arquivo','id_tipo_solicitacao','id_proposta','id_status', 'id_tipo_solicitacao', 'to_char(spes.dt_criacao, \'dd/mm/yyyy\') as dt_criacao'));
        $select->join(array('sets' => 'seguro.endosso_tipo_solicitacao'), 'sets.id = spes.id_tipo_solicitacao', array('ds_tipo_endosso', 'ds_orientacao'));
        $select->join(array('sp' => 'seguro.propostas'), 'sp.id = spes.id_proposta', '');
        $select->join(array('pp' => 'produto.produtos'), 'pp.id = sp.id_produto', 'ds_nome_abreviado');
        $select->join(array('ss' => 'sistema.status'), 'ss.id = spes.id_status', 'ds_status');
        $select->join(array('spp' => 'seguro.propostas_propriedades'), 'spp.id_proposta = sp.id', '');
        $select->join(array('sm' => 'sistema.municipios'), 'sm.id = spp.id_municipio', 'ds_nome_municipio');
        $select->join(array('se' => 'sistema.estados'), 'se.id = sm.id_estado', 'ds_sigla');
        $select->join(array('spr' => 'seguro.propostas_endosso_solicitacao_status'), 'spr.id_solicitacao = spes.id', 'ds_observacao');
        $select->join(array('us' => 'sistema.usuarios'), 'spes.id_usuario_criacao = us.id', 'ds_nome_usuario');
        $select->joinLeft(array('spesa' =>  'seguro.propostas_endosso_solicitacao_arquivos'), 'spesa.id_solicitacao = spes.id and spesa.fl_ativo = true',
            array('ds_nome_arquivo', 'assinada' => new Zend_Db_Expr($case), 'to_char(spesa.dt_criacao, \'dd/mm/yyyy\') as dt_criacao_arquivo'));
        $select->joinLeft(array('sc' => 'sistema.corretores'), 'us.id = sc.id_usuario', 'ds_nome_corretor');
        $select->joinLeft(array('spre' => 'sistema.prepostos'), 'us.id = spre.id_usuario', 'ds_nome_preposto');
        $select->where('spr.fl_ativo = true');

        if ($params['id_solicitacao']) {
            $select->where('spes.id = ?', $params['id_solicitacao']);
        }

        if ($params['id_proposta']) {
            $select->where('spes.id_proposta = ?', $params['id_proposta']);
        }

        if ($params['id_produto']) {
             $select->where('pp.id = ?', $params['id_produto']);
        }

        if ($params['id_status']) {
            $select->where('ss.id = ?', $params['id_status']);
        }

        if ($params['assinada']) {
            $select->where('spesa.ds_nome_arquivo is '.($params['assinada'] == 'S' ? 'not null' : 'null'));
        }

        return $this->fetchAll($select);
    }

    public function relatorioSubvencaoCancelada($id_safra="", $arProdudo=""){

      if (strtolower($id_safra) == 'todas') {
        $filtro = "pd.id_safra >= 16 and ";
      } else if (strtolower($id_safra) == 'tres_ultimas') {
        $modelSafra = new Produto_Model_Safras();
        $safraAtual = $modelSafra->getSafraAtual();
        $safraAtual = $safraAtual['id'];

        $filtro = "pd.id_safra IN (".$safraAtual.", ".($safraAtual-1).", ".($safraAtual-2).") and ";
      } else if ($id_safra) {
        $filtro = "pd.id_safra=".$id_safra." and ";
      } else {
        $filtro = "";
      }

    	if(is_array($arProduto)){
    		$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
    	}

    	$sql = "
				select
				     seguro.id_proposta_mae(pr.id) as id_proposta
				    ,replace(replace(seguro.id_proposta_mae_completo(pr.id), '.', ''), '-', '') as id_proposta_completo
				    ,pr.nr_apolice
				    ,pr.ds_identificador_seguradora
				    ,to_char(pr.dt_transmissao, 'DD/MM/YYYY') as dt_transmissao
                    ,to_char(ps2.dt_criacao, 'DD/MM/YYYY') as dt_transmissao2    			
				    ,case when pp.vl_subvencao_federal >= 0 then pp.vl_subvencao_federal else pp.vl_subvencao_federal *-1 end as vl_subvencao_federal
    			    ,case when pp.vl_subvencao_estadual >= 0 then pp.vl_subvencao_estadual else pp.vl_subvencao_estadual *-1 end as vl_subvencao_estadual
				    ,case
				        when id_motivo_cobranca_subvencao_segurado = 1 then 'Cadin'
				        when id_motivo_cobranca_subvencao_segurado = 2 then 'CPF/CNPJ impedido de participar'
				        when id_motivo_cobranca_subvencao_segurado = 3 then 'Saldo zero'
    					when id_motivo_cobranca_subvencao_segurado = 4 then 'Falta de recurso'
				    end as motivo
				from
				    seguro.propostas_endosso pe
				    inner join seguro.propostas pr on pe.id_proposta = pr.id
				    inner join seguro.propostas_status ps on ps.id_proposta = pr.id
				    inner join sistema.status st on st.id = ps.id_status
				    inner join seguro.propostas_parcelas pp on pp.id_proposta = pr.id and pp.id_motivo_cobranca_subvencao_segurado > 0
				    inner join produto.produtos pd on pd.id = pr.id_produto
				    inner join produto.produtos_geral pg on pg.id = pd.id_produto_geral
				    inner join produto.safras sf on sf.id = pd.id_safra
    			
                    inner join seguro.propostas_status ps2 on ps2.id_proposta = pr.id
                    inner join sistema.status st2 on st2.id = ps2.id_status and st2.ds_chave='AGUARDANDO_ENVIO_SEG'    			
				where
				    ".$filtro."
				    st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'ENDOSSO_CANCELADO', 'SOLICITACAO_CANCELADA')
				    and pr.id_usuario_criacao  <> 487
				    and ps.fl_ativo = true
				order by
				    pr.id
		";

    	return $this->fetchAll($sql);
    }
    
    public function importacaocotrijal($dtTransmissaoInicio, $dtTransmissaoFim, $id_safra="", $arProdudo=""){
        /*
    	$filtro  = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
    	if(is_array($arProduto)){
    		$filtro .= "pd.id in (".implode("," , $arProduto).") and ";
    	}
        */    	
    	
    	$filtro = "pd.id_safra >= 20 and ";
    	
    	if($dtTransmissaoInicio && $dtTransmissaoFim){
    		$filtro .= "pr.dt_transmissao between '".$dtTransmissaoInicio."' and '".$dtTransmissaoFim."' and";
    	}
    
    	$sql = "
			select 
			    case when pp.tp_pessoa='F' then 1 else 2 end 
			    ||lpad(replace(replace(replace(pp.cpf_cnpj,'-',''), '.',''),'/',''), 14, '0') 
			    ||lpad(pr.id::text, 20, '0') 
			    ||lpad(replace(replace(replace(em.cpf_cnpj,'-',''), '.',''),'/',''), 14, '0') 
			    ||lpad(replace(replace(replace(co.cpf_cnpj,'-',''), '.',''),'/',''), 14, '0') 
			    ||lpad(replace(its.vl_area::text,'.',''), 11, '0') 
			    ||to_char(pa.dt_vencimento,'ddMMYYYY') 
			    ||case 
			         when em.id = 181 then lpad('341', 5, '0')
			         when em.id = 6 then lpad('222', 5, '0')
			     end
			    ||lpad(replace(pa.vl_segurado::text,'.',''), 15, '0')
                ||lpad(seguro.nr_endosso(pr.id,pr.id_endosso)::text, 2, '0') 
                ||to_char(pr.dt_vigencia_inicio,'ddMMYYYY')     			
    			as row_proposta
			from
			    seguro.propostas pr
			    inner join seguro.propostas_proponentes pp on pp.id_proposta = pr.id
			    inner join produto.produtos pd on pd.id = pr.id_produto
			    inner join seguro.propostas_corretores pc on pc.id_proposta = pr.id
			    inner join sistema.corretores co on co.id_usuario = pc.id_usuario
			    inner join sistema.empresas em on em.id = pd.id_seguradora
			    inner join sumario.itens_segurados its on its.id_proposta = pr.id
			    inner join seguro.propostas_parcelas pa on pa.id_proposta = pr.id 
    			inner join sistema.status st on st.id = pr.id_status and st.ds_chave NOT IN ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
			where
    			".$filtro."
			        pr.id_usuario_criacao in (905, 2606)
			    and pa.vl_segurado > 0
			order by
			    pr.id_proposta_mae, seguro.nr_endosso(pr.id,pr.id_endosso), pa.nr_parcela 
		";
    
    	return $this->fetchAll($sql);
    }

    public function relatorioComissoes($dt_recebimento="")
    {
		$safraAtual = (new Produto_Model_Safras())->getSafraAtual()['id'];

        $filtro = [];

        if($tp_usuario == 'C') {
            $filtro[] = "pc.id_usuario = {$id_usuario}";
        }

        if($tp_usuario == 'P') {
            $filtro[] = "pr.id_usuario_criacao = {$id_usuario}";
        }

		if($dt_recebimento) {
			$arDate = explode('-', $dt_recebimento);
			list($year, $month) = $arDate;

			$filtro[] = "CASE WHEN (to_date(pr.dt_emissao_apolice,'dd/mm/yyyy') > tblvencimento.dt_pagamento) 
				THEN (extract('month' from to_date(pr.dt_emissao_apolice, 'dd/mm/yyyy')) = $month
					AND extract('year' from to_date(pr.dt_emissao_apolice, 'dd/mm/yyyy')) = $year) 
				ELSE (extract('month' from tblvencimento.dt_pagamento) = $month
					AND extract('year' from tblvencimento.dt_pagamento) = $year) 
				END";
		}
		

        $filtro = implode(" AND ", $filtro);

        $this->_db->query("
					CREATE TEMP TABLE tmp_propostas AS
                      (SELECT pr.id,
                              pr.id AS id_proposta,
                              pr.id_endosso,
                              id_proposta_renovada,
                              id_versao,
                              seguro.nr_endosso(pr.id, pr.id_endosso) AS nr_endosso,
                              nr_apolice,
                              pr.id_status,
                              pr.id_usuario_criacao,
                              id_produto,
                              to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') AS dt_vigencia_inicio_original,
                              to_char(apolice.dt_emissao_apolice, 'DD/MM/YYYY') AS dt_emissao_apolice ,
                              pr.dt_vigencia_inicio,
                              pr.id_proposta_mae,
							  pr.ds_identificador_seguradora
                         FROM seguro.propostas pr
                             INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
                             INNER JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
                             LEFT JOIN (select min(ps.dt_criacao) as dt_emissao_apolice, pr.id as id_proposta
                                          from seguro.propostas pr
                                               INNER JOIN seguro.propostas_status ps on ps.id_proposta = pr.id
                                               INNER JOIN sistema.status st ON st.id = ps.id_status
                                         WHERE st.ds_chave = 'APOLICE_EMITIDA'
                                         GROUP BY pr.id) as apolice ON apolice.id_proposta = pr.id
                       WHERE pd.id_safra between ({$safraAtual}-2) AND {$safraAtual})
				");

        $filtro = !empty($filtro) ? " AND {$filtro}" : "";

        $sql = "select pr.id_proposta_mae as id_proposta
					  ,pr.id_versao
					  ,pr.nr_endosso
					  ,pr.id_proposta_mae
					  ,pr.nr_apolice
					  ,pr.dt_vigencia_inicio
					  ,pr.dt_emissao_apolice AS dt_emissao_apolice
					  ,pr.id_status
					  ,c.ds_nome_cultura
					  ,sp.id as id_proponente
					  ,st.ds_status
					  ,co.ds_nome_abreviado as ds_nome_fantasia
					  ,u.tp_usuario
					  ,case when u.tp_usuario='P' then u.ds_nome_usuario else '' end as sublogin
					  ,pb.nr_parcela
					  ,pb.vl_total
					  ,pb.vl_segurado
					  ,pb.vl_subvencao_federal
					  ,pb.vl_subvencao_estadual
					  ,case when pb.fl_pago=true then 'Sim' else 'Não' end as fl_pago
					  ,pc.vl_comissao
					  ,to_char(tblvencimento.dt_vencimento, 'dd/mm/yyyy') as dt_vencimento
					  ,to_char(tblvencimento.dt_pagamento, 'dd/mm/yyyy') as dt_pagamento
					  ,tblvencimento.vl_pago
					  ,ste.ds_tipo
					  ,tblprorrogacoes.vl_segurado_juros
					  ,tblprorrogacoes.dt_vencto_prorrogado
					  ,case when (to_date(pr.dt_emissao_apolice,'dd/mm/yyyy') > tblvencimento.dt_pagamento) 
					  	then pr.dt_emissao_apolice else to_char(tblvencimento.dt_pagamento,'dd/mm/yyyy') end as dt_recebimento
					  ,sfr.ds_nome_safra
					  ,pr.ds_identificador_seguradora
				 FROM seguro.propostas_endosso pe
                      INNER JOIN tmp_propostas pr ON pr.id = pe.id_proposta
                      INNER JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
                      INNER JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr.id
                      INNER JOIN seguro.proponentes sp ON sp.cpf_cnpj = pp.cpf_cnpj
                      INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
                      INNER JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
					  INNER JOIN produto.safras sfr ON sfr.id = pd.id_safra
                      INNER JOIN produto.culturas c ON c.id = pg.id_cultura
                      INNER JOIN sistema.status st ON st.id = pr.id_status
                      INNER JOIN sistema.usuarios u ON u.id = pr.id_usuario_criacao
                      INNER JOIN sistema.corretores co ON co.id_usuario = pc.id_usuario
                      INNER JOIN seguro.proposta_boletos pb ON pb.id_proposta = pr.id AND pb.id_versao = pr.id_versao
                      INNER JOIN (SELECT vl_pago,
                                         dt_pagamento,
                                         dt_vencimento,
                                         id_proposta,
                                         nr_parcela
                                    FROM seguro.propostas_parcelas) AS tblvencimento ON tblvencimento.id_proposta = pb.id_proposta
                                                                                    AND tblvencimento.nr_parcela = pb.nr_parcela
					  LEFT JOIN (SELECT  pbp.vl_segurado + pbp.vl_juros AS vl_segurado_juros,
					  			         to_char(pbp.dt_vencimento,'DD/MM/YYYY') AS dt_vencto_prorrogado,
					  			         pbp.id_proposta,
					  			         pbp.nr_parcela
					  	           FROM seguro.propostas_boletos_prorrogacoes pbp
					  	           JOIN (SELECT MAX(id) AS id,
					  				            nr_parcela,
					  				            id_proposta
					  			           FROM seguro.propostas_boletos_prorrogacoes
					  			           GROUP BY nr_parcela, id_proposta
					                    ) max_boleto ON max_boleto.id = pbp.id
					            ) AS tblprorrogacoes ON tblprorrogacoes.id_proposta = pb.id_proposta AND tblprorrogacoes.nr_parcela = pb.nr_parcela
                      LEFT JOIN seguro.propostas_endosso_opcoes speo ON speo.id_proposta = pb.id_proposta
                      LEFT JOIN seguro.tipo_endosso ste ON speo.id_endosso_opcao =ste.id
                      WHERE st.ds_chave IN (
						'APOLICE_EMITIDA',
					  	'ENDOSSO_CANCELADO',
						'ENDOSSO_ANULADO',
						'APOLICE_CANCELADA'
						)
                        AND pc.id_usuario <> 487 --(corretor teste)
						AND pb.fl_pago = true
						AND sfr.id BETWEEN ({$safraAtual}-2) AND {$safraAtual}
                        {$filtro}
                      ORDER BY pr.id_proposta_mae ASC,
                               pr.id ASC,
                               pb.nr_parcela ASC";

        return $this->fetchAll($sql);
    }

    public function dadosProrrogacao($id_safra="",$idStatus=""){

		$filtro  = ($id_safra) ? "pd.id_safra = ".$id_safra." AND " : '';
		$filtro .= ($idStatus) ? "s.id = ".$idStatus." AND " : 's.cd_status >= 3 AND';

		$sql = "
				SELECT p.id_proposta_mae AS id_proposta
				     , seguro.id_proposta_mae_completo(p.id) AS id_proposta_completa
				     , p.nr_apolice
				     , ppn.ds_nome_proponente AS segurado
				     , ppn.cpf_cnpj
				     , ppn.ds_endereco_cep AS endereco_cep
				     , ppn.ds_endereco_rua AS endereco_rua
				     , ppn.ds_endereco_nro AS endereco_numero
				     , ppn.ds_endereco_complem AS endereco_complemento
				     , ppn.ds_endereco_rua || ' ' || ppn.ds_endereco_nro || ' ' || ppn.ds_endereco_complem AS endereco
				     , ppn.ds_endereco_bairro AS endereco_bairro
				     , ppn.ds_email_proponente AS email
				     , m.ds_nome_municipio AS cidade
				     , e.ds_sigla AS uf
				     , s.ds_status
				     , s.cd_status
				     , CASE WHEN spej.id is null THEN 'Sim' ELSE 'Não' END AS email_proprio
				 FROM seguro.propostas p
               INNER JOIN seguro.propostas_endosso pe
                       ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
               INNER JOIN seguro.propostas_proponentes ppn
                       ON p.id = ppn.id_proposta
               INNER JOIN sistema.municipios m
                       ON ppn.id_municipio = m.id
               INNER JOIN sistema.estados e
                       ON m.id_estado = e.id
               INNER JOIN sistema.status s
                       ON p.id_status = s.id
               INNER JOIN produto.produtos pd
                       ON pd.id = p.id_produto
               LEFT JOIN seguro.propostas_email_justificativa spej
                       ON spej.id_proposta = p.id
		   		WHERE ".substr($filtro, 0, -4) ."
		   	 ORDER BY p.id_proposta_mae ASC
		   	        , p.id ASC
				";

		return $this->fetchAll($sql);
	}
	
	public function relatorioTaxasComissoes($id_safra="", $arProduto=""){
	    
	    $filtro = ($id_safra) ? "pd.id_safra=".$id_safra." and " : '';
	    
	    if(is_array($arProduto)){
	        $filtro .= "pd.id in (".implode("," , $arProduto).") and ";
	    }
	    
	    $sql = "
        	SELECT
            	ta.id as id_validacao,
            	ta.ds_nome_agrupamento_taxas as nome_validacao,
                case
                    when tp_taxa_agrupamento='M' then 'Município'
                    when tp_taxa_agrupamento='E' then 'UF'
                    when tp_taxa_agrupamento='P' then 'Proponente'
                    when tp_taxa_agrupamento='U' then 'Usuário'
                    when tp_taxa_agrupamento='O' then 'Orçamento'
                    end as tipo_validacao,
                pd.ds_nome_produto,
                case when ta.fl_ativo=true then 'S' else 'N' end as ativo,
                ta.vl_comissao,
                ta.id_secao
            FROM
                comercializacao.taxas_agrupamento ta
                INNER JOIN produto.produtos pd on pd.id = ta.id_produto
            WHERE
                ".$filtro."
                1 = 1
            ORDER BY
                pd.ds_nome_produto
		";
	    
	    return $this->fetchAll($sql);
	}

  public function consultaSubvencao($id_safra="", $arProduto="", $propostasCanceladas=false, $propostasVigentes=false){
      
      $filtro = ($id_safra) ? " AND pd.id_safra=".$id_safra."" : '';
      
      if(is_array($arProduto)){
          $filtro .= " AND pd.id in (".implode("," , $arProduto).")";
	  }

      if ($propostasCanceladas) {
        $status = "'PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA'";
      } else {
        $status = "'PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'PROPOSTA_CANCELADA', 'APOLICE_CANCELADA', 'SOLICITACAO_CANCELADA'";
	  }
	  
	  if ($propostasVigentes) {
		$vigente = ' AND pe.fl_proposta_vigente = TRUE ';
	  }
      
      $this->_db->query("SELECT seguro.sumario_parcelas(0);");

      $sql = "
			SELECT p.id
				, p.id_proposta_mae
				, seguro.id_proposta_mae_completo(p.id) AS id_proposta_completo
				, p.nr_apolice
			    , case
                    when pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
                        then 'FRUTAS E HORTALIÇAS'
                    when pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . "
                        then case
                                when pg.tp_epoca_cultivo = 'I'
                                    then ptp.ds_tipo_produto || ' RN - INVERNO'
                                else ptp.ds_tipo_produto || ' RN - VERÃO'
                             end
                    when pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . "
                        then case
                                when pg.tp_epoca_cultivo = 'I'
                                    then 'GRÃOS PG - INVERNO'
                                else 'GRÃOS PG - VERÃO'
                             end
                    else ptp.ds_tipo_produto
                 end as tipo_produto
                , sp.id as id_proponente
				, pp.cpf_cnpj
				, pg.ds_nome_produto_geral AS produto
				, c.ds_nome_cultura AS cultura
				, CASE WHEN TRIM(pq_federal.ds_resposta) = '1' THEN
					'Sim'
						WHEN TRIM(pq_federal.ds_resposta) = '0' THEN
					'Não'
				ELSE
					null
				END AS quest_sub_federal
				, CASE WHEN TRIM(pq_estadual.ds_resposta) = '1' THEN
					'Sim'
						WHEN TRIM(pq_estadual.ds_resposta) = '0' THEN
					'Não'
				ELSE
					null
				END AS quest_sub_estadual
				, CASE
				    WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
				      THEN '-'
				      ELSE ss_subvencao_federal.ds_status
				   END AS quest_sub_federal_confirmada
				, CASE
				    WHEN ss_subvencao_estadual.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
				      THEN '-'
				      ELSE ss_subvencao_estadual.ds_status
				   END AS quest_sub_estadual_confirmada
				, pat.valor_subvencao_federal AS subvencao_federal
				, pat.valor_subvencao_estadual AS subvencao_estadual
				, st.ds_status AS status
				, seguro.nr_endosso(p.id,p.id_endosso) as nro_endosso
				, st_documento.ds_status as status_documento
				, string_agg(ap.ds_nome_pendencia,' ,') AS pendencias
			FROM seguro.propostas p
		INNER JOIN seguro.propostas_endosso pe
				ON p.id = pe.id_proposta
				$vigente
		INNER JOIN sumario_parcelas pat
				ON pat.id_endosso = pe.id_endosso
		INNER JOIN produto.produtos pd
				ON pd.id = p.id_produto
		INNER JOIN produto.produtos_geral pg
				ON pd.id_produto_geral = pg.id
        INNER JOIN produto.tipo_produto ptp
				ON ptp.id = pg.id_tipo_produto
		INNER JOIN produto.culturas c
				ON pg.id_cultura = c.id
		INNER JOIN seguro.propostas_proponentes pp
				ON pp.id_proposta = p.id
        INNER JOIN seguro.proponentes sp
				ON sp.cpf_cnpj = pp.cpf_cnpj
		INNER JOIN sistema.status st
				ON st.id = p.id_status
		INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = p.id_proposta_mae
		INNER JOIN sistema.status ss_subvencao_estadual ON ss_subvencao_estadual.id = sps.id_status_subvencao_estadual
		INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
		LEFT JOIN seguro.propostas_questionario pq_federal
				ON p.id = pq_federal.id_proposta
			AND pq_federal.id_atributo_rn = 19 -- QUEST_SUBVENCAO_FEDERAL
		LEFT JOIN seguro.propostas_questionario pq_estadual
				ON p.id = pq_estadual.id_proposta
			AND pq_estadual.id_atributo_rn = 21 -- QUEST_SUBVENCAO_ESTADUAL
		LEFT JOIN seguro.propostas_consulta_cadin pcc
				ON pcc.id_proposta = p.id_proposta_mae
			AND pcc.fl_ativo = TRUE
			AND pcc.fl_retorno_pendente = FALSE
			AND pcc.fl_sucesso = TRUE
		LEFT JOIN seguro.propostas_status_doc_fisico psdf
			 ON psdf.id_proposta = p.id
			AND psdf.fl_ativo = TRUE
		LEFT JOIN sistema.status st_documento
				ON st_documento.id = psdf.id_status
		LEFT JOIN seguro.propostas_pendencias_documento_fisico ppdf
				ON ppdf.id_proposta = p.id
		LEFT JOIN atendimento.pendencias ap
				ON ap.id = ppdf.id_pendencia
			WHERE st.ds_chave NOT IN ($status)
			$filtro
		GROUP BY p.id
				, p.id_proposta_mae
				, p.nr_apolice
				, pp.ds_nome_proponente
				, pp.cpf_cnpj
				, pg.ds_nome_produto_geral
				, c.ds_nome_cultura
				, pq_federal.ds_resposta
				, pq_estadual.ds_resposta
				, pcc.fl_sucesso
				, ss_subvencao_federal.ds_chave
				, ss_subvencao_federal.ds_status
				, ss_subvencao_estadual.ds_chave
				, ss_subvencao_estadual.ds_status
				, st.ds_status
				, pat.valor_subvencao_federal
				, pat.valor_subvencao_estadual
				, st_documento.ds_status
				, ap.ds_nome_pendencia
				, pg.id_tipo_produto
				, ptp.ds_tipo_produto
				, pg.tp_epoca_cultivo
				, sp.id
				, pg.id
		ORDER BY p.id_proposta_mae DESC
    ";

      return $this->fetchAll($sql);
  }

  public function relatorioSubvencaoPsrPR($id_safra="",$arProduto=""){
    
    $filtro  = ($id_safra)   ? "pd.id_safra=".$id_safra." and " : '';
    if(is_array($arProduto)){
      $filtro .= "pd.id in (".implode("," , $arProduto).") and ";
    }

    $this->_db->query("
          CREATE temp TABLE tmp_propostas AS (
            SELECT
              pr.id,
              pr.id as id_proposta,
              pr.id_endosso,
              lpt.dt_transmissao,
              EXTRACT(YEAR FROM pr.dt_criacao) AS ano_proposta,
              id_proposta_renovada,
              id_versao,
              seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
              nr_apolice,
              TO_CHAR(apolice.dt_criacao_max, 'DD/MM/YYYY') AS dt_apolice,
              to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
              to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
              vl_custo_apolice,
              id_status,
              pr.id_usuario_criacao,
              nr_digito_verificador,
              id_produto,
              to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
              seguro.id_proposta_mae(pr.id) as id_proposta_mae,
              seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
            FROM
              seguro.propostas pr
			  inner join produto.produtos pd ON ".$filtro. " pd.id = pr.id_produto
			  INNER JOIN (
			  	  SELECT
			  	  	  propostas.id AS id_proposta
			  	  	  ,to_char(dt_transmissao,'DD/MM/YYYY HH24:MI:SS') AS dt_transmissao
			  	  FROM seguro.propostas
			  ) AS lpt ON lpt.id_proposta = pr.id_proposta_mae
              LEFT JOIN (
                    SELECT MAX(ps.dt_criacao) AS dt_criacao_max
                       , pr.id AS id_proposta
                      FROM seguro.propostas pr
                  INNER JOIN seguro.propostas_status ps
                      ON ps.id_proposta = pr.id
                  INNER JOIN sistema.status st
                      ON st.id = ps.id_status
                     WHERE st.ds_chave = 'APOLICE_EMITIDA'
                    GROUP BY pr.id
                    ) apolice
                ON apolice.id_proposta = pr.id_proposta_mae
              )
        ");

    $this->_db->query("CREATE temp TABLE tmp_produtividade_estimada AS (select AVG(vl_rendimento_tonelada) as prod_estimada,it.id_proposta from seguro.itens_segurados it where it.vl_rendimento_tonelada > 0 group by it.id_proposta)");
    $this->_db->query("CREATE temp TABLE tmp_produtividade_garantida AS (select AVG(vl_producao_garantida) as prod_garantida,it.id_proposta from seguro.itens_segurados_complemento  isc, seguro.itens_segurados it where it.id = isc.id_item_segurado and isc.vl_producao_garantida > 0 group by it.id_proposta)");
    $this->_db->query("SELECT seguro.sumario_parcelas_consulta_cadin(0);");
    
    $sql = "
    SELECT DISTINCT pr.id
         , LPAD(REPLACE(REPLACE(seguro.id_proposta_mae_completo(pr.id),'.',''),'-',''),30,'0') AS id_proposta_composto
         , pr.id_proposta_mae
         , pr.dt_apolice
         , pr.nr_apolice
         , pr.dt_transmissao
         , pr.nr_endosso
         , CASE
             WHEN ss_subvencao_estadual.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
               THEN '-'
               ELSE ss_subvencao_estadual.ds_status
           END AS subvencao_concedida_confirmada
         , pq_cadpro.ds_resposta AS cadpro
         , st.ds_status
         , c.ds_nome_cultura AS cultura
         , ano_proposta
         , '' AS ds_atividade
         , '' AS ds_lote
         , '12' AS codigo_seguradora
         , to_char(lpt.dt_criacao, 'dd/mm/yyyy') AS dt_vigencia_inicio
         , po.cpf_cnpj AS cpf_cnpj
         , po.ds_nome_proponente
         , CASE WHEN pg.id_tipo_produto = '3' THEN
              'Multirrisco'
           ELSE
              'Risco Nomeado'
           END AS ds_caracterizacao_cobertura
         , (CASE WHEN pg.id_tipo_produto = '3' THEN
               pco.vl_franquia || ' '
           ELSE
               '-'
           END)::varchar AS vl_nivel_cobertura
         , (CASE WHEN pat.valor_total > 0 THEN
              ROUND((pat.valor_subvencao_federal/pat.valor_total), 2)
           ELSE
              0
           END) AS vl_percentual_subvencao
         , pat.valor_subvencao_federal
         , pat.valor_subvencao_estadual
         , pat.valor_total
         , pp.ds_nome_propriedade
         , pp.ds_endereco as ds_endereco_propriedade
         , pp.ds_endereco_nro as ds_endereco_nro_propriedade
         , pp.ds_endereco_complemento as ds_endereco_complemento_propriedade
         , m.ds_nome_municipio AS ds_nome_municipio_propriedade
         , e.ds_sigla AS ds_sigla_propriedade
         , pp.ds_endereco_cep AS ds_endereco_cep_propriedade
         , po.ds_endereco_rua AS ds_endereco_segurado
         , po.ds_endereco_nro AS ds_endereco_nro_segurado
         , CASE WHEN po.ds_endereco_complem IS NULL OR po.ds_endereco_complem = '' THEN
              po.ds_endereco_bairro
           ELSE
              po.ds_endereco_complem
           END AS ds_endereco_complemento_segurado
         , m2.ds_nome_municipio AS ds_nome_municipio_segurado
         , e2.ds_sigla AS ds_sigla_segurado
         , po.ds_endereco_cep AS ds_endereco_cep_segurado
         , ROUND(tpe.prod_estimada, 3) AS produtividade_estimada
         , CASE WHEN pg.id_tipo_produto = '3' THEN
               ROUND(tpg.prod_garantida, 3)
           ELSE
               ROUND(tpe.prod_estimada, 3)
           END AS produtividade_garantida
         , ist.vl_area
         , ist.vl_lmga AS importancia_segurada
         , '' AS coord1
         , '' AS coord2
         , '' AS coord3
         , 'S' as coord4
         , '' AS coord5
         , '' AS coord6
         , '' AS coord7
         , 'W' as coord8
      FROM seguro.propostas_endosso pe
INNER JOIN tmp_propostas pr
        ON pe.id_proposta = pr.id
INNER JOIN seguro.propostas_propriedades pp
        ON pp.id_proposta = pr.id
INNER JOIN seguro.propostas_proponentes po
        ON po.id_proposta = pr.id
INNER JOIN seguro.propostas_corretores pc
        ON pc.id_proposta = pr.id
INNER JOIN sistema.municipios m
        ON m.id = pp.id_municipio
INNER JOIN sistema.estados e
        ON e.id = m.id_estado
INNER JOIN sistema.municipios m2
        ON m2.id = po.id_municipio
INNER JOIN sistema.estados e2
        ON e2.id = m2.id_estado
INNER JOIN produto.produtos pd
        ON pd.id = pr.id_produto
INNER JOIN sistema.empresas emp
        ON emp.id = pd.id_seguradora
INNER JOIN produto.produtos_geral pg
        ON pg.id = pd.id_produto_geral
INNER JOIN produto.culturas c
        ON c.id = pg.id_cultura
INNER JOIN sumario_parcelas pat
        ON pat.id_endosso = pr.id_endosso
INNER JOIN sistema.status st
        ON st.id = pr.id_status
INNER JOIN seguro.propostas_status ps
        ON ps.id_proposta = pr.id
       AND ps.id_status = st.id
       AND ps.fl_ativo = true
INNER JOIN sistema.usuarios u
        ON pr.id_usuario_criacao = u.id
INNER JOIN sumario.itens_segurados ist
        ON ist.id_proposta = pr.id
INNER JOIN seguro.propostas_coberturas pco
        ON pco.id_proposta = pr.id
       AND pco.fl_principal = true
INNER JOIN log.propostas_transmissao lpt
        ON lpt.id_proposta = pr.id_proposta_mae
       AND lpt.id_status = 3
       AND lpt.ds_tipo_transmissao = 'EMITIR_PROPOSTA'
INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
INNER JOIN sistema.status ss_subvencao_estadual ON ss_subvencao_estadual.id = sps.id_status_subvencao_estadual
LEFT JOIN seguro.propostas_questionario pq_cadpro
       ON pq_cadpro.id_proposta = pr.id_proposta_mae
      AND pq_cadpro.id_atributo_rn = 177
 LEFT JOIN tmp_produtividade_estimada tpe
        ON tpe.id_proposta = pr.id
 LEFT JOIN tmp_produtividade_garantida tpg
        ON tpg.id_proposta = pr.id
     WHERE $filtro
           st.ds_chave IN ('APOLICE_EMITIDA', 'ENVIADA_AGUARDANDO_CONF', 'TRANSMITIDA_SEGURADORA', 'AGUARDANDO_EMISSAO', 'AGUARDANDO_ENVIO_SEG', 'AGUARDANDO_VISTORIA_PREVIA', 'CONF_PENDENCIAS')
       AND pe.fl_proposta_vigente = true
       AND pc.id_usuario <> 487 --(corretor teste)
       AND e.ds_sigla = 'PR' --relatorio somente para o parana
  ORDER BY pr.id
        ";
        
    return $this->fetchAll($sql);
  }

  public function consultaComissaoCorretor($id_safra="", $id_usuario=null, $tp_usuario=""){
      
      $filtro = ($id_safra) ? " AND safras.id = ".$id_safra." " : '';
      if ($id_usuario && $tp_usuario == 'C') {
        $filtro .= " AND corretores.id_usuario = ".$id_usuario." ";
      }
      
      $sql = "
        SELECT safras.ds_nome_safra AS safra
         , propostas.id_proposta_mae AS id_proposta
         , propostas_proponentes.ds_nome_proponente AS segurado
         , propostas_proponentes.cpf_cnpj
         , corretores.ds_nome_abreviado AS corretor
         , prepostos.ds_nome_preposto AS preposto
         , produtos.ds_nome_abreviado AS produto
         , culturas.ds_nome_cultura AS cultura
         , estado_propriedade.ds_sigla AS estado
         , municipio_propriedade.ds_nome_municipio AS municipio
         , propostas_corretores.vl_comissao AS comissao_corretor
         , TO_CHAR(propostas.dt_transmissao, 'DD/MM/YYYY') AS data_transmissao
         , status_proposta.ds_status AS status_proposta
         , propostas.nr_apolice AS apolice
         , digitador.ds_nome_usuario AS digitador
      FROM seguro.propostas
INNER JOIN seguro.propostas_proponentes
        ON propostas.id = propostas_proponentes.id_proposta
INNER JOIN seguro.propostas_endosso
        ON propostas.id = propostas_endosso.id_proposta
       AND propostas_endosso.fl_proposta_vigente = true
INNER JOIN produto.produtos
        ON propostas.id_produto = produtos.id
INNER JOIN produto.safras
        ON produtos.id_safra = safras.id
INNER JOIN produto.produtos_geral
        ON produtos.id_produto_geral = produtos_geral.id
INNER JOIN produto.culturas
        ON produtos_geral.id_cultura = culturas.id
INNER JOIN seguro.propostas_corretores
        ON propostas.id = propostas_corretores.id_proposta
INNER JOIN sistema.corretores
        ON propostas_corretores.id_usuario = corretores.id_usuario
INNER JOIN seguro.propostas_propriedades
        ON propostas.id = propostas_propriedades.id_proposta
INNER JOIN sistema.municipios AS municipio_propriedade
        ON propostas_proponentes.id_municipio = municipio_propriedade.id
INNER JOIN sistema.estados AS estado_propriedade
        ON municipio_propriedade.id_estado = estado_propriedade.id
INNER JOIN sistema.status AS status_proposta
        ON propostas.id_status = status_proposta.id
 LEFT JOIN sistema.prepostos
        ON propostas.id_usuario_criacao = prepostos.id_usuario
 LEFT JOIN sistema.usuarios AS digitador
        ON propostas.id_usuario_criacao = digitador.id
     WHERE status_proposta.ds_chave NOT IN ('PROPOSTA_INCOMPLETA', 'DEVOLVIDA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA')
       {$filtro}
  ORDER BY propostas.id_proposta_mae DESC;
    ";

      return $this->fetchAll($sql);
  }
  
  public function relatorioEndossoRestituicaoSubvencao($id_safra = ""){
      
      $filtro = ($id_safra == 'TODAS' || $id_safra < 16) ? "pd.id_safra >= 16 and " : "pd.id_safra = ".$id_safra." and ";
      
      $sql = "SELECT
            	sf.ds_nome_safra,
            	pr.id,
            	pr.id_proposta_mae,
            	seguro.id_proposta_mae_completo_sem_formatacao(pr.id_proposta_mae) as propostas_completa,
            	pr.ds_identificador_seguradora as id_endosso_essor,
            	nr_apolice,
            	pr.id_endosso,
            	seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
            	st.ds_chave as ds_status,
            	te.ds_tipo as ds_tipo_endosso,
            	pat.valor_subvencao_federal,
            	pat.valor_subvencao_estadual,
            	CASE
                  WHEN ss_subvencao_federal.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
                    THEN '-'
                    ELSE ss_subvencao_federal.ds_status
                 END AS ds_subvencao_federal_concedida,
            	CASE
				  WHEN ss_subvencao_estadual.ds_chave = '" . Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO . "'
				    THEN '-'
				    ELSE ss_subvencao_estadual.ds_status
				 END AS ds_subvencao_estadual_concedida
            FROM
            	seguro.propostas pr
            	INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
            	INNER JOIN produto.safras sf ON sf.id = pd.id_safra
            	INNER JOIN sistema.status st ON st.id = pr.id_status
            	INNER JOIN seguro.propostas_endosso_opcoes peo ON pr.id = peo.id_proposta
            	INNER JOIN seguro.tipo_endosso te ON te.id = peo.id_endosso_opcao
            	INNER JOIN (
            		select
            		    id_proposta,
            		    sum(vl_subvencao_federal) as valor_subvencao_federal,
            		    sum(vl_subvencao_estadual) as valor_subvencao_estadual
            		from
            		    seguro.propostas_parcelas
            		group by id_proposta
            	) pat on pat.id_proposta = pr.id
            	INNER JOIN seguro.propostas_subvencao sps ON sps.id_proposta = pr.id_proposta_mae
                INNER JOIN sistema.status ss_subvencao_estadual ON ss_subvencao_estadual.id = sps.id_status_subvencao_estadual
                INNER JOIN sistema.status ss_subvencao_federal ON ss_subvencao_federal.id = sps.id_status_subvencao_federal
            	LEFT JOIN seguro.propostas_consulta_cadin pca ON pca.fl_ativo = true AND pca.id_proposta = pr.id_proposta_mae	
            WHERE
                 ".$filtro."
                 st.ds_chave in ('APOLICE_EMITIDA', 'APOLICE_CANCELADA')
                 AND (pat.valor_subvencao_federal < 0 or pat.valor_subvencao_estadual < 0)
            ORDER BY
                 pr.id_proposta_mae,
                 pr.id
				";
      
      return $this->fetchAll($sql);
  }

  public function retornosSeguradora($dataInicio, $dataFim)
  {
    $dataInicio = Agro_Util::formatDate($dataInicio, Zend_Date::W3C);
    $dataFim = Agro_Util::formatDate($dataFim, Zend_Date::W3C);

    $sql = "
      SELECT DISTINCT 
              propostas.id_proposta_mae as id_proposta_mae,
              propostas.id as id_proposta_endosso,
              log.id,
              log.ds_tipo_transmissao,
              case when log.fl_sucesso = true then 'Sim' else 'Não' end as fl_sucesso,
              log.ds_retorno,
              to_char(log.dt_criacao,'DD/MM/YYYY HH24:MI:SS') AS dt_criacao
      FROM log.v_propostas_transmissao AS log
      INNER JOIN seguro.propostas ON propostas.id = log.id_proposta
      WHERE log.dt_criacao::date BETWEEN '{$dataInicio}'::date and '{$dataFim}'::date
      ORDER BY propostas.id_proposta_mae, propostas.id, log.id DESC;
    ";

    return $this->fetchAll($sql);
  }

  public function relatorioVistoriaPreviaTransmitida($id_safra = "", $arProduto = "")
  {
    $filtro = '';
    $aliasSafra = 'regulacao';

    if (!empty($id_safra)) {
      $filtro = " AND pd.id_safra=".$id_safra." ";

      if ($id_safra <= 17) {
        $aliasSafra = "safra".$id_safra;
      }
    }

    if(is_array($arProduto)){
      $filtro .= " AND pd.id in (".implode("," , $arProduto).") ";
    }

    if($flRelatorioEmpresas && $User->id_empresa != '20'){
      $User    = Zend_Auth::getInstance()->getIdentity();
      $filtro .= " AND ve.id_empresa = ".$User->id_empresa." ";
    }

    $this->_db->query("
      CREATE temp TABLE itens_segurados_temp AS (
        SELECT count(its.id) AS total_itens,
               id_proposta,
               max(itsc.dt_semeadura) AS data_semeadura 
          FROM seguro.itens_segurados its, 
               seguro.itens_segurados_complemento itsc 
         WHERE itsc.id_item_segurado=its.id 
         GROUP BY id_proposta
      )
    ");

    $this->_db->query("
      CREATE temp TABLE processos_temp AS (
        SELECT pr.id_endosso,
               sp.id AS id_processo
          FROM seguro.propostas pr
          JOIN seguro.propostas_endosso pe ON pe.id_proposta = pr.id 
                                          AND pe.fl_proposta_vigente = true
          JOIN sinistro.processos sp ON sp.id_proposta = pr.id
      )
    ");

    $this->_db->query("
      CREATE temp TABLE vistorias_previas_temp AS (
        SELECT id_endosso,
               id_vistoria,
               vp.id,
               vp.id_status,
               id_proposta_solicitacao,
               id_status_analise,
               vp.dt_criacao, 
               CASE WHEN vp.fl_transmitido_tablet = true AND vp.fl_transmitido = true THEN 'Digital'
                    WHEN vp.fl_transmitido_tablet is null and vp.fl_transmitido = true THEN 'Manual'
                    ELSE ''
               END AS tp_preenchimento 
          FROM seguro.propostas p
          JOIN seguro.propostas_vistorias_previas vp ON vp.id_proposta = p.id
      )
    ");

    $regex = '\\"(.*?)\\"';
    $this->_db->query("
      CREATE temp TABLE observacoes_itens_segurados_temp AS (
        SELECT x.id_laudo_previa,
               array_to_string(array_agg(x.motivos_negacao), ', ') as motivos_negacao 
          FROM (
            SELECT DISTINCT lis.id_laudo_previa, 
                   btrim(REGEXP_MATCHES(lis.motivos_negacao, '". $regex ."', 'g')::TEXT, '{}\"') as motivos_negacao
              FROM regulacao.lvp001 l
              JOIN ".$aliasSafra.".lvp001_itens_segurados lis ON lis.id_laudo_previa = l.id
              WHERE (lis.motivos_negacao <> '".'{""}'."' OR lis.motivos_negacao <> NULL)
              ORDER BY lis.id_laudo_previa
          ) AS x GROUP BY x.id_laudo_previa
      )
    ");

    $sql = "SELECT DISTINCT pr.id_proposta_mae AS id,
                            s1.ds_chave,
                            pd.ds_nome_produto,
                            sub.total_itens,
                            m.ds_nome_municipio,
                            e.ds_sigla,
                            CASE WHEN s2.ds_chave = 'ENC' THEN 'ENCAMINHADA'
                                 ELSE s2.ds_chave
                            END AS ds_status_vistoria,
                            tp_preenchimento,
                            s3.ds_status AS ds_status_analise,
                            ep.ds_nome_fantasia,
                            CASE WHEN pd.id_safra = '13' THEN TO_CHAR(sf13.dt_laudo, 'dd/mm/yyyy')
                                 WHEN pd.id_safra = '14' THEN TO_CHAR(sf14.dt_laudo, 'dd/mm/yyyy')
                                 WHEN pd.id_safra = '15' THEN TO_CHAR(sf15.dt_laudo, 'dd/mm/yyyy')
                                 WHEN pd.id_safra = '16' THEN TO_CHAR(sf16.dt_laudo, 'dd/mm/yyyy')
                                 WHEN pd.id_safra = '17' THEN TO_CHAR(sf17.dt_laudo, 'dd/mm/yyyy')
                                 ELSE TO_CHAR(l.dt_laudo, 'dd/mm/yyyy')
                            END AS dt_vistoria,
                            co.ds_nome_abreviado,
                            CASE WHEN sp.id_processo IS NOT NULL THEN 'Sim'
                                 ELSE 'Não'
                            END AS fl_sinistro,
                            seguro.count_endosso(pr.id_endosso) AS nr_endosso,
                            l.prioridade_conferencia,
                            '\"' || replace(replace(l.ds_observacao, ';', ':'), '.', '. ') || '\"' AS obs_laudo,
                            (SELECT motivos_negacao FROM observacoes_itens_segurados_temp oist WHERE oist.id_laudo_previa = l.id) AS obs_app,
                            CASE WHEN EXISTS(SELECT 1 FROM regulacao.lvp001_croqui lc WHERE lc.id_laudo = l.id AND ds_coordenadas_poligono IS NOT NULL LIMIT 1) THEN 'SIM'
                                 ELSE 'NÃO'
                            END AS croqui
              FROM seguro.propostas_endosso pre
              JOIN seguro.propostas pr ON pre.id_proposta = pr.id
              JOIN itens_segurados_temp sub ON sub.id_proposta = pr.id
              JOIN vistorias_previas_temp pv ON pr.id_endosso = pv.id_endosso AND pre.fl_proposta_vigente = true
              JOIN sistema.vistorias_empresas ve ON ve.fl_ativo = true AND ve.id_vistoria = pv.id_vistoria
              JOIN produto.produtos pd ON pd.id = pr.id_produto
              JOIN sistema.status s1 ON s1.id = pr.id_status
              JOIN sistema.status s2 ON s2.id = pv.id_status
              JOIN sistema.status s3 ON s3.id = pv.id_status_analise
              JOIN sistema.empresas ep ON ve.id_empresa = ep.id
              JOIN seguro.propostas_propriedades po ON po.id_proposta = pr.id
              JOIN sistema.municipios m ON m.id = po.id_municipio
              JOIN sistema.estados e ON e.id = m.id_estado
              JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
              JOIN sistema.corretores co ON co.id_usuario = pc.id_usuario
              LEFT JOIN processos_temp sp ON sp.id_endosso = pr.id_endosso
              LEFT JOIN sistema.vistorias_agendamentos va ON va.id_vistoria = pv.id_vistoria
              LEFT JOIN regulacao.lvp001 l ON l.id_proposta_vistoria = pv.id
              LEFT JOIN safra13.lvp001 sf13 ON sf13.id_proposta_vistoria = pv.id
              LEFT JOIN safra14.lvp001 sf14 ON sf14.id_proposta_vistoria = pv.id
              LEFT JOIN safra15.lvp001 sf15 ON sf15.id_proposta_vistoria = pv.id
              LEFT JOIN safra16.lvp001 sf16 ON sf16.id_proposta_vistoria = pv.id
              LEFT JOIN safra17.lvp001 sf17 ON sf17.id_proposta_vistoria = pv.id
              LEFT JOIN regulacao.lvp001_croqui lc ON lc.id_laudo = l.id
             WHERE s2.ds_chave IN ('TRANSMITIDA', 'TRANSMITIDA_SEM_FOTOS')" . $filtro;
        
        $result = $this->fetchAll($sql);

        //remove as temp tables
        $this->_db->query("DROP TABLE IF EXISTS observacoes_itens_segurados_temp");
        $this->_db->query("DROP TABLE IF EXISTS itens_segurados_temp");
        $this->_db->query("DROP TABLE IF EXISTS processos_temp");
        $this->_db->query("DROP TABLE IF EXISTS vistorias_previas_temp");

    return $result;
  }

  public function relatorioControleEmissoes($idSafra="", $produtos="") 
  {
	$filtro = " st.cd_status in (10, 11, 16, 17) ";

    if (!empty($idSafra)) {
		$filtro .= " AND pd.id_safra IN ( ". $idSafra .", ". ($idSafra - 1) .", ". ($idSafra - 2) ." ) ";
	}
  
	if(is_array($produtos)) {
		$filtro .= " AND pdg.id IN ( SELECT id_produto_geral FROM produto.produtos WHERE produtos.id IN (".implode("," , $produtos).")) ";
	}

	$sql = "
		SELECT sf.ds_nome_safra,
			pr.id_proposta_mae,
			seguro.nr_endosso(pr.id, pr.id_endosso) || ' ' as nr_endosso,
			ste.ds_tipo as tp_endosso,
			pr.nr_apolice as nr_apolice,
			ds_status as ds_status,
			to_char(apolice.dt_criacao_max, 'DD/MM/YYYY') as dt_emissao_apolice,
			COALESCE((select sum(vl_segurado) from seguro.propostas_parcelas where id_proposta = pr.id),'0.00') as vl_segurado,
			COALESCE((select sum(vl_subvencao_federal) from seguro.propostas_parcelas where id_proposta = pr.id),'0.00') as vl_subvencao_federal,
			COALESCE((select sum(vl_subvencao_estadual) from seguro.propostas_parcelas where id_proposta = pr.id),'0.00') as vl_subvencao_estadual
		FROM seguro.propostas_endosso pre
		JOIN seguro.propostas pr ON pre.id_proposta = pr.id
		JOIN produto.produtos pd ON pd.id = pr.id_produto
		JOIN produto.produtos_geral pdg ON pdg.id = pd.id_produto_geral
		JOIN produto.safras sf ON sf.id = pd.id_safra
		JOIN sistema.status st ON st.id = pr.id_status
		LEFT JOIN seguro.propostas_endosso_opcoes speo ON speo.id_proposta = pr.id
		LEFT JOIN seguro.tipo_endosso ste ON ste.id = speo.id_endosso_opcao
		LEFT JOIN (
			SELECT MAX(ps.dt_criacao) AS dt_criacao_max,
				pr.id AS id_proposta
				FROM seguro.propostas pr
				JOIN seguro.propostas_status ps ON ps.id_proposta = pr.id
				JOIN sistema.status st ON st.id = ps.id_status
				WHERE st.ds_chave = 'APOLICE_EMITIDA'
				GROUP BY pr.id
		) apolice ON apolice.id_proposta = pr.id
		WHERE {$filtro}
		ORDER BY sf.id desc, pr.id_proposta_mae desc, nr_endosso
	";
	
	return $this->fetchAll($sql);
  }

  public function relatorioControleSafraDataEmissaoApolices(array $idsSafra, ?array $produtos)
  {
	$filtro  = " pd.id_safra in (" .implode("," , $idsSafra). ") "; 
	$filtro .= " AND pr.id = pr.id_proposta_mae ";
	$filtro .= " AND pr.id_status not in (2, 4) ";

	if(is_array($produtos)) {
		$filtro .= " AND pdg.id IN ( SELECT id_produto_geral FROM produto.produtos WHERE produtos.id IN (".implode("," , $produtos).")) ";
	}

	$sql = "
		SELECT 
			pr.id_proposta_mae,
			regexp_replace(seguro.id_proposta_mae_completo(pr.id), '[-.]', '', 'g') as proposta_completo,
			pr.nr_apolice as nr_apolice,
			sf.ds_nome_safra,
			st.cd_status || ' - ' || st.ds_status as ds_status,
			COALESCE(to_char(transmissao.dt_criacao_min, 'DD/MM/YYYY'), to_char(pr.dt_transmissao,'DD/MM/YYYY')) AS dt_transmissao,
			to_char(apolice.dt_criacao_min, 'DD/MM/YYYY') as dt_emissao_apolice
		FROM seguro.propostas pr
		JOIN produto.produtos pd ON pd.id = pr.id_produto
		JOIN produto.produtos_geral pdg ON pdg.id = pd.id_produto_geral
		JOIN produto.safras sf ON sf.id = pd.id_safra
		JOIN sistema.status st ON st.id = pr.id_status
		LEFT JOIN (
			SELECT MIN(ps.dt_criacao) AS dt_criacao_min,
				pr.id AS id_proposta
				FROM seguro.propostas pr
				JOIN seguro.propostas_status ps ON ps.id_proposta = pr.id
				JOIN sistema.status st ON st.id = ps.id_status
				WHERE st.ds_chave = 'APOLICE_EMITIDA'
				GROUP BY pr.id
		) apolice ON apolice.id_proposta = pr.id
		LEFT JOIN (
			SELECT MIN(pt.dt_criacao) as dt_criacao_min,
				   pt.id_proposta
			  FROM log.propostas_transmissao pt
			  WHERE pt.fl_sucesso is TRUE
			  GROUP BY pt.id
		) transmissao ON transmissao.id_proposta = pr.id
		WHERE {$filtro}
		ORDER BY sf.id desc, pr.id_proposta_mae desc
	";

	return $this->fetchAll($sql);
  }

	/**
	 * Retorna os dados da relatório de devolução
	 *
	 * @param array $idsSafra
	 * @param int $motivo
	 * @param array|null $produtos
	 * @param array|null $corretores
	 *
	 * @return array
	 */
	public function relatorioDevolucao(array $idsSafra, int $motivo, ?array $produtos, ?array $corretores): array
	{
		$filtros = array();
		$filtros[] = "prod.id_safra IN (". implode(", ", $idsSafra) .")";

		if(!empty($produtos)) {
			$filtros[] = "pdg.id IN (SELECT id_produto_geral FROM produto.produtos WHERE produtos.id IN (".implode("," , $produtos).")) ";
		}

		if(!empty($corretores)) {
			$filtros[] = "pc.id_usuario IN (".implode("," , $corretores).")";
		}

		$where = implode(" AND " , $filtros);

		$sqlDataStatusCanceladaTemp = "
			CREATE temp TABLE data_status_cancelada_temp AS (
				SELECT MAX(ps.dt_criacao) AS dt_criacao_max,
					pr.id AS id_proposta
					FROM seguro.propostas pr
					JOIN seguro.propostas_status ps ON ps.id_proposta = pr.id
					JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
					JOIN produto.produtos prod ON prod.id = pr.id_produto
					JOIN produto.produtos_geral pdg ON pdg.id = prod.id_produto_geral
					JOIN produto.safras sf ON sf.id = prod.id_safra
					WHERE {$where}
					AND ps.id_status = ". Seguro_Model_Propostas::ID_STATUS_CANCELADA ."
					GROUP BY pr.id
			);
		";
		
		$sqlTransmissaoTemp = "
			CREATE temp TABLE transmissao_temp AS (
				SELECT  MIN(pt.dt_criacao) AS dt_criacao_min
					,pt.id_proposta     AS id_proposta
				FROM log.propostas_transmissao pt
				JOIN seguro.propostas pr ON pt.id_proposta = pr.id
				JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
				JOIN produto.produtos prod ON prod.id = pr.id_produto
				JOIN produto.produtos_geral pdg ON pdg.id = prod.id_produto_geral
				JOIN produto.safras sf ON sf.id = prod.id_safra
				WHERE {$where}
				AND pt.fl_sucesso is TRUE
				AND pt.ds_tipo_transmissao = 'EMITIR_PROPOSTA (Endosso)'
				GROUP BY pt.id_proposta
			);
		";

		if ($motivo == 1) {
			$where .= " AND seguro.nr_endosso(pr.id, pr.id_endosso) > 0 ";
		} else if ($motivo == 2) {
			$where .= " AND seguro.nr_endosso(pr.id, pr.id_endosso) = 0 ";
		}

        $whereStatusTentativaDevolucao = Seguro_Enum_PropostasDevolucoes::getStatusFilaAgendamento();

		$sql = "
			SELECT
				pr.id_proposta_mae,
				pr.id as id_proposta,
				sf.ds_nome_safra,
				seguro.nr_endosso(pr.id, pr.id_endosso) AS nr_endosso,
				regexp_replace(seguro.id_proposta_mae_completo(pr.id), '[-.]', '', 'g') as proposta_completa,
				pr.nr_apolice AS nr_apolice,
				pr.ds_identificador_seguradora AS id_endosso,
				(SELECT array_to_string(array_agg(pb.nr_parcela || '-' || pb.nu_boleto ORDER BY pb.nr_parcela), ', ') FROM seguro.proposta_boletos pb WHERE pb.id_proposta = pr.id GROUP BY pb.id_proposta ) AS numero_titulo,
				pp.ds_nome_proponente,
				pp.cpf_cnpj AS cpf_cnpj_proponente,
				CASE 
					WHEN pd.id_beneficiario is null THEN 'N'
					WHEN pd.id_beneficiario is not null AND pr.id_status = ". Sistema_Model_Status::ID_PROPOSTA_CANCELADA ."
						AND seguro.nr_endosso(pr.id, pr.id_endosso) = 0
						AND pcanc.id_proposta IS NOT NULL
							THEN 'N'
					ELSE 'S'
				END AS termo,
				be.cpf_cnpj AS cpf_cnpj_beneficiario,
				CASE WHEN seguro.nr_endosso(pr.id, pr.id_endosso) = 0
					THEN (SELECT sum(vl_segurado) FROM seguro.propostas_parcelas pp WHERE pp.id_proposta = pd.id_proposta AND (fl_pago IS true OR fl_liberar_devolucao IS true))
					WHEN seguro.nr_endosso(pr.id, pr.id_endosso) > 0
						THEN (SELECT sum(vl_segurado) * -1 FROM seguro.propostas_parcelas pp WHERE pp.id_proposta = pd.id_proposta)
					ELSE 0
				END as valor,
				CASE WHEN seguro.nr_endosso(pr.id, pr.id_endosso) = 0 THEN 'DEVOLUÇÃO/PROPOSTA RECUSADA' ELSE 'ENDOSSO DE RESTITUIÇÃO' END AS motivo,
				fp.ds_forma_pagamento AS tp_devolucao,
				b.ds_nome_banco AS instituicao_financeira,
				CASE WHEN ib.nu_digito_agencia is null THEN ib.ds_agencia ELSE ib.ds_agencia || '-' || ib.nu_digito_agencia END AS agencia,
				CASE WHEN ib.nu_digito_conta is null THEN ib.ds_conta ELSE ib.ds_conta || '-' || ib.nu_digito_conta END AS conta,
				CASE WHEN pd.fl_conta_conjunta is true THEN 'S' ELSE 'N' END as conta_conjunta,
				CASE WHEN ib.ds_tipo_conta is null THEN '' WHEN ib.ds_tipo_conta = 'C' THEN 'Corrente' WHEN ib.ds_tipo_conta = 'P' THEN 'Poupança' ELSE 'Ordem de Pagamento' END AS tipo_conta,
				CASE WHEN data_status_cancelada_temp.dt_criacao_max is NULL THEN to_char(transmissao_temp.dt_criacao_min, 'DD/MM/YYYY') ELSE to_char(data_status_cancelada_temp.dt_criacao_max, 'DD/MM/YYYY') END AS dt_inicio,
				c.ds_nome_fantasia as corretor,
				status_devolucao.ds_status AS ds_status_devolucao,
				CASE WHEN (EXISTS(SELECT 1 FROM seguro.propostas_devolucoes_arquivos pda WHERE pda.id_proposta_devolucao = pd.id and pda.fl_ativo is true)) THEN 'Sim' ELSE 'Não' END AS documento_anexado,
				to_char(pd.dt_programada, 'DD/MM/YYYY') AS dt_programada
				, CASE WHEN tentativas_devolucao.total_tentativas_devolucao > 0 THEN tentativas_devolucao.total_tentativas_devolucao ELSE 0 END AS total_tentativas_devolucao
				, to_char(pds.dt_criacao, 'DD/MM/YYYY HH24:MI:SS') as data_ultima_alteracao
				, pds.ds_observacao as observacao
			FROM seguro.propostas_devolucoes pd
			JOIN seguro.propostas_devolucoes_status pds ON pds.id_proposta_devolucao = pd.id AND pds.fl_ativo is true
			JOIN sistema.status status_devolucao ON status_devolucao.id = pds.id_status
			JOIN seguro.propostas pr ON pr.id = pd.id_proposta
			JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr.id
			JOIN produto.produtos prod ON prod.id = pr.id_produto
			JOIN produto.produtos_geral pdg ON pdg.id = prod.id_produto_geral
			JOIN produto.safras sf ON sf.id = prod.id_safra
			JOIN sistema.status st ON st.id = pr.id_status
			JOIN seguro.propostas_corretores pc ON pc.id_proposta = pr.id
			JOIN sistema.corretores c ON c.id_usuario = pc.id_usuario
			LEFT JOIN seguro.beneficiarios be ON be.id = pd.id_beneficiario
			LEFT JOIN sistema.formas_pagamento fp ON fp.id = pd.id_forma_pagamento
			LEFT JOIN sistema.informacoes_bancarias ib ON ib.id = pd.id_informacao_bancaria
			LEFT JOIN sistema.bancos b ON b.id = ib.id_banco
			LEFT JOIN  data_status_cancelada_temp ON data_status_cancelada_temp.id_proposta = pr.id
			LEFT JOIN transmissao_temp ON transmissao_temp.id_proposta = pr.id
			LEFT JOIN seguro.propostas_cancelamento pcanc ON pcanc.id_proposta = pd.id_proposta AND pcanc.id_motivo_cancelamento = "
				. Atendimento_Model_TipoCancelamento::MOTIVO_CANCELADA_A_PEDIDO_CORRETOR_SEGURADO ."
            LEFT JOIN (SELECT count(*) as total_tentativas_devolucao
                            , spd.id_proposta
                         FROM seguro.propostas_devolucoes_status spds
                              INNER JOIN seguro.propostas_devolucoes spd ON spds.id_proposta_devolucao = spd.id
                        WHERE id_status in (" . implode(', ', $whereStatusTentativaDevolucao) . ")
                        GROUP BY spd.id_proposta) as tentativas_devolucao ON tentativas_devolucao.id_proposta = pd.id_proposta
		   WHERE {$where}
		";

		$sql .= " ORDER BY pr.id_proposta_mae desc, nr_endosso ";
		
		$this->_db->query($sqlDataStatusCanceladaTemp);
		$this->_db->query($sqlTransmissaoTemp);
		return $this->fetchAll($sql);
  	}

	public function relatorioCondicoesComerciaisLogin(array $safras, array $produtos, array $usuarios)
	{
		ini_set('memory_limit', -1);

		$where = [
			'produtos.id_safra IN ('.implode(",", $safras).')',
			'produtos.id IN ('.implode(",", $produtos).')',
			'taxas_agrupamento_usuarios.id_usuario IN ('.implode(",", $usuarios).')',
			'taxas_agrupamento.fl_ativo = true',
		];
		$where = implode(' AND ', $where);

		$sql = "
		SELECT interna.ds_nome_safra
		, interna.ds_nome_produto
		, REPLACE(interna.ds_nome_agrupamento_taxas, ';', ',') as ds_nome_agrupamento_taxas
		, interna.vl_comissao
		, interna.vl_franquia
		, interna.vl_taxa
		, interna.vl_taxa_renovacao
		, interna.vl_taxa_inadimplente
		, interna.nr_ibge
		, interna.vl_produtividade_estimada
		, STRING_AGG(interna.usuario, ', ') AS nome_usuario
		, interna.ds_nome_cobertura
		, interna.id_cobertura
	 FROM (
				SELECT safras.ds_nome_safra
					, produtos.ds_nome_produto
					, taxas_agrupamento.ds_nome_agrupamento_taxas
					, taxas_agrupamento.vl_comissao
					, taxas_valores.vl_franquia
					, taxas_valores.vl_taxa
					, taxas_valores.vl_taxa_renovacao
					, taxas_valores.vl_taxa_inadimplente
					, municipios.nr_ibge
					, taxas_agrupamento_municipios.vl_produtividade_estimada
					, CASE
						   WHEN corretor.nome_corretor IS NOT NULL THEN
							   corretor.nome_corretor
						   ELSE
							   sublogin.nome_sublogin
					  END AS usuario
					, produtos_coberturas.id_cobertura
					, coberturas.ds_nome_cobertura
				 FROM produto.produtos                     AS produtos
				 JOIN produto.produtos_coberturas
				   ON produtos_coberturas.id_produto = produtos.id
				 JOIN produto.coberturas
				   ON coberturas.id = produtos_coberturas.id_cobertura
				 JOIN produto.safras
				   ON safras.id = produtos.id_safra
				 JOIN comercializacao.taxas_agrupamento    AS taxas_agrupamento
				   ON taxas_agrupamento.id_produto = produtos.id
				  AND taxas_agrupamento.tp_taxa_agrupamento = 'U'
				 JOIN comercializacao.taxas_agrupamento_usuarios
				   ON taxas_agrupamento_usuarios.id_taxa_agrupamento = taxas_agrupamento.id
				 JOIN comercializacao.taxas_agrupamento_municipios
				   ON taxas_agrupamento_municipios.id_taxa_agrupamento = taxas_agrupamento.id
				 JOIN sistema.municipios
			       ON municipios.id = taxas_agrupamento_municipios.id_municipio
				 JOIN comercializacao.taxas_valores
				   ON taxas_valores.id_taxa_agrupamento = taxas_agrupamento.id
				  AND taxas_valores.id_cobertura = produtos_coberturas.id_cobertura
   
			LEFT JOIN (
						  SELECT taxas_agrupamento_usuarios.id_taxa_agrupamento
							   , taxas_agrupamento_usuarios.id_usuario
							   , corretores.ds_nome_abreviado AS nome_corretor
							FROM sistema.corretores
							JOIN sistema.usuarios
							  ON usuarios.id = corretores.id_usuario
							JOIN comercializacao.taxas_agrupamento_usuarios
							  ON taxas_agrupamento_usuarios.id_usuario = usuarios.id
						GROUP BY taxas_agrupamento_usuarios.id_taxa_agrupamento
							   , taxas_agrupamento_usuarios.id_usuario
							   , corretores.ds_nome_abreviado
					  ) AS corretor
				   ON corretor.id_taxa_agrupamento = taxas_agrupamento.id
				  AND corretor.id_taxa_agrupamento = taxas_agrupamento_usuarios.id_taxa_agrupamento
				  AND corretor.id_usuario          = taxas_agrupamento_usuarios.id_usuario
   
			LEFT JOIN (
						  SELECT taxas_agrupamento_usuarios.id_taxa_agrupamento
							   , taxas_agrupamento_usuarios.id_usuario
							   , prepostos.ds_nome_preposto AS nome_sublogin
							FROM sistema.prepostos
							JOIN sistema.usuarios
							  ON usuarios.id = prepostos.id_usuario
							JOIN comercializacao.taxas_agrupamento_usuarios
							  ON taxas_agrupamento_usuarios.id_usuario = usuarios.id
						GROUP BY taxas_agrupamento_usuarios.id_taxa_agrupamento
							   , taxas_agrupamento_usuarios.id_usuario
							   , prepostos.ds_nome_preposto
					  ) AS sublogin
				   ON sublogin.id_taxa_agrupamento = taxas_agrupamento.id
				  AND sublogin.id_taxa_agrupamento = taxas_agrupamento_usuarios.id_taxa_agrupamento
				  AND sublogin.id_usuario          = taxas_agrupamento_usuarios.id_usuario
		  WHERE {$where}
          GROUP BY safras.ds_nome_safra
                 , produtos.ds_nome_produto
                 , taxas_agrupamento.ds_nome_agrupamento_taxas
                 , taxas_agrupamento.vl_comissao
                 , taxas_valores.vl_franquia
                 , taxas_valores.vl_taxa
                 , taxas_valores.vl_taxa_renovacao
                 , taxas_valores.vl_taxa_inadimplente
                 , municipios.nr_ibge
                 , taxas_agrupamento_municipios.vl_produtividade_estimada
                 , corretor.nome_corretor
                 , sublogin.nome_sublogin
				 , produtos_coberturas.id_cobertura
				 , coberturas.ds_nome_cobertura
       ) AS interna
GROUP BY interna.ds_nome_safra
       , interna.ds_nome_produto
       , interna.ds_nome_agrupamento_taxas
       , interna.vl_comissao
       , interna.vl_franquia
       , interna.vl_taxa
       , interna.vl_taxa_renovacao
       , interna.vl_taxa_inadimplente
       , interna.nr_ibge
       , interna.vl_produtividade_estimada
	   , interna.ds_nome_cobertura
	   , interna.id_cobertura
		";
		return $this->fetchAll($sql);
	}

    public function inicioCobertura(array $parametros)
    {
        $filtros = [
            'spp.vl_total > 0'
        ];

        $filtrosTabelasTemporariasValidacoes = [];

        if (!empty($parametros['id_safra'])) {
            $filtros[] = $filtrosTabelasTemporariasValidacoes[] = " pp.id_safra IN (".implode(',',$parametros['id_safra']). ")";
        }

        if (!empty($parametros['id_cultura'])) {
            $filtros[] = $filtrosTabelasTemporariasValidacoes[] = " ppg.id_cultura in(" . implode(', ', $parametros['id_cultura']) . ")";
        }

        if (!empty($parametros['parcelas_pagas'])) {
            if ($parametros['parcelas_pagas'] === 's') {
                $filtros[] = " spb.fl_pago is true ";
            } else {
                $filtros[] = " spb.fl_pago is false ";
            }
        }

        if (!empty($parametros['id_status_endosso'])) {
            $filtros[] = $filtrosTabelasTemporariasValidacoes[] = " ss.id in(" . implode(', ', $parametros['id_status_endosso']) . ") ";
        } else {
            $filtros[] = $filtrosTabelasTemporariasValidacoes[] = ' ss.cd_status in(' . implode(', ', [3, 4, 6, 9, 10, 11, 16, 17]) . ') ';
        }

		if (!empty($parametros['id_proposta'])) {
			$filtros[] = $filtrosTabelasTemporariasValidacoes[] = "sp.id = {$parametros['id_proposta']}";
		}

		if (!empty($parametros['nr_parcela'])) {
			$filtros[] = "spp.nr_parcela = {$parametros['nr_parcela']}";
		}

        $this->_db->query("SELECT seguro.sumario_parcelas(0);");

        $sqlPremioPagoSegurado = "CREATE temp TABLE premio_pago_segurado AS ( ";
		$sqlPremioPagoSegurado .= "    SELECT propostas_parcelas.id_endosso,sum(propostas_parcelas.vl_segurado) as premio_pago_segurado ";
		$sqlPremioPagoSegurado .= "      FROM seguro.propostas_parcelas ";
		$sqlPremioPagoSegurado .= "           JOIN seguro.propostas ON propostas.id = propostas_parcelas.id_proposta ";
		$sqlPremioPagoSegurado .= "           JOIN sistema.status ON status.id = propostas.id_status ";
	    $sqlPremioPagoSegurado .= "           LEFT JOIN seguro.proposta_boletos ON propostas.id = proposta_boletos.id_proposta AND propostas_parcelas.nr_parcela = proposta_boletos.nr_parcela ";
        $sqlPremioPagoSegurado .= "           LEFT JOIN seguro.propostas_versoes ON propostas_versoes.id = proposta_boletos.id_versao ";
		$sqlPremioPagoSegurado .= "     WHERE propostas_parcelas.fl_del=false ";
		$sqlPremioPagoSegurado .= "       AND (propostas_parcelas.fl_pago=true or propostas_parcelas.vl_segurado < 0 or proposta_boletos.fl_pago=true) ";
		$sqlPremioPagoSegurado .= "       AND status.ds_chave NOT IN ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA') ";
		$sqlPremioPagoSegurado .= "     GROUP BY propostas_parcelas.id_endosso)";

        $this->_db->query($sqlPremioPagoSegurado);

        $sqlPropostasValidacoesMunicipios = "CREATE TEMP TABLE propostas_validacoes_municipios AS ( ";
        $sqlPropostasValidacoesMunicipios .= "    SELECT sp.id as id_proposta, pvic.id_tipo_validacao, pvic.ds_descricao ";
        $sqlPropostasValidacoesMunicipios .= "      FROM seguro.propostas sp ";
        $sqlPropostasValidacoesMunicipios .= "           INNER JOIN produto.produtos pp ON pp.id = sp.id_produto ";
        $sqlPropostasValidacoesMunicipios .= "           INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral ";
        $sqlPropostasValidacoesMunicipios .= "           INNER JOIN sistema.status ss ON ss.id = sp.id_status ";
        $sqlPropostasValidacoesMunicipios .= "           INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id ";
        $sqlPropostasValidacoesMunicipios .= "           INNER JOIN produto.validacoes_inicio_cobertura pvic ON pvic.id_cultura = ppg.id_cultura ";
        $sqlPropostasValidacoesMunicipios .= "           INNER JOIN produto.tipos_validacoes_inicio_cobertura ptvic ON ptvic.id = pvic.id_tipo_validacao ";
        $sqlPropostasValidacoesMunicipios .= "           INNER JOIN produto.validacoes_inicio_cobertura_municipios pvicm ON pvicm.id_validacao_inicio_cobertura = pvic.id AND pvicm.id_municipio = spp.id_municipio ";
        $sqlPropostasValidacoesMunicipios .= " WHERE " . implode(' AND ', $filtrosTabelasTemporariasValidacoes);
        $sqlPropostasValidacoesMunicipios .= ")";

        $this->_db->query($sqlPropostasValidacoesMunicipios);

        $sqlDatas = "CREATE TEMP TABLE datas_itens AS ( ";
        $sqlDatas .= "      SELECT id_proposta, to_char(min(data), 'DD/MM/YYYY') as data ";
        $sqlDatas .= "        FROM (SELECT sis.id_proposta, ";
        $sqlDatas .= "                     CASE ";
        $sqlDatas .= "                         WHEN sisc.dt_poda is not null THEN sisc.dt_poda ";
        $sqlDatas .= "                         WHEN sisc.dt_plantio is not null THEN sisc.dt_plantio ";
        $sqlDatas .= "                         WHEN sisc.dt_semeadura is not null THEN sisc.dt_semeadura END AS data ";
        $sqlDatas .= "                FROM seguro.itens_segurados_complemento sisc ";
        $sqlDatas .= "                     INNER JOIN seguro.itens_segurados sis ON sis.id = sisc.id_item_segurado ";
        $sqlDatas .= "                     INNER JOIN seguro.propostas sp ON sp.id = sis.id_proposta ";
        $sqlDatas .= "                     INNER JOIN produto.produtos pp ON pp.id = sp.id_produto ";
        $sqlDatas .= "                     INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral ";
        $sqlDatas .= "                     INNER JOIN sistema.status ss ON ss.id = sp.id_status ";
        $sqlDatas .= "               WHERE " . implode(' AND ', $filtrosTabelasTemporariasValidacoes);
        $sqlDatas .= "               GROUP BY sis.id_proposta, sisc.dt_poda, sisc.dt_plantio, sisc.dt_semeadura) as data_temporaria ";
        $sqlDatas .= "       GROUP BY id_proposta);";

        $this->_db->query($sqlDatas);

        $sqlPropostasValidacoes = "CREATE TEMP TABLE propostas_validacoes AS ( ";
        $sqlPropostasValidacoes .= "    SELECT sp.id as id_proposta, pvic.id_tipo_validacao, pvic.ds_descricao ";
        $sqlPropostasValidacoes .= "      FROM seguro.propostas sp ";
        $sqlPropostasValidacoes .= "           INNER JOIN produto.produtos pp ON pp.id = sp.id_produto ";
        $sqlPropostasValidacoes .= "           INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral ";
        $sqlPropostasValidacoes .= "           INNER JOIN sistema.status ss ON ss.id = sp.id_status ";
        $sqlPropostasValidacoes .= "           INNER JOIN produto.validacoes_inicio_cobertura pvic ON pvic.id_cultura = ppg.id_cultura ";
        $sqlPropostasValidacoes .= "           INNER JOIN produto.tipos_validacoes_inicio_cobertura ptvic ON ptvic.id = pvic.id_tipo_validacao ";
        $sqlPropostasValidacoes .= "     WHERE " . implode(' AND ', $filtrosTabelasTemporariasValidacoes);
        $sqlPropostasValidacoes .= "       AND sp.id NOT IN(SELECT pvm.id_proposta ";
        $sqlPropostasValidacoes .= "                          FROM propostas_validacoes_municipios pvm)";
        $sqlPropostasValidacoes .= "       AND NOT EXISTS(SELECT 1 ";
        $sqlPropostasValidacoes .= "                        FROM produto.validacoes_inicio_cobertura_municipios pvicm ";
        $sqlPropostasValidacoes .= "                       WHERE pvicm.id_validacao_inicio_cobertura = pvic.id) ";
        $sqlPropostasValidacoes .= ");";

        $this->_db->query($sqlPropostasValidacoes);

		$sqlAvisos =  "CREATE TEMP TABLE tmp_avisos AS ( ";
		$sqlAvisos .= "    SELECT pr.id_proposta_mae ";
		$sqlAvisos .= "      FROM seguro.propostas pr ";
		$sqlAvisos .= "      JOIN sinistro.avisos av ON av.id_proposta = pr.id "; 
		$sqlAvisos .= "     WHERE av.id_status IN(" . Sinistro2_Model_AvisosSinistro::ID_STATUS_SA_ACEITO . ", " . Sinistro2_Model_AvisosSinistro::ID_STATUS_SA_PENDENTE . ")";
		$sqlAvisos .= "     GROUP BY pr.id_proposta_mae";
		$sqlAvisos .= ");";
		
		$this->_db->query($sqlAvisos);
		
        $sql = "SELECT sp.id as id_proposta ";
        $sql .= "      , sp.id_proposta_mae ";
        $sql .= "      , sp.nr_apolice ";
        $sql .= "      , pc.ds_nome_cultura ";
        $sql .= "      , se.ds_sigla as uf_propriedade ";
        $sql .= "      , pp.ds_nome_produto ";
        $sql .= "      , seguro.nr_endosso(sp.id, sp.id_endosso) as numero_endosso ";
        $sql .= "      , ss.ds_status ";
        $sql .= "      , spp.nr_parcela ";
        $sql .= "      , spp.vl_segurado ";
        $sql .= "      , to_char(spp.dt_vencimento, 'DD/MM/YYYY') as dt_vencimento ";
        $sql .= "      , spb.nu_boleto ";
        $sql .= "      , spbp.vl_total ";
        $sql .= "      , to_char(spbp.dt_vencimento, 'DD/MM/YYYY') as dt_vencimento_prorrogado ";
        $sql .= "      , spbp.nu_boleto as numero_boleto_essor_prorrogado ";
        $sql .= "      , CASE WHEN spb.fl_pago is true ";
        $sql .= "               THEN 'Sim' ELSE 'Não' ";
        $sql .= "         END AS status_pagamento ";
        $sql .= "      , to_char(spp.dt_pagamento, 'DD/MM/YYYY') as dt_pagamento ";
        $sql .= "      , CASE WHEN tmp_avisos.id_proposta_mae is not null ";
        $sql .= "               THEN 'Sim' ";
        $sql .= "             ELSE 'Não' ";
        $sql .= "         END AS sinistro_andamento ";
        $sql .= "      , CASE WHEN sa_recusa.id_proposta is not null ";
        $sql .= "               THEN 'Sim' ";
        $sql .= "             ELSE 'Não' ";
        $sql .= "         END AS sinistro_recusado ";
        $sql .= "      , sa_recusa.motivo_recusa ";
        $sql .= "      , to_char(seguro.dt_vigencia_inicio_original(sp.id), 'DD/MM/YYYY') as dt_vigencia_inicio_original ";
        $sql .= "      , to_char(sp.dt_vigencia_fim, 'DD/MM/YYYY') as dt_vigencia_fim ";
        $sql .= "      , CASE WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_PODA;
        $sql .= "               THEN datas_itens.data::text ";
        $sql .= "             WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_SEMEADURA_TRANSPLANTE;
        $sql .= "               THEN datas_itens.data::text ";
        $sql .= "             WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_SEMEADURA;
        $sql .= "               THEN datas_itens.data::text ";
        $sql .= "             WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_FIXA;
        $sql .= "               THEN validacoes.ds_descricao || '/' || to_char(spe_proposta_mae.dt_vigencia_inicio, 'YYYY') ";
        $sql .= "             ELSE to_char(spe_proposta_mae.dt_vigencia_inicio, 'DD/MM/YYYY') ";
        $sql .= "         end as inicio_cobertura ";
        $sql .= "      , CASE WHEN sparcelas.valor_subvencao_federal > 0 ";
        $sql .= "               THEN to_char(sp.dt_transmissao + interval '45 day', 'DD/MM/YYYY') ";
        $sql .= "             ELSE to_char(sp.dt_transmissao + interval '15 day', 'DD/MM/YYYY') ";
        $sql .= "         END AS dt_aceitacao ";
        $sql .= "      , sparcelas.valor_segurado ";
        $sql .= "      , pps.premio_pago_segurado ";
        $sql .= "      , ps.ds_nome_safra ";
		$sql .= "      , to_char(spp.dt_vencimento, 'DD/MM/YYYY') as dt_vencimento_boleto ";
        $sql .= " FROM seguro.propostas sp ";
        $sql .= "      INNER JOIN produto.produtos pp ON pp.id = sp.id_produto ";
        $sql .= "      INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral ";
        $sql .= "      INNER JOIN produto.culturas pc ON pc.id = ppg.id_cultura ";
        $sql .= "      INNER JOIN sistema.status ss ON ss.id = sp.id_status ";
        $sql .= "      INNER JOIN sumario_parcelas sparcelas ON sparcelas.id_endosso = sp.id_endosso ";
        $sql .= "      INNER JOIN produto.safras ps ON ps.id = pp.id_safra ";
        $sql .= "      INNER JOIN seguro.propostas_propriedades sppropriedades ON sppropriedades.id_proposta = sp.id ";
        $sql .= "      INNER JOIN sistema.municipios sm ON sm.id = sppropriedades.id_municipio ";
        $sql .= "      INNER JOIN sistema.estados se ON se.id = sm.id_estado ";
        $sql .= "      INNER JOIN (SELECT * ";
        $sql .= "                    FROM propostas_validacoes_municipios ";
        $sql .= "                   UNION ";
        $sql .= "                  SELECT * ";
        $sql .= "                    FROM propostas_validacoes) AS validacoes ON validacoes.id_proposta = sp.id ";
        $sql .= "      INNER JOIN (SELECT spe.id_proposta, sp.dt_vigencia_inicio ";
        $sql .= "                    FROM seguro.propostas_endosso spe ";
        $sql .= "                         INNER JOIN seguro.propostas_endosso spe2 ON spe2.id_endosso = spe.id_endosso ";
        $sql .= "                         INNER JOIN seguro.propostas sp ON sp.id = spe2.id_proposta AND sp.id = sp.id_proposta_mae ";
        $sql .= "                 ) AS spe_proposta_mae ON spe_proposta_mae.id_proposta = sp.id ";
        $sql .= "      INNER JOIN datas_itens ON datas_itens.id_proposta = sp.id ";
        $sql .= "      LEFT JOIN seguro.propostas_parcelas spp ON spp.id_proposta = sp.id ";
        $sql .= "      LEFT JOIN seguro.proposta_boletos spb ON spb.id_proposta = sp.id AND spb.id_versao = sp.id_versao AND spb.nr_parcela = spp.nr_parcela ";
        $sql .= "      LEFT JOIN premio_pago_segurado pps ON pps.id_endosso = sp.id_endosso ";
        $sql .= "      LEFT JOIN seguro.propostas_boletos_prorrogacoes spbp ON spbp.id_proposta = sp.id AND spbp.id_versao = sp.id_versao AND spbp.nr_parcela = spp.nr_parcela ";
        $sql .= "      LEFT JOIN tmp_avisos ON tmp_avisos.id_proposta_mae = sp.id_proposta_mae ";
        $sql .= "      LEFT JOIN (SELECT id_proposta, array_to_string(array_agg(atrs.ds_tipo_recusa), ' / ') as motivo_recusa ";
        $sql .= "                   FROM sinistro.avisos sa ";
        $sql .= "                        INNER JOIN sinistro.avisos_recusas sar ON sar.id_aviso = sa.id ";
        $sql .= "                        INNER JOIN atendimento.tipo_recusa_sinistro atrs ON atrs.id = sar.id_tipo_recusa ";
        $sql .= "                  WHERE id_status = " . Sinistro2_Model_AvisosSinistro::ID_STATUS_SA_RECUSADO;
        $sql .= "                  GROUP BY id_proposta";
        $sql .= "                ) as sa_recusa ON sa_recusa.id_proposta = sp.id ";

        if (!empty($filtros)) {
            $sql .= " WHERE " . implode(' AND ', $filtros);
        }

        $sql .= " ORDER BY sp.id_proposta_mae DESC, spp.nr_parcela ASC ";

        return $this->fetchAll($sql);
    }

	public function relatorioAcompanhamentocCampoSegurosVigentes(
		int $idSafra,
		?int $idCultura,
		?array $idsProduto,
		?array $idsEstado
	) {
		$this->_db->query("
			CREATE temp TABLE tmp_propostas AS (
				SELECT
					pr.id,
					pr.id as id_proposta,
					to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
					to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
					to_char(dt_transmissao, 'DD/MM/YYYY') as dt_transmissao,
					id_status,
					pr.id_usuario_criacao,
					nr_digito_verificador,
					id_produto,
					to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
					pr.id_proposta_mae,
					a.id_proposta as id_proposta_aviso
				FROM
					seguro.propostas pr
					INNER JOIN produto.produtos pd ON pd.id_safra = {$idSafra} and pd.id = pr.id_produto
					LEFT JOIN (
						SELECT 
							id_proposta 
						FROM 
							sinistro.avisos
						WHERE 
							id_status <> 168
							AND fl_ativo IS TRUE
						GROUP BY
							id_proposta
					) a ON a.id_proposta = pr.id 
			)
		");

		$filtroConsultaPrincipal = "pd.id_safra = {$idSafra} and ";
		$filtroValidacoesPropopostas = "pp.id_safra = {$idSafra}";
		
		if (!empty($idsProduto)){
			$strIdsProduto = implode("," , $idsProduto);
			$whereIdProdutoClause = "p.id_produto IN ({$strIdsProduto}) AND ";
			$filtroConsultaPrincipal .= "pd.id in ({$strIdsProduto}) and ";
			$filtroValidacoesPropopostas .= " and pp.id in ({$strIdsProduto})";
		}
	
		if (!empty($idCultura)) {
			$filtroConsultaPrincipal .= "c.id = {$idCultura} and ";
			$filtroValidacoesPropopostas .= " and ppg.id_cultura = {$idCultura} ";
		}
	
		if (!empty($idsEstado)) {
			$filtroConsultaPrincipal .= 'e1.id in ('. implode(',', $idsEstado) .') and ';
		}
	
		if ($somentePropostasCorretor) {
			$usuarioLogado = Zend_Auth::getInstance()->getIdentity();
	
			if ($usuarioLogado->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_PREPOSTO) {
				$filtroConsultaPrincipal .= "pr.id_usuario_criacao = {$usuarioLogado->id} and ";
				$filtroValidacoesPropopostas .=" and sp.id_usuario_criacao = {$usuarioLogado->id}";
			}
	
			if ($usuarioLogado->tp_usuario === Sistema_Model_Usuarios::TIPO_USUARIO_CORRETOR) {
				$sublogins = (new Sistema_Model_Corretores())->getPrepostosUsuario($usuarioLogado->id, false)->toArray();
				$idsCorretorSublogins = [];
	
				if (!empty($sublogins)) {
					$idsCorretorSublogins = array_map(function($sublogin) {
						return $sublogin['id_usuario'];
					}, $sublogins);
				}
	
				$idsCorretorSublogins[] = $usuarioLogado->id;
	
				$filtroConsultaPrincipal .= "pr.id_usuario_criacao in(" . implode(', ', $idsCorretorSublogins) . ") and ";
			}
		}
		
		// $this->_db->query("SELECT seguro.sumario_parcelas(0);");

        $this->_db->query('CREATE TEMP TABLE propostas_validacoes_municipios AS ( 
            SELECT sp.id as id_proposta, pvic.id_tipo_validacao, pvic.ds_descricao
			FROM seguro.propostas sp
			INNER JOIN produto.produtos pp ON pp.id = sp.id_produto
			INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral
			INNER JOIN sistema.status ss ON ss.id = sp.id_status
			INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id
			INNER JOIN produto.validacoes_inicio_cobertura pvic ON pvic.id_cultura = ppg.id_cultura
			INNER JOIN produto.tipos_validacoes_inicio_cobertura ptvic ON ptvic.id = pvic.id_tipo_validacao
			INNER JOIN produto.validacoes_inicio_cobertura_municipios pvicm ON pvicm.id_validacao_inicio_cobertura = pvic.id AND pvicm.id_municipio = spp.id_municipio
         	WHERE '. $filtroValidacoesPropopostas . ');'
		);
        
        $this->_db->query('CREATE TEMP TABLE datas_itens AS (
        	SELECT id_proposta, to_char(min(data), \'DD/MM/YYYY\') as data
        	FROM (SELECT sis.id_proposta,
        	CASE 
        	WHEN sisc.dt_poda is not null THEN sisc.dt_poda
        	WHEN sisc.dt_plantio is not null THEN sisc.dt_plantio
        	WHEN sisc.dt_semeadura is not null THEN sisc.dt_semeadura END AS data
        	FROM seguro.itens_segurados_complemento sisc
        	INNER JOIN seguro.itens_segurados sis ON sis.id = sisc.id_item_segurado
        	INNER JOIN seguro.propostas sp ON sp.id = sis.id_proposta AND sp.id = sp.id_proposta_mae
        	INNER JOIN produto.produtos pp ON pp.id = sp.id_produto
        	INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral
        	INNER JOIN sistema.status ss ON ss.id = sp.id_status
        	WHERE '. $filtroValidacoesPropopostas .'
			and ss.ds_chave not in (
				\'PROPOSTA_INCOMPLETA\',
				\'NAO_ENVIADA\',
				\'DEVOLVIDA\',
				\'PROPOSTA_CANCELADA\',
				\'APOLICE_CANCELADA\',
				\'ORCAMENTO_ENDOSSO\',
				\'ENDOSSO_INCOMPLETO\',
				\'ENDOSSO_ANULADO\',
				\'SOLICITACAO_CANCELADA\',
				\'SOLICITACAO_ENDOSSO\'
			)
        	GROUP BY sis.id_proposta, sisc.dt_poda, sisc.dt_plantio, sisc.dt_semeadura) as data_temporaria
        	GROUP BY id_proposta);'
		);

		$this->_db->query('CREATE TEMP TABLE propostas_validacoes AS (
            SELECT sp.id as id_proposta, pvic.id_tipo_validacao, pvic.ds_descricao
			FROM seguro.propostas sp
			INNER JOIN produto.produtos pp ON pp.id = sp.id_produto
			INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral
			INNER JOIN sistema.status ss ON ss.id = sp.id_status
			INNER JOIN produto.validacoes_inicio_cobertura pvic ON pvic.id_cultura = ppg.id_cultura
			INNER JOIN produto.tipos_validacoes_inicio_cobertura ptvic ON ptvic.id = pvic.id_tipo_validacao
			WHERE '. $filtroValidacoesPropopostas .'
               AND sp.id NOT IN(SELECT pvm.id_proposta
                                  FROM propostas_validacoes_municipios pvm)
               AND NOT EXISTS(SELECT 1
                                FROM produto.validacoes_inicio_cobertura_municipios pvicm
                               WHERE pvicm.id_validacao_inicio_cobertura = pvic.id));'
		);

		$sql = "
				SELECT pr.id AS id_proposta
					, pr.dt_vigencia_fim
					, pr.id_status
					, pr.id_usuario_criacao
					, pr.dt_vigencia_inicio_original
					, pr.id_proposta_mae
					, po.ds_coordenadas
					, CASE WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_PODA ."
							THEN datas_itens.data::text
					 	WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_SEMEADURA_TRANSPLANTE ."
							THEN datas_itens.data::text
						WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_SEMEADURA ."
							THEN datas_itens.data::text
						WHEN validacoes.id_tipo_validacao =  " . Produto_Model_TiposValidacoesInicioCobertura::ID_DATA_FIXA ."
							THEN validacoes.ds_descricao || '/' || to_char(pr2.dt_vigencia_inicio, 'YYYY')
					  ELSE to_char(pr2.dt_vigencia_inicio, 'DD/MM/YYYY')
				  	END as inicio_cobertura
					, CASE WHEN pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
							THEN 'FRUTAS E HORTALIÇAS'
					  	WHEN pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . " 
						  	THEN CASE 
								WHEN pg.tp_epoca_cultivo = 'I'
									THEN ptp.ds_tipo_produto || ' RN - INVERNO' 
								ELSE ptp.ds_tipo_produto || ' RN - VERÃO' 
							END
					  	WHEN pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . " 
						  THEN case 
								WHEN pg.tp_epoca_cultivo = 'I'
									THEN 'GRÃOS PG - INVERNO' 
								ELSE 'GRÃOS PG - VERÃO' 
							END
					  	ELSE ptp.ds_tipo_produto 
				   	END as tipo_produto
					, pd.ds_nome_produto
					, c.ds_nome_cultura
					, st.ds_status
					, ist.vl_area as total_area
					, ist.vl_lmga as total_lmga
					, e1.ds_sigla as estado_propriedade
					, m1.ds_nome_municipio as municipio_propriedade
					, cob.ds_nome_cobertura
					, CASE WHEN pvp.id_proposta IS NOT NULL
						THEN 'Sim' 
							ELSE 'Não'
					END AS previa_encaminhada
					, CASE WHEN pr.id_proposta_aviso IS NOT NULL
						THEN 'Sim' 
							ELSE 'Não'
					END AS sinistro_comunicado
			FROM seguro.propostas_endosso pe
			INNER JOIN tmp_propostas pr
				ON pe.id_proposta = pr.id
			INNER JOIN seguro.propostas pr2
				ON pr2.id = pr.id_proposta_mae
			LEFT JOIN (
				SELECT 
					pvp.id_proposta
				FROM
					seguro.propostas p
				INNER JOIN seguro.propostas_vistorias_previas pvp 
					ON pvp.id_proposta = p.id
				WHERE
					{$whereIdProdutoClause}
					pvp.id_status NOT IN (225, 227)
					AND pvp.fl_ativo IS TRUE
				GROUP BY 
					pvp.id_proposta
				) pvp ON pvp.id_proposta = pr2.id
			INNER JOIN seguro.propostas_propriedades po
				ON po.id_proposta = pr.id
			INNER JOIN sumario.itens_segurados ist
				ON ist.id_proposta = pr.id
			INNER JOIN seguro.propostas_corretores pc
				ON pc.id_proposta = pr.id
			INNER JOIN produto.produtos pd
				ON pd.id = pr.id_produto
			INNER JOIN produto.produtos_geral pg
				ON pg.id = pd.id_produto_geral
			INNER JOIN produto.produtos_coberturas ppc
				ON ppc.id_produto = pd.id AND ppc.fl_cobertura_principal IS TRUE
			INNER JOIN produto.coberturas cob
				ON cob.id = ppc.id_cobertura
			INNER JOIN produto.tipo_produto ptp
				ON ptp.id = pg.id_tipo_produto
			INNER JOIN produto.culturas c
				ON c.id = pg.id_cultura
			INNER JOIN sistema.municipios m1
				ON m1.id = po.id_municipio
			INNER JOIN sistema.estados e1
				ON e1.id = m1.id_estado
			INNER JOIN (SELECT id_tipo_validacao, ds_descricao, id_proposta
						FROM propostas_validacoes_municipios
				   		UNION
						SELECT id_tipo_validacao, ds_descricao, id_proposta
							FROM propostas_validacoes) AS validacoes 
				ON validacoes.id_proposta = pr2.id
	  		INNER JOIN datas_itens 
				ON datas_itens.id_proposta = pr2.id
			INNER JOIN sistema.status st
					ON st.id = pr.id_status
			INNER JOIN sistema.usuarios u
					ON pr.id_usuario_criacao = u.id
			WHERE {$filtroConsultaPrincipal}
					st.ds_chave not in (
						'PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' ,
						'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO',
						'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA', 'SOLICITACAO_ENDOSSO'
					)
				AND TO_DATE(pr.dt_vigencia_fim, 'DD/MM/YYYY') >= TO_DATE(TO_CHAR(now()::date, 'DD/MM/YYYY'), 'DD/MM/YYYY')
				AND pr.id_status IN (8, 62, 64, 102)
				AND pe.fl_proposta_vigente = true
				AND pc.id_usuario  <> 487
			ORDER BY pr.id;
		";
		
		$rs = $this->fetchAll($sql);
		
		return $rs;
	}
    public function relatorioSubscricao(array $parametros)
    {
        $filtros = ["pd.id_safra = {$parametros['id_safra']}"];

        if (!empty($parametros['id_status_multiple']) && is_array($parametros['id_status_multiple'])) {
            $filtros[] = "pr.id_status in (" . implode(",", $parametros['id_status_multiple']) . ")";
        }

        if (!empty($parametros['id_produto_multiple']) && is_array($parametros['id_produto_multiple'])) {
            $filtros[] = "pd.id in (" . implode(",", $parametros['id_produto_multiple']) . ")";
        }

        if (!empty($parametros['dt_inicio']) && !empty($parametros['dt_fim'])) {
            $dataInicio = Agro_Util::formatDate($parametros['dt_inicio'],'yyyy-MM-dd');
            $dataFim = Agro_Util::formatDate($parametros['dt_fim'],'yyyy-MM-dd');
            $filtros['dt_transmissao'] = "pr.dt_transmissao::DATE between '{$dataInicio}' AND '{$dataFim}'";
        }

        $this->_db->query("
            CREATE temp TABLE tmp_propostas AS (
                SELECT pr.id,
                       pr.id as id_proposta,
                       pr.id_endosso,
                       id_proposta_renovada,
                       id_versao,
                       seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso,
                       nr_apolice,
                       to_char(dt_vigencia_inicio,'DD/MM/YYYY') as dt_vigencia_inicio,
                       to_char(dt_vigencia_fim,'DD/MM/YYYY') as dt_vigencia_fim,
                       pr.dt_transmissao,
                       vl_custo_apolice,
                       id_status,
                       pr.id_usuario_criacao,
                       nr_digito_verificador,
                       id_produto,
                       to_char(seguro.dt_vigencia_inicio_original(pr.id),'DD/MM/YYYY') as dt_vigencia_inicio_original,
                       pr.id_proposta_mae,
                       seguro.id_proposta_mae_completo(pr.id) as id_proposta_mae_completo
                  FROM seguro.propostas pr
                       INNER JOIN produto.produtos pd ON pd.id = pr.id_produto
                 WHERE " . implode(' AND ', $filtros) . "
            )
        ");

        unset($filtros['dt_transmissao']);

        $this->_db->query("SELECT seguro.sumario_parcelas(0);");

        if (!empty($parametros['id_cultura_multiple']) && is_array($parametros['id_cultura_multiple'])) {
            $filtros[] = "pg.id_cultura in (" . implode(",", $parametros['id_cultura_multiple']) . ")";
        }

        if (!empty($parametros['id_estado_multiple']) && is_array($parametros['id_estado_multiple'])) {
            $filtros[] = "e1.id in (" . implode(",", $parametros['id_estado_multiple']) . ")";
        }

        if (!empty($parametros['id_municipio_multiple']) && is_array($parametros['id_municipio_multiple'])) {
            $filtros[] = "m1.id in (" . implode(",", $parametros['id_municipio_multiple']) . ")";
        }

        if (!empty($parametros['id_sublogin_multiple']) && is_array($parametros['id_sublogin_multiple'])) {
            $filtros[] = "pr.id_usuario_criacao in (" . implode(",", $parametros['id_sublogin_multiple']) . ")";
        } elseif (!empty($parametros['id_corretor'])) {
            $subloginsCorretor = (new Sistema_Model_Prepostos())->getComboUsuario($parametros['id_corretor'], false);
            $subloginsCorretor = array_keys($subloginsCorretor);
            $filtros[] = "(pr.id_usuario_criacao = {$parametros['id_corretor']} OR pr.id_usuario_criacao in(" . implode(',', $subloginsCorretor) . "))";
        }

        if (!empty($parametros['proponente_rt'])) {
            $filtros[] = "sproponentes.fl_restricao is true";
        }

        $sql = "SELECT pr.id ";
        $sql .= "     ,pr.id_proposta_mae ";
        $sql .= "     ,st.cd_status || ' - ' || st.ds_status as status ";
        $sql .= "     ,u.ds_nome_usuario ";
        $sql .= "     ,CASE ";
        $sql .= "        WHEN st.id = " . Seguro_Model_Propostas::ID_STATUS_ENVIADA_AGUARDANDO_CONF . " AND sproponentes.fl_validacao_receita is false ";
        $sql .= "          THEN 'Sim' ";
        $sql .= "          ELSE 'Não' ";
        $sql .= "       END AS cpf_cnpj_proponente_novo ";
        $sql .= "     ,CASE ";
        $sql .= "        WHEN sproponentes.fl_restricao is true ";
        $sql .= "          THEN 'Sim' ";
        $sql .= "          ELSE 'Não' ";
        $sql .= "       END AS fl_restricao ";
        $sql .= "     ,iseg.nr_item_segurado ";
        $sql .= "     ,iseg.ds_item_segurado ";
        $sql .= "     ,e1.ds_sigla as estado_propriedade ";
        $sql .= "     ,m1.ds_nome_municipio as municipio_propriedade ";
        $sql .= "     ,pd.ds_nome_produto ";
        $sql .= "     ,pc.ds_nome_cobertura as cobertura_principal ";
        $sql .= "	  ,va.ds_nome_variedade ";
        $sql .= "     ,CASE ";
        $sql .= "        WHEN sigc.ds_primeiro_ano_plantio = '1' THEN 'Sim' ";
        $sql .= "        WHEN sigc.ds_primeiro_ano_plantio = '2' THEN 'Não' ";
        $sql .= "        ELSE '' ";
        $sql .= "       END AS primeiro_ano_plantio ";
        $sql .= "	  ,iseg.vl_area as area_item ";
        $sql .= "	  ,iseg.vl_lmga as vl_lmga_item ";
        $sql .= "	  ,CASE ";
        $sql .= "        WHEN sigc.id_sistema_plantio = 1 THEN 'D'::text ";
        $sql .= "        WHEN sigc.id_sistema_plantio = 2 THEN 'C'::text ";
        $sql .= "        WHEN sigc.id_sistema_plantio = 3 THEN 'AL'::text ";
        $sql .= "        ELSE NULL::text ";
        $sql .= "       END AS sistema_plantio ";
        $sql .= "     ,to_char(pr.dt_transmissao + interval '25 day', 'DD/MM/YYYY') AS dt_aceitacao ";
        $sql .= "     ,po.ds_referencia_localizacao ";
        $sql .= "     ,questionario1.toda_area_cultivada ";
        $sql .= "     ,questionario2.possui_lavoura_mesmo_municipio ";
        $sql .= "     ,spo.ds_observacao ";
        $sql .= "     ,CASE  ";
        $sql .= "        WHEN seguro.nr_endosso(pr.id, pr.id_endosso) > 0 ";
        $sql .= "    	   THEN (select pr2.dt_transmissao from seguro.propostas pr2 where pr2.id = pr.id_proposta_mae) ";
        $sql .= "        ELSE pr.dt_transmissao ";
        $sql .= "       END as dt_transmissao ";
        $sql .= " FROM seguro.propostas_endosso pe ";
        $sql .= "      INNER JOIN tmp_propostas pr ON pr.id = pe.id_proposta ";
        $sql .= "      LEFT JOIN (select case when ds_resposta='1' then 'Sim' else 'Não' end as toda_area_cultivada, id_proposta from seguro.propostas_questionario where id_atributo_rn = 52) as questionario1 on questionario1.id_proposta = pr.id ";
        $sql .= "      LEFT JOIN (select case when ds_resposta='1' then 'Sim' else 'Não' end as possui_lavoura_mesmo_municipio, id_proposta from seguro.propostas_questionario where id_atributo_rn = 14) as questionario2 on questionario2.id_proposta = pr.id ";
        $sql .= "      INNER JOIN seguro.propostas_propriedades po ON pr.id = po.id_proposta ";
        $sql .= "      INNER JOIN seguro.itens_segurados iseg ON iseg.id_proposta = pr.id ";
        $sql .= "      INNER JOIN seguro.itens_segurados_complemento sigc ON sigc.id_item_segurado = iseg.id ";
        $sql .= "	   INNER JOIN produto.variedades va ON va.id = iseg.id_variedade ";
        $sql .= "      INNER JOIN seguro.propostas_corretores spc ON spc.id_proposta = pr.id ";
        $sql .= "      INNER JOIN produto.produtos pd ON pd.id = pr.id_produto ";
        $sql .= "      INNER JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral ";
        $sql .= "      INNER JOIN sistema.municipios m1 ON m1.id = po.id_municipio ";
        $sql .= "      INNER JOIN sistema.estados e1 ON e1.id = m1.id_estado ";
        $sql .= "      INNER JOIN sistema.status st ON st.id = pr.id_status ";
        $sql .= "      INNER JOIN sistema.usuarios u ON u.id = pr.id_usuario_criacao ";
        $sql .= "      LEFT JOIN sistema.prepostos pre ON pre.id_usuario = u.id ";
        $sql .= "      INNER JOIN seguro.propostas_proponentes spp ON spp.id_proposta = pr.id ";
        $sql .= "      INNER JOIN seguro.proponentes sproponentes ON sproponentes.cpf_cnpj = spp.cpf_cnpj ";
        $sql .= "      INNER JOIN produto.produtos_coberturas ppc ON ppc.id_produto = pd.id AND ppc.fl_cobertura_principal is true ";
        $sql .= "      INNER JOIN produto.coberturas pc ON pc.id = ppc.id_cobertura ";
        $sql .= "      LEFT JOIN sumario_parcelas sum_par ON sum_par.id_endosso = pr.id_endosso ";
        $sql .= "      INNER JOIN seguro.propostas_observacoes spo ON spo.id_proposta = pr.id AND spo.fl_principal is true ";
        $sql .= "WHERE " . implode(' AND ', $filtros);
        $sql .= "  AND pe.fl_proposta_vigente = true ";
        $sql .= "  AND spc.id_usuario <> 487 ";
        $sql .= "ORDER BY pr.id_proposta_mae, iseg.nr_item_segurado";

        return $this->fetchAll($sql);
    }

    public function beneficiariosProposta(array $parametros)
    {
        $filtros = ["pp.id_safra = {$parametros['id_safra']}"];

        if (!empty($parametros['id_status_multiple']) && is_array($parametros['id_status_multiple'])) {
            $filtros[] = "sp.id_status in (" . implode(",", $parametros['id_status_multiple']) . ")";
        }

        if (!empty($parametros['id_produto_multiple']) && is_array($parametros['id_produto_multiple'])) {
            $filtros[] = "pp.id in (" . implode(",", $parametros['id_produto_multiple']) . ")";
        }

        if (!empty($parametros['id_cultura_multiple']) && is_array($parametros['id_cultura_multiple'])) {
            $filtros[] = "ppg.id_cultura in (" . implode(",", $parametros['id_cultura_multiple']) . ")";
        }

        if (!empty($parametros['id_estado_multiple']) && is_array($parametros['id_estado_multiple'])) {
            $filtros[] = "sm.id_estado in (" . implode(",", $parametros['id_estado_multiple']) . ")";
        }

        if (!empty($parametros['id_municipio_multiple']) && is_array($parametros['id_municipio_multiple'])) {
            $filtros[] = "sm.id in (" . implode(",", $parametros['id_municipio_multiple']) . ")";
        }

        $sql = "SELECT spb.id_proposta, sb.cpf_cnpj ";
        $sql .= "      ,CASE ";
        $sql .= "         WHEN sb.fl_validado is false ";
        $sql .= "           THEN 'Sim' ";
        $sql .= "           ELSE 'Não' ";
        $sql .= "        END as beneficiario_novo ";
        $sql .= " FROM seguro.propostas_beneficiarios spb ";
        $sql .= "      INNER JOIN seguro.propostas sp ON sp.id = spb.id_proposta ";
        $sql .= "      INNER JOIN seguro.beneficiarios sb ON sb.cpf_cnpj = spb.nr_cpf_cnpj ";
        $sql .= "      INNER JOIN produto.produtos pp ON pp.id = sp.id_produto ";
        $sql .= "      INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral ";
        $sql .= "      INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id ";
        $sql .= "      INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio ";
        $sql .= "WHERE " . implode(' AND ', $filtros);
        $sql .= " ORDER BY spb.id_proposta ";

        return $this->fetchAll($sql);
    }

    public function coberturasAdicionaisPropostas(array $parametros)
    {
        $filtros = ["spc.fl_principal is false", "pp.id_safra = {$parametros['id_safra']}"];

        if (!empty($parametros['id_status_multiple']) && is_array($parametros['id_status_multiple'])) {
            $filtros[] = "sp.id_status in (" . implode(",", $parametros['id_status_multiple']) . ")";
        }

        if (!empty($parametros['id_produto_multiple']) && is_array($parametros['id_produto_multiple'])) {
            $filtros[] = "pp.id in (" . implode(",", $parametros['id_produto_multiple']) . ")";
        }

        if (!empty($parametros['id_cultura_multiple']) && is_array($parametros['id_cultura_multiple'])) {
            $filtros[] = "ppg.id_cultura in (" . implode(",", $parametros['id_cultura_multiple']) . ")";
        }

        if (!empty($parametros['id_estado_multiple']) && is_array($parametros['id_estado_multiple'])) {
            $filtros[] = "sm.id_estado in (" . implode(",", $parametros['id_estado_multiple']) . ")";
        }

        if (!empty($parametros['id_municipio_multiple']) && is_array($parametros['id_municipio_multiple'])) {
            $filtros[] = "sm.id in (" . implode(",", $parametros['id_municipio_multiple']) . ")";
        }

        $sql = "SELECT spc.id_proposta, pc.ds_nome_cobertura ";
        $sql .= " FROM seguro.propostas_coberturas spc ";
        $sql .= "      INNER JOIN seguro.propostas sp ON sp.id = spc.id_proposta ";
        $sql .= "      INNER JOIN produto.coberturas pc ON pc.id = spc.id_cobertura ";
        $sql .= "      INNER JOIN produto.produtos pp ON pp.id = sp.id_produto ";
        $sql .= "      INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral ";
        $sql .= "      INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id ";
        $sql .= "      INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio ";
        $sql .= "WHERE " . implode(' AND ', $filtros);
        $sql .= " ORDER BY spc.id_proposta, pc.ds_nome_cobertura ";

        return $this->fetchAll($sql);
    }

    public function propostasCroquisTalhoes(array $parametros) : array
    {
        $filtros = [
            "pp.id_safra = {$parametros['id_safra']}",
            "ss.ds_chave not in ('PROPOSTA_INCOMPLETA', 'NAO_ENVIADA', 'DEVOLVIDA', 'PROPOSTA_CANCELADA', 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')",
        ];

        if (!empty($parametros['id_produto'])) {
            $filtros[] = "pp.id in (" . implode(',', $parametros['id_produto']) . ")";
        }

        $sql = "SELECT sp.id as id_proposta, spct.ds_item_segurado, spct.ds_coordenadas_centroide ";
        $sql .= "      , spct.ds_coordenadas ";
        $sql .= " FROM seguro.propostas sp ";
        $sql .= "      INNER JOIN produto.produtos pp ON pp.id = sp.id_produto ";
        $sql .= "      INNER JOIN seguro.propostas_croquis spc ON spc.id_proposta = sp.id AND spc.fl_vigente is true ";
        $sql .= "      INNER JOIN seguro.propostas_croquis_talhoes spct ON spct.id_croqui = spc.id ";
        $sql .= "      INNER JOIN sistema.status ss ON ss.id = sp.id_status ";
        $sql .= "WHERE " . implode(' AND ', $filtros);
        $sql .= "ORDER BY spct.id ";

        return $this->fetchAll($sql);
    }

	public function mapCroquisTalhoesToEndossoNrItem(array $idsEndosso): array
	{
		$idsEndosso = implode(',', $idsEndosso);

		$query = "
			SELECT
				pe.id_endosso,
				pe.id_proposta,
				iseg.id as id_item_segurado,
				pe.fl_proposta_vigente,
				iseg.nr_item_segurado,
				CASE WHEN pct.id IS NULL THEN sisc.ds_coordenadas_geograficas ELSE pct.ds_coordenadas_centroide END as ds_coordenadas,
				CASE WHEN pct.id IS NULL THEN 0 ELSE 1 END as is_decimal
			FROM
				seguro.propostas_endosso pe
				INNER JOIN seguro.itens_segurados iseg ON iseg.id_proposta = pe.id_proposta
				LEFT JOIN seguro.itens_segurados_complemento sisc ON sisc.id_item_segurado = iseg.id
				LEFT JOIN seguro.propostas_croquis spc ON spc.id_proposta = pe.id_proposta
				AND spc.fl_vigente IS TRUE
				LEFT JOIN seguro.propostas_croquis_talhoes pct ON pct.id_croqui = spc.id
				AND iseg.id IN (
					SELECT
						min(aux.id_item_segurado) :: INTEGER
					FROM
						(
							SELECT
								unnest(string_to_array(ds_item_segurado, ',')) AS id_item_segurado
							FROM
								seguro.propostas_croquis_talhoes pct2
							WHERE
								pct2.id = pct.id
						) as aux
				)
			where
				pe.id_endosso IN ({$idsEndosso})
			ORDER BY
				pe.id_endosso,
				pe.fl_proposta_vigente,
				pe.id_proposta DESC;
		";

		$rs = $this->_db->fetchAll($query);

		$mapCoordenadasToItem = [];
		$idEndossoAnterior = $rs[0]['id_endosso'];

		foreach ($rs as $row) {
			if (empty($row['ds_coordenadas'])) {
				continue;
			}

			if (
				array_key_exists($row['id_endosso'], $mapCoordenadasToItem)
				&& array_key_exists($row['nr_item_segurado'], $mapCoordenadasToItem[$row['id_endosso']])
				&& !empty($mapCoordenadasToItem[$row['id_endosso']][$row['nr_item_segurado']]['ds_coordenadas'])
			) {
				continue;
			}

			$coordenadas = $row['ds_coordenadas'];

			if ($row['is_decimal'] == 0) {
				$aux = explode(',', $coordenadas);
				
				list($latDeg, $latMin, $latSeg) = explode(' ', trim($aux[0]));
				list($lngDeg, $lngMin, $lngSeg) = explode(' ', trim($aux[1]));
		
				$lat = Agro_Util::grau2decimal($latDeg, $latMin, $latSeg, 14);
				$lng = Agro_Util::grau2decimal($lngDeg, $lngMin, $lngSeg, 14);

				$coordenadas = "{$lat}, {$lng}";
			}
			
			$mapCoordenadasToItem[$row['id_endosso']][$row['nr_item_segurado']] = $coordenadas;
		}
		
		return $mapCoordenadasToItem;
	}

    public function subscricaoGeorreferenciamento(array $parametros = []) : array
    {
        if (isset($parametros['id_safra'])) {
            $where[] = "ps.id = {$parametros['id_safra']}";
        }

        if (isset($parametros['id_produto_multiple'])) {
            $where[] = "pp.id in(" . implode(', ', $parametros['id_produto_multiple']) . ")";
        }

		if (isset($parametros['fl_endosso_0']) && $parametros['fl_endosso_0']) {
			$where[] = "seguro.nr_endosso(sp.id, sp.id_endosso) = 0";
			$where[] = "
				EXISTS(
					SELECT 1
					  FROM seguro.propostas pr
				 	  JOIN seguro.propostas_endosso pe ON pe.id_proposta = pr.id
					 WHERE pr.id_proposta_mae = sp.id_proposta_mae
					   AND pe.fl_proposta_vigente is true
					   AND pr.id_status NOT IN (2, 4)
				)
			";
			} else {
			$where[] = "spe.fl_proposta_vigente is true";
			$where[] = "sp.id_status NOT IN (2, 4, 5)";
		}

        if (empty($where)) {
            $where[] = "ps.fl_vigente is true";
        }

		$where = implode(' AND ', $where);

        /**
         * ATENÇÃO!
         * AO REALIZAR ALTERAÇÕES NESTE SQL, VERIFICAR A NECESSIDADE DE ALTERAR TAMBÉM A VIEW MATERIALIZADA:
		 * geo.v_subscricao
         */
        $sql = "SELECT sp.id_proposta_mae                            as id_proposta_mae
                     , sp.id                                         as id_proposta
                     , ss.cd_status                                  as status_endosso
                     , ps.ds_nome_safra                              as nome_safra
                     , sprop.id                                      as id_segurado
                     , pc.ds_nome_cultura                            as nome_cultura
                     , CASE
                           WHEN ppg.id_tipo_produto = 2
                               THEN
                               CASE
                                   WHEN ppg.tp_epoca_cultivo = 'I'
                                       THEN 'GRÃOS INVERNO'
                                   ELSE 'GRÃOS VERÃO'
                                   END
                           ELSE ptp.ds_tipo_produto
                        END                                              AS nome_grupo
                     , CASE
                           WHEN sc.id is not null
                               THEN sc.ds_nome_fantasia
                           ELSE sc2.ds_nome_fantasia
                        END                                              AS nome_fantasia_corretor
                     , CASE
                           WHEN sprep.id is not null
                               THEN sprep.ds_nome_preposto
                           ELSE ''
                        END                                              AS nome_sublogin
                     , sm.nr_ibge                                    as codigo_ibge
                     , sm.ds_nome_municipio                          as nome_municipio
                     , se.ds_sigla                                   as sigla_uf
                     , spc.id_cobertura                              as id_cobertura_principal
                     , CASE
                           WHEN coberturas_adicionais.ids_cobertura[1] is not null
                               THEN coberturas_adicionais.ids_cobertura[1]
                        END                                              AS cobertura_adicional_1
                     , CASE
                           WHEN coberturas_adicionais.ids_cobertura[2] is not null
                               THEN coberturas_adicionais.ids_cobertura[2]
                        END                                              AS cobertura_adicional_2
                     , CASE
                           WHEN coberturas_adicionais.ids_cobertura[3] is not null
                               THEN coberturas_adicionais.ids_cobertura[3]
                        END                                              AS cobertura_adicional_3
                     , CASE
                           WHEN coberturas_adicionais.ids_cobertura[4] is not null
                               THEN coberturas_adicionais.ids_cobertura[4]
                        END                                              AS cobertura_adicional_4
                     , CASE
                           WHEN coberturas_adicionais.ids_cobertura[5] is not null
                               THEN coberturas_adicionais.ids_cobertura[5]
                        END                                              AS cobertura_adicional_5
                     , CASE
                           WHEN coberturas_adicionais.ids_cobertura[6] is not null
                               THEN coberturas_adicionais.ids_cobertura[6]
                        END                                              AS cobertura_adicional_6
                     , CASE
                           WHEN coberturas_adicionais.ids_cobertura[7] is not null
                               THEN coberturas_adicionais.ids_cobertura[7]
                        END                                              AS cobertura_adicional_7
                     , sis.vl_lmga                                   as valor_lmga
                     , sis.vl_area                                   as valor_area
                     , to_char(sp1.dt_vigencia_inicio, 'dd/mm/yyyy') as vigencia_inicio
                     , to_char(sp1.dt_vigencia_fim, 'dd/mm/yyyy')    as vigencia_fim
                     , CASE
                           WHEN sp.dt_transmissao IS NOT NULL
                               THEN to_char(sp.dt_transmissao, 'dd/mm/yyyy')
                           ELSE ''
                        END                                              AS data_transmissao
                     , sis.nr_item_segurado                          as numero_item
                     , sis.ds_item_segurado                          as descricao_item
                     , (sp.id::varchar || sis.nr_item_segurado)::integer        as proposta_item
					 , talhoes.ds_coordenadas AS ds_coordenadas
					 , itens_car.ds_car
					, itens_car.fl_manual
                FROM seguro.propostas sp
                     INNER JOIN seguro.propostas_endosso spe ON spe.id_proposta = sp.id
                     INNER JOIN produto.produtos pp ON pp.id = sp.id_produto
                     INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral
                     INNER JOIN produto.culturas pc ON pc.id = ppg.id_cultura
                     INNER JOIN produto.tipo_produto ptp ON ptp.id = ppg.id_tipo_produto
                     INNER JOIN sistema.status ss ON ss.id = sp.id_status
                     INNER JOIN produto.safras ps ON ps.id = pp.id_safra
                     INNER JOIN seguro.propostas_proponentes spp ON spp.id_proposta = sp.id
                     INNER JOIN seguro.proponentes sprop ON sprop.cpf_cnpj = spp.cpf_cnpj
                     INNER JOIN sistema.usuarios su ON su.id = sp.id_usuario_criacao
                     LEFT JOIN sistema.corretores sc ON sc.id_usuario = su.id
                     LEFT JOIN sistema.prepostos sprep ON sprep.id_usuario = su.id
                     LEFT JOIN sistema.corretores sc2 ON sc2.id = sprep.id_corretor
                     INNER JOIN seguro.propostas_propriedades sppropriedades ON sppropriedades.id_proposta = sp.id
                     INNER JOIN sistema.municipios sm ON sm.id = sppropriedades.id_municipio
                     INNER JOIN sistema.estados se ON se.id = sm.id_estado
                     INNER JOIN seguro.propostas sp1 ON sp1.id = sp.id_proposta_mae
                     INNER JOIN seguro.itens_segurados sis ON sis.id_proposta = sp.id
                     INNER JOIN seguro.propostas_coberturas spc ON spc.id_proposta = sp.id AND spc.fl_principal is true
					 LEFT JOIN seguro.propostas_croquis spcroquis ON spcroquis.id_proposta = sp.id AND spcroquis.fl_vigente is true
					 LEFT JOIN LATERAL (
    				 	SELECT *
    				 	FROM seguro.itens_segurados_car ic
    				 	WHERE ic.id_item_segurado = sis.id and ic.fl_selecionado = 'true'
    				 	ORDER BY ic.id DESC
    				 	LIMIT 1
					 ) itens_car ON TRUE
					 LEFT JOIN (
					 	SELECT string_agg(spct.ds_coordenadas, '|') as ds_coordenadas
							  ,spct.id_croqui
						      ,spct.ds_item_segurado
						  FROM seguro.propostas_croquis_talhoes spct
						  GROUP BY spct.id_croqui, spct.ds_item_segurado

					 ) AS talhoes ON talhoes.id_croqui = spcroquis.id AND sis.id::varchar = any(string_to_array(talhoes.ds_item_segurado, ','))
                     LEFT JOIN (SELECT array_agg(id_cobertura) as ids_cobertura, id_proposta
                                FROM seguro.propostas_coberturas
                                WHERE fl_principal is false
                                GROUP BY id_proposta) as coberturas_adicionais ON coberturas_adicionais.id_proposta = sp.id
               WHERE {$where}
                 AND sis.vl_lmga > 0
               ORDER BY sp.id desc, sis.nr_item_segurado ASC
		";
	
        return $this->fetchAll($sql);
    }

    public function subscricaoListagemCoordenadas(array $parametros = []) : array
    {
        if (isset($parametros['id_safra'])) {
            $where[] = "ps.id = {$parametros['id_safra']}";
        }

        if (isset($parametros['id_produto_multiple'])) {
            $where[] = "pp.id in(" . implode(', ', $parametros['id_produto_multiple']) . ")";
        }

        if (empty($where)) {
            $where[] = "ps.fl_vigente is true";
        }

        /**
         * ATENÇÃO!
         * AO REALIZAR ALTERAÇÕES NESTE SQL, VERIFICAR A NECESSIDADE DE ALTERAR TAMBÉM A VIEW MATERIALIZADA:
         * geo.v_subscricao_coordenadas
         */
        $sql = "SELECT id_proposta_mae
                     , id_proposta
                     , btrim(coordenadas_item[1]) as latitude
                     , btrim(coordenadas_item[2]) as longitude
                     , numero_item
                     , proposta_item::integer
                  FROM (SELECT id_proposta_mae
                             , id_proposta
                             , string_to_array(unnest(meu_novo_array), ' ') as coordenadas_item
                             , numero_item
                             , proposta_item
                          FROM (SELECT id_proposta_mae
                                     , id_proposta
                                     , numero_item
                                     , proposta_item
                                     , array_append(coordenadas_item, coordenadas_item[1]) as meu_novo_array
                                  FROM (SELECT sp.id_proposta_mae                     as id_proposta_mae
                                             , sp.id                                  as id_proposta
                                             , string_to_array(replace(replace(regexp_replace(spct.ds_coordenadas, '[\[\]{}\":]', '', 'g'), 'latitude', ''), ',longitude', ' '), ',') as coordenadas_item
                                             , sis.nr_item_segurado                   as numero_item
                                             , sp.id::varchar || sis.nr_item_segurado as proposta_item
                                          FROM seguro.propostas sp
                                               INNER JOIN seguro.propostas_endosso spe ON spe.id_proposta = sp.id
                                               INNER JOIN produto.produtos pp ON pp.id = sp.id_produto
                                               INNER JOIN produto.produtos_geral ppg ON ppg.id = pp.id_produto_geral
                                               INNER JOIN produto.safras ps ON ps.id = pp.id_safra
                                               INNER JOIN seguro.itens_segurados sis ON sis.id_proposta = sp.id
                                               LEFT JOIN seguro.propostas_croquis spcroquis ON spcroquis.id_proposta = sp.id AND spcroquis.fl_vigente is true
                                               LEFT JOIN seguro.propostas_croquis_talhoes spct ON spct.id_croqui = spcroquis.id AND sis.id::varchar = any(string_to_array(spct.ds_item_segurado, ','))
                                         WHERE " . implode(' AND ', $where) . "
                                           AND sis.vl_lmga > 0
                                           AND spe.fl_proposta_vigente is true
                                           AND sp.id_status NOT IN (2, 4, 5)
                                         ORDER BY sp.id desc, sis.nr_item_segurado
                                          ) AS subscricao_inicial
                                  ) AS subscricao_coordenadas_base
                          ) AS subscricao_coordenadas_final
          ";

        return $this->fetchAll($sql);
    }

	public function relatorioPremioItemCobertura(int $idSafra = null, ?array $arProdutos = null): array
	{
		$whereParametros = [];

		if (!empty($idSafra)) {
			$whereParametros[] = "pd.id_safra = {$idSafra}";
		}

		if (!empty($arProdutos)) {
			$idsProdutos = implode("," , $arProdutos);
			$whereParametros[] = "pd.id IN ($idsProdutos)";
		}

		$this->estruturarLiquidacaoMultirrisco($whereParametros);

		$condicaoMultirrisco2 = "((pc.ds_chave_cobertura = 'COB_MULTIRISCO_II' AND tli.ds_chave = 'LIQ05') OR tli.ds_chave = 'LIQ17')";
		$whereLiquidacaoItemSelect = ["NOT {$condicaoMultirrisco2}"];
		$whereLiquidacaoItemSelect = array_merge($whereLiquidacaoItemSelect, $whereParametros);
		$whereLiquidacaoItemSelect = implode(" AND ", $whereLiquidacaoItemSelect);

		$sqlLiquidacaoItemTemp = "
			CREATE TEMP TABLE liquidacao_item_temp AS (
				SELECT x.id_proposta
					,x.nr_item_segurado
					,x.id_cobertura
					,round(sum(x.vl_prejuizo), 2) AS vl_prejuizo
					,round(sum(x.vl_indenizacao), 2) AS vl_indenizacao
				FROM (
					SELECT prc.id_proposta
						,sis.nr_item_segurado
						,lisc.id_cobertura
						,round(sum(lisc.vl_prejuizo_total), 2) AS vl_prejuizo
						,round(sum(lisc.vl_indenizacao), 2) AS vl_indenizacao
					FROM sinistro.processos prc
					JOIN sinistro.liquidacoes li ON li.id_processo = prc.id
					JOIN sinistro.tipo_liquidacao tli ON tli.id = li.id_tipo_liquidacao
					JOIN sinistro.liquidacoes_itens_segurados_coberturas lisc ON lisc.id_liquidacao = li.id
					JOIN seguro.itens_segurados sis ON sis.id = lisc.id_item_segurado
					JOIN seguro.propostas pr ON pr.id = prc.id_proposta
					JOIN produto.produtos pd ON pd.id = pr.id_produto
					JOIN produto.coberturas pc ON pc.id = lisc.id_cobertura
					WHERE {$whereLiquidacaoItemSelect}
					GROUP BY prc.id_proposta
							,sis.nr_item_segurado
							,sis.ds_item_segurado
							,lisc.id_cobertura
							,pc.ds_chave_cobertura

					UNION

						SELECT id_proposta
							,nr_item_segurado
							,id_cobertura
							,vl_prejuizo
							,vl_indenizacao
						FROM liquidacao_manual_multirrisco_item_temp
				) AS x
				GROUP BY x.id_proposta
						,x.nr_item_segurado
						,x.id_cobertura
			);
		";
		$this->_db->query($sqlLiquidacaoItemTemp);

		$wherePropostasEndosso = ["spe.fl_proposta_vigente is true"];
		$wherePropostasEndosso = array_merge($wherePropostasEndosso, $whereParametros);
		$wherePropostasEndosso = implode(" AND ", $wherePropostasEndosso);

		$sqlPropostasEndossoTemp = "
			CREATE TEMP TABLE propostas_endosso_temp AS (
				SELECT spe.id_proposta
				  FROM seguro.propostas_endosso spe
				  JOIN seguro.propostas pr ON pr.id = spe.id_proposta
				  JOIN produto.produtos pd ON pd.id = pr.id_produto
				 WHERE {$wherePropostasEndosso}
			);
		";
		$this->_db->query($sqlPropostasEndossoTemp);

		$sqlPropostaCroquisTalhoesTemp = "
			CREATE TEMP TABLE propostas_croquis_talhoes_itens_temp AS (
				SELECT DISTINCT ON (unnest(string_to_array(ds_item_segurado,','))::integer)
					   spct2.id AS id_propostas_croquis_talhoes
					  ,unnest(string_to_array(ds_item_segurado,','))::integer AS id_item_segurado
					  ,spct2.ds_coordenadas_centroide
				  FROM seguro.propostas_croquis_talhoes spct2
				  JOIN seguro.propostas_croquis spc2 ON spc2.id = spct2.id_croqui
				  JOIN propostas_endosso_temp pe_temp ON pe_temp.id_proposta = spc2.id_proposta
				 WHERE spc2.fl_vigente is true
				 ORDER BY id_item_segurado, LENGTH(spct2.ds_coordenadas) DESC
			);
		";
		$this->_db->query($sqlPropostaCroquisTalhoesTemp);

		$where = [
			"st.ds_chave NOT IN ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'APOLICE_CANCELADA', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'SOLICITACAO_CANCELADA', 'SOLICITACAO_ENDOSSO')",
			"pco.id_usuario <> 487"
		];

		$where = array_merge($where, $whereParametros);
		$where = implode(" AND ", $where);

		$sql = "
			SELECT seguro.id_proposta_mae(pr.id) AS id_proposta
				, sis.id AS id_item_segurado
				, sis.nr_item_segurado
				, sis.ds_item_segurado
      			, round((sis.vl_lmga * pc.vl_taxa) / 100,2) AS vl_premio
      			, sis.vl_area
      			, CASE WHEN pc.fl_principal is true THEN sis.vl_lmga
            		WHEN c.ds_chave_cobertura = 'COB_PROTECAO_FITO' THEN CASE
            		WHEN sis.vl_lmga > 0 THEN sis.vl_area * 100  ELSE 0 END  ELSE round((sis.vl_lmga * pc.vl_lmi) / 100,2) END AS vl_lmga
				, c.ds_nome_cobertura
				, CASE WHEN (SELECT fl_exibir_franquia FROM produto.produtos_coberturas WHERE id_cobertura = c.id AND id_produto = pd.id) = false
						THEN null
						ELSE pc.vl_franquia
				END AS vl_franquia
				, st.ds_chave
				, pd.ds_nome_produto
				, cu.ds_nome_cultura
				, m.nr_ibge
				, pco.vl_comissao
				, sf.ds_nome_safra
				, coalesce(lip.vl_prejuizo, 0.00) AS vl_prejuizo
				, coalesce(lip.vl_indenizacao, 0.00) AS vl_indenizacao
				, CASE WHEN pg.id = " . Produto_Model_ProdutosGeral::ID_TOMATE_INDUSTRIA . "
					THEN 'FRUTAS E HORTALIÇAS'
						WHEN pg.id_tipo_produto = " . Produto_Model_Tipos::GRAOS . "
								THEN CASE WHEN pg.tp_epoca_cultivo = 'I'
									THEN ptp.ds_tipo_produto || ' RN - INVERNO'
								ELSE ptp.ds_tipo_produto || ' RN - VERÃO'
						END
					WHEN pg.id_tipo_produto = " . Produto_Model_Tipos::MULTIRRISCO . "
						THEN CASE WHEN pg.tp_epoca_cultivo = 'I'
									THEN 'GRÃOS PG - INVERNO'
								ELSE 'GRÃOS PG - VERÃO'
						END
					ELSE ptp.ds_tipo_produto
				END as tipo_produto
				, m.ds_nome_municipio
				, e.ds_sigla
				, CASE WHEN croqui_temp.ds_coordenadas_centroide IS NOT NULL
					   	THEN croqui_temp.ds_coordenadas_centroide
					   WHEN sisc.ds_coordenadas_geograficas IS NOT NULL
					   	THEN REPLACE(coordenadas_dms_para_decimal(sisc.ds_coordenadas_geograficas), ' ', ', ')
					   ELSE REPLACE(coordenadas_dms_para_decimal(pp.ds_coordenadas), ' ', ', ')
				END AS ds_coordenadas_centroide
			FROM propostas_endosso_temp pe_temp
			JOIN seguro.propostas pr ON pr.id = pe_temp.id_proposta
			JOIN seguro.itens_segurados sis ON sis.id_proposta = pr.id
			JOIN seguro.propostas_corretores pco ON pco.id_proposta = pr.id
			JOIN seguro.propostas_coberturas pc ON pc.id_proposta = pr.id
			JOIN seguro.propostas_propriedades pp ON pp.id_proposta = pr.id
			JOIN produto.coberturas c ON c.id = pc.id_cobertura
			JOIN produto.produtos pd ON pd.id = pr.id_produto
			JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
			JOIN produto.tipo_produto ptp ON ptp.id = pg.id_tipo_produto
			JOIN produto.safras sf ON sf.id = pd.id_safra
			JOIN produto.culturas cu ON cu.id = pg.id_cultura
			JOIN sistema.status st ON st.id = pr.id_status
			JOIN sistema.municipios m ON m.id = pp.id_municipio
			JOIN sistema.estados e ON e.id = m.id_estado
			LEFT JOIN seguro.itens_segurados_complemento sisc ON sisc.id_item_segurado = sis.id
			LEFT JOIN propostas_croquis_talhoes_itens_temp croqui_temp ON croqui_temp.id_item_segurado = sis.id
			LEFT JOIN liquidacao_item_temp lip ON lip.id_proposta = pc.id_proposta
												AND lip.id_cobertura = pc.id_cobertura
												AND lip.nr_item_segurado = sis.nr_item_segurado
			WHERE {$where}
			ORDER BY
				pr.id_proposta_mae,
				pr.id,
				sis.nr_item_segurado,
				pc.fl_principal DESC,
				pc.id_cobertura;
		";

		return $this->fetchAll($sql);
	}

	/**
	 * Ajustes para LIQ17 ou LIQ05 com produto multirrisco 2, para
	 * desconsiderar valores negativos nos itens, somar todos os valores dos itens
	 * e dividir o total proporcionalmente entre os itens pela sua área.
	 *
	 * @param array $whereParametros
	 */
	private function estruturarLiquidacaoMultirrisco(array $whereParametros): void
	{
		//Monta a tabela temporária liquidacao_manual_multirrisco_temp, somando o total de área, prejuizo e indenização por liquidação
		$condicaoMultirrisco = "((pc.ds_chave_cobertura = 'COB_MULTIRISCO_II' AND tli.ds_chave = 'LIQ05') OR tli.ds_chave = 'LIQ17')";
		$sqlLiquidacaoManualMultirriscoTemp = "
			CREATE TEMP TABLE liquidacao_manual_multirrisco_temp AS (
				SELECT lisc.id_liquidacao
					  ,sum(sis.vl_area) AS vl_area_total
					  ,round((SELECT COALESCE(sum(vl_prejuizo_total), 0) FROM sinistro.liquidacoes_itens_segurados_coberturas i WHERE i.id_liquidacao = lisc.id_liquidacao AND vl_prejuizo_total > 0), 2) AS vl_prejuizo_total
					  ,round((SELECT COALESCE(sum(vl_indenizacao), 0) FROM sinistro.liquidacoes_itens_segurados_coberturas i WHERE i.id_liquidacao = lisc.id_liquidacao AND vl_indenizacao > 0), 2) AS vl_indenizacao_total
				  FROM sinistro.liquidacoes li
				  JOIN sinistro.tipo_liquidacao tli ON tli.id = li.id_tipo_liquidacao
				  JOIN sinistro.liquidacoes_itens_segurados_coberturas lisc ON lisc.id_liquidacao = li.id
				  JOIN seguro.itens_segurados sis ON sis.id = lisc.id_item_segurado
				  JOIN produto.coberturas pc ON pc.id = lisc.id_cobertura
				 WHERE {$condicaoMultirrisco}
				 GROUP BY lisc.id_liquidacao
			);
		";
		$this->_db->query($sqlLiquidacaoManualMultirriscoTemp);

		//Monta a tabela temporária liquidacao_manual_multirrisco_item_temp dividindo o valor total da liquidação entre os itens proporcionalmente a sua área
		$whereLiquidacaoItemSelect = [$condicaoMultirrisco];
		$whereLiquidacaoItemSelect = array_merge($whereLiquidacaoItemSelect, $whereParametros);
		$whereLiquidacaoItemSelect = implode(" AND ", $whereLiquidacaoItemSelect);
		$sqlLiquidacaoManualMultirriscoItemTemp = "
			CREATE TEMP TABLE liquidacao_manual_multirrisco_item_temp AS (
				SELECT  prc.id_proposta
					,lisc.id_liquidacao
					,sis.nr_item_segurado
					,lisc.id_cobertura
					,round((lmmt.vl_prejuizo_total * ((sis.vl_area * 100) / lmmt.vl_area_total)) / 100,2)    AS vl_prejuizo
					,round((lmmt.vl_indenizacao_total * ((sis.vl_area * 100) / lmmt.vl_area_total)) / 100,2) AS vl_indenizacao
				FROM sinistro.processos prc
				JOIN sinistro.liquidacoes li ON li.id_processo = prc.id
				JOIN sinistro.tipo_liquidacao tli ON tli.id = li.id_tipo_liquidacao
				JOIN sinistro.liquidacoes_itens_segurados_coberturas lisc ON lisc.id_liquidacao = li.id
				JOIN liquidacao_manual_multirrisco_temp lmmt ON lmmt.id_liquidacao = lisc.id_liquidacao
				JOIN seguro.itens_segurados sis ON sis.id = lisc.id_item_segurado
				JOIN seguro.propostas pr ON pr.id = prc.id_proposta
				JOIN produto.produtos pd ON pd.id = pr.id_produto
				JOIN produto.coberturas pc ON pc.id = lisc.id_cobertura
				WHERE {$whereLiquidacaoItemSelect}
				GROUP BY  prc.id_proposta
						,sis.nr_item_segurado
						,sis.ds_item_segurado
						,lisc.id_cobertura
						,pc.ds_chave_cobertura
						,sis.vl_area
						,sis.id
						,li.id
						,lmmt.vl_area_total
						,lmmt.vl_prejuizo_total
						,lmmt.vl_indenizacao_total
						,lisc.id_liquidacao
			);
		";
		$this->_db->query($sqlLiquidacaoManualMultirriscoItemTemp);

		//Verifica e a soma dos valores distribuído nos itens fecha com o valor total da indenização,
		//caso não, acrescenta o valor da diferença no último item da liquidação.
		$sqlAcertoArredodamento = "
			WITH cte AS (
				SELECT x.id_liquidacao
					  ,(x.vl_prejuizo_total - x.vl_prejuizo_sum) AS vl_prejuizo_diferenca
					  ,(x.vl_indenizacao_total - x.vl_indenizacao_sum) AS vl_indenizacao_diferenca
					  ,(SELECT t.nr_item_segurado FROM liquidacao_manual_multirrisco_item_temp t WHERE t.id_liquidacao = x.id_liquidacao ORDER BY t.nr_item_segurado DESC LIMIT 1 ) AS nr_item_segurado
				  FROM (
				  	  SELECT lit.id_liquidacao
				  	  	    ,sum(lit.vl_prejuizo) AS vl_prejuizo_sum
				  	  	    ,sum(lit.vl_indenizacao) AS vl_indenizacao_sum
				  	  	    ,lmmt.vl_indenizacao_total
				  	  	    ,lmmt.vl_prejuizo_total
				  	    FROM liquidacao_manual_multirrisco_item_temp lit
				  	    JOIN liquidacao_manual_multirrisco_temp lmmt ON lmmt.id_liquidacao = lit.id_liquidacao
				  	   GROUP by lit.id_liquidacao
				  	  		 ,lmmt.vl_indenizacao_total
				  	  		 ,lmmt.vl_prejuizo_total
				  	  HAVING sum(lit.vl_indenizacao) <> lmmt.vl_indenizacao_total
					      OR sum(lit.vl_prejuizo) <> lmmt.vl_prejuizo_total
				  ) AS x
			)

			UPDATE liquidacao_manual_multirrisco_item_temp
			   SET vl_prejuizo = vl_prejuizo + cte.vl_prejuizo_diferenca,
				   vl_indenizacao = vl_indenizacao + cte.vl_indenizacao_diferenca
			  FROM cte
			 WHERE liquidacao_manual_multirrisco_item_temp.id_liquidacao = cte.id_liquidacao
			   AND liquidacao_manual_multirrisco_item_temp.nr_item_segurado = cte.nr_item_segurado;
		";
		$this->_db->query($sqlAcertoArredodamento);
	}

	
	/**
 		* [SR-53734]Gera um relatório detalhado de informações por apólice com base nos filtros fornecidos.
 		*
 		* Este método executa uma série de queries SQL para criar tabelas temporárias no banco de dados,
 		* filtrar propostas de seguro, agrupar dados de sinistros, avisos, vistorias e liquidações,
 		* e consolidar essas informações em um array estruturado.
 		*
 		* Parâmetros aceitos no array $params:
 		* - 'id_safra' (string|int): ID da safra a ser filtrada.
 		* - 'id_cultura' (array): Lista de IDs de culturas.
		* - 'id_resseguro' (array): Lista de IDs de contratos de resseguro.
		*
		* @param array $params Filtros para geração do relatório.
		*
		* @return array {
		*     @type array $dados_complementares Informações detalhadas das propostas filtradas.
		*     @type array $liquidacoes Lista de liquidações por endosso.
		*     @type array $sinistros Lista de sinistros com avisos, eventos, datas e status consolidados.
		* }
		*
		* 
	*/
	public function relatorioInformacoesResseguroPorApolice($where){
		$todosAvisosCanceladosOuRecusados = true;
		//propostas com status especifico relacionadas com tabelas de resseguro, incluindo info de produto, cultura e propriedades
		$this->_db->query("CREATE TEMP TABLE tmp_propostas_filtradas AS 
			WITH propostas_filtradas AS 
				(SELECT * FROM seguro.propostas
					WHERE id_status IN (8, 13)),
					produtos_filtrados AS
						(SELECT * FROM produto.produtos 
						WHERE id_safra {$where['id_safra']}),
					culturas_filtradas AS
						(SELECT id FROM produto.produtos_geral 
						WHERE id_cultura {$where['id_cultura']}),
					contratos_validos AS
						(SELECT id,dt_inicio_vigencia FROM produto.contratos_resseguro WHERE id {$where['id_contrato_resseguro']})
						SELECT p.id, 
						p.id_proposta_mae, 
						p.id_produto, 
						p.nr_apolice, 
						p.dt_vigencia_inicio, 
						p.dt_vigencia_fim, 
						p.id_status, 
						p.vl_custo_apolice, 
						p.id_endosso, 
						p.dt_transmissao, 
						prod.id_produto_geral, 
						prod.ds_nome_produto, 
						prod.id_safra,
						st.dt_criacao as dt_emissao,
						cr.dt_inicio_vigencia as dt_inicio_vigencia_resseguro,
						pcr.id as id_proposta_resseguro,
						string_to_array(coordenadas_dms_para_decimal(pp.ds_coordenadas), ' ') AS coordenadas_decimais
						FROM propostas_filtradas p 
						JOIN produtos_filtrados prod ON prod.id = p.id_produto 
						JOIN culturas_filtradas cg ON prod.id_produto_geral = cg.id 
						LEFT JOIN seguro.propostas_contratos_resseguro pcr ON p.id = pcr.id_proposta 
						LEFT JOIN contratos_validos cr ON pcr.id_contrato_resseguro = cr.id
						LEFT JOIN seguro.propostas_status st ON st.id_proposta = p.id AND st.id_status = 8
						INNER JOIN seguro.propostas_corretores pc ON pc.id_proposta = p.id
						JOIN seguro.propostas_propriedades pp ON pp.id_proposta = p.id where pc.id_usuario  <> 487 order by id_proposta_mae");

		$this->_db->query("CREATE TEMP TABLE tmp_endossos AS
			SELECT ppr.id,
			ppr.id_endosso,
			seguro.nr_endosso(ppr.id, ppr.id_endosso) AS nr_endosso
			FROM tmp_propostas_filtradas ppr group by ppr.id, ppr.id_endosso");

		$this->_db->query("CREATE TEMP TABLE tmp_base_propostas AS
			SELECT ppr.*,e.nr_endosso
			FROM tmp_propostas_filtradas ppr
			JOIN tmp_endossos e ON ppr.id = e.id AND ppr.id_endosso = e.id_endosso;");

		$this->_db->query("CREATE TEMP TABLE ultimos_endossos AS 
			SELECT tbp.id AS id_proposta,
			tbp.id_proposta_mae,
			tbp.id_endosso,
			tbp.nr_endosso,
			tbp.id_produto FROM tmp_base_propostas tbp 
			JOIN  seguro.propostas_endosso spe ON spe.id_proposta = tbp.id 
			WHERE spe.fl_proposta_vigente = TRUE group by tbp.id, tbp.id_proposta_mae, tbp.id_endosso, tbp.nr_endosso, tbp.id_produto");

		$this->_db->query("CREATE TEMP TABLE processos_temp AS 
			SELECT ue.id_proposta,
			ue.id_endosso,
			sp.id AS id_processo, 
			st.ds_status AS status_sinistro,
			tbp.id_proposta_mae,
			sa.id AS id_aviso, 
			sa.dt_sinistro, 
			sa.id_status AS status_aviso,
			sp.id_status AS id_status_sinistro
			FROM sinistro.processos sp 
			INNER JOIN ultimos_endossos ue ON ue.id_proposta = sp.id_proposta
			INNER JOIN tmp_base_propostas tbp ON tbp.id_endosso = ue.id_endosso
			INNER JOIN sistema.status st ON st.id = sp.id_status 
			LEFT JOIN sinistro.avisos sa ON sa.id_proposta = ue.id_proposta
			GROUP BY sp.id, st.ds_status, ue.id_proposta, tbp.id_proposta_mae, sa.id, sa.id_status, sa.dt_sinistro, ue.id_endosso, ue.id_proposta;");
	
		$this->_db->query("CREATE TEMP TABLE tmp_avisos_sinistro AS
			SELECT sa.id AS id_aviso,
			sa.id_proposta,
			sa.dt_sinistro,
			pt.id_processo,
			pt.id_endosso,
			pe.ds_nome_evento,
			sa.dt_criacao as dt_envio,
			sa.id_status,
			sa.fl_ocorrencia_replantio as replantio
			FROM
			sinistro.avisos sa
			INNER JOIN processos_temp pt ON pt.id_proposta = sa.id_proposta
			INNER JOIN sinistro.avisos_eventos ae ON ae.id_aviso = sa.id
			INNER JOIN produto.eventos pe on pe.id = ae.id_evento
			WHERE sa.id_status IN (27,28,29,168)
			GROUP BY sa.id,pt.id_endosso,pt.id_processo,sa.id_proposta, sa.dt_sinistro,pe.ds_nome_evento, sa.dt_criacao order by sa.id");

		$this->_db->query("CREATE TEMP TABLE tmp_vistorias_processos AS (SELECT vp.id_vistoria AS id_vistoria_processo,
			vp.id_processo,
			p.id_proposta,
			crv.id_cobranca_relatorio,
			SUM(crv.vl_honorarios) AS vl_honorarios,
			SUM(crv.vl_alimentacao) AS vl_alimentacao,
			SUM(crv.vl_hotel) AS vl_hotel,
			SUM(crv.vl_pedagio) AS vl_pedagio,
			SUM(crv.vl_custo_quilometragem) AS vl_custo_quilometragem,
			SUM(crv.vl_alimentacao + crv.vl_hotel + crv.vl_pedagio + crv.vl_custo_quilometragem) AS vl_total_despesas,
			SUM(crv.vl_honorarios + crv.vl_alimentacao + crv.vl_hotel + crv.vl_pedagio + crv.vl_custo_quilometragem) AS despesas_sinistro FROM 
			sinistro.cobranca_relatorio_vistorias crv
			LEFT JOIN sinistro.cobranca_relatorio cr ON cr.id = crv.id_cobranca_relatorio
			INNER JOIN sistema.status st ON st.id = cr.id_status
			INNER JOIN sistema.vistorias v ON v.id = crv.id_vistoria
			INNER JOIN sistema.tipos_vistoria tv ON tv.id = v.id_tipo
			INNER JOIN sinistro.vistorias_processos vp ON vp.id_vistoria = v.id
			INNER JOIN processos_temp p ON p.id_processo = vp.id_processo GROUP BY vp.id_vistoria, vp.id_processo, p.id_proposta, crv.id_cobranca_relatorio);");

		$this->_db->query("CREATE TEMP TABLE tmp_vistorias_processos2 AS 
			SELECT vp.id_vistoria AS id_vistoria_processo, 
			vp.id_processo, 
			p.id_proposta, 
			crv.id_cobranca_relatorio, 
			COALESCE(crv.vl_honorarios, 0) AS vl_honorarios, 
			COALESCE(crv.vl_alimentacao, 0) AS vl_alimentacao, 
			COALESCE(crv.vl_hotel, 0) AS vl_hotel, 
			COALESCE(crv.vl_pedagio, 0) AS vl_pedagio, 
			COALESCE(crv.vl_custo_quilometragem, 0) AS vl_custo_quilometragem, 
			COALESCE(crv.vl_alimentacao, 0) + COALESCE(crv.vl_hotel, 0) + COALESCE(crv.vl_pedagio, 0) + COALESCE(crv.vl_custo_quilometragem, 0) AS vl_total_despesas, COALESCE(crv.vl_honorarios, 0) + COALESCE(crv.vl_alimentacao, 0) + COALESCE(crv.vl_hotel, 0) + COALESCE(crv.vl_pedagio, 0) + COALESCE(crv.vl_custo_quilometragem, 0) AS despesas_sinistro FROM sinistro.vistorias_processos vp INNER JOIN processos_temp p ON p.id_processo = vp.id_processo LEFT JOIN sistema.vistorias v ON v.id = vp.id_vistoria LEFT JOIN sistema.tipos_vistoria tv ON tv.id = v.id_tipo LEFT JOIN sinistro.cobranca_relatorio_vistorias crv ON crv.id_vistoria = vp.id_vistoria LEFT JOIN sinistro.cobranca_relatorio cr ON cr.id = crv.id_cobranca_relatorio LEFT JOIN sistema.status st ON st.id = cr.id_status group by id_vistoria_processo, vp.id_processo, p.id_proposta, crv.id_cobranca_relatorio, crv.vl_honorarios, crv.vl_alimentacao, crv.vl_hotel, crv.vl_pedagio, crv.vl_custo_quilometragem;");

		$this->_db->query("CREATE TEMP TABLE tmp_liquidacoes_por_endosso AS
			SELECT p.id_endosso,
			p.id AS id_proposta,
			p.id_proposta_mae,
			liq.id AS id_liquidacao,
			liq.id_processo, st.ds_status as status_liquidacao, 
			pgto.vl_pagamento as vl_pago
			FROM sinistro.liquidacoes liq
			JOIN sinistro.processos proc ON proc.id = liq.id_processo
			JOIN processos_temp ptemp ON ptemp.id_processo = proc.id
			JOIN seguro.propostas p ON p.id = ptemp.id_proposta
			JOIN sistema.status st on liq.id_status = st.id
			LEFT JOIN sinistro.liquidacoes_previsao_pagamento pgto on liq.id = pgto.id_liquidacao
			LEFT JOIN sinistro.liquidacoes_canceladas liq_cancel ON liq.id = liq_cancel.id_liquidacao
			LEFT JOIN sinistro.liquidacoes_itens_segurados_coberturas liq_cob ON liq.id = liq_cob.id_liquidacao
			WHERE liq_cancel.id_liquidacao IS NULL and liq_cob.id_liquidacao IS NOT NULL;
			");

		$this->_db->query("SELECT seguro.sumario_parcelas(0);");
		$this->_db->query("CREATE temp TABLE tmp_parcela_restituicao AS (
			SELECT coalesce(sum(vl_segurado),0.0) as vl_restituido, pe.id_endosso
			FROM tmp_base_propostas pr 
			inner join seguro.propostas_endosso pe on pe.id_proposta = pr.id 
			inner join produto.produtos pd ON pd.id = pr.id_produto 
			inner join seguro.propostas_parcelas pp on pp.id_proposta = pr.id inner join sistema.status st on st.id = pr.id_status and st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA') 
			WHERE pd.id_safra {$where['id_safra']} and pp.vl_segurado < 0 GROUP BY pr.id_proposta_mae, pe.id_endosso)");

		$this->_db->query("CREATE temp TABLE tmp_parcela_cobranca AS (SELECT
						    sum(vl_segurado) as vl_pago,
						    pe.id_endosso,
							pr.id_proposta_mae
						FROM
						    seguro.propostas pr
						    inner join tmp_endossos pe on pe.id= pr.id
						    inner join produto.produtos pd ON pd.id = pr.id_produto
						    inner join seguro.propostas_parcelas pp on pp.id_proposta = pr.id
						    inner join sistema.status st on st.id = pr.id_status and st.ds_chave not in ('PROPOSTA_INCOMPLETA' , 'NAO_ENVIADA' , 'DEVOLVIDA' , 'PROPOSTA_CANCELADA' , 'ORCAMENTO_ENDOSSO', 'ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')
						WHERE pd.id_safra {$where['id_safra']} and
						      pp.vl_segurado > 0 and pp.fl_pago = true
						GROUP BY pr.id_proposta_mae, pe.id_endosso 
					)
				");

		$this->_db->query("CREATE TEMP TABLE temp_itens_segurados AS (
			SELECT sis.id_proposta,
			pr.id_endosso,
        	SUM(sis.vl_area) AS vl_area,
        	SUM(sis.vl_lmga) AS vl_lmga,
        	SUM(sis.vl_area * sis.vl_rendimento_tonelada) AS area_pe FROM 
        	seguro.itens_segurados sis
    		INNER JOIN ultimos_endossos pr ON pr.id_proposta = sis.id_proposta
    		WHERE sis.vl_lmga > 0 GROUP BY sis.id_proposta, pr.id_endosso);");

		$this->_db->query("CREATE TEMP TABLE tmp_dados_complementares AS 
			WITH menor_emissao AS (SELECT id_proposta_mae, MIN(dt_emissao) AS menor_data_emissao FROM tmp_base_propostas GROUP BY id_proposta_mae),
			transmissao_original AS (
				SELECT id_proposta_mae, dt_transmissao,dt_vigencia_inicio, dt_vigencia_fim
 				FROM tmp_base_propostas
 				WHERE nr_endosso = 0
			),
			base_propostas AS (
				SELECT bp.*, spe.id_endosso AS bp_id_endosso, me.menor_data_emissao
				FROM tmp_base_propostas bp
 				JOIN seguro.propostas_endosso spe 
 				ON bp.id = spe.id_proposta AND bp.id_endosso = spe.id_endosso
 				LEFT JOIN menor_emissao me 
 				ON bp.id_proposta_mae = me.id_proposta_mae
			),
			produtos_detalhes AS (
				SELECT prod.id, prod.ds_nome_produto, prod.id_safra, pg.id AS id_geral, pg.id_tipo_produto, cul.ds_nome_cultura, safras.ds_nome_safra, prod.ds_nome_abreviado
				FROM produto.produtos prod
				JOIN produto.produtos_geral pg ON prod.id_produto_geral = pg.id
				JOIN produto.culturas cul ON pg.id_cultura = cul.id
				JOIN produto.safras safras ON prod.id_safra = safras.id
			),
			financeiro AS (
				SELECT pat.id_endosso, pat.valor_total, tis.id_proposta, tis.vl_area, tis.vl_lmga, tis.area_pe, tcob.vl_pago, trest.vl_restituido
				FROM sumario_parcelas pat
				LEFT JOIN temp_itens_segurados tis ON pat.id_endosso = tis.id_endosso
				JOIN ultimos_endossos ue ON tis.id_proposta = ue.id_proposta
				LEFT JOIN tmp_parcela_cobranca tcob ON tcob.id_endosso = ue.id_endosso
				LEFT JOIN tmp_parcela_restituicao trest ON trest.id_endosso = ue.id_endosso
			),
			sinistros AS (
				SELECT sin.id_endosso, sin.id_processo, processos.id_status
				FROM processos_temp sin
				LEFT JOIN sinistro.processos processos ON processos.id = sin.id_processo
			),
			resseguro AS (
				SELECT pcr.id_proposta, pcr.id_contrato_resseguro, cr.dt_inicio_vigencia
 				FROM seguro.propostas_contratos_resseguro pcr
 				LEFT JOIN produto.contratos_resseguro cr ON pcr.id_contrato_resseguro = cr.id
			),
			cobertura_principal AS (
				SELECT pco.id_proposta, pco.id_cobertura, pco.vl_franquia, cob.ds_chave_cobertura, pco.fl_principal
 				FROM seguro.propostas_coberturas pco
 				JOIN produto.coberturas cob ON pco.id_cobertura = cob.id
 				WHERE pco.fl_principal = true AND pco.fl_del = false
			),
			localizacao AS (
 				SELECT spp.id_proposta, spp.id_municipio, smu.ds_nome_municipio, smu.nr_ibge, smu.id_estado, 
 				se.ds_nome_estado, se.ds_sigla, smu.id_regiao, smu.ds_regiao_ibge
 				FROM seguro.propostas_propriedades spp
 				JOIN sistema.municipios smu ON smu.id = spp.id_municipio
 				JOIN sistema.estados se ON se.id = smu.id_estado
			),
			final AS (
				SELECT bp.id AS id_proposta,
 				bp.id_proposta_mae,
 				cob.ds_chave_cobertura,
 				bp.id_endosso,
 				bp.nr_endosso,
 				bp.dt_inicio_vigencia_resseguro,
 				prod.ds_nome_safra,
 				prod.ds_nome_cultura,
 				to_char(trans.dt_transmissao, 'DD/MM/YYYY HH24:MI:SS') AS dt_transmissao,
 				to_char(trans.dt_vigencia_inicio, 'DD/MM/YYYY HH24:MI:SS') AS dt_inicio_vigencia,
 				to_char(trans.dt_vigencia_fim, 'DD/MM/YYYY HH24:MI:SS') AS dt_vigencia_fim,
 				CASE WHEN cob.fl_principal AND prod.id_tipo_produto = 3 THEN 'Multirrisco' ELSE 'Risco Nomeado' END AS tipo_cobertura,
 				CASE WHEN cob.fl_principal AND prod.id_tipo_produto = 3 THEN 'Multirrisco' ELSE 'Granizo' END AS cobertura_basica,
 				CASE 
 					WHEN cob.fl_principal AND prod.ds_nome_abreviado like '%- Multirrisco II%' THEN 'Área total'
 					WHEN cob.fl_principal AND cob.id_cobertura = 1 AND prod.id_tipo_produto = 2 THEN 'Área sinistrada'
 					WHEN cob.fl_principal THEN 'Talhonamento'
 					ELSE NULL
 				END AS tipo_area,
 				CASE 
 				WHEN bp.id_status = 8 THEN 'Emitida'
 				WHEN bp.id_status = 13 AND EXISTS (
					SELECT 1 FROM processos_temp ps 
					WHERE ps.id_proposta = bp.id AND bp.id_status NOT IN (5)
				) THEN 'Cancelada com sinistro'
				WHEN bp.id_status = 13 THEN 'Cancelada' ELSE NULL
 				END AS situacao_proposta,
				case when bp.id_status != 13 then 0 else coalesce(fin.vl_pago,0) + coalesce(fin.vl_restituido,0) end as vl_retido,
 				loc.id_municipio,
 				loc.ds_nome_municipio,
 				loc.nr_ibge,
 				loc.id_estado,
 				loc.ds_nome_estado,
 				loc.ds_sigla,
				loc.ds_regiao_ibge,
 				prod.ds_nome_produto,
 				prod.id_safra,
 				fin.vl_area AS total_area,
 				fin.vl_lmga,
 				fin.area_pe,
 				cob.vl_franquia,
 				fin.valor_total,
 				pr.vl_custo_apolice,
 				bp.id_proposta_resseguro,
 				vppr.nr_apolice,
 				re.ds_nome_regiao,
 				bp.id_status,
 				cob.id_cobertura,
 				tp.ds_chave_rn AS tipo_produto,
				CASE WHEN tp.ds_chave_rn = 'MULTIRRISCO' THEN 1 ELSE 0 END as is_pg,
 				bp.dt_emissao,
 				bp.menor_data_emissao,
 				btrim(bp.coordenadas_decimais[1]) AS latitude,
 				btrim(bp.coordenadas_decimais[2]) AS longitude
 				FROM base_propostas bp
 				JOIN produtos_detalhes prod ON prod.id = bp.id_produto
 				JOIN cobertura_principal cob ON cob.id_proposta = bp.id
 				JOIN produto.tipo_produto tp ON tp.id = prod.id_tipo_produto
 				JOIN localizacao loc ON loc.id_proposta = bp.id
 				LEFT JOIN sistema.regioes re ON re.id = loc.id_regiao
 				JOIN financeiro fin ON fin.id_proposta = bp.id
 				JOIN tmp_base_propostas pr ON pr.id = bp.id
 				JOIN seguro.propostas vppr ON vppr.id = bp.id
 				LEFT JOIN sinistros sin ON sin.id_endosso = bp.id_endosso
 				LEFT JOIN resseguro res ON res.id_proposta = bp.bp_id_endosso
 				LEFT JOIN transmissao_original trans ON trans.id_proposta_mae = bp.id_proposta_mae
			)
			SELECT * FROM final;"
		);
		$query = "SELECT d.*
			FROM tmp_dados_complementares d
			LEFT JOIN tmp_liquidacoes_por_endosso l 
    		ON d.id_proposta = l.id_proposta AND d.id_endosso = l.id_endosso
			GROUP BY 
    		d.id_proposta, d.id_proposta_mae,d.id_endosso, d.nr_endosso, d.ds_nome_safra, d.ds_nome_cultura, d.dt_transmissao, d.dt_inicio_vigencia,
    		d.dt_vigencia_fim, d.tipo_cobertura, d.cobertura_basica, d.tipo_area, d.situacao_proposta,
    		d.id_municipio, d.ds_nome_municipio, d.nr_ibge, d.id_estado, d.ds_nome_estado, d.ds_sigla,
    		d.ds_nome_produto, d.id_safra, d.total_area, d.vl_lmga, d.area_pe, d.vl_franquia,
    		d.valor_total, d.vl_custo_apolice, d.id_proposta_resseguro,d.nr_apolice, d.ds_nome_regiao, d.id_status, d.id_cobertura, d.tipo_produto,
    		d.ds_chave_cobertura, d.latitude, d.longitude, d.dt_emissao, d.dt_inicio_vigencia_resseguro, d.menor_data_emissao, d.vl_retido, d.is_pg, d.ds_regiao_ibge";

		$dados_complementares 	= $this->fetchAll($query);
		//indexar por id_proposta_mae
		$dados_complementares = $this->unificarPropostas($dados_complementares);

		//indexar por id_proposta_mae
		$liquidacoes 			= $this->fetchAll("SELECT * FROM tmp_liquidacoes_por_endosso;");

		$processos_sinistro		= $this->fetchAll("SELECT * FROM processos_temp;");
		$avisos_sinistro		= $this->fetchAll("SELECT * FROM tmp_avisos_sinistro;");
		$vistorias				= $this->fetchAll("SELECT * FROM tmp_vistorias_processos2");

		$avisos_por_processo 			= [];
		$ids_status_avisos_por_processo = [];
		$avisos_eventos = [];
		
		foreach ($avisos_sinistro as $aviso) {
			$id_processo = $aviso['id_processo'];
	
 			if (!isset($avisos_por_processo[$id_processo])) {
 				$avisos_por_processo[$id_processo] = [];
 			}

 			$avisos_por_processo[$id_processo][] = $aviso['id_aviso'];

			$ids_status_avisos_por_processo[$id_processo][] = $aviso['id_status'];
			// Agrupar eventos de aviso (se existir o campo 'evento')
			if (isset($aviso['ds_nome_evento'])) {
	 			if (!isset($eventos_por_processo[$id_processo])) {
 					$eventos_por_processo[$id_processo] = [];
 				}
				if(!in_array($aviso['id_status'],[29,35,168])){
					$eventos_por_processo[$id_processo][$aviso['id_aviso']] = ($aviso['replantio']) ? $aviso['ds_nome_evento']."(Replantio)" : $aviso['ds_nome_evento'];
				}else{
					
					$eventos_por_processo[$id_processo][$aviso['id_aviso']] = 'Aviso Cancelado';
				}
			}

			if (isset($aviso['dt_sinistro'])) {
	 			if (!isset($dts_sinistro[$id_processo])) {
 					$dts_sinistro[$id_processo] = [];
 				}
				if(!is_null($aviso['dt_sinistro']) && !in_array($aviso['id_status'], [29,35,168])){
					$dt_sinistro = DateTime::createFromFormat('Y-m-d H:i:s',$aviso['dt_sinistro']);
					$dt_sinistro = $dt_sinistro->format("d/m/Y");
 					$dts_sinistro[$id_processo][] = $dt_sinistro;
				}else{
					$dts_sinistro[$id_processo][] = 'Aviso Cancelado';
				}
			}

			if (isset($aviso['dt_envio'])) {
	 			if (!isset($dts_envio[$id_processo])) {
 					$dts_envio[$id_processo] = [];
 				}
				if(!is_null($aviso['dt_envio']) && !in_array($aviso['id_status'], [29,35,168])){
					$dt_envio = DateTime::createFromFormat('Y-m-d H:i:s-s',$aviso['dt_envio']);
					$dt_envio = (!is_bool($dt_envio)) ? $dt_envio->format("d/m/Y") : "-";
 					$dts_envio[$id_processo][] = $dt_envio;
				}else{
					$dts_envio[$id_processo][] = 'Aviso Cancelado';
				}
 				
			}
			$avisos_eventos[$id_processo][$aviso['id_aviso']] = $aviso['ds_nome_evento'];
		}

		// Agora, adicionamos a chave "ids_avisos" em cada sinistro
		foreach ($processos_sinistro as &$sinistro) {
	
 			$id_processo = $sinistro['id_processo'];

 			$sinistro['ids_avisos'] 	= isset($avisos_por_processo[$id_processo]) ? implode(', ', $avisos_por_processo[$id_processo]) : '';
			$sinistro['eventos_avisos'] = isset($eventos_por_processo[$id_processo]) ? implode(', ', $eventos_por_processo[$id_processo]) : '';
			$sinistro['dts_sinistro'] 	= isset($dts_sinistro[$id_processo]) ? implode(', ', $dts_sinistro[$id_processo]) : '';
			$sinistro['dts_envio'] 		= isset($dts_envio[$id_processo]) ? implode(', ', $dts_envio[$id_processo]) : '';
			
			if(isset($ids_status_avisos_por_processo[$id_processo])){
				foreach($ids_status_avisos_por_processo[$id_processo] as $id_status){

					if(!in_array($id_status, [29,35, 168])){
						$todosAvisosCanceladosOuRecusados = false;
					}else{
						$todosAvisosCanceladosOuRecusados = true;
					}

				}
			}

			$sinistro['apenasAvisosCanceladosOuRecusados'] = $todosAvisosCanceladosOuRecusados;
			
		}
		unset($sinistro); // boa prática

		$unificados = [];
		$chaves = [];
	
		foreach ($processos_sinistro as $registro) {
			$chave = $registro['id_processo'];
			if (!isset($chaves[$chave])) {
 				$unificados[] = $registro;
 				$chaves[$chave] = true;
 			}
		}
		$liquidacoes = array_map("unserialize", array_unique(array_map("serialize", $liquidacoes)));
		$totalPago = 0;
		$liquidacoes_por_processo = [];

		foreach ($liquidacoes as $liq) {
 			$vl_pago = floatval($liq['vl_pago']);
 			$totalPago += $vl_pago;

 			$id_processo = $liq['id_processo'];

 			if (!isset($liquidacoes_por_processo[$id_processo])) {
 				$liquidacoes_por_processo[$id_processo] = [
 					'liquidacoes' => [],
 					'vl_pago_total' => 0.0
 				];
 			}

 			$liquidacoes_por_processo[$id_processo]['liquidacoes'][] = [
 				'id_liquidacao' => $liq['id_liquidacao'],
 				'status_liquidacao' => $liq['status_liquidacao'],
 				'vl_pagamento' => $liq['vl_pago']
			];

 			$liquidacoes_por_processo[$id_processo]['vl_pago_total'] += $vl_pago;
		}

		//criar um foreach nas vistorias, agrupa-las via id_processo e indexa-las nos dados de sinistro.
		// Adicionar ao array de sinistros
		foreach ($unificados as &$sinistro) {
			$id_processo = $sinistro['id_processo'];
			$sinistro['liquidacoes'] = isset($liquidacoes_por_processo[$id_processo]) ? $liquidacoes_por_processo[$id_processo] : [];
		}

		unset($sinistro);

		foreach ($unificados as &$sinistro) {
			$unificados[0]['somatorio_vl_pago'] = $liquidacoes_por_processo[$id_processo]['vl_pago_total'];
		}
		unset($sinistro);
		
		// Agrupar vistorias por id_processo
		$vistoriasPorProcesso = [];
		foreach ($vistorias as $vistoria) {
	 		$idProcesso = $vistoria['id_processo'];
	 		$vistoriasPorProcesso[$idProcesso][] = $vistoria;
		}
		// Adicionar as vistorias ao array de processos
		foreach ($unificados as &$processo) {
			$idProcesso = $processo['id_processo'];
			$processo['vistorias'] = $vistoriasPorProcesso[$idProcesso] ?? [];
		}

		$arr = [
			'dados_complementares'	=> $dados_complementares,
			'liquidacoes' 			=> $liquidacoes,
			'sinistros'				=> $unificados
		];

		return $arr;
	}

	
	/**
 		* Unifica os dados das propostas com base na proposta mãe.
 		*
 		* Este método percorre um array de propostas e, para cada proposta que possui
 		* uma proposta mãe diferente de si mesma, substitui as datas de transmissão e vigência
 		* pelas da proposta mãe correspondente. O objetivo é garantir que os registros
 		* herdem corretamente as informações temporais da proposta principal.
 		*
 		* @param array $propostas Lista de propostas, cada uma contendo pelo menos os campos:
 		*                          - 'id_proposta' (int|string)
 		*                          - 'id_proposta_mae' (int|string)
 		*                          - 'dt_transmissao' (string)
 		*                          - 'dt_inicio_vigencia' (string)
 		*                          - 'dt_vigencia_fim' (string)
 		*
 		* @return array Lista de propostas com as datas ajustadas conforme a proposta mãe.
 	*/
	private function unificarPropostas(array $propostas): array {
		// Indexa os registros por ID
		$porId = [];
		foreach ($propostas as $p) {
			$porId[$p['id_proposta_mae']] = $p;
		}
		$resultado = [];

		foreach ($propostas as $p) {
			$idMae = $p['id_proposta_mae'];
			// Se o registro tem uma mãe diferente dele mesmo
			if ($p['id_proposta'] !== $idMae && isset($porId[$idMae])) {
				$p['dt_transmissao'] 		= $porId[$idMae]['dt_transmissao'];
				$p['dt_inicio_vigencia'] 	= $porId[$idMae]['dt_inicio_vigencia'];
				$p['dt_vigencia_fim'] 		= $porId[$idMae]['dt_vigencia_fim'];
			}
			$resultado[] = $p;
		}

		return $resultado;
	}

	public function getResumoStatus($id_proposta){
		$sql = "SELECT dt_criacao FROM seguro.propostas_status
		WHERE id_proposta = $id_proposta and id_status = 8";
		return $this->fetchAll($sql);
	}

	/* Recupera a data que o corretor transmitiu a proposta para Agro */
	public function getDataRecepcao(int $idProposta) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('pt' => 'log.propostas_transmissao'), 'to_char(pt.dt_criacao, \'dd/mm/yyyy\')');
		$Select->join(array('ss' => 'sistema.status'), 'ss.id = pt.id_status', false);
		$Select->where('pt.id_proposta = ?', $idProposta);
		$Select->where('pt.ds_tipo_transmissao = \'EMITIR_PROPOSTA\'');
		$Select->where('ss.ds_chave = \'ENVIADA_AGUARDANDO_CONF\'');
	
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function relatorioCondicoesComerciaisPorMunicipio($idSafra, $produtos, $municipios)
	{
		$db = Zend_Db_Table::getDefaultAdapter();
		$select = $db->select()
    		->from(
				array('tam'=>'comercializacao.taxas_agrupamento_municipios'),
				'id_municipio, tam.vl_produtividade_estimada'
			)
			->join(
				array('co' => 'comercializacao.taxas_agrupamento'), 
				'co.id = tam.id_taxa_agrupamento', 
				array('id_produto', 'ds_nome_agrupamento_taxas', 'vl_comissao')
			)
			->join(
				array('taxas_valores'=>'comercializacao.taxas_valores'),
				'taxas_valores.id_taxa_agrupamento = co.id', 
				array('vl_franquia', 'vl_taxa','vl_taxa_renovacao', 'vl_taxa_inadimplente')
			)
			->join(
				array('p' => 'produto.produtos'), 
				'p.id = co.id_produto', 
				'ds_nome_produto'
			)
			->join(
				array('safras'=>'produto.safras'), 
				'safras.id = p.id_safra', 
				'ds_nome_safra'
			)
			->join(
				array('pc'=>'produto.produtos_coberturas'), 
				'pc.id_produto = p.id AND pc.id_cobertura = taxas_valores.id_cobertura AND pc.fl_ativo IS TRUE', 
				false
			)
			->join(
				array('coberturas'=>'produto.coberturas'), 
				'coberturas.id = pc.id_cobertura', 
				array('ds_nome_cobertura', 
				'id as id_cobertura')
			)
    		->join(
				array('municipios'=>'sistema.municipios'),
				'municipios.id = tam.id_municipio',
				array('nr_ibge','ds_nome_municipio')
			)
			->join(
				array('estados'=>'sistema.estados'),
				'estados.id = municipios.id_estado',
				array('ds_sigla as ds_sigla_estado')
			)
			->where('tam.id_municipio IN (?)', $municipios)
			->where('p.id_safra IN (?)', $idSafra)
			->where('co.tp_taxa_agrupamento = \'M\'');
			

			if (!empty($produtos)) {
    			$select->where('co.id_produto IN (?)', $produtos);
			}
		
		return $this->fetchAll($select);
	}

}

