<?php
/**
 * Classe para gerenciamento da proposta
 *
 */
class Seguro_PropostaajaxController extends Agro_Controller_Action {

	/**
	 * Inicializa a classe retirando o layout e o phtml
	 *
	 */
	public function init() {
		$this->getHelper('layout')->disableLayout();
		ini_set('memory_limit','1024M');
		require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");
	}

	/**
	 * Gera uma versao da proposra
	 */
	public function geraversaoAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$return = array();

		if ($this->getRequest()->getParam('id')) {
			$Propostas = new Seguro_Model_Propostas();

			$return['message'] = MSG_SUCCESS;
			/*
			if ($Propostas->gera_versao($this->getRequest()->getParam('id'))) {
				$return['message'] = MSG_SUCCESS;
			} else {
				$return['message'] = MSG_ERROR;
			}
			*/
		} else {
			$return['message'] = 'Nenhuma proposta informada.';
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Retorna os produtos da proposta
	 *
	 */
	public function getprodutosAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$Propostas = new Seguro_Model_Propostas();
		$combo = $Propostas->getProdutos($this->getRequest()->getParams());

		$this->getResponse()->setBody(Zend_Json::encode($combo));
	}

	/**
	 * Retorno o proponente pelo CPF/CNPJ
	 *
	 */
	public function getproponenteAction() {
		$this->getHelper('ViewRenderer')->setNoRender();

		$Proponente = new Seguro_Model_Proponentes();
		$Row = $Proponente->getProponente($this->getRequest()->getParam('cpf_cnpj'));
		
		if (!empty($Row['id'])) {
			$Row['valid'] = true;
			
			if (!empty($Row['ds_email_proponente'])) {
				$Row['valid'] = $this->isEmailValido($this->getRequest()->getParam('id_proposta'), $Row['ds_email_proponente']);
			}
		}

		$this->getResponse()->setBody(Zend_Json::encode($Row));
	}

	public function loadquestionarioAction() {
		$this->isAjax();
		$Propostas = new Seguro_Model_Propostas();
		$Proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
        $questionarios = $Proposta->questionario($this->getRequest()->getParam('cpf_cnpj'));
		$respostas = $Proposta->respostas();
		$preposto = $Proposta->preposto();
		$propriedades = $Proposta->atributos('PROPRIEDADE');

		$dataAux = !empty($Proposta->dt_transmissao) ? $Proposta->dt_transmissao : $Proposta->dt_criacao;
		$aplicarNovaLeiSeguro = strtotime($dataAux) >= strtotime(DATA_INICIO_NOVA_LEI_SEGURO)
			|| $Proposta->id_status == Seguro_Enum_PropostaStatus::ID_NAO_ENVIADA;

		if ($aplicarNovaLeiSeguro) {
			echo '
				<div>
					<fieldset>
					<legend>
						<b style="color:red; font-size:12px;">Atenção</b>
					</legend>
					<div style="text-align:center;">
						<p style="font-size:12px; font-weight:bold; width:50%; margin: auto;">
						É fundamental que todas as informações fornecidas na formação do contrato de seguro sejam completas e precisas. O descumprimento do dever de informar pode resultar na perda de direitos ou na anulação do contrato de seguro. Caso tenha dúvidas sobre quais informações são relevantes, consulte nosso atendimento.
						</p>
					</div>
					</fieldset>
				</div>
			';
		}

		$this->view->getHelper('MontaQuetionario')->montaQuetionario($questionarios, $respostas, array('QUEST_ZONEAMENTO_ENQUADRADO_MAPA', 'QUEST_SUBVENCAO_ESTADUAL_CONFIRMADA'), $preposto, $propriedades);
		$this->view->getHelper('MontaJsQuetionario')->montaJsQuetionario($questionarios, $respostas);

		//necessário para bloquear campos do questionário
		echo '<script type="text/javascript">verificaEstadoPropriedade()</script>';
	}

	/**
	 * Retorno o proponente pelo CPF/CNPJ
	 *
	 */
	public function getbeneficiarioAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$Beneficiario = new Seguro_Model_Beneficiarios();

		if ($this->getRequest()->getParam('tp_pessoa') == 'J') {
			$banco = $Beneficiario->getBanco($this->getRequest()->getParam('cpf_cnpj'));
		}

		if ($banco) {
			$result['status'] = true;
            $result['message'] = "Este CNPJ é um Banco";
		} else {
            $result = $Beneficiario->getBeneficiario($this->getRequest()->getParam('cpf_cnpj'));
		}

        $this->getResponse()->setBody(Zend_Json::encode($result));
	}

	/**
	 * Retorno dos dados do banco pelo CNPJ
	 */
	public function getbancoAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$ModelBanco = new Seguro_Model_Beneficiarios();
		$banco = $ModelBanco->getBanco($this->getRequest()->getParam('cpf_cnpj'));
		$this->getResponse()->setBody(Zend_Json::encode($banco));
	}

	/**
	 * Deleta uma unidade segurada
	 *
	 */
	public function deleteunidadeAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$ids = '';

		if ($this->getRequest()->getParam('ids')) {
			$ids = explode(',', $this->getRequest()->getParam('ids'));

			$ItensSegurados = new Seguro_Model_ItensSegurados();
			foreach ($ids as $nro) {
				$ItensSegurados->deleteunidade($this->getRequest()->getParam('id_proposta'), $nro);
			}

			$ItensSegurados->reOrdena($this->getRequest()->getParam('id_proposta'));
		}

		$this->getResponse()->setBody(Zend_Json::encode($ids));
	}

	/**
	 * Retorna os produtos da proposta
	 *
	 */
	public function calculaAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();

        // Instancia a proposta
        $proposta = (new Seguro_Model_Propostas())->get($this->getRequest()->getParam('id_proposta'));
        $valorFranquiaSelecionada = $this->getRequest()->getParam('valorFranquiaSelecionada');
        $idTaxaCarSelecionada = null;
        $isTaxaAgrupamentoCar = false;
        $taxaCar = null;

        if (!empty($this->getRequest()->getParam('agrupamento'))) {
            $taxaAgrupamento = (new Comercializacao_Model_TaxasAgrupamentos())
                ->find($this->getRequest()->getParam('agrupamento'))
                ->current()
                ->toArray();

            if (
                !empty($taxaAgrupamento)
                && $taxaAgrupamento['tp_taxa_agrupamento'] !== Comercializacao_Model_TaxasAgrupamentos::TIPO_ORCAMENTO
            ) {
                $taxasCar = $proposta->_agrupamentoCar();
                foreach ($taxasCar['principal'] as $tc) {
                    if ($tc['vl_franquia'] == $valorFranquiaSelecionada) {
                        $idTaxaCarSelecionada = $tc['id_taxa'];
                        $taxaCar = $tc;
                        $isTaxaAgrupamentoCar = true;
                    }
                }
            }
        }

        // Busca as propriedades da proposta
        $propriedades = $proposta->atributos('PROPRIEDADE');

        // Aplica as regras
        $dados = $this->getRequest()->getParams();
        $franquia = explode('#', $this->getRequest()->getParam('taxa'));

        $dados['comissao']['vl_nova_comissao'] = $this->getRequest()->getParam('vl_nova_comissao');
        $dados['comissao']['vl_comissao_original'] = !empty($this->getRequest()->getParam('vl_comissao_original'))
			? $this->getRequest()->getParam('vl_comissao_original')
			: null;
        $dados['comissao']['valorComissaoAdicional'] = $this->getRequest()->getParam('valorComissaoAdicional');
        $dados['lmga'] = Agro_Util::formatCurrencyDb($dados['lmga']);
        $taxa = $franquia[0];
        $dados['id_taxa'] = $franquia[1];
        $dados['vl_percentual_subvencao_federal'] = $franquia[2];

        $dados['taxa'] = $taxa;

        $vlAcrescimoGeada = $this->getRequest()->getParam('fl_acrescimo_geada')
            ? $this->getRequest()->getParam('fl_acrescimo_geada')
            : 0;
        $return = $dados;
        $id_renovada = ($proposta->inadimplente()) ? false : $proposta->id_proposta_renovada;

        if ($propriedades['PROD_PRODUCAO_GARANTIDA']) {
            $return['lmga'] = Agro_Util::formatDbCurrency(
                $this->recalculaLmgaUnidades($dados, $propriedades, $proposta)
            );
            $dados['lmga'] = $return['lmga'];
        }

        /**
         * Propriedade existente somente para cultura pastagem. Para as demais, sempre será false
         */
        $return['dispensaComissaoMinima'] = false;

        if (
            !empty($this->getRequest()->getParam('dispensaComissaoMinima'))
            && $this->getRequest()->getParam('dispensaComissaoMinima') === 'true'
        ) {
            $return['dispensaComissaoMinima'] = true;
        }

        if ($proposta->produto()['ds_nome_produto'] == 'Pastagem Protegida - Índice') {
            $modelTaxasValores = new Comercializacao_Model_TaxasValores();
            $rowTaxasValores = $taxaCar ??
                $modelTaxasValores->getTaxasValoresByTaxaAgrupamento(
                    $this->getRequest()->getParam('agrupamento'),
                    $this->getRequest()->getParam('codigoCoberturaPrincipal'),
                    $dados['id_taxa']
                )->current();

            $modelPropostaCotacaoAgritask = new Seguro_Model_PropostasCotacaoAgritask();
            $rowPropostaCotacaoAgritask = $modelPropostaCotacaoAgritask->getRow(
                $this->getRequest()->getParam('id_proposta')
            );

            switch ($rowTaxasValores['vl_franquia']) {
                case 10:
                    $valorPremioAgritask = $rowPropostaCotacaoAgritask['vl_premio_10'];
                    break;
                case 20:
                    $valorPremioAgritask = $rowPropostaCotacaoAgritask['vl_premio_20'];
                    break;
                default:
                    $valorPremioAgritask = $rowPropostaCotacaoAgritask['vl_premio_30'];
                    break;
            }

            $return['cobertura_principal'] = [
                'taxa' => number_format($rowTaxasValores['vl_taxa'], 2, '.', ''),
                'premio' => Agro_Util::formatDbCurrency($valorPremioAgritask)
            ];

            if ($return['dispensaComissaoMinima']) {
                $valorComissaoNovo = number_format($this->getRequest()->getParam('vl_nova_comissao'), 2, '.', '');
                $valorComissaoOriginal = number_format($rowTaxasValores['vl_comissao'], 2, '.', '');

                if ($valorComissaoNovo === $valorComissaoOriginal) {
                    $return['cobertura_principal'] = [
                        'taxa' => number_format($rowTaxasValores['vl_taxa'], 2, '.', ''),
                        'premio' => Agro_Util::formatDbCurrency($valorPremioAgritask)
                    ];
                } else {
                    $return['cobertura_principal'] = $this->calculacoberturaprincipal($dados);
                }
            }
        } else {
            $return['cobertura_principal'] = $this->calculacoberturaprincipal($dados);
        }

        $return['coberturas_adicionais_validas'] = [];

        if (!empty($dados['ids_coberturas_adicionais'])) {
            // Valida se na relação de Produto/Cobertura não está marcado o checkbox Taxa Relacionada.
            $modelProdutosCoberturas = new Produto_Model_ProdutosCoberturas();
            $coberturasComTaxaRelaciona = $modelProdutosCoberturas->getCoberturasTaxaRelacionada(
                $dados['id_produto'],
                false,
                $dados['ids_coberturas_adicionais']
            );

            foreach ($coberturasComTaxaRelaciona as $coberturaValida) {
                $return['coberturas_adicionais_validas'][] = $coberturaValida['id_cobertura'];
            }

            $idsCoberturas = array_diff($dados['ids_coberturas_adicionais'], $return['coberturas_adicionais_validas']);

            $idAgrupamentoPrincipal = $dados['agrupamento'];
            $idTaxa = $dados['id_taxa'];

            if ($isTaxaAgrupamentoCar) {
                $select = Agro_Db_Table_Abstract::getDefaultAdapter()
                    ->select()
                    ->from(array('cta' => 'comercializacao.taxas_agrupamento'), array('id as id_agrupamento'))
                    ->join(
                        array('ctac' => 'comercializacao.taxas_agrupamento_car'),
                        'ctac.id_taxa_agrupamento = cta.id',
                        false
                    )
                    ->join(
                        array('ctv' => 'comercializacao.taxas_valores'),
                        'ctv.id_taxa_agrupamento = cta.id',
                        array('id as id_taxa')
                    )
                    ->where('ctv.id = ?', $idTaxaCarSelecionada);

                $taxaAgrupamento = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($select);

                $idAgrupamentoPrincipal = $taxaAgrupamento['id_agrupamento'];
                $idTaxa = $taxaAgrupamento['id_taxa'];
            }

            // Para as relações de Produto/Cobertura que estão marcadas a Taxa Relacionada,
            // valida se a taxa configurada para a cobertura está marcada como relacionada.
            $idsCoberturasValidas = $this->validarCoberturaRelacionada(
                $idAgrupamentoPrincipal,
                $idTaxa,
                $idsCoberturas
            );

            $return['coberturas_adicionais_validas'] = array_merge(
                $return['coberturas_adicionais_validas'],
                $idsCoberturasValidas
            );
        }

        $return['coberturas_adicionais'] = $this->calculacoberturasadicionais(
            $id_renovada,
            $dados['lmga'],
            $proposta->inadimplente(),
            $vlAcrescimoGeada,
            $dados['id_proposta'],
            ($isTaxaAgrupamentoCar && !empty($taxasCar) && !empty($taxasCar['adicionais']))
                ? $taxasCar['adicionais']
                : [],
            $valorFranquiaSelecionada
        );

        foreach ($return['coberturas_adicionais'] as $idx => $cobAdicional) {
            if (!in_array($cobAdicional['id_cobertura'], $return['coberturas_adicionais_validas'])) {
                unset($return['coberturas_adicionais'][$idx]);
            }
        }

        $agroReras = new Agro_Regras();
        $return['condicao_comercial'] = $agroReras->RN_CALC_05(
            $dados,
            $return['cobertura_principal'],
            $return['coberturas_adicionais'],
            $propriedades,
            $return['dispensaComissaoMinima']
        );

        if ($taxaCar !== null) {
            $return['valorFranquiaProposta'] = $valorFranquiaSelecionada;
        }

        $return['parcelamento'] = $agroReras->RN_CALC_06(
            $return['condicao_comercial'],
            $dados['parcelamento'],
            date('Y-m-d'),
            $proposta,
            $propriedades,
            false,
            false,
            $dados['vl_percentual_subvencao_federal'],
            $dados['id_taxa']
        );

        if (!empty($return['condicao_comercial']['premio_minimo'])) {
            $condicaoComercial = $return['condicao_comercial'];
            $condicaoComercial['premio_liquido'] = $condicaoComercial['premio_liquido_minimo'];
            $premioPagar = Agro_Util::formatCurrencyDb($condicaoComercial['premio_liquido'])
                + Agro_Util::formatCurrencyDb($condicaoComercial['custo_apolice']);
            $condicaoComercial['premio_pagar'] = Agro_Util::formatDbCurrency($premioPagar);
            $return['parcelamento_minimo'] = $agroReras->RN_CALC_06(
                $condicaoComercial,
                $dados['parcelamento'],
                date('Y-m-d'),
                $proposta,
                $propriedades,
                false,
                false,
                $dados['vl_percentual_subvencao_federal'],
                $dados['id_taxa']
            );
        }

        $return['beneficiarios'] = $proposta->beneficiarios();

        $coberturas = explode('--', $this->getRequest()->getParam('coberturas'));
        foreach ($coberturas as $cobertura) {
            list($id_cobertura, $franquia, $id_taxa) = explode('#', $cobertura);
            if (($id_cobertura == 33) || ($id_cobertura == 40) || ($id_cobertura == 45)) {
                $propostasCooperativas = new Seguro_Model_PropostasCooperativas();
                $return['locais_entregas'] = $propostasCooperativas->getByIdProposta(
                    $this->getRequest()->getParam('id_proposta')
                )->toArray();
                break;
            }
        }

        $return['cultura_pastagem'] = $this->calculaCulturaPastagem($proposta, $return);

        $this->getResponse()->setBody(Zend_Json::encode($return));
    }

	/**
	 * Valida se as coberturas adicionais possuem taxa relacionada com a franquia da cobertura principal
	 *
	 * @param int $idTaxaAgrupamento
	 * @param int $idTaxaRelacionada
	 * @param int $idsCoberturasAdicionais
	 * @return array
	 */
	private function validarCoberturaRelacionada(int $idTaxaAgrupamento, int $idTaxaRelacionada, array $idsCoberturasAdicionais): array
	{
		$idsCoberturasValidas = [];
		$modelTaxasValores = new Comercializacao_Model_TaxasValores();
		$rs = $modelTaxasValores->getTaxa($idTaxaAgrupamento, $idsCoberturasAdicionais, $idTaxaRelacionada, true);

		if (!empty($rs)) {
			foreach ($rs as $row) {
				$idsCoberturasValidas[] = $row['id_cobertura'];
			}
		}
		
		return $idsCoberturasValidas;
	}

	private function recalculaLmgaUnidades($dados, $propriedades, $Proposta) {
		$taxas = $Proposta->taxas($Proposta->agrupamento(), $propriedades['PROD_PRODUCAO_GARANTIDA']);
		$taxa = explode('#', $this->getRequest()->getParam('taxa'));
		$TaxaValor = new Comercializacao_Model_TaxasValores();
		$ItensSegurados = new Seguro_Model_ItensSegurados();
		
		$RowTaxa = $TaxaValor->find($taxa[1])->current();
		$unidades = $Proposta->unidades(false);
		
		if (is_array($unidades)) {
			$lmga = 0;
			
			foreach ($unidades as $idx => $unidade) {
				if ($propriedades['PROD_PRODUCAO_GARANTIDA'] == 1) {
					// valorFranquiaSelecionada é informada quando uma taxa CAR está sendo utilizada
					$valorFranquia = $dados['valorFranquiaSelecionada'] ?? $RowTaxa->vl_franquia;
					
					$unidade = Agro_Regras::RN_IS_03($unidade, $Proposta, $propriedades, $valorFranquia);
					$unidade['IS_LMGA_PARCIAL'] = round($unidade['IS_PRODUCAO_GARANTIDA'] * Agro_Util::formatCurrencyDb($unidade['IS_VALOR_TONELADA']) * $unidade['IS_AREA'], 2);
				}

				$unidade['IS_SISTEMA_PLANTIO'] = $unidade['IS_ID_SISTEMA_PLANTIO'];
				$lmga = Agro_Util::formatCurrencyDb($unidade['IS_LMGA_PARCIAL']) + Agro_Util::formatCurrencyDb($lmga);

				$ItensSegurados->save($idx, $unidade, $Proposta->id);
			}
		}

		return $lmga;
	}

	public function calculacoberturasAction() {
		$this->getHelper('ViewRenderer')->setNoRender();

		$return = array(
			'cobertura_principal' => $this->calculacoberturaprincipal(),
			'coberturas_adicionais' => $this->calculacoberturasadicionais()
		);

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	private function unCheckCoberturas() {
		$Proposta = new Zend_Session_Namespace('proposta');

		if ($this->getRequest()->getParam('uncoberturas')) {
			$coberturas = explode(',', $this->getRequest()->getParam('uncoberturas'));

			foreach ($coberturas as $cobertura) {
				if ($cobertura)
					unset($Proposta->premio['dados']['coberturas'][$cobertura]);
			}
		}
	}

	/**
	 * Calcula a taxa e a comissao da cobertura principal
	 *
	 */
	public function calculacoberturaprincipal($dados) {
	    //$Session = new Zend_Session_Namespace('PROPOSTA');

		try {
			$lmga = Agro_Util::formatCurrencyDb($dados['lmga']);
			return Agro_Regras::RN_CALC_03($lmga, $dados['taxa'], $dados['comissao'], $dados['id_proposta']);
		} catch (Exception $e) {
			return $e->getMessage();
		}

		return;
	}

	/**
	 * Calcula a taxa e a comissao das coberturas adicionais
	 *
	 */
	public function calculacoberturasadicionais(
		$propostaRenovada,
		$lmga,
		$inadimplente = false,
		$vlAcrescimoGeada = 0,
		$id_proposta,
		$taxasCar,
		$valorFranquiaSelecionada = null
	) {
	    //$Session = new Zend_Session_Namespace('PROPOSTA');

		$ProdCoberturas = new Produto_Model_ProdutosCoberturas();
		$Taxas          = new Comercializacao_Model_Taxas();

		try {
			$agrupamento = $this->getRequest()->getParam('agrupamento');
			$arrCoberturas = explode('--', $this->getRequest()->getParam('coberturas'));
			if (is_array($arrCoberturas)) {
				$coberturas = array();
				foreach ($arrCoberturas as $Cobertura) {
					$arrTemp = explode('#', $Cobertura);
					// Index 0 = id_cobertura
					// Index 1 = franquina
					// Index 2 = id_taxa
					
					$franquiaSelecionada = !empty($arrTemp[4]) ? $arrTemp[4] : $valorFranquiaSelecionada;

					if ($arrTemp[0]) {
						$coberturas[$arrTemp[0]] = array($arrTemp[1], $arrTemp[2], (int) $franquiaSelecionada);
					}
				}
			}

			$return = array();
			
			if (is_array($coberturas) && count($coberturas)) {
				$mapTaxaCarToCobertura = [];
				
				foreach ($taxasCar as $taxa) {
					$mapTaxaCarToCobertura[$taxa['id_cobertura']][$taxa['vl_franquia']] = $taxa;
				}

				
				foreach ($coberturas as $cobertura => $franquia) {
					
					if ($cobertura) {
						$ProdCobertura = $ProdCoberturas->find($this->getRequest()->getParam('id_produto'), $cobertura)->current();
						$valorFranquia = null;

						if (!empty($mapTaxaCarToCobertura[$cobertura])) {
							$taxaRelacionada = (object) $mapTaxaCarToCobertura[$cobertura][$franquia[2]];
							$fl_independente = false;
							$valorFranquia = $taxaRelacionada->vl_franquia;
						} elseif ($ProdCobertura->fl_taxa_relacionada) {
							$taxaRelacionada = $Taxas->getTaxaRelacionada($franquia[1], $cobertura);
							$fl_independente = false;
						} else {
							$taxaRelacionada = $Taxas->getTaxaNaoRelacionada($franquia[1], $propostaRenovada);
							$fl_independente = true;
						}
						
						$TaxasValores = new Comercializacao_Model_TaxasValores();

						if (is_null($valorFranquia)) {
							$Valores = $TaxasValores->find($franquia[1])->current();
							$valorFranquia = $Valores->vl_franquia;
						}

						$dados = array();
						
						$Propostas = new Seguro_Model_Propostas();
						$proposta = $Propostas->get($id_proposta);

						if ($propostaRenovada && $proposta->renovacaoSemSinistro((int) $proposta['id_usuario_criacao'])) {
							$dados['taxa'] = $taxaRelacionada->vl_taxa_renovacao;
						} elseif($inadimplente) {
						    $dados['taxa'] = $taxaRelacionada->vl_taxa_inadimplente;
						} else {
							if (!empty($taxasCar)) {
								$dados['taxa'] = (!is_null($taxaRelacionada->vl_taxa) ? $taxaRelacionada->vl_taxa : $franquia[0]);
							} else {
								$dados['taxa'] = ($taxaRelacionada->vl_taxa ? $taxaRelacionada->vl_taxa : $franquia[0]);
							}
						}
						
						if (!$inadimplente && in_array($cobertura, array(5, 30, 31, 36))) {
							$ModelProposta = new Seguro_Model_Propostas();
							$Proposta = $ModelProposta->find($id_proposta)->current();

							$ProdutosAtributos = new Produto_Model_ProdutosAtributos();

							if($propostaRenovada && !$proposta->renovacaoSemSinistro((int) $Proposta['id_usuario_criacao'])) {
								$taxaReplantio = null;
							} else {
								$taxaReplantio = $ProdutosAtributos->getTaxaReplantio(
                                    $Proposta['id_produto'],
                                    $Proposta['id_usuario_criacao'],
                                    $Proposta->propriedade('id_municipio'),
                                    $Proposta->proponente('id_proponente'),
                                    $propostaRenovada
                                );
							}

							$dados['taxa'] = is_null($taxaReplantio) ? $dados['taxa'] : $taxaReplantio;
						}

						//$dados['comissao'] = $this->getRequest()->getParam('comissao');

						$dados['comissao']['vl_comissao_original'] = $this->getRequest()->getParam('vl_comissao_original');
						$dados['comissao']['vl_nova_comissao'] = $this->getRequest()->getParam('vl_nova_comissao');

						$dados['lmga']     = Agro_Util::formatCurrencyDb($lmga);

						$coberturasComAcrescimo = [
							Produto_Model_Coberturas::COB_GEADA,
							Produto_Model_Coberturas::COB_GEADA_II,
						];
						if(in_array($cobertura, $coberturasComAcrescimo) && $vlAcrescimoGeada > 0){
							$dados['taxa'] = round($vlAcrescimoGeada * $dados['taxa'], 2);
						}
						
						$calc = Agro_Regras::RN_CALC_03($dados['lmga'], $dados['taxa'], $dados['comissao'], $id_proposta);
						
						$return[] = array(
							'mostra_franquia'  => Agro_Util::formatDbCurrency($valorFranquia, 2, '.', ''),
							'premio_tarifario' => $calc['premio'],
							'id_cobertura'     => $cobertura,
							'vl_franquia'      => $franquia[0],
							'id_taxa'          => !empty($taxasCar) ? 0 : $franquia[1],
							'vl_taxa'          => $calc['taxa'],
							'fl_independente'  => $fl_independente,
						);
					}
				}
			}

			return $return;
		} catch (Exception $e) {
			return $e->getMessage();
		}
	}

	/**
	 * Carrega um beneficiario pelo ID
	 *
	 */
	public function loadbeneficiarioAction() {
		$this->getHelper('ViewRenderer')->setNoRender();

		$this->getResponse()->setBody(Zend_Json::encode(
          (new Seguro_Model_PropostasBeneficiarios())->getPropostaBeneficiarioById($this->getRequest()->getParam('id'))->toArray()
        ));
	}

	/**
	 * Adicionar beneficiario
	 *
	 */
	public function savebeneficiarioAction() {
		$this->getHelper('ViewRenderer')->setNoRender();

		$propostasBeneficiarios = new Seguro_Model_PropostasBeneficiarios();
		$BaseBeneficiarios = new Seguro_Model_Beneficiarios();
		$result = array('status' => true);
        $parametros = $this->getRequest()->getParams();

		$lmga = Agro_Util::formatCurrencyDb($this->getRequest()->getParam('lmga'));
		$idProposta = (int) $parametros['id_proposta'];
		$total = $propostasBeneficiarios->sumTotal($this->getRequest()->getParams());
        $tipoPessoa = strlen($parametros['cpf_cnpj']) == 14 ? 'F' : 'J';

		if ($total > $lmga) {
			$result['message'] = "A soma dos valores dos beneficiários não pode ultrapassar R$".$this->getRequest()->getParam('lmga');
			$result['status'] = false;
			$this->getResponse()->setBody(Zend_Json::encode($result));
			return;
		}

		if ($propostasBeneficiarios->verificaDocumentoBeneficiario($this->getRequest()->getParams())) {
			$result['message'] = 'Já existe outro beneficiário com o mesmo CPF/CNPJ.';
			$result['status'] = false;
			$this->getResponse()->setBody(Zend_Json::encode($result));
			return;
		}

		if (!Agro_Util::validarCpfCnpj($this->getRequest()->getParam('cpf_cnpj'))) {
			$result['message'] = 'Informe um CPF/CNPJ válido.';
			$result['status'] = false;
			$this->getResponse()->setBody(Zend_Json::encode($result));
			return;
		}

		if (($propostasBeneficiarios->fetchAll("id_proposta = $idProposta")->count() >= QTD_BENEFICIARIOS) && !$this->getRequest()->getParam('id_beneficiario')) {
			$result['message'] = 'O número máximo de beneficiários já foi atingido.';
			$result['status'] = false;
			$this->getResponse()->setBody(Zend_Json::encode($result));
			return;
		}
        if ($parametros['tp_favorecido'] === 'n') {
            // Verifica se o CPF_CNPJ informado já consta no banco de dados de Beneficiários.
            // Caso não conste, insere o novo registro
            $consultaBeneficiario = $BaseBeneficiarios->fetchRow("cpf_cnpj = '{$parametros['cpf_cnpj']}'");
	
            if(!$consultaBeneficiario) {
                $tp_pessoa = $tipoPessoa;
			
                $idBeneficiario = $BaseBeneficiarios->saveByCpfCnpj(array(
                    'cpf_cnpj' => $parametros['cpf_cnpj'],
                    'tp_pessoa' => $tp_pessoa,
                    'ds_nome_beneficiario' => $parametros['ds_favorecido'],
                    'id_banco' => $parametros['id_banco'],
                    'ds_agencia' => $parametros['ds_agencia'],
                    'dt_nascimento' => ($parametros['dt_nasc_beneficiario'] ? $parametros['dt_nasc_beneficiario'] : null),
                    'id_tipo_beneficiario' => $parametros['id_tipo_beneficiario'],
					'ds_endereco_cep' => $parametros['ds_endereco_cep'],
					'id_municipio' => $parametros['id_municipio'],
					'id_estado' => $parametros['id_estado'],
					'ds_endereco_bairro' => $parametros['ds_endereco_bairro'],
					'ds_endereco_logradouro' => $parametros['ds_endereco_logradouro'],
					'ds_endereco_nro' => $parametros['ds_endereco_nro'],
					'ds_endereco_complem' => $parametros['ds_endereco_complem'],
					'ds_tel' => $parametros['ds_tel'],
					'ds_email' => $parametros['ds_email_beneficiario']
                ));

                if (!$idBeneficiario) {
                    $result['message'] = 'Erro ao salvar beneficiário.';
                    $result['status'] = false;
                    $this->getResponse()->setBody(Zend_Json::encode($result));
                    return;
                }
            } else {
                $idBeneficiario = $consultaBeneficiario['id'];
				
				$BaseBeneficiarios->saveEnderecoByCpf(array(
					'cpf_cnpj' => $parametros['cpf_cnpj'],
					'ds_endereco_cep' => $parametros['ds_endereco_cep'],
					'id_municipio' => $parametros['id_municipio'],
					'id_estado' => $parametros['id_estado'],
					'ds_endereco_bairro' => $parametros['ds_endereco_bairro'],
					'ds_endereco_logradouro' => $parametros['ds_endereco_logradouro'],
					'ds_endereco_nro' => $parametros['ds_endereco_nro'],
					'ds_endereco_complem' => $parametros['ds_endereco_complem'],
					'ds_tel' => $parametros['ds_tel'],
					'ds_email' => $parametros['ds_email_beneficiario']
                ));
            }

            $rowInformacoesBancariasBeneficiarios = (new Seguro_Model_InformacoesBancariasBeneficiarios())->fetchAll(["id_beneficiario = {$idBeneficiario}"])->current();

            if (!empty($rowInformacoesBancariasBeneficiarios)) {
                $rowSistemaInformacoesBancarias = (new Sistema_Model_InformacoesBancarias())->fetchAll(["id = {$rowInformacoesBancariasBeneficiarios['id_informacoes_bancarias']}"])->current();

                if (!empty($rowSistemaInformacoesBancarias)) {
                    $this->incluirInformacoesBancariasBeneficiarios([
                        'cpf_cnpj' => $parametros['cpf_cnpj'],
                        'id_proposta' => $idProposta,
                        'id_banco' => $rowSistemaInformacoesBancarias['id_banco'],
                        'nu_conta_corrente' => $rowSistemaInformacoesBancarias['ds_conta'],
                        'nu_digito_conta_corrente' => $rowSistemaInformacoesBancarias['nu_digito_conta'],
                        'nu_agencia' => $rowSistemaInformacoesBancarias['ds_agencia'],
                        'nu_digito_agencia' => $rowSistemaInformacoesBancarias['nu_digito_agencia'],
                        'id_forma_pagamento' => $rowInformacoesBancariasBeneficiarios['id_forma_pagamento'],
                    ]);
                }
            }
        }

        if ($parametros['tp_favorecido'] === 's') {
            $this->incluirInformacoesBancariasBeneficiarios([
                'cpf_cnpj' => $parametros['cpf_cnpj'],
                'id_proposta' => $idProposta,
                'id_banco' => $parametros['id_banco'],
                'nu_conta_corrente' => '',
                'nu_digito_conta_corrente' => '',
                'nu_agencia' => $parametros['ds_agencia'],
                'nu_digito_agencia' => '',
                'id_forma_pagamento' => Sistema_Model_FormasPagamento::ID_STATUS_CHEQUE
            ]);
        }

		if (!empty($this->getRequest()->getParam('ds_email_beneficiario')) && !$this->isEmailValido($idProposta, $this->getRequest()->getParam('ds_email_beneficiario'))) {
			$result['message'] = 'Informar e-mail do Beneficiário, pois este e-mail está cadastrado para o Corretor.';
			$result['status'] = false;
			$this->getResponse()->setBody(Zend_Json::encode($result));
			return;
		}

		if ($this->getRequest()->getParam('fl_vinculada_financiamento') && empty($this->getRequest()->getParam('ds_email_instituicao_financeira'))) {
			$result['message'] = 'Informe o e-mail do responsável da instituição financeira.';
			$result['status'] = false;
			$this->getResponse()->setBody(Zend_Json::encode($result));
			return;
		}

		if (!empty($this->getRequest()->getParam('ds_email_instituicao_financeira'))) {

			if (!$this->isEmailValido($idProposta, $this->getRequest()->getParam('ds_email_instituicao_financeira'))) {
				$result['message'] = 'Informar e-mail do responsável da instituição financeira, pois este e-mail está cadastrado para o Corretor.';
				$result['status'] = false;
				$this->getResponse()->setBody(Zend_Json::encode($result));
				return;
			}
		}
        $propostasBeneficiarios->save(array(
            'id' => $parametros['id_beneficiario'],
            'ds_nome_beneficiarios' => $parametros['ds_favorecido'],
            'ds_qualidade_beneficiario' => $parametros['ds_qualidade'],
            'vl_limite_beneficio' => Agro_Util::formatCurrencyDb($parametros['ds_quantia']),
            'nr_cpf_cnpj' => $parametros['cpf_cnpj'],
            'id_banco' => $parametros['id_banco'],
            'ds_agencia' => $parametros['ds_agencia'],
            'ds_conta' => $parametros['tp_favorecido'],
            'ds_observacao' => $parametros['tp_favorecido'],
            'ds_tipo_conta' => $parametros['tp_favorecido'],
            'dt_nascimento' => $parametros['dt_nasc_beneficiario'],
            'tp_pessoa' => $tipoPessoa,
            'id_tipo_beneficiario' => $parametros['id_tipo_beneficiario'],
			'ds_email_beneficiario' => $this->getRequest()->getParam('ds_email_beneficiario'),
			'ds_email_instituicao_financeira' => $this->getRequest()->getParam('ds_email_instituicao_financeira'),
			'fl_nome_social' => $parametros['fl_nome_social'],
			'ds_nome_social' => $parametros['ds_nome_social'],
			'ds_tel' => $parametros['ds_tel']
        ), $idProposta);

		$this->atualizarPropostasEmailAssinaturaDocumento($idProposta);
		
		(new Seguro_Model_PropostasHashOrcamento())->save($idProposta);

		$Model = new Seguro_Model_Propostas();
		$Proposta = $Model->find($idProposta)->current();
	
		$this->getResponse()->setBody(Zend_Json::encode($Proposta->beneficiarios()));
	}

	private function incluirInformacoesBancariasBeneficiarios(array $dados)
    {
        $modelSeguroInformacoesBancariasBeneficiarios = new Seguro_Model_InformacoesBancarias();
        $modelSeguroInformacoesBancariasBeneficiarios->deleteByPropostaCpfCnpj(
            $dados['id_proposta'],
            $dados['cpf_cnpj']
        );

        $modelSeguroInformacoesBancariasBeneficiarios->save($dados);
    }

	/**
	 * Verifica se a soma do valor total dos Beneficiarios não ultrapassa a LMGA da propota
	 *
	 */
	public function verificasomabeneficiariosAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$Beneficiarios = new Seguro_Model_PropostasBeneficiarios();

		$lmga   = Agro_Util::formatCurrencyDb($this->getRequest()->getParam('lmga'));
		$total  = $Beneficiarios->sumTotal($this->getRequest()->getParams());
		$return = array();

		if ($total > $lmga) {
			$return['status'] = false;
		} else {
			$return['status'] = true;
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Deletar beneficiario
	 *
	 */
	public function deletebeneficiarioAction() {
		$Beneficiarios = new Seguro_Model_PropostasBeneficiarios();
		$this->getHelper('ViewRenderer')->setNoRender();

		$Row = $Beneficiarios->find($this->getRequest()->getParam('id'))->current();

		$Model = new Seguro_Model_Propostas();
		$Proposta = $Model->find($Row->id_proposta)->current();

		$Beneficiarios->delete($Row->id);

		$this->atualizarPropostasEmailAssinaturaDocumento($Row->id_proposta);
		
        (new Seguro_Model_InformacoesBancarias())->deleteByPropostaCpfCnpj(
          (int) $Row->id_proposta,
          $Row->nr_cpf_cnpj
        );

		(new Seguro_Model_PropostasHashOrcamento())->save($Row->id_proposta);

		$this->getResponse()->setBody(Zend_Json::encode($Proposta->beneficiarios()));
	}

	/**
	 * Salva croqui da proposta
	 *
	 */
	public function savecroquiAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();

        $proposta = new Zend_Session_Namespace('PROPOSTA');
        $modelPropostaArquivos = new Seguro_Model_PropostasArquivos();

        $croquis = explode('|', $this->getRequest()->getParam('uploader_file'));

        if (is_array($croquis) && $modelPropostaArquivos->contaCroqui($proposta->id_proposta) < QTD_CROQUIS_PROPOSTA) {
            foreach ($croquis as $croqui) {
                if ($croqui) {
                    $modelPropostaArquivos->saveCroquiList($croqui, (int)$proposta->id_proposta, true);
                }
            }
        } else {
            die('Somente ' . QTD_CROQUIS_PROPOSTA . ' podem ser cadastrados.');
        }
    }

	/**
	 * Deleta um croqui da proposta
	 *
	 */
	public function deletecroquiAction() {
		$this->getHelper('ViewRenderer')->setNoRender();

		$ModelPropostaArquivos = new Seguro_Model_PropostasArquivos();

		$ModelPropostaArquivos->deleteCroquiList($this->getRequest()->getParam('id'), true);
	}

	private function zeraPendenciaTransmissao($id_proposta) {
		$Analise_Transmissao = new Seguro_Model_PropostasAnaliseTransmissao();
		return $Analise_Transmissao->removeAnaliseTransmissao($id_proposta,'');
	}

	/*
	* Verifica se não foram abertas duas propostas para edição/inclusão
	*/
	public function checaSessao($md) {

		$Session = new Zend_Session_Namespace('PROPOSTA');
		$User = Zend_Auth::getInstance()->getIdentity();

		if (($Session->id_proposta) && ($User->id_empresa <> 20))  {
			if ($md <> md5($Session->id_proposta.$_SERVER['SERVER_ADDR'])) {
				return false;
			}
		}

		return true;
	}

	public function validarcoordenadassedeAction()
	{
		$this->getHelper('ViewRenderer')->setNoRender();

		try {
	        $usuario = Zend_Auth::getInstance()->getIdentity();
	        $modelUsuarios = new Sistema_Model_Usuarios();

	        $return = array(
	        	'status' => true,
	        	'confirm' => $modelUsuarios->isFuncionarioAgro($usuario->id),
	        	'message' => ''
	        );

	        if (empty($this->getRequest()->getParam('id'))) {
	        	$return['confirm'] = false;
	        	throw new Exception("ID da proposta não informado.");
	        }

	        if (empty($this->getRequest()->getParam('nomeMunicipioPropriedade'))) {
	        	$return['confirm'] = false;
	        	throw new Exception("Nome do município não informado.");
	        }

	        if (empty($this->getRequest()->getParam('coordenadas'))) {
	        	$return['confirm'] = false;
	        	throw new Exception("Coordenadas do município não informado.");
	        }

			$Propostas = new Seguro_Model_Propostas();
			$Produto = $Propostas->getProdutoByProposta($this->getRequest()->getParam('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) {

		        $nomeMunicipioPropriedade = $this->getRequest()->getParam('nomeMunicipioPropriedade');
				$coordenadas = $this->getRequest()->getParam('coordenadas');

				$nomeMunicipio = strtoupper(Agro_Util::removeAcentos($nomeMunicipioPropriedade));
		    	$nomeMunicipioCoordenadas = Agro_Util::getMunicipioByCoordenada($coordenadas);

		        if (( $nomeMunicipioCoordenadas != $nomeMunicipio ) && ( $nomeMunicipioCoordenadas <> '' )) {

		        	$mensagem = "As coordenadas estão fora do CEP/Município informado no campo da propriedade.";
		        	if ($return['confirm']) {
		        		$mensagem .= "\n\nDeseja transmitir mesmo assim?";
		        	}

		        	throw new Exception($mensagem);
		        }
			}


			//VALIDACAO TEMPORARIA PARA POUCO CAPACIDADE
			$return['confirm'] = false;

	        if (empty($this->getRequest()->getParam('cpfCnpj'))) {
	        	throw new Exception("CPF/CNPJ não informado.");
	        }
			
	        if (empty($this->getRequest()->getParam('siglaEstadoPropriedade'))) {
	        	throw new Exception("Estado da propriedade não informado.");
	        }

			if (empty($this->getRequest()->getParam('idProduto'))) {
	        	throw new Exception("Produto não informado.");
	        }

			//$produtosValidacao = [1344,1345,1350,1354,1386,1387,1363,1361,1417,1407,1408,1418];
			//$estadosValidacao = ['RS','SC','PR','MS'];
			//
			//if (in_array($this->getRequest()->getParam('siglaEstadoPropriedade'), $estadosValidacao) && in_array($this->getRequest()->getParam('idProduto'), $produtosValidacao)) {
			//	$proponente = (new Seguro_Model_Proponentes())->fetchAll("cpf_cnpj = '".$this->getRequest()->getParam('cpfCnpj')."'")->current();
			//	
			//	if ($proponente) {
			//		$unblock = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll(
			//			"SELECT * 
			//			FROM public.proponentes_liberados_capacidade
			//			WHERE id_proponente = ".$proponente['id']
			//		);
			//		if (count($unblock)<=0) {
			//			throw new Exception("Comercialização não disponível.");
			//		}
			//	} else {
			//		throw new Exception("Comercialização não disponível.");
			//	}
			//}
			//FINALIZADA VALIDACAO TEMPORARIA

		} catch (Exception $e) {
        	$return['status'] = false;
        	$return['message'] = $e->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function validarcoordenadasmunicipioAction()
	{
		ini_set('max_execution_time', 360);
		$this->getHelper('ViewRenderer')->setNoRender();

        $usuario = Zend_Auth::getInstance()->getIdentity();
        $modelUsuarios = new Sistema_Model_Usuarios();

        $return = array(
        	'status' => true,
        	'confirm' => $modelUsuarios->isFuncionarioAgro($usuario->id),
        	'message' => ''
        );

		$Propostas = new Seguro_Model_Propostas();
		$Proposta = $Propostas->find($this->getRequest()->getParam('id'))->current();
		$mensagens = array();
        $PropostaQuestionarios = new Seguro_Model_PropostasQuestionarios();


		if (!$Propostas->isCoordenadasSedeMunicipio($Proposta->id)){

        	$mensagem = 'As coordenadas estão fora do CEP/Município informado no campo da propriedade.';
        	$Proposta->atualizaAnaliseTransmissao($mensagem);
        	$mensagens[] = $mensagem;
        	$return['status'] = false;
		}

        if ($PropostaQuestionarios->getResposta($Proposta->id, 'QUEST_SUBVENCAO_FEDERAL')) {

	        $ProdutosAtributos = new Produto_Model_ProdutosAtributos();
			$Produto = $Propostas->getProdutoByProposta($Proposta->id);
			$produtoAtributos = $ProdutosAtributos->getAtributosFromProduto($Produto->id_produto, true, 'p', true, true);
			$PropostaPropriedade = $Proposta->propriedade();

			$nomeMunicipio = strtoupper(Agro_Util::removeAcentos($PropostaPropriedade['ds_nome_municipio']));
			if (array_key_exists('PROD_VALIDAR_COORD_TALHOES', $produtoAtributos) && $produtoAtributos['PROD_VALIDAR_COORD_TALHOES'] == 1) {
				$PropostasCroquis = new Seguro_Model_PropostasCroquis();
		        $croquis = $PropostasCroquis->getCroquis($Proposta->id);

		        foreach ($croquis as $croqui) {
		        	$possuiCoordenadaNoMunicipio = false;
		         	$coordenadasCroqui = json_decode($croqui['ds_coordenadas']);

		         	foreach ($coordenadasCroqui as $latitudeLongitudes) {

		         		$municipioCroqui = Agro_Util::getMunicipioByCoordenada($latitudeLongitudes, true);
		         		if ($municipioCroqui == $nomeMunicipio) {
		         			$possuiCoordenadaNoMunicipio = true;
		         			continue 2;
		         		}
		         	}

		         	if (!$possuiCoordenadaNoMunicipio) {
		         		$nomeTalhao = trim(mb_strtoupper($croqui['ds_nome']));
		         		$mensagens[] = "As coordenadas do talhão {$nomeTalhao} estão no município {$municipioCroqui}, e o CEP da propriedade refere-se ao município {$nomeMunicipio}, favor ajustar e tentar transmitir novamente.";
		         	}

		        }

		        if (count($croquis) > 0 && !$possuiCoordenadaNoMunicipio) {
		        	$Proposta->atualizaAnaliseTransmissao('As coordenadas do talhão da propriedade refere-se ao outro município.');
		        	$return['status'] = false;
		        }
			}
        }

        $return['message'] = implode("\n", $mensagens);

        if (!empty($return['message']) && $return['confirm']) {
        	 $return['message'] .= "\n\nDeseja transmitir mesmo assim?";
        }

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Transmite a proposta para o Status
	 * AGUARDANDO_CONFERENCIA
	 */
	public function transmitirAction () {

		ini_set('max_execution_time', 360);

		$this->getHelper('ViewRenderer')->setNoRender();

		if ($this->getRequest()->getParam('fl_api_corretores') || $this->checaSessao($this->getRequest()->getParam('md'))) {
			$return['status'] = true;
			$return['adicionado_fila_docusign'] = false;

			$modelBloqueioPropostaTransmissao = new Log_Model_BloqueioPropostaTransmissao();

			try {
				$idProposta = (int) $this->getRequest()->getParam("id");
				
				if (!empty($modelBloqueioPropostaTransmissao->getByProposta($idProposta))) {
					throw new Exception("Proposta já está sendo processada.");
				}

				if ((new Seguro_Model_PropostaStatus())->propostaTransmitida($idProposta)) {
					throw new Exception("Proposta já está transmitida.");
				}

				if (!$modelBloqueioPropostaTransmissao->insert(['id_proposta' => $idProposta])) {
					throw new Exception("Erro ao adicionar a proposta na lista de bloqueio de transmissão.");
				}
			} catch (\Throwable $th) {
				$return['status'] = false;
				$return['message'] = $th->getMessage();
				$this->getResponse()->setBody(Zend_Json::encode($return));
				return;
			}

			$return = array('status' => true, 'id_endosso' => '0', 'id_proposta' => $this->getRequest()->getParam('id'));
			$this->zeraPendenciaTransmissao($this->getRequest()->getParam('id'));

			$ItensSegurados = new Seguro_Model_ItensSegurados();
			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($this->getRequest()->getParam('id'))->current();
			$PropostaPropriedade = $Proposta->propriedade();

			$serviceGerarPdfProposta = new Seguro_Service_GerarPdfProposta();

			$pdfCotacao = $serviceGerarPdfProposta->executar($Proposta->id, true);

			//VERIFICA LISTA SUJA
			try {
				$esscrEventosPessoas = new Agro_Essor_EsscrEventos_Pessoas();
				$possuiRestricaoTecnica = $esscrEventosPessoas->possuiRestricaoTenica($Proposta->proponente('cpf_cnpj'));
			} catch (\Throwable $th) {
				$return['status'] = false;
				$return['message'] = $th->getMessage();
			}

			if ($return['status'] && $possuiRestricaoTecnica) {
				$return['status'] = false;
				$return['message'] = "Recusa por Restrição Cadastral.";
				$return['validacao_lista'] = true;
				$Propostas->changeStatusId($Proposta->id, Seguro_Model_Propostas::ID_STATUS_CANCELADA, $return['message']);
				
				$body = "Prezado Usuário,<br><br>";
				$body .= "A seguinte proposta foi Recusada por Restrição Cadastral: {$Proposta->id} <br><br>";
				$body .= "Acesse o sistema Agronet 2.0 através do endereço: <a href='http://agronet.agrobrasilseguros.com.br/'>http://agronet.agrobrasilseguros.com.br/</a>";
				$body .= "<br>ATENÇÃO: esta é uma mensagem automática. Por favor, não responda. Se deseja entrar em contato conosco, escreva para atendimento@agrobrasilseguros.com.br <br><br>";
	
				$email = new Agro_Mail();			 
				$email->addTo('luana.beck@agrobrasilseguros.com.br');
				$email->addCc('karina.silva@agrobrasilseguros.com.br');
				$email->addCc('tais.silveira@agrobrasilseguros.com.br');
				$email->addCc('diego.cecagno@agrobrasilseguros.com.br');
				$email->addCc('henrique.alves@agrobrasilseguros.com.br');
				$email->setSubject("Recusa por Restrição Cadastral");
				$email->setBody($body, 'html');
				$email->send();
			}
			
			/*
			 * VERIFICA SE A DATA DE SEMEADURA FOI INFORMADA PARA TODOS OS ITENS SEGURADOS.
			 * SOMENTE VALIDADO SE ESSA INFORMAÇAO FOR OBRIGATORIA PARA O PRODUTO
			 */
			if ($return['status']) {
				$atributos_is = $Proposta->atributos_rn('UNIDADE_SEGURADA', false, false);

				foreach ($atributos_is as $atributo_required){
					if($atributo_required['fl_required'] == true){
						$arRequired[$atributo_required['ds_chave_rn']] = true;
					}
				}

				$countIs = 0;
				if($arRequired['IS_DATA_SEMEADURA'] == true){
					$countIs = $ItensSegurados->getItemSeguradoSemDataSemeaduraByProposta($this->getRequest()->getParam('id'));

					if($countIs > 0){
						$return['message'] = "Verificar Itens Segurados sem Data de Semeadura informada.";
						$return['status'] = false;
					}
				}
			}

     		/*
			 * VERIFICACAO DOS DIAS DE VIGENCIA
			 */
			if ($return['status']) {
				if($Propostas->getVigenciaDays($this->getRequest()->getParam('id'))['total_days'] > 450) {
					$return['message'] = 'Período de Vigência ultrapassa o período de 450 dias. Favor entrar em contato com o Departamento de Atendimento da AgroBrasil para verificação e adequação do Orçamento de Seguro.';
					$return['status'] = false;
				}
			}

			/*
			 * VERIFICACAO TEMPORÁRIA DE CPF HABILITADO POR PRODUTO
			 */
			$ModelCPF = new Seguro_Model_ProdutosProponentesAutorizados();
	        $resultProduto = $ModelCPF->fetchAll("id_produto = ".$Proposta->id_produto);
	        if(count($resultProduto) > 0){
	    		$result = $ModelCPF->fetchAll("id_produto = ".$Proposta->id_produto." and cpf_cnpj='".$Proposta->proponente('cpf_cnpj')."'");
	    		if(!count($result)){
				    $return['message'] = "Este CPF/CNPJ não está habilitado para esta comercialização.";
				    $return['status'] = false;
	    		}
	        }

	        if ($return['status']) {
		        if(!Agro_Util::validarCpfCnpj($Proposta->proponente('cpf_cnpj'))){
		        	$return['message'] = "CPF/CNPJ do Proponente inválido.";
		        	$return['status'] = false;

		        }
	        }

	        /*
	         * VERIFICACAO SE EXISTE COMISSAO INFORMADA PARA O CORRETOR
	         */
	        if ($return['status']) {
		        if(!abs($Proposta->comissaoCorretor()) > 0){
	        		$return['message'] = "Comissão não especificada.";
	        		$return['status'] = false;
		        }
	        }

	        /*
	         * VALIDACAO DE TOTALIZADORES
	         */
	        if ($return['status']) {
		        if($Proposta->premio_liquido() != $Proposta->premio_liquido_parcelas()){
		        	$return['message'] = "A soma do Prêmio das Coberturas não confere com o Prêmio à Pagar. \nFavor entrar em contato com a AgroBrasil para verificação.";
		        	$return['status'] = false;
		        }
	        }

	        /*
	         * VERIFICA DUPLICIDADE DE CPF/COORDENADA POR CULTURA
	         */
	        $bloqueioCPfCoordenada = false;
			$VerificaCpfDuplicado = $Proposta->verifica_duplicidade_cpf();

			if(is_array($VerificaCpfDuplicado)){
				foreach($VerificaCpfDuplicado as $PropostaCoordenada) {
					//compara se a distância entre as coodenadas das propostas é maior que 3Km
					if(
						Agro_Util::recuperaDistancia($PropostaPropriedade['ds_coordenadas'], $PropostaCoordenada['ds_coordenadas']) < 3
						&& $PropostaPropriedade['id_municipio'] == $PropostaCoordenada['id_municipio']
					){
						$bloqueioCPfCoordenada = true;
					}
				}
			}

			/*
			* VERIFICA EXIBIÇÃO DE BOLETOS PARA QUEM ESTÁ EM RESTRIÇÃO TÉCNICA
			*/
			$User = Zend_Auth::getInstance()->getIdentity();
			if($Proposta->proponente()['fl_restricao'] && $User->id_empresa != 20) {
				$return['fl_exibir_boleto'] = false;
			} else {
				$return['fl_exibir_boleto'] = true;
			}

	        /*
	         * Verifica através do google maps se a coordenada confere com o município informado
	         */
	        if ($return['status']) {

		        if ($Proposta->fl_analise_transmissao <> '2') {

			        if ($Proposta->respostas('QUEST_AREA_DECLARADA')) {
			        	$Proposta->atualizaAnaliseTransmissao('Divisão propriedade: Detalhamento: '.$Proposta->respostas('QUEST_AREA_DECLARADA_PROP_COMPLEMENTAR'));
			        	$return['motivos'][] = "- Divisão propriedade. Detalhamento: ". $Proposta->respostas('QUEST_AREA_DECLARADA_PROP_COMPLEMENTAR');
			        	$return['status'] = false;
			        }

			        if ($bloqueioCPfCoordenada == true) {
			        	foreach ($VerificaCpfDuplicado as $c) {
			        		$str_c .= ','.$c['id'];
			        	}
			        	$Proposta->atualizaAnaliseTransmissao('Coordenada: '.$PropostaCoordenada['ds_coordenadas'].' dentro da área de bloqueio. Propostas: '.$Proposta->id.$str_c);
			        	$return['motivos'][] = "- Coordenada ".$PropostaCoordenada['ds_coordenadas']." dentro da área de bloqueio. Propostas: ".$Proposta->id.$str_c;
			        	$return['status'] = false;
			        }

			        $dado = $Proposta->verifica_duplicidade_coordenada();
			        if (count($dado) > 0) {
			        	foreach ($dado as $d) {
			        		$str_d .= ','.$d['id'];
			        	}
			        	$Proposta->atualizaAnaliseTransmissao('Coordenada duplicada. Propostas: '.$Proposta->id.$str_d);
			        	$return['motivos'][] = "- Coordenada duplicada. Propostas: $Proposta->id" . $str_d;
			        	$return['status'] = false;
			        }

			        if ( $return['status'] == false ) {
			        	$return['message'] = "ATENÇÃO:\n\nEste Orçamento não foi transmitido por restrições técnicas.\n\nMotivos:\n";
			        	foreach ($return['motivos'] as $motivo) {
			        		$return['message'] .= "\n\n$motivo";
			        	}
			        }
		        }
	        }
	        /*
	         * FIM VERIFICA DUPLICIDADE DE CPF/COORDENADA POR CULTURA
	        */

	        /*
	         * VALIDACAO DE CROQUI OBRIGATORIO CASO SEJA ESSA A ESPECIFICAÇÃO DO PRODUTO
	        */
	        if ($return['status']) {
				$PROD_CROQUI_OBRIGATORIO = $Proposta->atributos('PROPRIEDADE', 'PROD_CROQUI_OBRIGATORIO');
				$produto = $Proposta->produto();

				if ($PROD_CROQUI_OBRIGATORIO) {
					switch ($PROD_CROQUI_OBRIGATORIO) {
						case '3':
							break;
						case '2':
							if ($Proposta->unidades()) {
								foreach ($Proposta->unidades(false) as $unidade) {
									if (!$unidade['IS_COORDENADAS_GEOGRAFICAS'] && $Proposta->croquigeo(true) <= 0) {
										$return['message'] = 'É necessário informar o croqui georreferenciado para o orçamento.';
										$return['type'] = 'add';
										$return['status'] = false;
										$return['confirm'] = 'confirm';
									}
								}
							}
							break;
						case '1':
						default:
							$informarCroqui = false;

							if($produto["ds_nome_cultura"] == "Pastagem"){
								if ($Proposta->croquis(true) <= 0) {
									$informarCroqui = true;
								}
							} else {
								if ($Proposta->croquigeo(true) <= 0) {
									$informarCroqui = true;
								}
							}

							if($informarCroqui == true){
								$return['message'] = 'É necessário informar o croqui georreferenciado para o orçamento.';
								$return['type'] = 'add';
								$return['status'] = false;
								$return['confirm'] = 'confirm';
							}
							break;
					}
				}
			}

			/*
			* VALIDACAO DE CROQUI COM ITENS SEGURADOS
			*/
			if ($return['status'] && $Proposta->croquigeo(true) > 0) {
				$Croqui = $Proposta->croquigeo();

				if (!(new Seguro_Model_PropostasCroquisTalhoes())->verificaItemCroqui($Proposta->id, $Croqui['id'])) {
					
					$return['message'] = "ATENÇÃO\nÉ necessário vincular todos os itens/polígonos para salvar o croqui georreferenciado.";
					$return['type'] = '';
					$return['status'] = false;
					$return['confirm'] = 'confirm';

				}
			}

			/*
			 * VALIDACOES DE LIMITE DE CAPACIDADE
			 */
			if ($return['status']) {

			    $CoberturasValidacao = $Proposta->proposta_coberturas_validacao_capacidade();
			    $PropostaCorretor    = $Proposta->corretor();
			    $PropostaPreposto    = $Proposta->preposto();

			    if($PropostaPreposto['id_usuario']){
			        $id_usuario = $PropostaPreposto['id_usuario'];
			    } else {
			        $id_usuario = $PropostaCorretor['id_usuario'];
			    }


			    /*
			     * VERIFICA SE EXISTE ALGUMA VALIDAÇÃO QUE CONTEMPLE AS SEGUINTES CONDIÇOES, PARA CADA COBERTURA:
			     * 1 - cada cobertura deve possuir uma validação para o Estado/Corretor ou Preposto ou
			     * 2 - cada cobertura deve possuir uma validação para o Municipio/Corretor ou Preposto com a opção "Agrupar Municipios" ativada
			     * As validaçoes por municipio, com a opção "Agrupar Municipios" desabilitada, serão desonsideradas nessa verificação e utilizadas somente na hora de validar
			     */
                $ValidacoesLimiteCapacidades = $Proposta->getValidacaoLimiteCapacidade();
                $flValidacaoNaoEncontrada    = true;

			    foreach($CoberturasValidacao as $cobertura){
			        foreach ($ValidacoesLimiteCapacidades as $idValidacao => $Validacao) {

			        	if(
			        			(
			        				in_array($PropostaPropriedade['id_estado'], $Validacao['uf']) &&
			        				in_array($id_usuario, $Validacao['corretores']) &&
			        				in_array($cobertura['id_cobertura'], $Validacao['coberturas'])
			        			)

			        			||

			        			(
			        			    $Validacao['fl_agrupar_municipios'] == true &&
			        				in_array($PropostaPropriedade['id_municipio'], $Validacao['municipios']) &&
			        				in_array($id_usuario, $Validacao['corretores']) &&
			        				in_array($cobertura['id_cobertura'], $Validacao['coberturas'])
			        			)

			        	){
			        	    $flValidacaoNaoEncontrada = false;
			        	}
			        }
			    }

		        if($flValidacaoNaoEncontrada == true){

		        	$return['message'] = "Não há Validação de Capacidade configurada para este Produto/Cobertura (".$cobertura['id_cobertura'].").\nFavor entrar em contato com a AgroBrasil.";
		        	$return['status'] = false;

			    } else {

			        /*
		             * EXECUTA A VALIDACAO DE LIMITE DE CAPACIDADE PARA TODAS VALIDACOES QUE CONTEMPLEM
			         * ESTADO/COBERTURA/CORRETOR OU PREPOSTO ou
			         * MUNICIPIO/COBERTURA/CORRETOR OU PREPOSTO
			        */
			        foreach($CoberturasValidacao as $cobertura){

	        	        foreach ($ValidacoesLimiteCapacidades as $idValidacao => $Validacao) {

	        	            if(
	        	                    (
	        	                        in_array($PropostaPropriedade['id_estado'], $Validacao['uf']) &&
	        	                        in_array($id_usuario, $Validacao['corretores']) &&
	        	                        in_array($cobertura['id_cobertura'], $Validacao['coberturas'])
	        	                    )
	        	                    ||
	        	                    (
	        	                        in_array($PropostaPropriedade['id_municipio'], $Validacao['municipios']) &&
	        	                    	in_array($id_usuario, $Validacao['corretores']) &&
	        	                    	in_array($cobertura['id_cobertura'], $Validacao['coberturas'])
	        	                    )

	        	              ){
	        	                $limiteCapacidade = $Validacao['vl_limite_capacidade'];

	        	                if (!empty($Validacao['vl_reserva_tecnica'])) {
                                    $limiteCapacidade -= $Validacao['vl_reserva_tecnica'];
                                }

                                if (in_array($cobertura['id_cobertura'], $Validacao['coberturas']) and $Proposta->verificaCorretor($Validacao['corretores']) and count($Validacao['municipios']) == 0) {
                                    $Utilizado = $Proposta->getValorUsadoLimiteCapacidade($idValidacao, $Validacao['coberturas'], false, false, $Validacao['fl_limite_corretor']);
                                    $Utilizado = ($Utilizado ? $Utilizado : 0);
                                    if (($Utilizado + $Proposta->lmga()) > $limiteCapacidade) {
                                        $return['message'] = "Limite da Capacidade atingido (2). Validação Id = '{$Validacao['id']}'";
                                        $return['status'] = false;
                                    }
                                }

                                if ($Proposta->verificaCorretor($Validacao['corretores']) && $Proposta->verificaMunicipio($Validacao['municipios']) && in_array($cobertura['id_cobertura'], $Validacao['coberturas'])) {
                                    $Utilizado = $Proposta->getValorUsadoLimiteCapacidade($idValidacao, $Validacao['coberturas'], true, $Validacao['fl_agrupar_municipios'], $Validacao['fl_limite_corretor']);
                                    $Utilizado = ($Utilizado ? $Utilizado : 0);

                                    if (($Utilizado + $Proposta->lmga()) > $limiteCapacidade) {
                                        $return['message'] = "Limite da Capacidade atingido (3). Validação Id = '{$Validacao['id']}'";
                                        $return['status'] = false;
                                    }
                                }
	    	                }
	    	            }
	    	        }
		        }
			}
			/*
			 * FIM: VALIDACOES DE LIMITE DE CAPACIDADE
			*/

			// VALIDA O LIMITE DE LMGA POR PROPOSTA
			if ($return['status']) {
	    		$PROD_LIMITE_LMGA_PROPOSTA = $Proposta->atributos('PROPRIEDADE', 'PROD_LIMITE_LMGA_PROPOSTA');
	    		if($Proposta->lmga() > $PROD_LIMITE_LMGA_PROPOSTA){
	    			$return['message'] = "Limite de LMGA por proposta atingido.";
	    			$return['status'] = false;
	    		}
			}

			// VALIDACAO DOS LIMITES DE SUBVENCAO
			if ($return['status']) {
				if ($Proposta->respostas('QUEST_SUBVENCAO_FEDERAL') == '1') {
					unset($msg_erro_subvencao);

					//EXECUTA VALIDACAO DE LIMITES DE SUBVENCAO POR CULTURA/CORRETOR
					$subvencao = $Proposta->subvencaoCultura();
					if (($subvencao['usado'] + $Proposta->subvencao_federal()) > $subvencao['liberado']) {
						$msg_erro_subvencao = 'O Valor da Subvenção Federal atingiu o limite liberado para esta Cultura / Corretor.';
					}

					//EXECUTA VALIDACAO DE LIMITES DE SUBVENCAO POR CULTURA/GRUPO DE CORRETORES
					$subvencao = $Proposta->subvencaoCulturaGrupoCorretores();
					//print_r($subvencao);
					if($subvencao['liberado'] != ''){
	    				if (($subvencao['usado'] + $Proposta->subvencao_federal()) > $subvencao['liberado']) {
							$msg_erro_subvencao = 'O Valor da Subvenção Federal atingiu o limite liberado para esta Cultura / Grupo de Corretores.';
	    				} else {
							unset($msg_erro_subvencao);
						}
					}

					if($msg_erro_subvencao){
						$return['message'] = $msg_erro_subvencao;
						$return['status'] = false;
					}
				}
			}

            /**
             * Valida se o vencimento da última parcela é inferior a data final de vigência
             */
            if ($return['status']) {
			    $ultimaParcela = end($Proposta->parcelamento());

			    $dataFinalVigencia = Agro_Util::formatDate($Proposta['dt_vigencia_fim']);
			    $dataVencimentoUltimaParcela = Agro_Util::formatDate($ultimaParcela['dt_vencimento']);

			    if (Agro_Util::validaDataInicioFim($dataFinalVigencia, $dataVencimentoUltimaParcela)) {
                    $return['message'] = "A Data de vencimento da(s) parcela(s) deve(m) estar dentro do período de";
                    $return['message'] .= " vigência do seguro. Favor entrar em contato com o Depto. de Atendimento da AgroBrasil para verificação.";
                    $return['status'] = false;
                }
            }

            // VALIDAÇÃO DOS DADOS BANCÁRIOS
            if ($return['status']) {
                $rowInformacoesBancarias = (new Sistema_Model_InformacoesBancarias())->getInformacoesBancariasByProposta($this->getRequest()->getParam('id'));

                if (empty($rowInformacoesBancarias)) {
                    $return['message'] = "É necessário preencher as Informações bancárias no local indicado.";
                    $return['message'] .= "\n\nDeseja inserir?";
                    $return['type'] = 'add';
                    $return['status'] = false;
                    $return['confirm'] = 'confirm';
                    $return['modal'] = 'dados_bancarios';
                }
            }

			if ($return['status']) {

				Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

			    /*
			     * SE FOR PROPOSTA DA ESSOR SEGURADORA, FAZ A TRANSMISSÃO DOS DADOS
			     * VIA WEBSERVICE PARA LIBERAÇÃO DA GERAÇÃO DE BOLETOS
			     */
			    $Produto = $Proposta->produto();
			    if($Produto['ds_nome_fantasia'] == 'ESSOR SEGUROS'){

	        		if (APPLICATION_ENV != 'production') {
	        		    $client = new nusoap_client(WSDL_DEV, true, false, false, false, false, 3600, 3600);
	        	    } else {
	        	        $client = new nusoap_client(WSDL_PROD, true, false, false, false, false, 3600, 3600);
	        	    }

	                $Transmissao = new Seguro_Model_TransmissaoEssor();

	                $xml = $Transmissao->montaXMLTransmissaoEssor($this->getRequest()->getParam('id'));
	                $mysoapmsg = $client->serializeEnvelope($xml);

	                Agro_Util::geraSalvaXml($this->getRequest()->getParam('id').".xml", $mysoapmsg);

	                $params     = array('Servico' => 'EMITIR_PROPOSTA', 'conteudoXML' => $mysoapmsg);

					$dtEnvio = date('Y-m-d H:i:s');
	                $result     = $client->call('ExecutarRow', array($params));
					$dtRetorno = date('Y-m-d H:i:s');

	                if ($client->getError()) {
	                    $return['status'] = false;
	                    $return['message'] = "Erro: Transmissão Seguradora. (conexão)";

	                    $Propostas->gravaLogTransmissao(
	                            array(
	                                    'id_proposta'        => $this->getRequest()->getParam('id'),
	                                    'ds_retorno'         => utf8_encode($client->getError()),
	                                    'fl_sucesso'         => 'f',
	                                    'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
	                                    'ds_xml_transmissao' => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno
	                            )
	                    );

	                    Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

	                } else {
	                    $result_xml = simplexml_load_string(utf8_encode($result['ExecutarRowResult']), 'SimpleXMLElement', LIBXML_NOCDATA);

	                    if($result_xml->cd_retorno > 0){
	                        $return['status'] = false;
	                        $return['message'] = "Erro: Transmissão Seguradora (1).";

	                        $Propostas->gravaLogTransmissao(
	                                array(
	                                        'id_proposta'        => $this->getRequest()->getParam('id'),
	                                        'ds_retorno'         => $result_xml->nm_retorno,
	                                        'fl_sucesso'         => 'f',
	                                        'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
	                                        'ds_xml_transmissao' => $mysoapmsg,
											'dt_envio'           => $dtEnvio,
											'dt_retorno'         => $dtRetorno	
	                                )
	                        );

	                        Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

	                    } else {
	                        if($result_xml->id_endosso){
	                            $Propostas->update(array("ds_identificador_seguradora" => $result_xml->id_endosso), "id = ".$this->getRequest()->getParam('id'));

	                            $Proposta = $Propostas->find($this->getRequest()->getParam('id'))->current();
	                            $return = array_merge($return, array('id_endosso' => $Proposta->ds_identificador_seguradora));

	                            $PropostaFisico = new Atendimento_Model_PropostaDocumentoFisico();
	                            $PropostaDigitalizado = new Seguro_Model_PropostaStatusDocumentoDigitalizado();

	                            $dtTransmissao = date('Y-m-d H:i:s');
	                            $dtTransmissaoData = date('d/m/Y');
	                            $dtTransmissaoHora = date('H:i');

                                if ($Proposta->id == $Proposta->id_proposta_mae) {
                                    $dataInicioVigencia = (new Seguro_Service_Proposta())
                                        ->maiorDataEntreVigenciaInicioTransmissao(
                                            substr($Proposta->dt_vigencia_inicio, 0, 10)
                                        );
                                }

	                            $data = array(
                                    'dt_transmissao' => $dtTransmissao,
                                    'dt_vigencia_inicio' => $dataInicioVigencia
                                );

	                            if ($Propostas->update($data, "id = ".$this->getRequest()->getParam('id'))) {
	                                $dadosStatus = ['id_proposta' => $this->getRequest()->getParam('id')];

	                                $observacao = "PROTOCOLO DE RECEBIMENTO PELA ESSOR DA SEGUINTE PROPOSTA DE SEGUROS:<br>";
                                    $observacao .= "- Nome do proponente: {$Proposta->proponente('ds_nome_proponente')}<br>";
                                    $observacao .= "- Número da proposta: {$Proposta->doc()} ({$this->getRequest()->getParam('id')})<br>";
                                    $observacao .= "- Data do recebimento: {$dtTransmissaoData}<br>";
                                    $observacao .= "- Hora do recebimento: {$dtTransmissaoHora}";

									if (!empty($this->getRequest()->getParam('id_usuario'))) {
										$dadosStatus['id_usuario'] = $this->getRequest()->getParam('id_usuario');
									}

	                            	if ($Propostas->changeStatus($dadosStatus, 'ENVIADA_AGUARDANDO_CONF')) {

	                            		$PropostaFisico->changeStatus(array('id_proposta' => $this->getRequest()->getParam('id')), 'DOC_PENDENTE_ENVIO');
	                            		$PropostaDigitalizado->atualizarStatus($this->getRequest()->getParam('id'), Seguro_Model_PropostaStatusDocumentoDigitalizado::STATUS['DOC_PENDENTE_ENVIO']);
	                            		$Propostas->gera_versao($this->getRequest()->getParam('id'), 'f', '', $result_xml->id_endosso);
	                            		$Propostas->gravaConsultaCadin($this->getRequest()->getParam('id'));

										$mensagem = 'Proposta transmitida com sucesso.';
										if ($Produto["ds_nome_cultura"] == "Pastagem") {
											try {
												$AgriTaskCotacao = new Agro_AgritaskCotacao();
												$AgriTaskCotacao->atualizarFranquiaSelecionada($this->getRequest()->getParam('id'));
											} catch (\Throwable $th) {
												$mensagem = "Proposta transmitida com sucesso porém não foi possível atualizar a franquia na Agritask.";
												$Propostas->gravaLogTransmissao(
													array(
															'id_proposta' => $this->getRequest()->getParam('id'),
															'ds_retorno' => $th->getMessage(),
															'fl_sucesso' => 'f',
															'ds_tipo_transmissao' => 'AGRITASK_ATUALIZAR_FRANQUIA',
															'dt_envio'           => $dtEnvio,
															'dt_retorno'         => $dtRetorno					
													)
												);
											}
										}

                                        $observacao = str_replace("<br>", "\n", $observacao);
                                        $mensagem .= "\n\n{$observacao}";

	                            		$Propostas->gravaLogTransmissao(
											array(
													'id_proposta'        => $this->getRequest()->getParam('id'),
													'ds_retorno'         => $result_xml->id_endosso,
													'fl_sucesso'         => 't',
													'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
													'ds_xml_transmissao' => $mysoapmsg,
													'dt_envio'           => $dtEnvio,
													'dt_retorno'         => $dtRetorno			
											)
										);

										//Ativa os emails da proposta
										$propostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
										$propostasEmailAssinaturaDocumento->ativarProposta($this->getRequest()->getParam('id'));

										//Adiciona para lista de envio para a docusign
										$propostasTipoAssinaturaDocumento = new Seguro_Model_PropostasTipoAssinaturaDocumento();
										$tipoAssinaturaDocumento = $propostasTipoAssinaturaDocumento->getByProposta($this->getRequest()->getParam('id'));
										$tiposValidos = [Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL, Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS];
										if (count($tipoAssinaturaDocumento) > 0 && in_array($tipoAssinaturaDocumento[0]['tipo_assinatura'], $tiposValidos)) {

											$PropostasDocusign = new Seguro_Model_PropostasDocusign();
											$PropostasDocusign->adicionarFila($this->getRequest()->getParam('id'), Seguro_Model_PropostasDocusign::TIPO_PROPOSTA);
											$return['adicionado_fila_docusign'] = true;
										}

	                            		$return['message'] = $mensagem;
	                            		$return['status'] = true;

										$pdfProposta = $serviceGerarPdfProposta->executar($Proposta->id, true);

										// ENVIAR PDFS DE PROPOSTA E COTAÇÃO PARA RABBITMQ
										try {
											$serviceEnviarFormularioFila = new Seguro_Service_EnviarFormularioFilaEcmPlugEssor();
										
											$dtoCotacao = new Seguro_Dto_FormularioFilaEcmPlugEssor(
												$Proposta->id, Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_COTACAO, base64_encode($pdfCotacao)
											);
											$dtoProposta = new Seguro_Dto_FormularioFilaEcmPlugEssor(
												$Proposta->id, Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_PROPOSTA, base64_encode($pdfProposta)
											);

											$serviceEnviarFormularioFila->executar([$dtoCotacao, $dtoProposta]);
										} catch (Throwable $e) { }
										
	                            		Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
	                            	} else {
	                            		$return['message'] = 'Não foi possível transmitir a proposta.';
	                            		$return['status'] = false;
	                            		Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
	                            	}
	                            } else {
	                            	$return['message'] = 'Não foi possível transmitir a proposta.';
	                            	$return['status'] = false;
	                            	Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
	                            }

	                        } else {
	                            $return['status'] = false;
	                            $return['message'] = 'Erro: Falha de recepção na Seguradora.';
															$nm_retorno = empty($result_xml->error->attributes()->nm_retorno) ? $result_xml->nm_retorno->__toString() : $result_xml->erro->attributes()->nm_retorno;

	                            $Propostas->gravaLogTransmissao(
	                                    array(
	                                            'id_proposta'        => $this->getRequest()->getParam('id'),
	                                            'ds_retorno'         => $nm_retorno,
	                                            'fl_sucesso'         => 'f',
	                                            'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
	                                            'ds_xml_transmissao' => $mysoapmsg,
												'dt_envio'           => $dtEnvio,
												'dt_retorno'         => $dtRetorno		
	                                    )
	                            );

	                            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
	                        }
	                    }
	                }
			    }
			    /*
			     * FIM BLOCO ESSOR
			     */
			}

			// remove proposta da lista de bloqueio após todo processamento
            if (!$modelBloqueioPropostaTransmissao->delete($idProposta, 'id_proposta')) {
				
				$return['message'] .= "\n\nHouve um erro ao excluir o bloqueio de transmissão desta proposta.";
				$return['status'] = false;
			}

		} else {
			$return['message'] = "Prezado Corretor.\n\n Por motivo de segurança, não é permitido editar Orçamentos simultaneamente.\n Favor fechar esta janela e retornar a operação.";
			$return['status'] = false;
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function changestatusAction() {
		$this->getHelper('ViewRenderer')->setNoRender();

		$return = array('status' => false);
		if ($this->getRequest()->getParam('id')) {
			$Propostas = new Seguro_Model_Propostas();

			if ($this->getRequest()->getParam('status')) {
				if ($Propostas->changeStatus(array('id_proposta' => $this->getRequest()->getParam('id')), $this->getRequest()->getParam('status'))) {
					$return['status'] = true;
				} else {
					$return['status'] = false;
				}
			}
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function getBeneficiarios() {
		$Proposta = new Zend_Session_Namespace('proposta');
		return $Proposta->premio['beneficiarios'];
	}

	/**
	 * Busca o CEP da Propriedade, validando
	 * com as habilitacoes do corretor/preposto
	 */
	public function ceppropriedadeAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $request = $this->getRequest()->getParams();

        $result = array();

        try {	
           $result = $this->buscaCep($request, false);
        } catch (Exception $erro) {
			try {
				$result = $this->buscaCep($request, true);
			} catch (Exception $e) {
				$result['status'] = false;
            	$result['message'] = $e->getMessage();
			}
        }

        $this->getResponse()->setBody(Zend_Json::encode($result));
    }

	private function verificaPermiteOrcamento(Seguro_Model_Row_Proposta $proposta, int $idMunicipio, array $params): bool
	{
		$Atributos = new Produto_Model_Atributogrupos();
		$idProponente = null;

		if (!empty($params['cpf_cnpj'])) {
			$modelProponentes = new Seguro_Model_Proponentes();
			$proponente = $modelProponentes->getProponente($params['cpf_cnpj']);

			if (!empty($proponente)) {
				$idProponente = $proponente['id']; 
			}
		}

		$parametrosAdicionais = ['id_municipio' => $idMunicipio, 'id_proponente' => $idProponente];
		$atributosProposta = $Atributos->getAtributosProposta($proposta, Produto_Model_AtributosModulos::DS_CHAVE_PROPRIEDADE, '', $parametrosAdicionais);

		$att = [];
		foreach ($atributosProposta as $atributo) {
			$att[$atributo['grupo_padrao']][$atributo['ds_chave_rn']] = $atributo['ds_valor'];
		}

		$dsChaveRn = empty($params['id_proposta_renovada']) ? 'PROD_PERMITE_NOVO_ORCAMENTO' : 'PROD_PERMITE_RENOVACAO';
		
		//Se houver um grupo diferente do padrão pega o atributo dele, senão pega o do grupo padrao
		$permiteOrcamento = !empty($att[0]) ? $att[0][$dsChaveRn] :  $att[1][$dsChaveRn];
		
		if ($permiteOrcamento == '2' || $permiteOrcamento == '4') {
			return false;
		}

		return true;
	}

	private function verificaComercializacao($produto, $estado, $municipio, $cpf_cnpj, $idUsuarioProposta) {
		$Comercializacao = new Comercializacao_Model_Comercializacoes();
		return $Comercializacao->checkComercializacao($produto, $estado, $municipio, $cpf_cnpj, $idUsuarioProposta);
	}

	private function verificaTaxa($produto, $estado, $municipio) {
		$Taxas = new Comercializacao_Model_TaxasAgrupamentos();
		return $Taxas->checkGrupoTaxas($produto, $estado, $municipio);
	}

	public function verificapropostaAction() {
		//$Proposta = new Zend_Session_Namespace('PROPOSTA');
		$this->getHelper('ViewRenderer')->setNoRender();
		$return = array('status' => true);

		$Model = new Seguro_Model_Propostas();
		$Proposta = $Model->find($this->getRequest()->getParam('id_proposta'))->current();

		if (!$Proposta->id) {
			$return = array(
				'message' => 'Não existe uma proposta definida.',
				'status' => false
			);
		}

		if (!$Proposta->id_produto) {
			$return = array(
				'message' => 'Não existe um produto definido.',
				'status' => false
			);
		}

		if (!$this->getRequest()->getParam('parcelamento')) {
			$return = array(
				'message' => 'Não existe um parcelamento definido.',
				'status' => false
			);
		}

		if (!count($Proposta->unidades())) {
			$return = array(
				'message' => 'Unidades Seguradas estão incompletas.',
				'status' => false
			);
		}

		// Se foi selecionada cobertura cevada
		if ($this->getRequest()->getParam('cob_cevada')) {
			$PropostasCooperativas = new Seguro_Model_PropostasCooperativas();
			if(count($PropostasCooperativas->getByIdProposta($this->getRequest()->getParam('id_proposta'))->toArray()) <= 0) {
				$return = array(
					'message' => 'Devido a cobertura de Cevada selecionada, é necessário informar um local de entrega.',
					'status' => false
				);
			}
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Verifica a classe da proposta
	 *
	 * @author Renato - 19/08/2010
	 */
	public function verificaclasseAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$return = array();

		if ($this->getRequest()->getParam('id_proposta')) {
			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
			$return['classe'] = $Proposta->ds_classe;

			// Se for uma proposta nova
			if (!$Proposta->id_proposta_renovada) {
				if ($Proposta->checkStatusHistorico('AGUARDANDO_ANALISE_TECNICA')) {
					$return['classe'] = $Proposta->ds_classe;
				} else {
					$return['classe'] = 'E';
				}
			}
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Altera o Status da proposta
	 *
	 * @author Renato - 20/08/2010
	 */
	public function setstatusAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$return = array('classe' => 'E');

		if ($this->getRequest()->getParam('id_proposta')) {
			$Propostas = new Seguro_Model_Propostas();
			$Propostas->changeStatus($this->getRequest()->getParams(), $this->getRequest()->getParam('status'));

			switch ($this->getRequest()->getParam('status')) {
				default:
					$return['href'] = '/seguro/proposta';
					break;
			}
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Monta o form de Digitalizacao
	 *
	 * @author Renato - 12/05/2011
	 */
	public function digitalizacaoAction() {
		$Propostas = new Seguro_Model_Propostas();
		$this->view->proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();

		$Versoes =  new Seguro_Model_PropostasVersoes();
		$versao = $Versoes->getVersao($this->view->proposta);
		$this->view->id_proposta = $this->view->proposta;
		$this->view->form = true;

		if ($this->getRequest()->isPost()) {
			$this->view->form = false;

			foreach ($_FILES as $file) {
				$path = APPLICATION_PATH . "/upload_files/proposta/digitalizacao/";
				$arquivo = $path.$versao->ds_nome_arquivo;
				$federal = $path.$versao->ds_nome_arquivo_subvencao_federal;
				$estadual = $path.$versao->ds_nome_arquivo_subvencao_estadual;

				// Verifica se existe o arquivo antigo e deleta
				if (file_exists($arquivo)) {
					unset($arquivo);
				}

				// Verifica se existe o arquivo antigo e deleta
				if (file_exists($federal)) {
					unset($federal);
				}

				// Verifica se existe o arquivo antigo e deleta
				if (file_exists($estadual)) {
					unset($estadual);
				}

				try {
					if (!$_FILES['ds_nome_arquivo']['error']) {
						$versao->ds_nome_arquivo = "PROPOSTA_" . $this->view->proposta->id . "_" . $this->view->proposta->versao() .".".Agro_Util::getExtension($file['name']);

						if (!copy($_FILES['ds_nome_arquivo']['tmp_name'], $path.$versao->ds_nome_arquivo)) {
							$this->view->execute = "alert('Não foi possível salvar o arquivo da digitalização.')";
						}
					}

					if ($_FILES['ds_nome_arquivo_subvencao_federal'] && !$_FILES['ds_nome_arquivo_subvencao_federal']['error']) {
						$versao->ds_nome_arquivo_subvencao_federal = "PROPOSTA_" . $this->view->proposta->id . "_" . $this->view->proposta->versao() ."_FEDERAL.".Agro_Util::getExtension($file['name']);

						if (!copy($_FILES['ds_nome_arquivo_subvencao_federal']['tmp_name'], $path.$versao->ds_nome_arquivo_subvencao_federal)) {
							$this->view->execute = "alert('Não foi possível salvar o arquivo da digitalização da subvenção federal.')";
						}
					}

					if ($_FILES['ds_nome_arquivo_subvencao_estadual'] && !$_FILES['ds_nome_arquivo_subvencao_estadual']['error']) {
						$versao->ds_nome_arquivo_subvencao_estadual = "PROPOSTA_" . $this->view->proposta->id . "_" . $this->view->proposta->versao() ."_ESTADUAL.".Agro_Util::getExtension($file['name']);

						if (!copy($_FILES['ds_nome_arquivo_subvencao_estadual']['tmp_name'], $path.$versao->ds_nome_arquivo_subvencao_estadual)) {
							$this->view->execute = "alert('Não foi possível salvar o arquivo da digitalização da subvenção estadual.')";
						}
					}

					if ($versao->save()) {
						$this->view->execute = "$('#frmFilter').submit();$('#arquivos').load('/seguro/propostaajax/arquivosdigitalizados/id_proposta/{$this->view->proposta->id}')";
					} else {
						$this->view->execute = "alert('Não foi possível salvar os  dados.')";
					}
				} catch (Exception $e) {
					$this->view->execute = "alert('Ocorreu um erro inesperado ao enviar os arquivos.')";
				}
			}
		}

		$this->view->versao = $Versoes->getVersao($this->view->proposta);
	}

	/**
	 * Monta os arquivos digitalizados
	 *
	 * @author Renato - 07/06/2011
	 */
	public function arquivosdigitalizadosAction() {
		$Propostas = new Seguro_Model_Propostas();
		$this->view->proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();

		$Versoes =  new Seguro_Model_PropostasVersoes();
		$this->view->versao = $Versoes->getVersao($this->view->proposta);
	}

	public function deletedigitalizacaoAction(){
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$Propostas = new Seguro_Model_Propostas();
		$proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();

		$Versoes =  new Seguro_Model_PropostasVersoes();
		$versao = $Versoes->getVersao($proposta);

		if($Versoes->deleteDigitalizacao($this->getRequest()->getParam('id'), $this->getRequest()->getParam('tipo'))){

			$path = APPLICATION_PATH . "/upload_files/proposta/digitalizacao/";
			$arquivo = $path.$versao->ds_nome_arquivo;
			$federal = $path.$versao->ds_nome_arquivo_subvencao_federal;
			$estadual = $path.$versao->ds_nome_arquivo_subvencao_estadual;

			switch ($this->getRequest()->getParam('tipo')){
				case 'N':
					$file = $arquivo;
					break;
				case 'F':
					$file = $federal;
					break;
				case 'E':
					$file = $estadual;
					break;
			}

			try {
				$sanitizedPath = realpath($file);

				if (file_exists($sanitizedPath)) {
					unlink($sanitizedPath);
				}
				
				$this->getResponse()->setBody(Zend_Json::encode("Arquivo removido com sucesso!"));
			} catch (Exception $e){
				die($e);
			}
		}
	}


	public function formsociosAction(){
		$this->isAjax(true);

		$Model = new Seguro_Model_PropostasProponentesSocios();
		$socio = $Model->getSocio($this->getRequest()->getParam('id'));

		$this->view->id = $socio['id'];
		$this->view->ds_nome_socio = $socio['ds_nome_socio'];
		$this->view->cpf_cnpj = $socio['cpf_cnpj'];
		$this->view->tp_pessoa = $socio['tp_pessoa'];
		$this->view->id_parent = $socio['id_parent'];
		$this->view->cnpj_segurado = $socio['cnpj_segurado'];

	}

	public function sociosAction(){
		$this->isAjax(true);

		if($this->getRequest()->getParam('id_parent')){
			$this->view->id_parent = $this->getRequest()->getParam('id_parent');
		}

		$this->view->cnpj_segurado = $this->getRequest()->getParam('cnpj_segurado');
	}

	public function getsociosAction(){
		$this->isAjax();

		$Model = new Seguro_Model_PropostasProponentesSocios();
		$socios = $Model->getSociosByCnpjSegurado($this->getRequest()->getParam('cnpj'),$this->getRequest()->getParam('id_parent'));
		foreach($socios as $key => $value){
			$dados[$key] = $value;
		}
		$this->getResponse()->setBody(Zend_Json::encode($dados));

	}


	public function savesocioAction(){
		$this->isAjax();
		$Model = new Seguro_Model_PropostasProponentesSocios();

		$dados = array();

		$dados['cnpj_segurado'] = $this->getRequest()->getParam('cnpj_segurado');
		$dados['id_parent'] = $this->getRequest()->getParam('id_parent');

		if ($Model->save($this->getRequest()->getParams())) {
			$return = array();
			$return['cnpj_segurado'] = $dados['cnpj_segurado'];
			$return['id_parent'] = $dados['id_parent'];
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));

	}

	public function removesocioAction(){
		$this->isAjax();
		$Model = new Seguro_Model_PropostasProponentesSocios();

		if($Model->removeSocio($this->getRequest()->getParam('id'))){
			$return = true;
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function produtocpfautorizadoAction() {
		$this->getHelper('ViewRenderer')->setNoRender();

		//$Session     = new Zend_Session_Namespace('PROPOSTA');
		$Model       = new Seguro_Model_ProdutosProponentesAutorizados();
		$Propostas   = new Seguro_Model_Propostas();
		$Proponentes = new Seguro_Model_Proponentes();

        /*
         * Verifica se o CPF está autorizado para venda naquele produto
         */
		$resultProduto = $Model->fetchAll("id_produto = ".$this->getRequest()->getParam('id_produto'));
        if(count($resultProduto) > 0){
    		$result = $Model->fetchAll("id_produto = ".$this->getRequest()->getParam('id_produto')." and cpf_cnpj='".$this->getRequest()->getParam('cpf_cnpj')."'");
    		if(count($result) == 0 || count($result) == ''){
    			$result['message'] = 'Este CPF/CNPJ não está habilitado para esta comercialização.';
    			$result['status'] = 0;
    		}

        } else if(!empty($this->getRequest()->getParam('id_proposta'))) {
        	/*
        	 * Se o produto não permitir novo orçamento para Inadimplentes, bloqueia quando for o caso
        	*/
        	$Proposta     = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
        	$propriedades = $Proposta->propriedades();
        	if($propriedades['PROD_PERMITE_NOVO_ORCAMENTO'] == 3 && $Proponentes->inadimplente($this->getRequest()->getParam('cpf_cnpj'))){
        		$result['message'] = 'Solicitamos que entre em contato pois será necessária a regularização de parcelas pendentes de pagamento.';
        		$result['status'] = 0;
        	} else {
        		$result['status'] = 1;
        	}
        } else {
            $result['status'] = 1;
        }

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	/**
     * Altera o corretor da proposta
     *
     * @author Renato - 09/08/2010
     */
    public function alterarcorretorAction() {
        $result = array('status' => false);
        $this->isAjax();

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

            if ($this->getRequest()->isPost()) {

                $Corretores = new Atendimento_Model_Proposta_Corretores();

                if ($Corretores->save($this->getRequest()->getParam('id_proposta'), $this->getRequest()->getParam('id_usuario_corretor'), $this->getRequest()->getParam('vl_comissao'), $this->getRequest()->getParam('id_usuario_preposto'))) {
                    $result['execute'] = 'history.go(0)';
                    $result['message'] = MSG_SUCCESS;
                    $result['status'] = true;
                } else {
                    $result['message'] = MSG_ERROR;
                }
            }

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (Exception $e) {
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
            $result['message'] = $e->getMessage();
        }

        $this->getResponse()->setBody(Zend_Json::encode($result));
    }

    /**
     * Altera o produto da proposta
     *
     * @author Marcelo - 01/03/2019
     */
    public function alterarprodutoAction() {
        $result = array('status' => false);
        $this->isAjax();

        try {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

            if ($this->getRequest()->isPost()) {

                $Propostas = new Atendimento_Model_Proposta();

                if ($Propostas->changeProdutoId($this->getRequest()->getParam('id_proposta'), $this->getRequest()->getParam('id_produto'))) {
                    $result['execute'] = 'history.go(0)';
                    $result['message'] = MSG_SUCCESS;
                    $result['status'] = true;
                } else {
                    $result['message'] = MSG_ERROR;
                }
            }

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (Exception $e) {
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
            $result['message'] = $e->getMessage();
        }

        $this->getResponse()->setBody(Zend_Json::encode($result));
	}

	//ESSE METODO SO PODE SER USADO VIA SCRIPT CURL
	//ELE NAO FAZ NENHUAM VERIFICACAO
	//UTILIZADO PARA RETRANSMITIR PROPOSTAS QUE JÁ FORAM TRANSMITIDAS E
	//JA PASSARAM POR TODAS VALIDAÇÕES
	public function transmissaoroboAction() {
		ini_set('max_execution_time', 360);
		$this->isAjax();
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$return = array('status' => true, 'id_endosso' => '0', 'id_proposta' => $this->getRequest()->getParam('id'));
		$this->zeraPendenciaTransmissao($this->getRequest()->getParam('id'));

		$Propostas = new Seguro_Model_Propostas();
		$Proposta = $Propostas->find($this->getRequest()->getParam('id'))->current();
		$Propostas->update(array('dt_vigencia_inicio' => date('Y-m-d')), "id = ".$this->getRequest()->getParam('id'));
		$return['status'] = true;

		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		/*
		* SE FOR PROPOSTA DA ESSOR SEGURADORA, FAZ A TRANSMISSÃO DOS DADOS
		* VIA WEBSERVICE PARA LIBERAÇÃO DA GERAÇÃO DE BOLETOS
		*/
		$Produto = $Proposta->produto();
		$Model = new Seguro_Model_PropostasParcelas();

		$Rs = $Model->fetchAll("id_proposta = ".$this->getRequest()->getParam('id')." and nr_parcela = 1");

		if ($Rs->count()) {
			foreach($Rs as $Row) {
				if ($Row->dt_vencimento < date('Y-m-d')) {
					$Row->dt_vencimento = date('Y-m-d');
					$Row->save();
				}
			}
		}

		if (APPLICATION_ENV != 'production') {
			$client = new nusoap_client(WSDL_DEV, true, false, false, false, false, 3600, 3600);
		} else {
			$client = new nusoap_client(WSDL_PROD, true, false, false, false, false, 3600, 3600);
		}

		$Transmissao = new Seguro_Model_TransmissaoEssor();

		$xml = $Transmissao->montaXMLTransmissaoEssor($this->getRequest()->getParam('id'));
		$mysoapmsg = $client->serializeEnvelope($xml);

		Agro_Util::geraSalvaXml($this->getRequest()->getParam('id').".xml", $mysoapmsg);

		$params     = array('Servico' => 'EMITIR_PROPOSTA', 'conteudoXML' => $mysoapmsg);

		$dtEnvio = date('Y-m-d H:i:s');
		$result     = $client->call('ExecutarRow', array($params));
		$dtRetorno = date('Y-m-d H:i:s');

		if ($client->getError()) {
			$return['status'] = false;
			$return['message'] = "Erro: Transmissão Seguradora. (conexão)";

			$Propostas->gravaLogTransmissao(
					array(
							'id_proposta'        => $this->getRequest()->getParam('id'),
							'ds_retorno'         => utf8_encode($client->getError()),
							'fl_sucesso'         => 'f',
							'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
							'ds_xml_transmissao' => $mysoapmsg,
							'dt_envio'           => $dtEnvio,
							'dt_retorno'         => $dtRetorno
					)
			);

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

		} else {
			$result_xml = simplexml_load_string(utf8_encode($result['ExecutarRowResult']), 'SimpleXMLElement', LIBXML_NOCDATA);
			if($result_xml->erro){
				$return['status'] = false;
				$return['message'] = "Erro: Transmissão Seguradora (1).";

				$Propostas->gravaLogTransmissao(
						array(
								'id_proposta'        => $this->getRequest()->getParam('id'),
								'ds_retorno'         => $result_xml->erro->attributes()->nm_retorno,
								'fl_sucesso'         => 'f',
								'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
								'ds_xml_transmissao' => $mysoapmsg,
								'dt_envio'           => $dtEnvio,
								'dt_retorno'         => $dtRetorno
						)
				);

				Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

			} else {
				if($result_xml->id_endosso){
					$Propostas->update(array("ds_identificador_seguradora" => $result_xml->id_endosso), "id = ".$this->getRequest()->getParam('id'));

					$Proposta = $Propostas->find($this->getRequest()->getParam('id'))->current();
					$return = array_merge($return, array('id_endosso' => $Proposta->ds_identificador_seguradora));

					$PropostaFisico = new Atendimento_Model_PropostaDocumentoFisico();
					$PropostaDigitalizado = new Seguro_Model_PropostaStatusDocumentoDigitalizado();

					//$Comercializacoes = new Comercializacao_Model_Comercializacoes();
					//$Comercializacao = $Comercializacoes->find($this->getRequest()->getParam('comercializacao'))->current();

					$dtVigenciaInicio = date('Y-m-d');
					$dtTransmissao    = date('Y-m-d H:i:s');

					$data = array('dt_transmissao' => $dtTransmissao);

					if ($Propostas->update($data, "id = ".$this->getRequest()->getParam('id'))) {

						if ($Propostas->changeStatus(array('id_proposta' => $this->getRequest()->getParam('id')), 'ENVIADA_AGUARDANDO_CONF')) {

							$PropostaFisico->changeStatus(array('id_proposta' => $this->getRequest()->getParam('id')), 'DOC_PENDENTE_ENVIO');
							$PropostaDigitalizado->atualizarStatus($this->getRequest()->getParam('id'), Seguro_Model_PropostaStatusDocumentoDigitalizado::STATUS['DOC_PENDENTE_ENVIO']);
							$Propostas->gera_versao($this->getRequest()->getParam('id'), 'f', '', $result_xml->id_endosso);
							$Propostas->gravaConsultaCadin($this->getRequest()->getParam('id'));

							$Propostas->gravaLogTransmissao(
								array(
										'id_proposta'        => $this->getRequest()->getParam('id'),
										'ds_retorno'         => $result_xml->id_endosso,
										'fl_sucesso'         => 't',
										'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
										'ds_xml_transmissao' => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno
								)
							);


							$return['message'] = 'Proposta transmitida com sucesso.';
							$return['status'] = true;

							Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
						} else {
							$return['message'] = 'Não foi possível transmitir a proposta.';
							$return['status'] = false;
							Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
						}
					} else {
						$return['message'] = 'Não foi possível transmitir a proposta.';
						$return['status'] = false;
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
					}

				} else {
					$return['status'] = false;
					$return['message'] = 'Erro: Falha de recepção na Seguradora.';

					$Propostas->gravaLogTransmissao(
						array(
								'id_proposta'        => $this->getRequest()->getParam('id'),
								'ds_retorno'         => $result_xml->sucesso->attributes()->nm_retorno,
								'fl_sucesso'         => 'f',
								'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
								'ds_xml_transmissao' => $mysoapmsg,
								'dt_envio'           => $dtEnvio,
								'dt_retorno'         => $dtRetorno
						)
					);

					Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
				}
			}
		}
		/*
		* FIM BLOCO ESSOR
		*/

		$this->getResponse()->setBody(Zend_Json::encode($return));

	}

	// Adicionar local de entrega
	public function savelocalentregaAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$parms = $this->getRequest()->getParams();
		$PropostasCooperativas = new Seguro_Model_PropostasCooperativas();
		$Cooperativas = new Sistema_Model_Cooperativas();

		// Quando "Local Próprio" foi selecionado
		if ($parms['cnpj'] == '00.000.000/0000-00') {
			$row = $Cooperativas->hasCooperativaByCnpj($parms['cnpj']);
			$parms['id_cooperativa'] = $row->id;
			$parms['id_estado'] = $row->id_estado;
			$parms['id_municipio'] = $row->id_municipio;
			$parms['ds_nome_cooperativa'] = $row->ds_nome_cooperativa;
			$parms['cnpj'] = $row->cnpj;
		}

		if ($parms['id_cooperativa'] == ''){
			$parms['id_cooperativa'] = $Cooperativas->save($parms);
		}

		if ($PropostasCooperativas->save($parms)) {
			$locais = $PropostasCooperativas->getByIdProposta($parms['id_proposta'])->toArray();
			$response['status'] = true;
			$response['locais'] = $locais;
		} else {
			$response['status'] = false;
			$response['message'] = "ATENÇÃO.\n\nEste local de entrega já foi incluído.";
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	// Remove local de entrega
	public function deletelocalentregaAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$PropostasCooperativas = new Seguro_Model_PropostasCooperativas();

		if (!$PropostasCooperativas->delete($this->getRequest()->getParam('id'))) {
			$response['status'] = false;
			$response['message'] = 'Erro ao excluir local da proposta.';
		} else {
			// se foi cadastrado no mesmo orçamento (cooperativa nova) exclui
			// tanto cooperativa quanto propostas_cooperativa
			if ($PropostasCooperativas->isFirst((int) $this->getRequest()->getParam('id_cooperativa')) && ($this->getRequest()->getParam('id_cooperativa') != 1)) {
				$Cooperativas = new Sistema_Model_Cooperativas();
				$Cooperativas->getDefaultAdapter()->beginTransaction();
				try {
					$Cooperativas->delete($this->getRequest()->getParam('id_cooperativa'));
					$Cooperativas->getDefaultAdapter()->commit();
				} catch (Exception $e) {
					$Cooperativas->getDefaultAdapter()->rollBack();
				}
			}
			$response['status'] = true;
			$response['locais'] = $PropostasCooperativas->getByIdProposta($this->getRequest()->getParam('id_proposta'))->toArray();
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function deletelocalentregabyidpropostaAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$PropostasCooperativas = new Seguro_Model_PropostasCooperativas();
		if ($PropostasCooperativas->deleteByIdProposta($this->getRequest()->getParam('id_proposta'))) {
			$response['status'] = true;
			$response['message'] = 'Locais excluídos.';
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function listlocalentregaAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$PropostasCooperativas = new Seguro_Model_PropostasCooperativas();
		$locais = $PropostasCooperativas->getByIdProposta(($this->getRequest()->getParam('id_proposta')))->toArray();
		$this->getResponse()->setBody(Zend_Json::encode($locais));
	}

	public function getcooperativaAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$Cooperativas = new Sistema_Model_Cooperativas();
		$coop = $Cooperativas->getCooperativaByCnpj($this->getRequest()->getParam('cnpj'))->toArray();
		if (count($coop) > 0) {
			$response['message'] = $coop[0];
			$response['status'] = true;
		} else {
			$response['status'] = false;
			$response['message'] = '';
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function loadcooperativaAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$PropostasCooperativas = new Seguro_Model_PropostasCooperativas();
		$propostasCoop = $PropostasCooperativas->getById($this->getRequest()->getParam('id'))->toArray();
		$this->getResponse()->setBody(Zend_Json::encode($propostasCoop[0]));
	}

	private function calculaCulturaPastagem(Seguro_Model_Row_Proposta $proposta, array $condicoesPremio)
    {
        $produto = $proposta->produto();
        $dadosCulturaPastagem = null;

        if (
          $produto['id_cultura'] === Produto_Model_Culturas::PASTAGEM
          && !$condicoesPremio['dispensaComissaoMinima']
          && isset($condicoesPremio['condicao_comercial']['premio_pagar'])
            ) {
            $propriedades = $proposta->atributos('PROPRIEDADE');

            $premio = Agro_Util::formatCurrencyDb($condicoesPremio['condicao_comercial']['premio_pagar']);
            $percentualComissao = $condicoesPremio['vl_nova_comissao'] / 100;
            $valorComissao = $premio * $percentualComissao;

            $dadosCulturaPastagem['percentual_comissao_corrigida'] = round($condicoesPremio['vl_nova_comissao'], 2);
            $dadosCulturaPastagem['valor_comissao_minima'] = $propriedades['PROD_COMISSAO_MINIMA'];
            $dadosCulturaPastagem['valor_comissao_minima_formatado'] = Agro_Util::formatDbCurrency($propriedades['PROD_COMISSAO_MINIMA']);
            $dadosCulturaPastagem['valor_premio_minimo'] = $propriedades['PROD_PREMIO_MINIMO'];
            $dadosCulturaPastagem['valor_premio_minimo_formatado'] = Agro_Util::formatDbCurrency($propriedades['PROD_PREMIO_MINIMO']);

            if ($valorComissao < $propriedades['PROD_COMISSAO_MINIMA']) {
                $novaComissao = ($propriedades['PROD_COMISSAO_MINIMA'] / $premio) * 100;
                $valorPremio = Agro_Util::formatCurrencyDb($condicoesPremio['cobertura_principal']['premio']);
                $valorPercentual = round($novaComissao, 2);
                $percentualAjusteCalculo = $valorPercentual / 100;
                $calculoComissao = round($valorPremio * $percentualAjusteCalculo, 2);
                $comissaoMinima = Agro_Util::formatCurrencyDb($dadosCulturaPastagem['valor_comissao_minima_formatado']);

                while ($calculoComissao < $comissaoMinima) {
                    $valorPercentual += 0.01;

                    $percentualAjusteCalculo = $valorPercentual / 100;
                    $calculoComissao = round($valorPremio * $percentualAjusteCalculo, 2);
                }

                $dadosCulturaPastagem['percentual_comissao_corrigida'] = round($valorPercentual, 2);
            }

        }

        return $dadosCulturaPastagem;
	}

	private function isEmailValido($idProposta, $email)
	{
		$Propostas = new Seguro_Model_Propostas();
		$Proposta = $Propostas->find($idProposta)->current();
		$corretor = $Proposta->corretor();

		if ($corretor['ds_email'] == $email ||
			$corretor['ds_email_2'] == $email ||
			$corretor['ds_email_responsavel'] == $email || 
			$corretor['ds_email_contato_outros'] == $email ||
			$corretor['ds_email_contato_outros_2'] == $email) 
		{
			return false;
		}

		return true;
	}

	public function isemailvalidoAction()
	{
		$response = array('valid' => true);
		$this->isAjax();

		$idProposta = $this->getRequest()->getParam('id_proposta');
		$email = $this->getRequest()->getParam('email');

		$response['valid'] = $this->isEmailValido($idProposta, $email);

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	/**
	 * Primeiro busca se a proposta possui um e-mail de assinatura ativo (proposta que já foi transmitida)
	 * Caso não haja, tenta buscar o e-mail de assinatura que ainda não está ativo (proposta ainda não transmitida)
	 * Caso não haja, busca o e-mail do segurado informado na primeira aba do orçamento.
	 */
	public function getemailproponenteAction()
	{
		$response = array('email' => '', 'valid' => true, 'nr_justificativa' => '', 'ds_justificativa' => '');
		$this->isAjax();

		$idProposta = $this->getRequest()->getParam('id_proposta');
		$PropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
		$emails = $PropostasEmailAssinaturaDocumento->getByProposta($idProposta, true);
		
		if (empty($emails)) {
			$emails = $PropostasEmailAssinaturaDocumento->getByProposta($idProposta);
		}

		$idPropostaEmailAssinaturaDocumento = $emails['id'];
		$response['email'] = $emails['ds_email_segurado'];
		if (empty($response['email'])) {
			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($idProposta)->current();
			$response['email'] = $Proposta->proponente('ds_email_proponente');	
			$idPropostaEmailAssinaturaDocumento = null;
		}

		$response['valid'] = $this->isEmailValido($idProposta, $response['email']);

		$PropostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();
		$emailJustificativa = $PropostasEmailJustificativa->getByProposta($idProposta, $idPropostaEmailAssinaturaDocumento);
		
		if (!empty($emailJustificativa)) {
			$response['nr_justificativa'] = $emailJustificativa['nr_justificativa'];
			$response['ds_justificativa'] = $emailJustificativa['ds_justificativa'];
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function saveemailproponenteAction()
	{
		$response = array('status' => true, 'message' => 'E-mail do Segurado salvo com sucesso!');
		$this->isAjax();

		$idProposta = $this->getRequest()->getParam('id_proposta');
		$email =  $this->getRequest()->getParam('ds_email_segurado');

		if ($this->isEmailValido($idProposta, $email)) {

			$PropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
			$retorno = $PropostasEmailAssinaturaDocumento->save([
				'id_proposta' => $idProposta,
				'ds_email_segurado' => $email
			]);
	
			if ($retorno == false) {
				$response['status'] = false;
				$response['message'] = 'Erro ao salvar os dados do Segurado.';
			}
		} else {
			$response['status'] = false;
			$response['message'] = 'Informar e-mail do Segurado, pois este e-mail está cadastrado para o Corretor.';
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	private function atualizarPropostasEmailAssinaturaDocumento($idProposta) 
	{
		$Model = new Seguro_Model_Propostas();
		$Proposta = $Model->find($idProposta)->current();
		$beneficiarios = $Proposta->beneficiarios();
		
		$emailBeneficiarios = [];
		foreach($beneficiarios as $beneficiario) {
			
			$stdBeneficiarioEmail = new stdClass;
			$stdBeneficiarioEmail->id = $beneficiario['id'];
			$stdBeneficiarioEmail->email = $beneficiario['ds_email_beneficiario'];
			$stdBeneficiarioEmail->email_instituicao_financeira = $beneficiario['ds_email_instituicao_financeira'];
			$emailBeneficiarios[] = $stdBeneficiarioEmail;
		}

		$PropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
		return $PropostasEmailAssinaturaDocumento->save([
			'id_proposta' => $idProposta,
			'ds_email_beneficiarios' => Zend_Json::encode($emailBeneficiarios)
		]);
	}

    // Funçao que trata um caso específico com o corretor
    // bloqueando que ele cria/edite novos orçamentos com novos CPFs
    // e so possa incluir novos orcamentos com clientes novos
    // tarefa 2304191217
    public function brokerproblemAction() {
        $this->isAjax();
        $response = ['status' => false, 'message' => 'Comercialização não disponível.'];
        $ModelProposta = new Seguro_Model_Propostas();

        if($ModelProposta->isImperatrizClient($this->getRequest()->getParam('cpfCnpj')) || 
            ($ModelProposta->newClient($this->getRequest()->getParam('cpfCnpj')))) {
            $response = ['status' => true, 'message' => ''];
        };

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

	public function validarestricoesAction()
	{
		$this->isAjax();
		$idProposta = Agro_Util::filterVariable($this->getRequest()->getParam("idProposta")) ? $this->getRequest()->getParam("idProposta") : 0;
		//pegar restricoes com criterios da proposta. Quais criterios? idsafra, idproduto, idcultura,idcobertura, idmunicipio
		$Propostas = new Seguro_Model_Propostas();
		$proposta = $Propostas->get($idProposta);

		
		$criteriosRestricoes = array(
			'idMunicipio'	=> $proposta->id_municipio,
			'idProduto' 	=> $proposta->id_produto,
			'idCobertura' 	=> $proposta->id_cobertura_principal,
			'idCultura' 	=> $proposta->id_cultura,
			'idSafra' 		=> $proposta->id_safra
		);

		$modelValidacoes 			= new Produto_Model_ValidacoesRestricoes();
		$modelRestricoesCriterios 	= new Produto_Model_ValidacoesRestricoesCriterios();

		$restricoes		= $modelValidacoes->getRestricoes($criteriosRestricoes);
		Agro_Util::processarRestricoes($restricoes, $modelRestricoesCriterios);

		$obj = new Seguro_Model_ItensSegurados();
		$unidades = $obj->fetchItensProposta($idProposta);
		
		
		foreach($unidades as $unidade){
			if(!empty($restricoes)){
				$resultadoValidacoes = $modelValidacoes->validar($restricoes, $unidade, $idProposta);
			}
		}
		if(!empty($resultadoValidacoes)){
			$result = array('status' => false, 'errosDeRestricao' => $resultadoValidacoes, 'md' => true);
			$this->getResponse()->setBody(Zend_Json::encode($result));
		}else{
			$this->getResponse()->setBody(Zend_Json::encode(['status'=>true]));

		}
		
	
	}
    public function istelefonevalidoAction()
    {
        $response = array('valid' => true);
        $this->isAjax();

        $idProposta = $this->getRequest()->getParam('id_proposta');
        $telefone = $this->getRequest()->getParam('telefone');

        $response['valid'] = (new Seguro_Model_PropostasEmailAssinaturaDocumento())->isTelefoneValido($idProposta, $telefone);

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

    /**
     * Primeiro busca se a proposta possui um celular de assinatura ativo (proposta que já foi transmitida)
     * Caso não haja, tenta buscar o celular de assinatura que ainda não está ativo (proposta ainda não transmitida)
     * Caso não haja, busca o celular do segurado informado na primeira aba do orçamento.
     */
    public function getcelularproponenteAction()
    {
        $response = array('celular' => '', 'valid' => true);
        $this->isAjax();

        $idProposta = $this->getRequest()->getParam('id_proposta');
        $PropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
        $propostaEmailAssinaturaDocumento = $PropostasEmailAssinaturaDocumento->getByProposta($idProposta, true);

        if (empty($propostaEmailAssinaturaDocumento)) {
            $propostaEmailAssinaturaDocumento = $PropostasEmailAssinaturaDocumento->getByProposta($idProposta);
        }

        $response['celular'] = $propostaEmailAssinaturaDocumento['ds_celular_segurado'];
        if (empty($response['celular'])) {
            $Propostas = new Seguro_Model_Propostas();
            $Proposta = $Propostas->find($idProposta)->current();
            $proponente = $Proposta->proponente();

            $response['celular'] = $proponente['ds_tel_celular'];

            if (substr($proponente['ds_tel_residencia'], 4, 1) == '9') {
                $response['celular'] = $proponente['ds_tel_residencia'];
            }
        }

        $response['valid'] = $PropostasEmailAssinaturaDocumento->isTelefoneValido($idProposta, $response['celular']);

        $this->getResponse()->setBody(Zend_Json::encode($response));
    }


    public function cadastrarenderecobeneficiarioAction()
	{
		try {
			$this->isAjax();
	 		$response = ['status' => true, 'message' => 'Endereço cadastrado com sucesso!'];
			$params = $this->getRequest()->getParams();
            $params = json_decode($params['enderecos'],true);
		
			$agrupado = [];
			foreach ($params as $chave => $valor) {
    			if (preg_match('/^(.*)_(\d+)$/', $chave, $matches)) {
        			$prefixo = $matches[1];
        			$sufixo = $matches[2];

        			if (!isset($agrupado[$sufixo])) {
            			$agrupado[$sufixo] = [];
        			}

        			$agrupado[$sufixo][$prefixo] = $valor;
    			}
			}
			
			foreach($agrupado as $key => $beneficiario){
				if (array_key_exists('nr_cpf', $beneficiario)) {
    				$beneficiario['cpf_cnpj'] = $beneficiario['nr_cpf']; // mantém o valor
    				unset($beneficiario['nr_cpf']); // remove a chave antiga
				}

				if (array_key_exists('ds_email_beneficiario', $beneficiario)) {
    				$beneficiario['ds_email'] = $beneficiario['ds_email_beneficiario']; // mantém o valor
    				unset($beneficiario['ds_email_beneficiario']); // remove a chave antiga
				}
			
				$modelBeneficiarios = new Seguro_Model_Beneficiarios();
				$modelBeneficiarios->save($beneficiario);
			}
			
		} catch (Exception $e) {
			$response['status'] = false;
        	$response['message'] = $e->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function savebeneficiariosAction() {
		$this->isAjax();
		$this->getHelper('ViewRenderer')->setNoRender();

		$params 				= $this->getRequest()->getParams();
		$idsBeneficiarios 		= [];
		$result 				= array('status' => true);
		$modelEndossoPropostas 	= new Endosso_Model_Propostas();
		$propostasBeneficiarios = new Seguro_Model_PropostasBeneficiarios();
		$BaseBeneficiarios 		= new Seguro_Model_Beneficiarios();

		foreach($params['beneficiarios'] as $beneficiario){
			$idProposta = (int) $beneficiario['id_proposta'];
			$lmga = Agro_Util::formatCurrencyDb($modelEndossoPropostas->getLmgaProposta($idProposta));
			
			$paramsSumTotal = [
				'ds_quantia' 	=> $beneficiario['vl_limite_beneficio'],
				'id_proposta' 	=> $idProposta,
				'cpf_cnpj'		=> $beneficiario['cpf_cnpj']
			];
			$paramsVerificaDocumentoBeneficiario = [
				'id_proposta' => $beneficiario['id_proposta'],
				'cpf_cnpj' => $beneficiario['cpf_cnpj']
			];
			
			//banco está marcado como 'NÃO'
			if ($beneficiario['tp_favorecido'] === 'n') {
            	// Verifica se o CPF_CNPJ informado já consta no banco de dados de Beneficiários.
            	// Caso não conste, insere o novo registro
            	$consultaBeneficiario = $BaseBeneficiarios->fetchRow("cpf_cnpj = '{$beneficiario['cpf_cnpj']}'");
				
            	if(!$consultaBeneficiario) {
			
                	$idBeneficiario = $BaseBeneficiarios->saveByCpfCnpj(array(
                    	'cpf_cnpj' 	=> $beneficiario['cpf_cnpj'],
                    	'tp_pessoa' => $beneficiario['tp_pessoa'],
                    	'ds_nome_beneficiario' => $beneficiario['ds_nome_beneficiario'],
                    	'id_banco' => $beneficiario['id_banco'],
                    	'ds_agencia' => $beneficiario['ds_agencia'],
                    	'dt_nascimento' => $beneficiario['dt_nascimento'],
                    	'id_tipo_beneficiario' => $beneficiario['id_tipo_beneficiario'],
						'ds_endereco_cep' => $beneficiario['ds_endereco_cep'],
						'id_municipio' => $beneficiario['id_municipio'],
						'id_estado' => $beneficiario['id_estado'],
						'ds_endereco_bairro' => $beneficiario['ds_endereco_bairro'],
						'ds_endereco_logradouro' => $beneficiario['ds_endereco_logradouro'],
						'ds_endereco_nro' => $beneficiario['ds_endereco_nro'],
						'ds_endereco_complem' => $beneficiario['ds_endereco_complem'],
						'ds_tel' => $beneficiario['ds_tel'],
						'ds_email' => $beneficiario['ds_email_beneficiario']
                	));
					
                	if (!$idBeneficiario) {
                    	$result['message'] = 'Erro ao salvar beneficiário.';
                    	$result['status'] = false;
                    	$this->getResponse()->setBody(Zend_Json::encode($result));
                    	return;
                	}
            	} else {
                	$idBeneficiario = $consultaBeneficiario['id'];
				
					$BaseBeneficiarios->saveEnderecoByCpf(array(
						'cpf_cnpj' => $beneficiario['cpf_cnpj'],
						'ds_endereco_cep' => $beneficiario['ds_endereco_cep'],
						'id_municipio' => $beneficiario['id_municipio'],
						'id_estado' => $beneficiario['id_estado'],
						'ds_endereco_bairro' => $beneficiario['ds_endereco_bairro'],
						'ds_endereco_logradouro' => $beneficiario['ds_endereco_logradouro'],
						'ds_endereco_nro' => $beneficiario['ds_endereco_nro'],
						'ds_endereco_complem' => $beneficiario['ds_endereco_complem'],
						'ds_tel' => $beneficiario['ds_tel'],
						'ds_email' => $beneficiario['ds_email_beneficiario'],
						'ds_endereco_cep' => $beneficiario['ds_endereco_cep']
                	));
            	}
            	$rowInformacoesBancariasBeneficiarios = (new Seguro_Model_InformacoesBancariasBeneficiarios())->fetchAll(["id_beneficiario = {$idBeneficiario}"])->current();

            	if (!empty($rowInformacoesBancariasBeneficiarios)) {
                	$rowSistemaInformacoesBancarias = (new Sistema_Model_InformacoesBancarias())->fetchAll(["id = {$rowInformacoesBancariasBeneficiarios['id_informacoes_bancarias']}"])->current();

                	if (!empty($rowSistemaInformacoesBancarias)) {
                    	$this->incluirInformacoesBancariasBeneficiarios([
                        	'cpf_cnpj' => $beneficiario['cpf_cnpj'],
                        	'id_proposta' => $idProposta,
                        	'id_banco' => $rowSistemaInformacoesBancarias['id_banco'],
                        	'nu_conta_corrente' => $rowSistemaInformacoesBancarias['ds_conta'],
                        	'nu_digito_conta_corrente' => $rowSistemaInformacoesBancarias['nu_digito_conta'],
                        	'nu_agencia' => $rowSistemaInformacoesBancarias['ds_agencia'],
                        	'nu_digito_agencia' => $rowSistemaInformacoesBancarias['nu_digito_agencia'],
                        	'id_forma_pagamento' => $rowInformacoesBancariasBeneficiarios['id_forma_pagamento'],
                    	]);
                	}
            	}
        	}
			//banco está marcado como 'SIM'
        	if ($beneficiario['tp_favorecido'] === 's') {
            	$this->incluirInformacoesBancariasBeneficiarios([
                	'cpf_cnpj' => $beneficiario['cpf_cnpj'],
                	'id_proposta' => $idProposta,
                	'id_banco' => $beneficiario['id_banco'],
                	'nu_conta_corrente' => '',
                	'nu_digito_conta_corrente' => '',
                	'nu_agencia' => $beneficiario['ds_agencia'],
                	'nu_digito_agencia' => '',
                	'id_forma_pagamento' => Sistema_Model_FormasPagamento::ID_STATUS_CHEQUE
            	]);
        	}

			if (!empty($beneficiario['ds_email_beneficiario']) && !$this->isEmailValido($beneficiario['id_proposta'], $beneficiario['ds_email_beneficiario'])) {
				$result['message'] = 'Informar e-mail do Beneficiário, pois este e-mail está cadastrado para o Corretor.';
				$result['status'] = false;
				$this->getResponse()->setBody(Zend_Json::encode($result));
				return;
			}

			if ($beneficiario['fl_vinculada_financiamento'] && empty($beneficiario['ds_email_instituicao_financeira'])) {
				$result['message'] = 'Informe o e-mail do responsável da instituição financeira.';
				$result['status'] = false;
				$this->getResponse()->setBody(Zend_Json::encode($result));
				return;
			}

			if (!empty($beneficiario['ds_email_instituicao_financeira'])) {

				if (!$this->isEmailValido($idProposta, $beneficiario['ds_email_instituicao_financeira'])) {
					$result['message'] = 'Informar e-mail do responsável da instituição financeira, pois este e-mail está cadastrado para o Corretor.';
					$result['status'] = false;
					$this->getResponse()->setBody(Zend_Json::encode($result));
					return;
				}
			}

			//$propostasBeneficiarios->save(array(
            //	'id' 								=> $idBeneficiario,
            //	'ds_nome_beneficiarios' 			=> $beneficiario['ds_nome_beneficiario'],
            //	'ds_qualidade_beneficiario' 		=> $beneficiario['ds_qualidade_beneficiario'],
            //	'vl_limite_beneficio' 				=> Agro_Util::formatCurrencyDb($beneficiario['vl_limite_beneficio']),
            //	'nr_cpf_cnpj' 						=> $beneficiario['cpf_cnpj'],
            //	'id_banco' 							=> $beneficiario['id_banco'],
            //	'ds_agencia' 						=> $beneficiario['ds_agencia'],
            //	'ds_conta' 							=> $beneficiario['tp_favorecido'],
            //	'ds_observacao' 					=> $beneficiario['tp_favorecido'],
            //	'ds_tipo_conta' 					=> $beneficiario['tp_favorecido'],
            //	'dt_nascimento' 					=> $beneficiario['dt_nascimento'],
            //	'tp_pessoa' 						=> $tipoPessoa,
            //	'id_tipo_beneficiario' 				=> $beneficiario['id_tipo_beneficiario'],
			//	'ds_email_beneficiario' 			=> $beneficiario['ds_email_beneficiario'],
			//	'ds_email_instituicao_financeira' 	=> $beneficiario['ds_email_instituicao_financeira'],
			//	'fl_nome_social' 					=> $beneficiario['fl_nome_social'],
			//	'ds_nome_social' 					=> $beneficiario['ds_nome_social'],
			//	'ds_tel' 							=> '123'
        	//), $idProposta);

			$this->atualizarPropostasEmailAssinaturaDocumento($idProposta);

			//(new Seguro_Model_PropostasHashOrcamento())->save($idProposta);

			$Model = new Seguro_Model_Propostas();
			$Proposta = $Model->find($idProposta)->current();
	
			//$this->getResponse()->setBody(Zend_Json::encode($Proposta->beneficiarios()));
			$idsBeneficiarios[] = $idBeneficiario;
		}

		$retorno = [
			'status' => true,
			'message' => 'Sucesso!',
			'beneficiarios' => $idsBeneficiarios
		];
		$this->getResponse()->setBody(Zend_Json::encode($retorno));

	}

	public function getestadopropriedadepropostaAction()
	{
		try {
			$this->isAjax();
			
			$params = $this->getRequest()->getParams();
					
        	if (empty($params['id_proposta'])) {
            	throw new Exception('ID da proposta não informado.');
        	}

			$modelPropriedades = new Seguro_Model_PropostasPropriedades();
			$propriedade = $modelPropriedades->get($params['id_proposta']);

			if (empty($propriedade)) {
				throw new Exception("Não foi encontrada propriedade referente a proposta {$params['id_proposta']}.");
			}

			$response = [
				'idEstado' => $propriedade['id_estado'],
				'sigla' =>  $propriedade['ds_sigla'],
				'status' => true
			];
		} catch(Exception $e) {
			$response['status'] = false;
        	$response['message'] = 'Falha ao obter propriedades da proposta.';
		}
		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	private function buscaCep(array $request, bool $usarCepAuxiliar = false)
	{
		$cep = $usarCepAuxiliar ? (new Agro_CepAuxiliar()) : (new Agro_Cep());
		$cep->setCep($request['cep']);
		$resp = $cep->getCepInfo();

		if (empty($resp['id_estado'])) {
			throw new Exception("ATENÇÃO!\n\nO CEP informado não existe.");
		}

		$habilitado = (new Produto_Model_Habilitacoes())->getHabilitacoesEstados($request, $resp['id_estado']);
	
		if (
			empty($habilitado)
			|| (!in_array($resp['id_municipio'], $habilitado[$resp['id_estado']]['municipios']) && !empty($habilitado[$resp['id_estado']]['municipios']))
		) {
			throw new Exception("ATENÇÃO!\n\nUsuário sem habilitação para este CEP.");
		}

		$result = $resp;
		$result['status'] = true;

		$proposta = (new Seguro_Model_Propostas())->find($request['id_proposta'])->current();

		if (
			!$this->verificaComercializacao(
				(int) $request['id_produto'],
				$result['id_estado'],
				$result['id_municipio'],
				$request['cpf_cnpj'],
				$proposta['id_usuario_criacao']
			)
		) {
			throw new Exception("ATENÇÃO!\n\nNão existe uma comercialização cadastrada para este CEP.");
		}

		if (!$this->verificaTaxa($request['id_produto'], $result['id_estado'], $result['id_municipio'])) {
			throw new Exception("ATENÇÃO!\n\nNão existe um grupo de taxas cadastrada para este CEP.");
		}

		if (
			!isset($request['origemCotacao'])
			&& !$this->verificaPermiteOrcamento($proposta, $result['id_municipio'], $request)
		) {
			throw new Exception("ATENÇÃO!\n\nNão é possível criar um novo orçamento.");
		}

		//verificacao se o estado precisa cadpro
		//id_proposta só vem no orçamento
		if ($this->getRequest()->getParam('id_proposta')) {
			$proposta = (new Seguro_Model_Propostas())->getRow($this->getRequest()->getParam('id_proposta'));
			$result['prod_cadpro'] = (new Produto_Model_Atributogrupos())->getAtributosProposta(
				$proposta,
				'PROPRIEDADE',
				'PROD_CADPRO'
			);
		}

		return $result;
	}
}
