<?php

class Seguro_Model_Propostas extends Agro_Db_Table_Propostas {
    const DS_CHAVE_AGUARDANDO_ENVIO_SEG = 'AGUARDANDO_ENVIO_SEG';
    const DS_CHAVE_APOLICE_CANCELADA = 'APOLICE_CANCELADA';
    const DS_CHAVE_APOLICE_EMITIDA = 'APOLICE_EMITIDA';
    const DS_CHAVE_DEVOLVIDA = 'DEVOLVIDA';
    const DS_CHAVE_ENDOSSO_INCOMPLETO = 'ENDOSSO_INCOMPLETO';
    const DS_CHAVE_NAO_ENVIADA = 'NAO_ENVIADA';
    const DS_CHAVE_ORCAMENTO_ENDOSSO = 'ORCAMENTO_ENDOSSO';
    const DS_CHAVE_PROPOSTA_INCOMPLETA = 'PROPOSTA_INCOMPLETA';
    const DS_CHAVE_PROPOSTA_CANCELADA = 'PROPOSTA_CANCELADA';
    const DS_CHAVE_SOLICITACAO_CANCELADA = 'SOLICITACAO_CANCELADA';
    const DS_CHAVE_SOLICITACAO_ENDOSSO = 'SOLICITACAO_ENDOSSO';
    const DS_CHAVE_STATUS_DEVOLVIDA = 'DEVOLVIDA';
    const DS_CHAVE_STATUS_NAO_ENVIADA = 'NAO_ENVIADA';

    const ID_STATUS_AGUARDANDO_ENVIO_SEG = 62;
    const ID_STATUS_APOLICE_CANCELADA = 13;
    const ID_STATUS_APOLICE_EMITIDA = 8;
    const ID_STATUS_CONF_PENDENCIAS = 102;
    const ID_STATUS_ENDOSSO_ANULADO = 213;
    const ID_STATUS_ENDOSSO_CANCELADO = 212;
    const ID_STATUS_ENDOSSO_INCOMPLETO = 160;
    const ID_STATUS_ENVIADA_AGUARDANDO_CONF = 3;
    const ID_STATUS_NAO_ENVIADA = 2;
    const ID_STATUS_ORCAMENTO_ENDOSSO = 162;
    const ID_STATUS_PROPOSTA_CANCELADA = 5;
    const ID_STATUS_PROPOSTA_INCOMPLETA = 4;
    const ID_STATUS_SOLICITACAO_CANCELADA = 270;
    const ID_STATUS_SOLICITACAO_ENDOSSO = 269;
    const ID_STATUS_CANCELADA = 5;
    const ID_STATUS_INCOMPLETA = 4;
    const ID_STATUS_DEVOLVIDA =	59;
    const ID_STATUS_AGUARDANDO_VISTORIA_PREVIA = 61;
    const ID_STATUS_TRANSMITIDA_SEGURADORA = 63;
    const ID_STATUS_AGUARDANDO_EMISSAO = 64;
    const ID_STATUS_ENDOSSO_AGUARDANDO_ENVIO_SEG = 163;

	protected $_rowClass = 'Seguro_Model_Row_Proposta';
	protected $_name = 'propostas';
	protected $_schema = 'seguro';
	public $mensagemStatus = '';
	protected $_log = true;

	public function save(array $values) {
		$Row = $this->getRow($values['id_proposta']);

		$Row->vl_custo_apolice = $Row->atributos('PROPRIEDADE', 'PROD_CUSTO_APOLICE');

        if (empty($Row->dt_vigencia_inicio)) {
            $Row->dt_vigencia_inicio = date('Y-m-d');
        }

        if (!empty($values['id_usuario_criacao'])) {
            $Row->id_usuario_criacao = $values['id_usuario_criacao'];
        }

        if (!empty($values['id_usuario_criacao'])) {
            $Row->id_usuario_criacao = $values['id_usuario_criacao'];
        }

        if (!empty($values['vl_comissao'])) {
            $Row->vl_comissao = $values['vl_comissao'];
        }

        if (!empty($values['id_status'])) {
            $Row->id_status = $values['id_status'];
        }

		if (!empty($values['id_produto'])) {
            $Row->id_produto = $values['id_produto'];
        }

        if (!empty($values['id_taxa_agrupamento'])) {
            $Row->id_taxa_agrupamento = $values['id_taxa_agrupamento'];
        }

        if (!empty($values['id_comercializacao'])) {
            $Row->id_comercializacao = $values['id_comercializacao'];
        }

		if (!$Row->nr_digito_verificador) {
			$Row->nr_digito_verificador = Agro_Util::getCheckNumber($values['id_proposta']);
		}

		return $Row->save();
	}

	public function get($id) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from('seguro.propostas');
		$Select->join('seguro.propostas_proponentes', 'propostas.id = propostas_proponentes.id_proposta', array('cpf_cnpj as cpf_cnpj_proponente', 'ds_nome_proponente', 'id_proponente_original', 'id_proposta', 'seguro.dt_vigencia_inicio_original(propostas.id) as dt_vigencia_inicio_original'));
		$Select->joinLeft('seguro.proponentes', 'proponentes.cpf_cnpj = propostas_proponentes.cpf_cnpj', ['id as id_proponente']);
		$Select->join('seguro.propostas_propriedades', 'propostas.id = propostas_propriedades.id_proposta', array('id_municipio'));
		$Select->join('seguro.propostas_corretores', 'propostas.id = propostas_corretores.id_proposta', array('id_usuario as id_corretor',new Zend_Db_Expr('COALESCE(propostas_corretores.vl_comissao, propostas.vl_comissao) AS vl_comissao')));
		$Select->join('produto.produtos', 'propostas.id_produto = produtos.id', array('id as id_produto', 'ds_nome_produto', 'id_seguradora', 'nr_susep'));
		$Select->join('produto.produtos_coberturas', 'produtos.id = produtos_coberturas.id_produto AND produtos_coberturas.fl_cobertura_principal = true', false);
		$Select->join('produto.coberturas', 'produtos_coberturas.id_cobertura = coberturas.id', array('ds_nome_cobertura', 'ds_chave_cobertura', 'id as id_cobertura_principal'));
		$Select->join('produto.produtos_geral', 'produtos.id_produto_geral = produtos_geral.id', array('ds_nome_produto_geral', 'tp_epoca_cultivo'));
		$Select->join('produto.culturas', 'culturas.id = produtos_geral.id_cultura', array('id as id_cultura', 'ds_nome_cultura'));
		$Select->join('produto.ramos', 'produtos_geral.id_ramo = ramos.id', array('id as id_ramo', 'ds_nome_ramo'));
		$Select->join('produto.safras', 'produtos.id_safra = safras.id', array('ds_nome_safra', 'id as id_safra'));
		$Select->join('sistema.corretores', 'propostas_corretores.id_usuario = corretores.id_usuario', array('ds_nome_fantasia as ds_nome_corretor', 'ds_email as ds_email_corretor'));
		$Select->join('sistema.empresas', 'produtos.id_seguradora = empresas.id', array('ds_razao_social as ds_nome_seguradora', 'cpf_cnpj as cpf_cnpj_seguradora'));
		$Select->join('sistema.status', 'propostas.id_status = status.id', array('ds_status', 'ds_chave as ds_chave_status'));
		$Select->join('sistema.usuarios', 'propostas.id_usuario_criacao = usuarios.id', false);
		$Select->join(['sf' => 'sistema.funcionarios'], 'sf.id_usuario = corretores.id_comercial', ['ds_nome_funcionario as nome_comercial_principal']);
		$Select->joinLeft('sistema.prepostos', 'usuarios.id = prepostos.id_usuario', array('id_usuario as id_preposto', 'ds_nome_preposto', 'ds_email as ds_email_preposto'));
		$Select->where('propostas.id = ?', $id);

		return $this->fetchRow($Select);
	}

	public function getArquivoKMLGeral(array $params = []) {
		$arStatus = array(4, 6, 7, 11);

		if (isset($params['fl_incluir_propostas_canceladas']) && !empty($params['fl_incluir_propostas_canceladas'])) {
			$arStatus = array_merge($arStatus, array(9, 10));
		}

		$Select = $this->select()->setIntegrityCheck(false);

		$Select->from('seguro.propostas', array('id_proposta_mae as id_proposta', 'nr_digito_verificador'));
		$Select->join('seguro.propostas_endosso', 'propostas_endosso.id_proposta = propostas.id', false);
		$Select->join('produto.produtos', 'produtos.id = propostas.id_produto', array('id as id_produto','id_seguradora'));
		$Select->join('produto.safras', 'safras.id = produtos.id_safra', false);
		$Select->join('seguro.propostas_propriedades', 'propostas_propriedades.id_proposta = propostas.id', array('ds_coordenadas'));
		$Select->join('seguro.itens_segurados', 'itens_segurados.id_proposta = propostas.id', array('ds_item_segurado', 'nr_item_segurado', 'vl_area'));
		$Select->join('seguro.itens_segurados_complemento', 'itens_segurados_complemento.id_item_segurado = itens_segurados.id', array('ds_coordenadas_geograficas'));
		$Select->join('sistema.status', 'status.id = propostas.id_status', false);
		$Select->join('produto.produtos_geral', 'produtos_geral.id = produtos.id_produto_geral', false);
		$Select->join('produto.culturas', 'culturas.id = produtos_geral.id_cultura', array('ds_nome_cultura'));
		$Select->join('produto.ramos', 'ramos.id = produtos_geral.id_ramo', array('id as id_ramos'));
		$Select->join('sistema.municipios', 'municipios.id = propostas_propriedades.id_municipio', false);
		$Select->join('sistema.estados', 'estados.id = municipios.id_estado', false);
		$Select->where('cd_status in ('.implode(', ', $arStatus).')');
		$Select->where('propostas.fl_del = false');
		$Select->where('propostas.fl_ativo = true');
		$Select->where('propostas_endosso.fl_proposta_vigente = true');
		
		if (array_key_exists('id_cultura', $params) && !empty($params['id_cultura'])) {
			$Select->where('culturas.id in ('
				. (
					is_array($params['id_cultura']) 
						? implode(',', $params['id_cultura']) 
						: $params['id_cultura']
				)
				.')'
			);
		}

		if (array_key_exists('id_produto', $params) && !empty($params['id_produto'])) {
			$Select->where('produtos.id in ('
				. (
					is_array($params['id_produto'])
						? implode(',', $params['id_produto'])
						: $params['id_produto']
				)
				.')'
			);
		}

		if (array_key_exists('id_safra', $params) && !empty($params['id_safra'])) {
			$Select->where('safras.id = ?', $params['id_safra']);
		}

		if (array_key_exists('id_estado_search', $params) && !empty($params['id_estado_search'])) {
			$Select->where('estados.id = ?', $params['id_estado_search']);
		}

		if (array_key_exists('id_municipio_search', $params) && !empty($params['id_municipio_search'])) {
			$Select->where('municipios.id = ?', $params['id_municipio_search']);
		}

		$Select->order(array('propostas.id', 'itens_segurados.nr_item_segurado'));
		
		ini_set( 'memory_limit', '512M' );
		
		return $this->fetchAll($Select);

	}

	public function getArquivoKMLAviso($params='') {
		$sql = "SELECT DISTINCT propostas.id_proposta_mae as id_proposta,
				nr_digito_verificador,
				produtos.id as id_produto,
				produtos.id_seguradora,
				ds_coordenadas,
				ds_referencia_localizacao,
				ds_item_segurado,
				nr_item_segurado,
				itens_segurados.vl_area,
				ds_coordenadas_geograficas,
				ds_status
				FROM seguro.propostas
				JOIN produto.produtos
				  ON produtos.id = propostas.id_produto
				JOIN produto.safras
				  ON safras.id = produtos.id_safra
				JOIN seguro.propostas_propriedades
				  ON propostas_propriedades.id_proposta = propostas.id
				JOIN seguro.itens_segurados
				  ON itens_segurados.id_proposta = propostas.id
				JOIN seguro.itens_segurados_complemento
				  ON itens_segurados_complemento.id_item_segurado = itens_segurados.id
				JOIN sistema.status
				  ON status.id = propostas.id_status
				JOIN sinistro.processos
				  ON processos.id_proposta = propostas.id
				JOIN sinistro.avisos
				  ON avisos.id_proposta = propostas.id
				JOIN sistema.municipios
				  ON municipios.id = propostas_propriedades.id_municipio
				JOIN sistema.estados
				  ON estados.id = municipios.id_estado
				JOIN (SELECT CASE WHEN UPPER(ds_status) = 'ACEITO' THEN 1
								  WHEN UPPER(ds_status) = 'PENDENTE' THEN 2
								  WHEN UPPER(ds_status) = 'RECUSADO' THEN 3
								  WHEN UPPER(ds_status) = 'CANCELADO' THEN 4
							 ELSE 5 END AS id
							,id_proposta
							,id_evento
					  FROM sistema.status
					  JOIN sinistro.avisos
						ON avisos.id_status = status.id
					  JOIN sinistro.avisos_eventos
				        ON avisos_eventos.id_aviso = avisos.id 
				    ORDER BY id
				) AS aviso_status
				  ON aviso_status.id_proposta = propostas.id
			   WHERE status.cd_status in (4, 6, 7, 11)
				 AND propostas.fl_del = false
				 AND propostas.fl_ativo = true
			";

		if ($params['id_produto']) {
			$sql .= " AND propostas.id_produto in (".implode(',', $params['id_produto']).") ";
		}

		if ($params['id_estado_search']) {
			$sql .= " AND municipios.id_estado = ". $params['id_estado_search']." ";
		}

		if ($params['id_municipio_search']) {
			$sql .= " AND municipios.id = " . $params['id_municipio_search']." ";
		}

		if ($params['id_safra']) {
			$sql .= " AND produtos.id_safra = " . $params['id_safra']." ";
		}
	
		if ($params['id_evento']) {
			$sql .= ' AND aviso_status.id_evento in ('.implode(',',$params['id_evento']).') ';
		}

		if($params['dt_inicial_sinistro'] && $params['dt_final_sinistro']){

			$params['dt_inicial_sinistro'] 	= str_replace('/','-', $params['dt_inicial_sinistro']);
			$params['dt_final_sinistro'] 	= str_replace('/','-', $params['dt_final_sinistro']);

			$params['dt_inicial_sinistro'] 	= date("m-d-Y", strtotime($params['dt_inicial_sinistro']));
			$params['dt_final_sinistro'] 	= date("m-d-Y", strtotime($params['dt_final_sinistro']));
			
			$sql .= " AND avisos.dt_sinistro BETWEEN '".$params['dt_inicial_sinistro']."' AND '".$params['dt_final_sinistro']."'";
		}
		
		ini_set( 'memory_limit', '512M' );		
		return $this->_db->fetchAll($sql);
	}

	public function iniciaProposta($idProduto, $idCorretor, $idPreposto) {
		if (!$idPreposto) { $idPreposto = 0; }

		return $this->getAdapter()->fetchOne("select seguro.inicia_proposta($idProduto, $idCorretor, $idPreposto)");
	}

	public function changeStatusId($idProposta, $idStatus, $obs = '') {
		try {
			$Row = $this->getRow($idProposta);
			$Row->id_status = $idStatus;

			$PropostaStatus = new Seguro_Model_PropostaStatus();

			if ($PropostaStatus->save(array('ds_observacao' => $obs, 'id_proposta' => $idProposta, 'id_status' => $idStatus))) {
				$ModelStatus = new Sistema_Model_Status();
				
				$chave = $ModelStatus->getChave($idStatus);
				if($chave == 'PROPOSTA_CANCELADA'){
					$Chamados = new Atendimento_Model_Chamado();
					$Chamados->fechaUltimosChamados($idProposta);
				}

				//Vincula o contrato de resseguro com a proposta
				if (in_array($chave, [Seguro_Model_Propostas::DS_CHAVE_APOLICE_EMITIDA, Seguro_Model_Propostas::DS_CHAVE_APOLICE_CANCELADA])) {
					(new Seguro_Model_PropostasContratosResseguro())->vincularContrato($idProposta);
				}
				
				$Row->save();
				
				return true;

			} else {
				return false;
			}

		} catch (Exception $e) {
			return false;
		}
	}

	public function getComboProdutos($data) {
		$Options = $this->getProdutos($data);

		$ret = array();
		if ($Options) {
			foreach ($Options as $Option) {
				$ret[$Option['id']] = $Option['label'];
			}
		}

		return $ret;
	}

	public function getProdutos($data) {
		$usuarioCorretor = (is_numeric($data['id_corretor']) ? $data['id_corretor'] : null);
		$usuarioSublogin = (is_numeric($data['id_preposto']) ? $data['id_preposto'] : null);
		$idSafra = (is_numeric($data['id_safra']) ? $data['id_safra'] : null);
		$Produtos = null;
        $Opt = [];
        $corretorTemPermissao = true;
		
		//Tratamento para quando entra o sublogin sem o corretor
		if (!empty($usuarioSublogin) && empty($usuarioCorretor)) {
			$usuarioCorretor = (new Sistema_Model_Corretores())
				->find((new Sistema_Model_Prepostos())
				->fetchRow("id_usuario = ".$usuarioSublogin)->id_corretor)
				->current()->id_usuario;
		}

        if (!empty($usuarioCorretor)) {
            $dadosCorretor = (new Sistema_Model_Corretores())->findByUser($usuarioCorretor);

            if (!empty($dadosCorretor) && $dadosCorretor['fl_treinado'] === true) {
                $rowPeriodoCadastroAnual = (new Sistema_Model_CorretoresPeriodoCadastroAnual())->getByCorretor(
                  $dadosCorretor['id']
                )->current();

                $temPermissaoForaPeriodoCadastroAnual = [
                  Sistema_Model_Corretores::ID_STATUS_EM_ANALISE,
                  Sistema_Model_Corretores::ID_STATUS_CONCLUIDO_FINALIZADO
                ];

                if (
                    empty($rowPeriodoCadastroAnual)
                    && !in_array($dadosCorretor['id_status'], $temPermissaoForaPeriodoCadastroAnual)
                ) {
                    $corretorTemPermissao = false;
                }

                if (!empty($rowPeriodoCadastroAnual)) {
                    $dataAtual = date('Y-m-d');

                    if (
                        $rowPeriodoCadastroAnual['dt_fim'] < $dataAtual
                        && !in_array($dadosCorretor['id_status'], $temPermissaoForaPeriodoCadastroAnual)
                    ) {
                        $corretorTemPermissao = false;
                    }
                }
            }
        }

        /**
         * Somente corretores treinados e com status Concluído/Finalizado estarão habilitados a lançar um novo orçamento.
         * Sublogins herdam a validação do corretor, ou seja, estando o corretor treinado e com status Concluído/Finalizado, os sublogins também estarão.
         */
        if ($corretorTemPermissao) {
            if ($usuarioSublogin) {
                $Produtos = $this->getRsProdutos($usuarioSublogin, $idSafra);
            } else {
                $Produtos = $this->getRsProdutos($usuarioCorretor, $idSafra);
            }
        }

		if ($Produtos !== null) {
			foreach ($Produtos as $Row) {
			    $fl_habilitado = ($Row->id_usuario > 0) ? true : false;
			    $fl_vigente = ($Row->fl_vigente) ? true : false;
			    $Opt[] = array('id' => $Row->id, 'label' => $Row->ds_nome_abreviado, 'habilitado' => $fl_habilitado, 'fl_vigente' => $fl_vigente, 'safra' => $Row->ds_nome_safra);
			}
		} else {
			$Opt[] = array('id' => 0, 'label' => 'Nenhum produto pode ser comercializado para esta seleção.', 'fl_vigente' => true);
		}

		return $Opt;
	}

	public function getProdutosRenovacao($data,$fl_inadimplente) {
		$corretor = (is_numeric($data['id_corretor']) ? $data['id_corretor'] : null);
		$preposto = (is_numeric($data['id_preposto']) ? $data['id_preposto'] : null);
		
		$ModelProdutoGeral = new Produto_Model_ProdutosGeral();
		$rsProdutosGerais = $ModelProdutoGeral->getProdutosGeralRelacionadoSafrasFuturas($data['id_produto']);
		foreach($rsProdutosGerais as $produtoGeral){
			$arProdutosGerais[] = 	$produtoGeral['id_produto_geral'];
		}
		$id_produto_geral = implode(",", $arProdutosGerais);
		
		if(!isset($id_produto_geral)){
			$Opt[] = array('id' => 0, 'label' => 'Nenhum produto pode ser comercializado para esta seleção.');
		} else {
			$Produtos = null;
	
			if ($preposto) {
				$Produtos = $this->getRsProdutosRenovacao($preposto, $fl_inadimplente, $id_produto_geral);
			}
	
			if ((!$Produtos) or (!$Produtos->count())) {
				$Produtos = $this->getRsProdutosRenovacao($corretor, $fl_inadimplente, $id_produto_geral);
			}
			$Html = array();
			if ($Produtos->count()) {
				foreach ($Produtos as $Row) {
	
					$Opt[] = array('id' => $Row->id, 'label' => $Row->ds_nome_abreviado);
				}
			} else {
				$Opt[] = array('id' => 0, 'label' => 'Nenhum produto pode ser comercializado para esta seleção.');
			}
		}

		return $Opt;
	}

	public function getRsProdutos($usuario, $idSafra = null) {
	    $ModelSafras = new Produto_Model_Safras();
	    $safra_atual = $ModelSafras->getSafraAtual();

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('pd' => 'produto.produtos'), array('pd.id', 'pd.ds_nome_abreviado'));
		$select->join(array('ps' => 'produto.safras'), 'ps.id = pd.id_safra', array('ps.fl_vigente', 'ps.ds_nome_safra'));
		$select->joinLeft(array('produtos_habilitados' => 'produto.v_combo_produto_proposta'), 'produtos_habilitados.id = pd.id and produtos_habilitados.id_usuario='.$usuario, array('produtos_habilitados.id_usuario'));
		if ($idSafra) {
			$select->where('pd.id_safra = ?', $idSafra);
		}
		//$select->where('pd.id_safra = ?', $safra_atual['id']);
		$select->where('pd.fl_ativo = ?', true);
		$select->order('pd.ds_nome_abreviado asc');

		return $this->fetchAll($select);
	}

	public function getRsProdutosRenovacao($usuario,$fl_inadimplente,$id_produto_geral) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'produto.v_combo_produto_proposta_renovacao'), '*');
		$select->where('id_usuario = ?', $usuario);
		$select->where('id_produto_geral in ('.$id_produto_geral.')' );

		if ($fl_inadimplente) {
			$select->where("ds_valor in ('2','3')");
		} else {
			$select->where("ds_valor in ('1','3')");
		}
		
		return $this->fetchAll($select);
	}

	public function fetchRespostas($idProposta) {
		$return = '';

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.v_atributos'), 'ds_chave_rn');
		$select->join(array('pq' => 'seguro.propostas_questionario'), 'a.id = pq.id_atributo_rn', 'ds_resposta');
		$select->where("pq.id_proposta = ?", $idProposta);
		$Rs = $this->fetchAll($select);

		foreach ($Rs as $row) {
			$return['quest'][$row['ds_chave_rn']] = $row['ds_resposta'];
		}

		return $return;
	}

	public function getComercializacao($idProduto, $idEstado, $idMunicipio, $returnRow=false) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('c' => 'comercializacao.comercializacoes'), '*');
		$select->join(array('m' => 'comercializacao.comercializacoes_municipios'), 'c.id = m.id_comercializacao', false);
		$select->where("id_produto = ?", $idProduto, 'integer');
		$select->where("id_municipio = ?", $idMunicipio, 'integer');
		$Row = $this->fetchRow($select);

		if ($Row) {
			return ($returnRow ? $Row : $Row->id);
		} else {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('c' => 'comercializacao.comercializacoes'), '*');
			$select->join(array('e' => 'comercializacao.comercializacoes_estados'), 'c.id = e.id_comercializacao', false);
			$select->where("id_produto = ?", $idProduto, 'integer');
			$select->where("id_estado = ?", $idEstado, 'integer');
			$Row = $this->fetchRow($select);

			if ($Row) {
				return ($returnRow ? $Row : $Row->id);
			}
		}
	}

	public function getAgrupamento($produto, $corretor, $preposto, $estado=false, $municipio=false, $cpf_cnpj=false, $returnRow=false) {
		if ($corretor == $preposto) { $preposto = 0; }
		$Row = false;

		if (!$Row && $cpf_cnpj) {
			$Row = $this->getAgrupamentoProponente($produto, $cpf_cnpj, $municipio);
		}

		if (!$Row && $preposto && $municipio) {
			$Row = $this->getAgrupamentoUsuario($produto, $preposto, $municipio);
		}

		if (!$Row && $corretor && $municipio) {
			$Row = $this->getAgrupamentoUsuario($produto, $corretor, $municipio);
		}

		if (!$Row && $municipio) {
			$Row = $this->getAgrupamentoMunicipio($produto, $municipio);
		}

		if (!$Row && $estado) {
			$Row = $this->getAgrupamentoEstado($produto, $estado);
		}

		if ($Row) {
			return ($returnRow ? $Row : $Row['id']);
		} else {
			return 0;
			//throw new Exception("Nenhum agrupamento foi encontrado.");
		}
	}

	public function getAgrupamentoProponente($produto, $CpfCnpj, $id_municipio) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'comercializacao.taxas_agrupamento'));
		$select->join(array('tap' => 'comercializacao.taxas_agrupamento_proponentes'), 'a.id = tap.id_taxa_agrupamento', false);
		$select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
		$select->join(array('p' => 'seguro.proponentes'), 'tap.id_proponente = p.id', false);
		$select->where("tam.id_municipio = ?", $id_municipio);
		$select->where("a.tp_taxa_agrupamento = 'P'");
		$select->where("a.id_produto = ?", $produto);
		$select->where("p.cpf_cnpj = ?", $CpfCnpj);
		$Row = $this->fetchRow($select);

		if ($Row) {
			return $Row;
		} else {
			return false;
		}
	}

	public function getAgrupamentoUsuario($produto, $usuario, $id_municipio) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'comercializacao.taxas_agrupamento'));
		$select->join(array('tau' => 'comercializacao.taxas_agrupamento_usuarios'), 'a.id = tau.id_taxa_agrupamento', false);
		$select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
		$select->where("tam.id_municipio = ?", $id_municipio);
		$select->where("tau.id_usuario = ?", $usuario);
		$select->where("a.tp_taxa_agrupamento = 'U'");
		$select->where("a.id_produto = ?", $produto);
		//$select->where("a.fl_ativo = true");
		$Row = $this->fetchRow($select);

		if ($Row) {
			return $Row;
		} else {
			return false;
		}
	}

	public function getAgrupamentoMunicipio($produto, $municipio) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'comercializacao.taxas_agrupamento'));
		$select->join(array('tam' => 'comercializacao.taxas_agrupamento_municipios'), 'a.id = tam.id_taxa_agrupamento', false);
		$select->where("tam.id_municipio = ?", $municipio);
		$select->where("a.tp_taxa_agrupamento = 'M'");
		$select->where("a.id_produto = ?", $produto);
		//$select->where("a.fl_ativo = true");

		$Row = $this->fetchRow($select);

		if ($Row) {
			return $Row;
		} else {
			return false;
		}
	}

	public function getAgrupamentoEstado($produto, $estado) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'comercializacao.taxas_agrupamento'));
		$select->join(array('e' => 'comercializacao.taxas_agrupamento_estados'), 'a.id = e.id_taxa_agrupamento', false);
		$select->where("a.tp_taxa_agrupamento = 'E'");
		$select->where("a.id_produto = ?", $produto);
		$select->where("e.id_estado = ?", $estado);
		//$select->where("a.fl_ativo = true");
		$Row = $this->fetchRow($select);

		if ($Row) {
			return $Row;
		} else {
			return false;
		}
	}

	public function getTaxasCoberturaPrincipal($franquia, $produto, $producaoGarantida) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('tv'=>'comercializacao.taxas_valores'), array('id', 'vl_taxa', 'vl_franquia'));
		$select->join(array('pc'=>'produto.produtos_coberturas'), 'pc.id_cobertura = tv.id_cobertura', false);
		$select->where('tv.id_taxa_agrupamento = ?', $franquia);
		$select->where('pc.fl_cobertura_principal = ?', true);
		$select->where('pc.id_produto = ?', $produto);

		if ($producaoGarantida) {
			$select->order('tv.vl_taxa desc');
		} else {
			$select->order('tv.vl_taxa asc');
		}

		$Rs = $this->fetchAll($select);
		if ($Rs) {
			return $Rs;
		} else {
			return false;
		}
	}

	public function getComissoesCoberturaPrincipal($produto) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p'=>'produto.produtos'), null);
		$select->join(array('pg'=>'produto.produtos_geral'), 'p.id_produto_geral = pg.id', null);
		$select->join(array('cc'=>'produto.culturas_comissoes'), 'cc.id_cultura = pg.id_cultura', array('id', 'vl_comissao', 'vl_ajuste'));
		$select->where('p.id = ?', $produto);

		$Rs = $this->fetchAll($select);
		if ($Rs) {
			return $Rs->toArray();
		} else {
			return false;
		}
	}

	/**
	 * Busca os cabeçalhos das propostas
	 *
	 * @param int $idProposta
	 * @return array
	 */
	public function getHeaderData($idProposta){
		if ($idProposta) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('pr' => 'seguro.propostas'),
				array(
					'id',
					'to_char(dt_vigencia_inicio, \'DD/MM/YYYY\') || \' - \' ||
					to_char(dt_vigencia_fim, \'DD/MM/YYYY\') as vigencia',

					'cast(pg.id_ramo as varchar) || \'.\' ||
					cast(pd.id_seguradora as varchar) || \'.\' ||
					cast(pr.id_produto as varchar) || \'.\' ||
					cast(pr.id as varchar) || \'-\' ||
					cast(pr.nr_digito_verificador as varchar)
					as nr_proposta',
				    'pr.nr_apolice'
				)
			);

			$select->join(array('pd'=>'produto.produtos'),'pr.id_produto = pd.id','ds_nome_produto','');
			$select->joinLeft(array('pg'=>'produto.produtos_geral'),'pd.id_produto_geral = pg.id','');
			$select->joinLeft(array('po'=>'seguro.propostas_proponentes'),'pr.id = po.id_proposta','ds_nome_proponente','');
			$select->joinLeft(array('pi'=>'seguro.propostas_propriedades'),'pr.id = pi.id_proposta',array('ds_nome_propriedade','ds_endereco'));
			$select->joinLeft(array('mu'=>'sistema.municipios'),'pi.id_municipio = mu.id','ds_nome_municipio');
			$select->joinLeft(array('es'=>'sistema.estados'),'mu.id_estado = es.id','ds_nome_estado');
			$select->where($this->getAdapter()->quoteInto('pr.id = ?',$idProposta));

			$Res = $this->fetchRow($select);
			if ($Res) {
				return $Res->toArray();
			} else{
				return null;
			}
		} else {
			return null;
		}
	}

	public function getCulturaProduto($idProposta) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p'=>$this->_schema.'.'.$this->_name), false);
		$select->join(array('pro'=>'produto.produtos'), 'pro.id = p.id_produto', false);
		$select->join(array('pg'=>'produto.produtos_geral'), 'pg.id = pro.id_produto_geral', '*');
		$select->join(array('pc'=>'produto.culturas'), 'pc.id = pg.id_cultura', 'ds_chave_cultura');
		$select->where('p.id = ?', $idProposta);

		$Rs = $this->fetchRow($select);
		if ($Rs) {
			$result = $Rs->toArray();
			return $result;
		} else {
			return '';
		}
	}

	public function isProdutoMultirrisco($idProposta) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p'=>$this->_schema.'.'.$this->_name), false);
		$select->join(array('pr'=>'produto.produtos'), 'pr.id = p.id_produto', false);
		$select->join(array('pg'=>'produto.produtos_geral'), 'pg.id = pr.id_produto_geral', '*');
		$select->join(array('tp'=>'produto.tipo_produto'), 'tp.id = pg.id_tipo_produto', false);
		$select->where('p.id = ?', $idProposta);
		$select->where('tp.ds_chave_rn = \'MULTIRRISCO\'');

		$Rs = $this->fetchRow($select);
		if ($Rs) {
			return true;
		} else {
			return false;
		}
	}

	public function atualizaStatusProposta($id_proposta, $id_status) {
		$this->_db->query("select seguro.ativa_proposta_status($id_proposta,$id_status)");
	}

	public function cancelaProposta($dados) {
		$ModelStatus = new Seguro_Model_PropostaStatus();
		$Rs = $ModelStatus->getStatusAtual($dados['id_proposta']);

		$this->getAdapter()->beginTransaction();
		try {
			//salva  proposta_Status
			$id_proposta_status = $this->changeStatus($dados, 'PROPOSTA_CANCELADA');

			$Model = new Seguro_Model_PropostaPendencia();
			$arr = array();
			$arr['dt_prazo'] = $dados['dt_prazo'];
			$arr['id_proposta_status'] = $id_proposta_status;
			if(is_array($dados['id_pendencia'])) {
				foreach($dados['id_pendencia'] as $key => $val) {
					$arr['id_pendencia'] = $val;
					$Model->save($arr);
				}
			}
		} catch (Exception $e) {
			$this->getAdapter()->rollBack();
			return false;
		}
		$this->getAdapter()->commit();

		//seta a mensagem que deve ser devolvida ao corretor
		$Rs_novo = $ModelStatus->getStatusAtual($dados['id_proposta']);
		$this->mensagemStatus = "Status da proposta alterado de '{$Rs['ds_status']}' para '{$Rs_novo['ds_status']}'";

		return true;
	}

	public function encaminharProposta($dados) {
		$Row = $this->getRow($dados['id_proposta']);

		try {
			$Status = new Sistema_Model_Status();

			if ($Row->id_status == $Status->getId("PROPOSTA_AGUARDANDO_CONFERENCIA_VISTORIA")) {
				$status = 'PROPOSTA_AGUARDANDO_VISTORIA';
				$this->setMessage("Aguardando Vistoria");
			} else {
				$status = 'AGUARDA_ENVIO_SEGURADORA';
				$this->setMessage("Aguardando envio Seguradora");
			}

			return $this->changeStatus($dados, $status);
		} catch(Exception $e) {
			return false;
		}
	}

	public function getData($where) {
		$Select = parent::getData($where);

		$Select->joinLeft(array('prc' => 'seguro.propostas_corretores_renovacao'), "prc.id_proposta = spr.id", false);

		if (is_array($where)) {
			foreach ($where as $clause) {
				if ($clause['field'] == 'id_pendencia') {
					$Select->joinLeft(array('spp' => 'seguro.propostas_pendencias'), "spp.id_proposta_status = sps.id", false);
					$Select->joinLeft(array('ape' => 'atendimento.pendencias'), "ape.id = spp.id_pendencia", false);
				}
			}
		}

		return $Select;
	}

	public function getDadosProposta($id_proposta) {
		$select = $this->getData("id = $id_proposta");
		return $this->_db->fetchAll($select);
	}

	public function carregaProposta($idProduto, $idCorretor, $idPreposto, $CpfCnpj=false, $idEstado=false, $idMunicipio=false) {
		$Session = new Zend_Session_Namespace('carrega_proposta');
		$Session->premio['comissoes'] = $this->getComissoesCoberturaPrincipal($idProduto);

		$Atributos = new Produto_Model_Atributos();
		$Session->segurado['questionarios'] = $Atributos->getGrupoAtributo($idProduto, 'QUESTIONARIO', $idCorretor, $idPreposto, $CpfCnpj);
		$Session->unidades['itens'] = $Atributos->getGrupoAtributo($idProduto, 'UNIDADE_SEGURADA', $idCorretor, $idPreposto, $CpfCnpj);
		$Session->premio['propriedades'] = $Atributos->getGrupoAtributo($idProduto, 'PROPRIEDADE', $idCorretor, $idPreposto, $CpfCnpj);

		$Coberturas = new Produto_Model_Coberturas();
		$Session->premio['coberturas'] = $Coberturas->getCoberturasProduto([$idProduto]);

		$Produtos = new Produto_Model_Produtos();
		$Session->premio['cultura'] = $Produtos->getCultura($idProduto);

		$CondicoesPagamento = new Produto_Model_CondicoesPagamento();
		$Session->premio['parcelamento'] = $CondicoesPagamento->getParcelamentoProposta($idProduto, $idCorretor, $idPreposto, $CpfCnpj);

		if ($idEstado && $idProduto) {
			$comercializacao = $this->getComercializacao($idProduto, $idEstado, $idMunicipio);
			if ($comercializacao) {
				$Session->premio['comercializacao'] = $comercializacao;
			}
		}

		$agrupamento = $this->getAgrupamento($idProduto, $idCorretor, $idPreposto, $idEstado, $idMunicipio, $CpfCnpj);
		if ($agrupamento) {
			$Session->premio['agrupamento'] = $agrupamento;

			$Taxas = new Comercializacao_Model_Taxas();
			$Session->premio['taxas'] = $Taxas->getTaxasProposta($agrupamento, $Session->premio['propriedades']['PROD_PRODUCAO_GARANTIDA']['ds_valor']);
			$Session->premio['taxas_relacionadas'] = $Taxas->getTaxasCoberturas($agrupamento);
		}

		// Monta os valores das subvencoes do corretor
		$Corretor = new Seguro_Model_PropostasCorretores();
		$Valores = $Corretor->getValorSubvencaoFederal($idCorretor, $Session->premio['cultura']['id']);
		$Session->corretor['subvencao_federal']['liberado'] = $Valores->vl_liberado;
		$Session->corretor['subvencao_federal']['usado'] = $Valores->vl_usado;

		return $Session;
	}

	public function getProposta($id) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'seguro.propostas'), array('seguro.dt_vigencia_inicio_original(p.id) as dt_vigencia_inicio', 'id', 'id_produto', 'nr_digito_verificador', 'id_proposta_renovada', 'nr_apolice', 'dt_vigencia_fim', 'id_status', 'vl_custo_apolice', 'vl_comissao', 'ds_status_seguradora', 'ds_identificador_seguradora', 'ds_classe', 'id_proposta_endossada', 'id_endosso', 'id_versao','fl_analise_transmissao'));
		$select->join(array('pc' => 'seguro.propostas_corretores'), 'p.id = pc.id_proposta', 'id_usuario as id_corretor');
		$select->where('p.id = ?', $id);

		return $this->fetchRow($select);
	}

	public function copiarProposta($id) {
		$sql = "select seguro.copiar_proposta_endosso($id)";
		return $this->_db->query($sql);
	}

	public function checkEdit($idProposta)
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct();
        $select->from(array('seguro.propostas'), 'id');
        $select->join(['seguro.propostas_propriedades'], 'propostas.id = propostas_propriedades.id_proposta', null);
        $select->join(array('seguro.propostas_corretores'), 'propostas.id = propostas_corretores.id_proposta', null);
        $select->join(['comercializacao.comercializacoes'], 'propostas.id_produto = comercializacoes.id_produto', null);
        $select->join(
            array('produto.produtos_habilitacoes'),
            'propostas.id_produto = produtos_habilitacoes.id_produto',
            null
        );
        $select->join(
            ['pphm' => 'produto.produtos_habilitacoes_municipios'],
            'pphm.id_produtos_habilitacoes = produtos_habilitacoes.id',
            null
        );
        $select->join(['produto.condicoes_pagamento'], 'propostas.id_produto = condicoes_pagamento.id_produto', null);
        $select->join(
            array('produto.condicoes_pagamento_itens'),
            'condicoes_pagamento.id = condicoes_pagamento_itens.id_condicao_pagamento',
            null
        );
        $select->where('propostas.id = ?', $idProposta);
        $select->where('propostas_propriedades.id_municipio = pphm.id_municipio');
        $select->where(
            '(propostas.id_usuario_criacao = produtos_habilitacoes.id_usuario)'
            . ' or (propostas_corretores.id_usuario = produtos_habilitacoes.id_usuario)'
        );
        $select->where('condicoes_pagamento_itens.ds_mes = ?', date('m') - 1);

        return $this->fetchAll($select)->count();
    }

	public function getIdPropostaByIdProcesso($idProcesso){
		$Select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$Select->from(array('seguro.propostas'), 'id');
		$Select->join(array('sinistro.processos'), 'propostas.id = processos.id_proposta', null);
		$Select->where('processos.id = ?', $idProcesso);

		return $this->_db->fetchOne($Select);
	}

	public function getProdutoByProposta($idProposta) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'seguro.propostas'), false);
		$select->join(array('pt' => 'produto.produtos'), 'pt.id = p.id_produto', array('id as id_produto', 'ds_nome_produto'));
		$select->where('p.id = ?', $idProposta);

		return $this->fetchRow($select);
	}

	public function getPropostasVigentes(array $propostas)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas'), false);
        $select->join(array('pe' => 'seguro.propostas_endosso'), 'pe.id_endosso = p.id_endosso AND pe.fl_proposta_vigente = true', array('id_proposta'));
        $select->where('p.id in (' . implode(',', $propostas) . ')');

        return $this->fetchAll($select)->toArray();
    }

    public function getCoberturasTaxasOrcamento($idProposta)
    {
        $subSelect = "(select 1 ";
		$subSelect .= "	 from comercializacao.taxas_relacionadas tr ";
		$subSelect .= "	 where tr.id_taxa = tv.id ";
		$subSelect .= "	 limit 1 ";
		$subSelect .= ") as relacionado_com";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['prop' => 'seguro.propostas'], false);
        $select->join(['pc' => 'produto.produtos_coberturas'], 'pc.id_produto = prop.id_produto', 'id_cobertura as id_produto_cobertura');
        $select->join(['cob' => 'produto.coberturas'], 'cob.id = pc.id_cobertura', 'ds_nome_cobertura');
        $select->join(['tao' => 'comercializacao.taxas_agrupamento_orcamentos'], 'tao.id_proposta = prop.id', false);
        $select->join(['ta' => 'comercializacao.taxas_agrupamento'], 'ta.id = tao.id_taxa_agrupamento', 'ta.vl_comissao, ta.id_secao');
        $select->join(
          ['tv' => 'comercializacao.taxas_valores'],
          'tv.id_taxa_agrupamento = tao.id_taxa_agrupamento AND tv.id_cobertura = pc.id_cobertura',
          "*, {$subSelect}"
        );
        $select->where('prop.id = ?', $idProposta);

        return $this->fetchAll($select)->toArray();
	}

    /**
     * @param int $idPropostaMae
     * @param string $dataVigencia
     * @return Zend_Db_Table_Row_Abstract|null
     */
    public function getUltimaPropostaByPropostaMaeDataVigencia(int $idPropostaMae, string $dataVigencia)
    : ?Zend_Db_Table_Row_Abstract
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas'), '*');
		$select->join(['ps' => 'seguro.propostas_status'], 'ps.id_proposta = p.id', ['dt_criacao AS dt_criacao_proposta_status']);
        $select->where('p.id_proposta_mae = ?', $idPropostaMae);
        $select->where('ps.dt_criacao <= ?', $dataVigencia);
        $select->where('p.id_status NOT IN (160, 213, 212, 269, 270)');
		$select->where("(
			(ps.id_status = ". self::ID_STATUS_ENVIADA_AGUARDANDO_CONF ." AND p.id = p.id_proposta_mae) OR
			(ps.id_status = ". self::ID_STATUS_APOLICE_EMITIDA ." AND p.id <> p.id_proposta_mae)
		)");
        $select->order('ps.dt_criacao desc, p.id desc');

        return $this->fetchRow($select);
    }

	public function isCoordenadasSedeMunicipio($idProposta)
	{
		$Proposta = $this->find($idProposta)->current();
		$Produto = $this->getProdutoByProposta($Proposta->id);
		$ProdutosAtributos = new Produto_Model_ProdutosAtributos();
		$produtoAtributos = $ProdutosAtributos->getAtributosFromProduto($Produto->id_produto, true, 'p', true, true);
		
		if (array_key_exists('PROD_VALIDAR_COORD_SEDE', $produtoAtributos) && $produtoAtributos['PROD_VALIDAR_COORD_SEDE'] == 1) {
			$PropostaPropriedade = $Proposta->propriedade();
			$nomeMunicipio = strtoupper(Agro_Util::removeAcentos($PropostaPropriedade['ds_nome_municipio']));
	        $nomeMunicipioCoordenadas = Agro_Util::getMunicipioByCoordenada($PropostaPropriedade['ds_coordenadas']);

	        if (( $nomeMunicipioCoordenadas != $nomeMunicipio ) && ( $nomeMunicipioCoordenadas <> '' )) {
	        	return false;
	        }
		}
		return true;
	}

	public function getIdPropostaMaeCompleto(int $idProposta)
	{
		$sql = $this->select()
			->setIntegrityCheck(false)
			->from(['sp' => 'seguro.propostas'], ['seguro.id_proposta_mae_completo(sp.id_proposta_mae) as id_proposta_mae_completo'])
			->where('sp.id = ?', $idProposta);

		return $this->_db->fetchOne($sql);
	}

    public function getDadosTermoSubvencaoSP($idProposta)
    {
        $campos  = "regexp_replace(seguro.id_proposta_mae_completo(p.id), '[-.]', '', 'g') || ' (' || p.id || ')' as texto_proposta_beneficiario,";
        $campos .= "pp.ds_nome_proponente as texto_nome_beneficiario,";
        $campos .= "pp.cpf_cnpj as texto_cpf_beneficiario,";
        $campos .= "lpad(extract(DAY from p.dt_transmissao)::text, 2, '0') AS texto_dia_emissao_beneficiario,";
        $campos .= "lpad(extract(MONTH from p.dt_transmissao)::text, 2, '0') AS texto_mes_emissao_beneficiario,";
        $campos .= "extract(YEAR from p.dt_transmissao) AS texto_ano_emissao_beneficiario,";
        $campos .= "mproponente.ds_nome_municipio || ' - ' || e.ds_sigla AS texto_local_assinatura,";
        $campos .= "lpad(extract(DAY from now())::text, 2, '0') AS texto_dia_assinatura,";
        $campos .= "extract(YEAR from now()) AS texto_ano_assinatura";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas'), $campos);
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = p.id', null);
        $select->join(array('pc' => 'seguro.propostas_corretores'), 'pc.id_proposta = p.id', null);
        $select->join(array('c' => 'sistema.corretores'), 'c.id_usuario = pc.id_usuario', null);
        $select->join(array('pro' => 'seguro.propostas_propriedades'), 'pro.id_proposta = p.id', null);
        $select->join(array('mproponente' => 'sistema.municipios'), 'mproponente.id = pp.id_municipio', null);
        $select->join(array('e' => ' sistema.estados'), 'e.id = mproponente.id_estado', null);
        $select->where('p.id = ?', $idProposta);

        return $this->fetchRow($select);
    }

    public function getDadosTermoSubvencaoPR($idProposta)
    {
        $campos = "pp.ds_nome_proponente AS texto_nome_produtor_rural,";
        $campos .= " (SELECT ds_resposta FROM seguro.propostas_questionario WHERE id_proposta = {$idProposta} AND id_atributo_rn = 177) AS texto_cadpro_produtor_rural,";
        $campos .= " CASE WHEN pp.tp_pessoa = 'F' THEN ec.ds_nome_estado_civil ELSE 'estado civil' END AS texto_qualificacao_civil_produtor_rural,";
        $campos .= " mproponente.ds_nome_municipio AS texto_municipio_produtor_rural,";
        $campos .= " mpropriedade.ds_nome_municipio AS texto_municipio_propriedade_rural,";
        $campos .= " cob.ds_nome_cobertura AS texto_cobertura,";
        $campos .= " cul.ds_nome_cultura AS texto_cultura,";
        $campos .= " TO_CHAR(p.dt_transmissao, 'YY') AS texto_ano_exercicio,";
        $campos .= " mproponente.ds_nome_municipio AS texto_local_assinatura2,";
        $campos .= " lpad(extract(DAY from now())::text, 2, '0') AS texto_dia_assinatura2,";
        $campos .= " TO_CHAR(now(), 'YY') AS texto_ano_assinatura2,";
        $campos .= " pp.cpf_cnpj as texto_cpf_produtor_rural,";
        $campos .= " CASE WHEN pp.tp_pessoa = 'F' THEN pp.ds_documento_numero ELSE '' END as texto_rg_produtor_rural,";
        $campos .= " pp.ds_endereco_rua as texto_rua_produtor_rural,";
        $campos .= " pp.ds_endereco_nro as texto_numero_produtor_rural,";
        $campos .= " pp.ds_endereco_cep as texto_cep_produtor_rural";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas'), $campos);
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = p.id', null);
        $select->join(array('ec' => 'sistema.estado_civil'), 'ec.id = pp.id_estado_civil', null);
        $select->join(array('pc' => 'seguro.propostas_corretores'), 'pc.id_proposta = p.id', null);
        $select->join(array('c' => 'sistema.corretores'), 'c.id_usuario = pc.id_usuario', null);
        $select->join(array('pro' => 'seguro.propostas_propriedades'), 'pro.id_proposta = p.id', null);
        $select->join(array('mpropriedade' => 'sistema.municipios'), 'mpropriedade.id = pro.id_municipio', null);
        $select->join(array('mproponente' => 'sistema.municipios'), 'mproponente.id = pp.id_municipio', null);
        $select->join(array('pcob' => 'seguro.propostas_coberturas'), 'pcob.id_proposta = p.id', null);
        $select->join(array('cob' => 'produto.coberturas'), 'cob.id = pcob.id_cobertura AND pcob.fl_principal is true', null);
        $select->join(array('prod' => 'produto.produtos'), 'prod.id = p.id_produto', null);
        $select->join(array('pg' => 'produto.produtos_geral'), 'pg.id = prod.id_produto_geral', null);
        $select->join(array('cul'  => 'produto.culturas'), 'cul.id = pg.id_cultura', null);

        $select->where('p.id = ?', $idProposta);

        return $this->fetchRow($select);
    }

    public function getDadosTermoPsr(int $idProposta)
    {
        $campos = [
            "c.ds_nome_cultura as texto_cultura",
            "lpad(extract(DAY from now())::text, 2, '0') AS texto_dia_assinatura",
            "lpad(extract(DAY from now())::text, 2, '0') AS texto_dia_assinatura2",
            "lpad(extract(MONTH from now())::text, 2, '0') AS texto_mes_assinatura",
            "lpad(extract(MONTH from now())::text, 2, '0') AS texto_mes_assinatura2",
            "TO_CHAR(now(), 'YY') AS texto_ano_assinatura",
            "TO_CHAR(now(), 'YY') AS texto_ano_assinatura2",
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['prop' => "{$this->_schema}.{$this->_name}"], implode(', ', $campos));
        $select->join(['prod' => 'produto.produtos'], 'prod.id = prop.id_produto', null);
        $select->join(['pg' => 'produto.produtos_geral'], 'pg.id = prod.id_produto_geral', null);
        $select->join(['c' => 'produto.culturas'], 'c.id = pg.id_cultura', null);
        $select->where('prop.id = ?', $idProposta);

        return $this->fetchRow($select);
    }

    public function getDadosTermoDadosBancariosSegurado(int $idProposta)
    {
        $campos  = "regexp_replace(seguro.id_proposta_mae_completo(p.id), '[-.]', '', 'g') || ' (' || p.id || ')' as texto_numero_proposta,";
        $campos .= "pp.ds_nome_proponente as texto_nome_proponente,";
        $campos .= "b.ds_nome_banco as texto_banco,";
        $campos .= "ib.ds_agencia as texto_agencia,";
        $campos .= "ib.nu_digito_agencia as texto_digito_agencia,";
        $campos .= "ib.ds_conta as texto_conta,";
        $campos .= "ib.nu_digito_conta as texto_digito_conta,";
        $campos .= "CASE (ib.ds_tipo_conta) WHEN 'C' THEN 'Seleção1' ELSE 'Seleção2' END as selecao_tipo_conta,";
        $campos .= "mproponente.ds_nome_municipio || ' - ' || e.ds_sigla AS texto_local_assinatura,";
        $campos .= "lpad(extract(DAY from now())::text, 2, '0') AS texto_dia_assinatura,";
        $campos .= "lpad(extract(MONTH from now())::text, 2, '0') AS texto_mes_assinatura,";
        $campos .= "TO_CHAR(now(), 'YY') AS texto_ano_assinatura";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas'), $campos);
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = p.id', null);
        $select->join(array('mproponente' => 'sistema.municipios'), 'mproponente.id = pp.id_municipio', null);
        $select->join(array('e' => 'sistema.estados'), 'e.id = mproponente.id_estado', null);
        $select->join(array('ibp' => 'seguro.informacoes_bancarias_propostas'), 'ibp.id_proposta = p.id AND ibp.fl_titular_conta is true', null);
        $select->join(array('ib' => 'sistema.informacoes_bancarias'), 'ib.id = ibp.id_informacoes_bancarias', null);
        $select->join(array('b' => 'sistema.bancos'), 'b.id = ib.id_banco', null);
        $select->where('p.id = ?', $idProposta);
        $select->where("ib.ds_tipo_conta in ('C', 'P')");

        return $this->fetchRow($select);
    }

    public function getDadosTermoDadosBancariosBeneficiario(int $idProposta)
    {
        $campos  = "regexp_replace(seguro.id_proposta_mae_completo(p.id), '[-.]', '', 'g') || ' (' || p.id || ')' as texto_numero_proposta,";
        $campos .= "pp.ds_nome_proponente as texto_nome_proponente,";
        $campos .= "CASE WHEN pb.ds_tipo_conta = 's' THEN b.ds_nome_banco ELSE pb.ds_nome_beneficiarios END as texto_nome_beneficiario,";
        $campos .= "pb.nr_cpf_cnpj as texto_cpf_beneficiario,";
        $campos .= "mproponente.ds_nome_municipio || ' - ' || e.ds_sigla AS texto_local_assinatura,";
        $campos .= "lpad(extract(DAY from now())::text, 2, '0') AS texto_dia_assinatura,";
        $campos .= "lpad(extract(MONTH from now())::text, 2, '0') AS texto_mes_assinatura,";
        $campos .= "TO_CHAR(now(), 'YY') AS texto_ano_assinatura";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas'), $campos);
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = p.id', null);
        $select->join(array('mproponente' => 'sistema.municipios'), 'mproponente.id = pp.id_municipio', null);
        $select->join(array('e' => 'sistema.estados'), 'e.id = mproponente.id_estado', null);
        $select->join(array('pb' => 'seguro.propostas_beneficiarios'), 'pb.id_proposta = p.id AND pb.fl_favorecido_autorizacao_credito is true', null);
        $select->joinLeft(array('b' => 'sistema.bancos'), 'b.id = pb.id_banco', null);
        $select->where('p.id = ?', $idProposta);

        return $this->fetchRow($select);
    }

    public function getDadosTermoDadosBancariosSeguradoOrdemPagamento(int $idProposta)
    {
        $campos  = "regexp_replace(seguro.id_proposta_mae_completo(p.id), '[-.]', '', 'g') || ' (' || p.id || ')' as texto_numero_proposta,";
        $campos .= "pp.ds_nome_proponente as texto_nome_proponente,";
        $campos .= "b.ds_nome_banco as texto_banco,";
        $campos .= "ib.ds_agencia as texto_agencia,";
        $campos .= "ib.nu_digito_agencia as texto_digito_agencia,";
        $campos .= "mproponente.ds_nome_municipio || ' - ' || e.ds_sigla AS texto_local_assinatura,";
        $campos .= "lpad(extract(DAY from now())::text, 2, '0') AS texto_dia_assinatura,";
        $campos .= "lpad(extract(MONTH from now())::text, 2, '0') AS texto_mes_assinatura,";
        $campos .= "TO_CHAR(now(), 'YY') AS texto_ano_assinatura";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas'), $campos);
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = p.id', null);
        $select->join(array('mproponente' => 'sistema.municipios'), 'mproponente.id = pp.id_municipio', null);
        $select->join(array('e' => 'sistema.estados'), 'e.id = mproponente.id_estado', null);
        $select->join(array('ibp' => 'seguro.informacoes_bancarias_propostas'), 'ibp.id_proposta = p.id AND ibp.fl_titular_conta is false', null);
        $select->join(array('ib' => 'sistema.informacoes_bancarias'), 'ib.id = ibp.id_informacoes_bancarias', null);
        $select->join(array('b' => 'sistema.bancos'), 'b.id = ib.id_banco', null);
        $select->where('p.id = ?', $idProposta);
        $select->where("ib.ds_tipo_conta in ('O')");

        return $this->fetchRow($select);
    }

	public function getTodasPropostas(int $idProposta)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['p1' => 'seguro.propostas'], false);
        $select->join(['p2' => 'seguro.propostas'], 'p2.id_proposta_mae = p1.id_proposta_mae', ['id', 'id_status']);
        $select->where("p1.id = {$idProposta}");
        $select->order("p2.id desc");

        return $this->fetchAll($select);
    }

    /**
     * Funcao especifica para tratar um corretor com problema
     * so pode editar proposta de clientes dele da safra anterior e atual
     * tarefa 2304191217
     */
    public function isImperatrizClient(string $cpfCnpj) : bool {
        $safra_atual = ( new Produto_Model_Safras())->getSafraAtual('id');

        $select = "SELECT 1 as has
            WHERE exists (
                SELECT pr.id
                  FROM seguro.propostas pr
                  JOIN seguro.propostas_proponentes pp
                    ON pr.id = pp.id_proposta
                  JOIN produto.produtos pd
                    ON pr.id_produto = pd.id
                 WHERE pp.cpf_cnpj = '${cpfCnpj}'
                   AND pd.id_safra in (${safra_atual},(${safra_atual}-1))                    
                   AND (pr.id_usuario_criacao in (
                        SELECT id_usuario
                          FROM sistema.prepostos
                         WHERE id_corretor = 379
                        )
		    OR pr.id_usuario_criacao = 2943)
	           AND pr.id_status in (62,13,8)
            )";
        
        return ($this->_db->fetchOne($select) !== 1 ? false : true);
    }

    /**
     * Funcao especifica para tratar um corretor com problema
     * so pode editar proposta de clientes novos
     * tarefa 2304191217
    */
    public function newClient(string $cpfCnpj) : bool {
        $safra_atual = ( new Produto_Model_Safras())->getSafraAtual('id');
        
        $select = "SELECT 1 as has
            WHERE exists (
                SELECT pr.id
                  FROM seguro.propostas pr
                  JOIN seguro.propostas_proponentes pp
                    ON pr.id = pp.id_proposta
                  JOIN produto.produtos pd
                    ON pr.id_produto = pd.id
                 WHERE pp.cpf_cnpj = '${cpfCnpj}'
                   AND pd.id_safra in (${safra_atual},(${safra_atual}-1))
                   AND pr.id_status in (62,13,8)
            )";

        return ($this->_db->fetchOne($select) === 1 ? false : true);
    }

	public function hasProdutividadePorItemConfigurada(int $idProposta): bool
	{
		$row = $this->fetchRow(
			$this->select()
				->setIntegrityCheck(false)
				->from(['sp' => 'seguro.propostas'], 'fl_taxa_pe_por_item')
				->where('id = ?', $idProposta)
		);
		
		return !empty($row['fl_taxa_pe_por_item']);
	}

    public function getPropostasComTaxaCar(array $campos = [], array $where = []) : Zend_Db_Table_Rowset
    {
        $campos = !empty($campos) ? $campos : ['sp.*'];
        $select = $this->select()->setIntegrityCheck(true);
        $select->from(['sp' => 'seguro.propostas'], $campos)
            ->join(['pp' => 'produto.produtos'], 'pp.id = sp.id_produto', false)
            ->join(['ps' => 'produto.safras'], 'ps.id = pp.id_safra', false)
            ->join(['cta' => 'comercializacao.taxas_agrupamento'], 'cta.id = sp.id_taxa_agrupamento', false)
            ->where("cta.tp_taxa_agrupamento = 'C'");

        if (!empty($where)) {
            foreach ($where as $condicao) {
                $select->where($condicao);
            }
        }

        $select->order('sp.id desc');

        return $this->fetchAll($select);
    }

	public function getIdPropostaMae(int $idProposta): ?int
	{
		$rs = $this->fetchRow(
			$this->select()
				->from(['sp' => 'seguro.propostas'], 'id_proposta_mae')
				->where('sp.id = ?', $idProposta)
		);

		return $rs['id_proposta_mae'] ?? null;
	}

	public function getDataTransmissaoPropostaMae(int $idProposta): DateTime
	{
		$proposta = $this->find($idProposta)->current();

		if ($proposta['id'] != $proposta['id_proposta_mae']) {
			$proposta = $this->find($proposta['id_proposta_mae'])->current();
		}

		if (empty($proposta['dt_transmissao'])) {
			return new DateTime('now');
		}

		return DateTime::createFromFormat('Y-m-d H:i:s', $proposta['dt_transmissao']);
	}
	
	public function atualizarComissao($id_proposta, $vl_comissao)
	{
		return $this->getAdapter()->query("update seguro.propostas set vl_comissao = '{$vl_comissao}' where id = {$id_proposta}");
	}

	public function getComissaoCotacaoProposta($id_proposta)
	{
		$row = $this->fetchRow(
			$this->select()
				->setIntegrityCheck(false)
				->from(['sc' => 'seguro.cotacoes'])
				->join(['sp'=>'seguro.propostas'], 'sp.id = sc.id_proposta')
				->where('sc.id_proposta = ?', $id_proposta)
		);
		
		return $row['vl_comissao'];
	}

	public function getNomeArquivoEnvioEcm(Seguro_Model_Row_Proposta $proposta, int $tipoEnvio): string
	{
		// Orçamento: <ID_PROPOSTA_I4PRO>_COTAÇÃO.pdf
        // Proposta:<ID_PROPOSTA_I4PRO>.pdf
        // Apólice: <NUMERO_APOLICE>.pdf
        // Proposta Endosso: <ID_PROPOSTA_MAE_I4PRO>_<ID_PROPOSTA_VIGENTE_AGRONET>.pdf
        // Apólice Endosso: <NUMERO_APOLICE>_<ID_PROPOSTA_VIGENTE_AGRONET>.pdf
        
        $numeroPropostaI4pro = (new Seguro_Model_Propostas())->getIdPropostaMaeCompleto($proposta->id);
        $numeroPropostaI4pro = str_replace(['.', '-'], '', $numeroPropostaI4pro);

        $numeroReferencia = '';

        if ($tipoEnvio == Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_COTACAO) {
            $numeroReferencia = "{$numeroPropostaI4pro}_COTAÇÃO";
        } elseif ($tipoEnvio == Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_PROPOSTA) {
            $numeroReferencia = "{$numeroPropostaI4pro}";

            if ($proposta->id != $proposta->id_proposta_mae) {
                // Proposta de endosso
                $numeroReferencia = "{$numeroPropostaI4pro}_{$proposta->id}";
            }
        } elseif($tipoEnvio == Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_APOLICE) {
            $numeroReferencia = "{$proposta->nr_apolice}";

            if ($proposta->id != $proposta->id_proposta_mae) {
                // Apólice de endosso
                $numeroReferencia = "{$proposta->nr_apolice}_{$proposta->id}";
            }
        }

        return "{$numeroReferencia}.pdf";
	}
}
