<?php
class Seguro_PropostaController extends Agro_Controller_Proposta {

	public function getModel() {
		return new Seguro_Model_Propostas();
	}

	public function editAction() {
		$Proposta = new Zend_Session_Namespace('PROPOSTA');
		$Proposta->unsetAll();

		$Proposta->id_proposta = $this->getRequest()->getParam('id');

		$this->getResponse()->setRedirect('/seguro/proposta/segurado');
	}

	public function init() {
		$this->view->title = 'Seguro » Proposta » Consultar';
	}

	public function viewprintAction()
	{
		$this->isAjax();
		
		try {
			if (empty($this->getRequest()->getParam('idProposta'))) {
				throw new Exception('Proposta não informada.', 1);
			}

			$idProposta = (int) $this->getRequest()->getParam('idProposta');
			$isSolicitacaoEndosso = filter_var($this->getRequest()->getParam('isSolicitacaoEndosso'), FILTER_VALIDATE_BOOLEAN);
			$modelProposta = new Seguro_Model_Propostas();

			$proposta = $modelProposta->find($idProposta)->current();

			if (empty($proposta)) {
				throw new Exception('Proposta não encontrada.', 1);
			}

			if ($proposta->id != $proposta->id_proposta_mae) {
				$dateTime = $modelProposta->getDataTransmissaoPropostaMae($idProposta);
			} else {
				$dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $proposta->dt_transmissao);
			}

			$idStatus = (new Sistema_Model_Status())->getIdStatus(
				'NAO_ENVIADA', 'PR'
			);
			
			if (
				$proposta->id_status != $idStatus
				&& $dateTime->format('Y-m-d H:i:s') >= DATA_CORTE_ENVIO_PDF_ECM
				&& !$isSolicitacaoEndosso
			) {
				$nomeArquivo = $modelProposta->getNomeArquivoEnvioEcm($proposta, Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_PROPOSTA);
				$caminhoArquivo = Seguro_Service_SalvarArquivoFormularioEcmPlugEssor::MAP_TIPO_ENVIO_FILE_PATH[Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_PROPOSTA]
					. "/{$nomeArquivo}";
				
				if (file_exists($caminhoArquivo)) {
					$pdfBase64 = base64_encode(file_get_contents($caminhoArquivo));
				} else {
					$retorno = (new Seguro_Service_ConsultarDocumentoEndossoPlugEssor())->executar(
						$idProposta,
						Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_PROPOSTA
					);
					
					$pdfBase64 = $retorno['base64'];
				}
			} else {
				$gerarPdfService = new Seguro_Service_GerarPdfProposta();
				$pdfBase64 = base64_encode($gerarPdfService->executar($idProposta, true));
			}

			$retorno = ['pdf' => $pdfBase64];
		} catch (Exception $e) {
			$mensagem = 'Erro ao carregar PDF.';
			if ($e->getCode() == 1) {
				$mensagem = $e->getMessage();
			}

			$retorno = [
				'erro' => true,
				'mensagem' => $mensagem
			];
		}

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}


	/**
	 * Monta a tela de pesquisa de propostas
	 *
	 */
	public function indexAction() {
		$this->view->title .= " » Listagem";

		$Proposta = new Zend_Session_Namespace('proposta');
		$Proposta->unsetAll();
	}
	
	/**
	 * Monta a tela de selecao de produto
	 *
	 */
	public function produtoAction() {
		$this->view->title = 'Seguro » Proposta » Novo Orçamento » Selecionar Produto';
		$this->view->back = "/seguro/proposta";

		$Proposta = new Zend_Session_Namespace('PROPOSTA');
		$Proposta->unsetAll();

		// Verifica se foi clicado no botao selecionar
		if ($this->getRequest()->isPost()) {
			$Propostas = new Seguro_Model_Propostas();
			$Proposta->id_proposta = $Propostas->iniciaProposta($this->getRequest()->getParam('id_produto'), $this->getRequest()->getParam('id_corretor'), $this->getRequest()->getParam('id_preposto'));

			if ($Proposta->id_proposta) {
				$this->getResponse()->setRedirect('/seguro/proposta/segurado');
			} else {
				$this->view->showMessage(MSG_ERROR, 'error');
			}
		}

		$this->view->form = new Seguro_Form_Proposta();
	}

	/**
	 * Monta a tela de form de proposta
	 *
	 */
	public function formAction() {
		$Propostas = new Seguro_Model_Propostas();
		$this->view->proposta = $Propostas->find($this->getRequest()->getParam('id'))->current();
	}

	/**
	 * Monta a tela de preenchimento do proponente, propriedade e questionario
	 *
	 */
	public function seguradoAction() {
		$this->view->usuario_logado = Zend_Auth::getInstance()->getIdentity()->ds_nome_usuario; //solicitacao 2849
		$PropostaQuestionarios = new Seguro_Model_PropostasQuestionarios();
		$PropostaPropriedades = new Seguro_Model_PropostasPropriedades();
		$PropostaProponentes = new Seguro_Model_PropostasProponentes();
		$Propostas = new Seguro_Model_Propostas();
		
		$Session = new Zend_Session_Namespace('PROPOSTA');
		
		if($Session->id_proposta > 0){
			$id_proposta = $Session->id_proposta;
			$Session->unsetAll();
		} else {
			$id_proposta = $this->getRequest()->getParam('id_proposta');
		}
		
		$this->view->title = "Seguro » Proposta » Segurado";

		if ($id_proposta) {
			$this->view->proposta = $Propostas->find($id_proposta)->current();
			$this->view->propriedade = $this->view->proposta->propriedade();
			$this->view->proponente = $this->view->proposta->proponente();
			$this->view->pessoa_autorizada = $this->view->proposta->pessoa_autorizada();

			$arStatus = array(4, 160, 162, 163, 59, 2, 13);
			if(!in_array($this->view->proposta['id_status'], $arStatus)) {
				$this->getHelper('ViewRenderer')->setNoRender();
				$this->getResponse()->setBody('<script>alert("Prezado Corretor.\n\n Por motivo de segurança, não é permitido editar Proposta neste status.\n Favor retomar a operação.");</script>');
			}
		} else {
			$this->getResponse()->setRedirect('/seguro/proposta');
		}
	}

	/*
	* Verifica se não foram abertas duas propostas para edição/inclusão
	*/
	public function checaSessao($md) {
		return true;
		/*
		$Session = new Zend_Session_Namespace('PROPOSTA');
		$User = Zend_Auth::getInstance()->getIdentity();

		if (($Session->id_proposta)) {
			if ($md <> md5($Session->id_proposta.$_SERVER['SERVER_ADDR'])) {
				return false;
			}
		}
		return true;
		*/
	}

	/**
	 * Monta a tela de unidades seguradas
	 *
	 */
	public function unidadesAction()
    {
        ini_set('memory_limit', '1024M');

        $this->view->title = "Seguro » Proposta » Unidades Seguradas";

        $itensSegurados = new Seguro_Model_ItensSegurados();
        $this->view->unidades = $this->getRequest()->getParam('unidade');

        $propostas = new Seguro_Model_Propostas();
        $this->view->proposta = $propostas->find($this->getRequest()->getParam('id_proposta'))->current();

		$this->view->configCarAtiva = (new Produto_Model_Atributos())->estaAtivoParaProduto($this->view->proposta->id_produto, 'IS_CAR');

        $arStatus = array(4, 160, 162, 163, 59, 2, 13);
        if (!in_array($this->view->proposta['id_status'], $arStatus)) {
            $mensagem = "Prezado Corretor.\n\n Por motivo de seguranca, nao é permitido permitido editar Proposta";
            $mensagem .= " neste status.\n Favor retomar a operação.";

            $this->getHelper('ViewRenderer')->setNoRender();
            $this->getResponse()->setBody('<script>alert(' . $mensagem . ');</script>');
        }

        //Salva dados da pagina do Proponente
        if ($this->getRequest()->getParam('propriedade')) {
            $propostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();

            (new Seguro_Model_PropostasProponentes())->save(
                $this->getRequest()->getParam('proponente'),
                $this->view->proposta->id
            );
            
            (new Seguro_Model_PropostasPropriedades())->save(
                $this->getRequest()->getParam('propriedade'),
                $this->view->proposta->id
            );
            
            (new Seguro_Model_PropostasQuestionarios())->save(
                $this->getRequest()->getParam('questionario'),
                $this->view->proposta
            );
            
            $dadosProponente = $this->getRequest()->getParam('proponente');

            if (!empty($dadosProponente['nr_justificativa'])) {
                $dadosProponente["id_proposta"] = $this->view->proposta->id;
                $propostasEmailJustificativa->save($dadosProponente);
            } else {
                $propostasEmailJustificativa->deleteByProposta($this->view->proposta->id);
            }

            $idStatusSubvencaoEstadual = $idStatusSubvencaoFederal = $propostas->getIdStatus(
                Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO,
                Sistema_Model_Tipostatus::DS_CHAVE_SUBVENCAO
            );

            $idStatusEmFilaEnvio = $propostas->getIdStatus(
                Seguro_Model_PropostasSubvencao::DS_CHAVE_EM_FILA_ENVIO,
                Sistema_Model_Tipostatus::DS_CHAVE_SUBVENCAO
            );

            if (!empty($this->_requestParams['questionario'][Seguro_Model_PropostasQuestionarios::DS_CHAVE_QUEST_SUBVENCAO_ESTADUAL])) {
                $idStatusSubvencaoEstadual = $idStatusEmFilaEnvio;
            }

            if (!empty($this->_requestParams['questionario'][Seguro_Model_PropostasQuestionarios::DS_CHAVE_QUEST_SUBVENCAO_FEDERAL])) {
                $idStatusSubvencaoFederal = $idStatusEmFilaEnvio;
            }

            (new Seguro_Model_PropostasSubvencao())->save([
                'id_proposta' => $this->view->proposta->id,
                'id_status_subvencao_estadual' => $idStatusSubvencaoEstadual,
                'id_status_subvencao_federal' => $idStatusSubvencaoFederal,
            ], true);

            (new Seguro_Model_PropostasHashOrcamento())->save($this->view->proposta->id);
        }

        if ($this->getRequest()->getParam('id_proposta')) {
            $propostas = new Seguro_Model_Propostas();
            $proposta = $propostas->get($this->getRequest()->getParam('id_proposta'));

            $this->view->proposta = $proposta;

            if ($this->getRequest()->isPost() && is_array($this->getRequest()->getParam('unidade'))) {
                $itensSegurados->getAdapter()->beginTransaction();

                try {
					$unidades = $this->getRequest()->getParam('unidade');
					$itensSegurados->deleteProposta($this->getRequest()->getParam('id_proposta'));
					$propriedades = $proposta->atributos('PROPRIEDADE');
					$regras = new Agro_Regras();

					$validarLimiteIS = Agro_Regras::validarLimiteIS($proposta->id_proposta_mae, $unidades);

					// Percorre unidades
					foreach ($unidades as $nro => $unidade) {
						// Atribui o numero do item
						$unidade['nr_item_segurado'] = $nro;

						// Verifica producao garantida
						if ($proposta->respostas('QUEST_PRODUTIVIDADE_DECLARADA') == 2) {
							// Aplica Regra RN_IS_04
							$regras->RN_IS_04($unidade);

							if ($regras->error) {
								$this->view->showMessage("Item $nro: " . $regras->message, 'error');
								$itensSegurados->getAdapter()->rollBack();
								$this->view->itemError = $nro;
								return false;
							}
						}

						// Valida limite de IS
                        if (!empty($validarLimiteIS['unidades'][$nro])) {
							
							$this->view->showMessage("Item $nro: " . $validarLimiteIS['unidades'][$nro]['message'], 'error');
							$itensSegurados->getAdapter()->rollBack();
							$this->view->itemError = $nro;
							return false;
                        }

						// Aplica Regra RN_IS_02
						$regras->RN_IS_02($unidade, $proposta, $propriedades);
						if ($regras->error) {
							$this->view->showMessage("Item $nro: " . $regras->message, 'error');
							$itensSegurados->getAdapter()->rollBack();
							$this->view->itemError = $nro;
							return false;
						}
						
						// Aplica Regra RN_IS_05
						$regras->RN_IS_05($unidade, $proposta);
						if ($regras->error) {
							$this->view->showMessage("Item $nro: " . $regras->message, 'error');
							$itensSegurados->getAdapter()->rollBack();
							$this->view->itemError = $nro;
							return false;
						}

						$itensSegurados->save($nro, $unidade, $this->getRequest()->getParam('id_proposta'));
					}

                    $this->view->camposAlterados = $this->getRequest()->getParam('salvar');
                    $this->view->showMessage(MSG_SUCCESS, 'success');
                    $itensSegurados->getAdapter()->commit();
                } catch (Exception $e) {
                    $this->view->showMessage(MSG_ERROR, 'error', $e);
                    $itensSegurados->getAdapter()->rollBack();
                }
            }
        } else {
            $mensagem = "Prezado Corretor.\n\n Por motivo de segurança, não é permitido editar Orçamentos";
            $mensagem .= " simultaneamente.\n Favor fechar esta janela e retornar a operação .";

            $this->getHelper('ViewRenderer')->setNoRender();
            $this->getResponse()->setBody('<script>alert(' . $mensagem . ');</script>');
        }
    }

	/**
	 * Monta o form de Croqui
	 *
	 * @author Renato
	 */
	public function croquiAction() {
		//$Session = new Zend_Session_Namespace('PROPOSTA');

		$this->view->title = "Seguro » Proposta » Croqui";

		if ($this->checaSessao($this->getRequest()->getParam('md'))) {
			$Propostas = new Seguro_Model_Propostas();
			$ModelPropostaArquivos = new Seguro_Model_PropostasArquivos();

			$this->view->proposta = $Propostas->get($this->getRequest()->getParam('id_proposta'));
			$this->view->croquis = $ModelPropostaArquivos->getPropostaCroquis($this->getRequest()->getParam('id_proposta'));
			$this->view->md = $this->getRequest()->getParam('md');
		} else {
			$this->getHelper('ViewRenderer')->setNoRender();
			$this->getResponse()->setBody('<script>alert("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 .");</script>');
		}
	}

	public function validaritenscroquiAction(): void
	{
		$this->isAjax();
		$return = ['status' => true, 'message' => ''];
		
		try {
			$modelPropostasArquivos = new Seguro_Model_PropostasArquivos();
			$idProposta = $this->getRequest()->getParam('idProposta');

			if (empty($idProposta)) {
				throw new Exception("Proposta não informada.");
			}

			$arquivos = $modelPropostasArquivos
				->getPropostaCroquis($idProposta);

			if (empty($arquivos)) {
				throw new Exception("ATENÇÃO!\n\n É necessário salvar o croqui.");
			}

			$modelPropostasCroquisTalhoes = new Seguro_Model_PropostasCroquisTalhoes();
			$modelItensSegurados = new Seguro_Model_ItensSegurados();

			$itens = $modelItensSegurados->getAllByProposta($idProposta);

			foreach ($itens as $item) {
				if (empty($modelPropostasCroquisTalhoes->getByCroquiIdItemSegurado($idProposta, $item['id']))) {
					throw new Exception("ATENÇÃO\nÉ necessário informar o croqui georreferenciado para avançar no orçamento.");
				}
			}
		} catch (Exception $e) {
			$return['message'] = $e->getMessage(); 
			$return['status'] = false;
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	/**
	 * Monta a tela de calculo do premio
	 *
	 */
	public function premioAction() {

		// Busca a sessao da proposta
		//$Session = new Zend_Session_Namespace('PROPOSTA');
		$Propostas = new Seguro_Model_Propostas();
		$idProposta = $this->getRequest()->getParam('id_proposta');
		$this->view->proposta = $Propostas->get($idProposta);

		try {
			$taxaAgrupamentoProposta = null;
			if (!empty($idProposta)) {
				$taxaAgrupamentoProposta = (new Seguro_Model_PropostasTaxasAgrupamento())
					->getTaxaAgrupamento((int) $idProposta);
			}
			
			$this->view->comissaoCoberturaPrincipal = $taxaAgrupamentoProposta['vl_comissao'] ?? null;
			$this->view->taxasCar = $this->view->proposta->_agrupamentoCar();
			if  (!empty($this->view->taxasCar)) {
				$this->view->comissaoCoberturaPrincipal = $this->view->taxasCar['principal'][0]['vl_comissao'];
			}
			
			$coberturas = $this->view->proposta->coberturas();

		if($coberturas){
				$mapTaxaCarAdicionalToCobertura = [];
				$resultadoValidacoes = array();
				foreach($coberturas as $cobertura){
					if(!$cobertura['fl_cobertura_principal']){
					//pegar restricoes com criterios da proposta. Quais criterios? idsafra, idproduto, idcultura,idcobertura, idmunicipio
					$proposta = $Propostas->get($idProposta);
					$criteriosRestricoes = array(
						'idMunicipio'	=> $proposta->id_municipio,
						'idProduto' 	=> $proposta->id_produto,
						'idCobertura' 	=> $cobertura['id_cobertura'],
						'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)){
							$resultadoValidacao = $modelValidacoes->validar($restricoes, $unidade, $idProposta);
							if($resultadoValidacao){
								$resultadoValidacoes[$cobertura['id_cobertura']] = $modelValidacoes->validar($restricoes, $unidade, $idProposta);
							}
						}
					}
					}
				}
				if(!empty($resultadoValidacoes)){
					foreach($resultadoValidacoes as $key=> $val){
						$coberturas = $this->removerCoberturaPorId($coberturas, $key);
					}
				}
				$this->view->coberturas = $coberturas;
				foreach ($this->view->taxasCar['adicionais'] as $taxa) {
					$mapTaxaCarAdicionalToCobertura[$taxa['id_cobertura']][$taxa['vl_franquia']][] = $taxa;
				}
			
				$this->view->mapTaxaCarAdicionalToCobertura = $mapTaxaCarAdicionalToCobertura;
			}else{
				$this->view->coberturas = $coberturas;
			}



		} catch (Exception $e) {
			// $this->getHelper('ViewRenderer')->setNoRender();
			$this->getResponse()->setBody('<script>alert("'. $e->getMessage() .'");</script>');
			
		}
		
		$TipoAssinaturaDocumento = new Seguro_Model_PropostasTipoAssinaturaDocumento();
		$tipoAssinaturaDocumento = $TipoAssinaturaDocumento->getByProposta($idProposta);
			
		$this->view->tipoAssinatura = Seguro_Model_PropostasTipoAssinaturaDocumento::NAO_INFORMADA;

		if (count($tipoAssinaturaDocumento) > 0) {
			$this->view->tipoAssinatura = $tipoAssinaturaDocumento[0]['tipo_assinatura'];
		}

		$this->view->md = $this->getRequest()->getParam('md');

		//Seta Proposta como vigente
		$this->view->proposta->setEndossoVigente();

		$arStatus = array(4, 160, 162, 163, 59, 2, 13);
		if(!in_array($this->view->proposta['id_status'], $arStatus)) {
			$this->getHelper('ViewRenderer')->setNoRender();
			$this->getResponse()->setBody('<script>alert("Prezado Corretor.\n\n Por motivo de segurança, não é permitido editar Proposta neste status.\n Favor retomar a operação .");</script>');
		}

		if ($this->checaSessao($this->getRequest()->getParam('md'))) {

			// Verifica se ha uma proposta
			if ($idProposta) {
				$this->view->title = "Seguro » Proposta » Cálculo Prêmio";

				// Verifica se a página foi postada
				$Estados = new Sistema_Model_Estados();
				$this->view->ufs = json_encode($Estados->getCombo());

				$PropostasCooperativas = new Seguro_Model_PropostasCooperativas();
				$this->view->locais_entrega = $PropostasCooperativas->getByIdProposta($idProposta)->toArray();
			} else {
				// Redireciona para a selecao de produto
				$this->_redirect('/seguro/proposta/produto');
			}
		} else {
			$this->getHelper('ViewRenderer')->setNoRender();
			$this->getResponse()->setBody('<script>alert("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 .");</script>');
		}

		$PropostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
		$emails = $PropostasEmailAssinaturaDocumento->getByProposta($idProposta, true);
		
		if (empty($emails)) {
			$emails = $PropostasEmailAssinaturaDocumento->getByProposta($idProposta);
		}

		$this->view->ds_email_segurado = '';
		$this->view->proponente = ['nr_justificativa' => '', 'ds_justificativa' => ''];
		
		if (!empty($emails['ds_email_segurado'])) {
			$this->view->ds_email_segurado = $emails['ds_email_segurado'];

			$PropostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();
			$propostaEmailJustificativa = $PropostasEmailJustificativa->getByProposta($idProposta, $emails['id']);
			$this->view->proponente['nr_justificativa'] = $propostaEmailJustificativa['nr_justificativa'];
			$this->view->proponente['ds_justificativa'] = $propostaEmailJustificativa['ds_justificativa'];
		}

		if (!empty($emails['ds_celular_segurado'])) {
			$this->view->ds_celular_segurado = $emails['ds_celular_segurado'];
		}
	}

	/**
	 * Salva a proposta
	 *
	 */
	public function saveAction()
    {
		// Busca a sessao da proposta
		//$Session = new Zend_Session_Namespace('PROPOSTA');
		$Model = new Seguro_Model_Propostas();
		$efetivar = true;
		$parametros = $this->getRequest()->getParams();
		
		$propostas = new Seguro_Model_Propostas();
		$this->view->proposta = $propostas->get($parametros['id_proposta']);

		$modelTaxasValores = new Comercializacao_Model_TaxasValores();
		
		if ($this->getRequest()->getParam('id_proposta')) {
			$configuracaoCarAtiva = (new Produto_Model_Atributogrupos())
				->isAtributoLiberadoParaProduto($this->view->proposta->id_produto, 'IS_CAR');
			
			$possuiItemSemIdentificacaoCar = false;
			if ($configuracaoCarAtiva && Seguro_Service_Car::isCarObrigatorio($this->view->proposta->id)) {
				$possuiItemSemIdentificacaoCar = (new Seguro_Model_ItensSegurados())->possuiItemSemIdentificacaoCar($this->view->proposta->id);
				
				if ($possuiItemSemIdentificacaoCar) {
					$efetivar = false;
				}
			}
			
			if ($this->getRequest()->isPost()) {
				Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

				try {
					// Salvar Tipo de Assinatura do Documento
					$emailSegurado = '';
					$celularSegurado = '';
					switch ($this->getRequest()->getParam('tp_assinatura')) {
						case '1':
							$tipoAssinatura = $this->getRequest()->getParam('tp_eletronica');

							if ($this->getRequest()->getParam('tp_eletronica') == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL) {
								$emailSegurado = $this->getRequest()->getParam('ds_email_segurado_assinatura');
							}

							if ($this->getRequest()->getParam('tp_eletronica') == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS) {
								$celularSegurado = $this->getRequest()->getParam('ds_celular_segurado_assinatura');
							}

							break;
						case '2':
							$tipoAssinatura = Seguro_Model_PropostasTipoAssinaturaDocumento::MANUAL;
							break;
						default:
							$tipoAssinatura = Seguro_Model_PropostasTipoAssinaturaDocumento::NAO_INFORMADA;
							break;
					}

					$TipoAssinaturaDocumento = new Seguro_Model_PropostasTipoAssinaturaDocumento();
					$idTipoAssinatura = $TipoAssinaturaDocumento->save([
						'id_proposta' => $this->getRequest()->getParam('id_proposta'),
						'tipo_assinatura' => $tipoAssinatura
					]);

					if (!$idTipoAssinatura) {
						$_SESSION['alert'] = 'Erro ao salvar o tipo de assinatura do documento.';
						$this->getResponse()->setRedirect('/seguro/proposta/premio');
						return false;
					}

					$propostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
					$idPropostaEmailAssinaturaDocumento = $propostasEmailAssinaturaDocumento->save([
						'id_proposta' => $this->getRequest()->getParam('id_proposta'),
						'ds_email_segurado' => $emailSegurado,
						'ds_celular_segurado' => $celularSegurado
					]);

					if (!$idPropostaEmailAssinaturaDocumento) {
						$_SESSION['alert'] = 'Erro ao salvar os dados de assinatura do documento.';
						$this->getResponse()->setRedirect('/seguro/proposta/premio');
						return false;
					}

					$dadosProponente = $this->getRequest()->getParam('proponente');
					$propostasEmailJustificativa = new Seguro_Model_PropostasEmailJustificativa();

					if (!empty($dadosProponente['nr_justificativa'])) {
						$dadosProponente["id_proposta"] = $this->getRequest()->getParam('id_proposta');
						$dadosProponente["id_proposta_email_assinatura_documento"] = $idPropostaEmailAssinaturaDocumento;
						$idPropostaEmailJustificativa = $propostasEmailJustificativa->save($dadosProponente);

						if (!$idPropostaEmailJustificativa) {
							$_SESSION['alert'] = 'Erro ao salvar a justificativa.';
							$this->getResponse()->setRedirect('/seguro/proposta/premio');
							return false;
						}
					} else {
						$propostasEmailJustificativa->deleteByProposta($this->getRequest()->getParam('id_proposta'), $idPropostaEmailAssinaturaDocumento);
					}

					// Salva as observacoes
					$Observacoes = new Seguro_Model_PropostasObservacoes();
					$Observacoes->save(array(
							'ds_observacao' => $this->getRequest()->getParam('observacao'),
							'id_proposta' => $this->getRequest()->getParam('id_proposta'),
							'fl_principal' => true
					),true);
					
					$idProposta = (int) $this->getRequest()->getParam('id_proposta');
				
					// Salva as Coberturas
					if (is_array($this->getRequest()->getParam('coberturas'))) {
						$Coberturas = new Seguro_Model_PropostasCoberturas();
						$Coberturas->deleteProposta($idProposta);
						
						$mapTaxasCarAdicionaisToCobertura = $coberturasAdicionaisCar = [];

						$agrupamentoOrcamento = $this->view->proposta->_agrupamentoOrcamento();

						if ($parametros['isTaxaCar'] == 1 && !$agrupamentoOrcamento) {
							$taxasCar = $this->view->proposta->_agrupamentoCar();
						}

						$valorFranquiaSelecionada = (int) $this->getRequest()->getParam('valorFranquiaSelecionada');

						foreach ($this->getRequest()->getParam('coberturas') as $id => &$cobertura) {

							if ($id && $cobertura['checked'] == 1) {

								$franquia = explode('#', $cobertura['franquia']);
								$valorFranquiaAdicionalSelecionada = !empty($franquia[3]) ? (int) $franquia[3] : $valorFranquiaSelecionada;

								if (!empty($taxasCar) && !empty($taxasCar['adicionais'])) {
									foreach ($taxasCar['adicionais'] as $taxa) {
										if ($taxa['vl_franquia'] == $valorFranquiaAdicionalSelecionada) {
											$mapTaxasCarAdicionaisToCobertura[$taxa['id_cobertura']] = $taxa;
										}
									}
								}
							
								if ($parametros['isTaxaCar'] == 1 && !$agrupamentoOrcamento) {
									if ($cobertura['principal'] == 0) {
										$coberturasAdicionaisCar[$id] = $cobertura;
										$taxaCar = $mapTaxasCarAdicionaisToCobertura[$id];
									} elseif ($cobertura['principal'] == 1) {
										$modelPropostasTaxasAgrupamento = new Seguro_Model_PropostasTaxasAgrupamento();
										$modelTaxaAgrupamento = new Comercializacao_Model_TaxasAgrupamentos();

										$propostaTaxaAgrupamento = $modelPropostasTaxasAgrupamento->getByProposta($idProposta);
										
										if (
											!empty($propostaTaxaAgrupamento)
											&& $propostaTaxaAgrupamento['fl_del']
											&& $propostaTaxaAgrupamento['tp_taxa_agrupamento'] === 'C'
										) {
											$modelTaxaAgrupamento->delete($propostaTaxaAgrupamento['id_taxa_agrupamento']);
										}
										
										$taxa = $taxaCar = null;
										
										foreach ($taxasCar['principal'] as $tx) {
											if ($valorFranquiaSelecionada == $tx['vl_franquia']) {
												$taxaCar = $tx;
												break;
											}
										}

										$comissaoCar = explode('#', $taxaCar['vl_comissao'])[0];

										if (!empty($parametros['tem-range-configurada'])) {
											$comissaoCar = explode('#', $parametros['vl_nova_comissao'])[0];
										}
		
										$taxaAgrupamento = $modelTaxaAgrupamento
											->salvar([
												'id_produto' => $this->view->proposta->id_produto,
												'ds_nome_agrupamento_taxas' => 'TAXA CAR PROPOSTA - ' . $this->view->proposta->id,
												'tp_taxa_agrupamento' => 'C',
												'vl_comissao' => $comissaoCar,
												'fl_ativo' => true,
												'fl_del' => true,
												'id_secao' => null
											]);
										
										$idTaxaAgrupamentoCar = $taxaAgrupamento->id;

										// Caso taxa salva anteriormente não seja CAR (ex: Município)
										if ($taxaCar == null && $propostaTaxaAgrupamento['tp_taxa_agrupamento'] != 'C') {
											$taxaCar = $taxasCar['principal'][0];
										}
										
										$taxaValor = $modelTaxasValores
											->save([
												'id_taxa_agrupamento' => $taxaAgrupamento->id,
												'id_cobertura' => $id,
												'vl_franquia' => $taxaCar['vl_franquia'],
												'vl_taxa' => $taxaCar['vl_taxa'],
												'vl_taxa_renovacao' => $taxaCar['vl_taxa_renovacao'],
												'vl_taxa_inadimplente' => $taxaCar['vl_taxa_inadimplente'],
												'vl_taxa_reduzida' => $taxaCar['vl_taxa_reduzida'],
												'vl_percentual_subvencao_federal' => $taxaCar['vl_percentual_subvencao_federal'],
												'fl_franquia_disponivel' => true,
												'fl_ativo' => true
											]);
										
										$propostaTaxaAgrupamento = $modelPropostasTaxasAgrupamento
											->save([
												'id_proposta' => $parametros['id_proposta'],
												'id_taxa_agrupamento' => $taxaAgrupamento->id
											]);
									}
								} else {
									// Valida se a taxa correta do agrupamento é a que está sendo salva
									$arr = explode('#', $cobertura['franquia']);
									
									$Taxa = $modelTaxasValores->getRow($arr[1]);
									
									$Agrupamento = new Comercializacao_Model_Taxas();
									$rsTaxas = $Agrupamento->getTaxasCoberturas($this->getRequest()->getParam('cod_agrupamento'), $Taxa->vl_franquia, $id);

									$modelPropostasTaxaAgrupamento = new Seguro_Model_PropostasTaxasAgrupamento();
									$rowPropostasTaxaAgrupamento = $modelPropostasTaxaAgrupamento->save([
										'id_proposta' => $parametros['id_proposta'], 'id_taxa_agrupamento' => $rsTaxas[0]['id_taxa_agrupamento']
									]);

									if (!$rowPropostasTaxaAgrupamento) {
										$_SESSION['alert'] = 'Erro ao salvar a taxa calculada da proposta.';
										$this->getResponse()->setRedirect('/seguro/proposta/premio');
										return false;
									}
								}

								if($this->getRequest()->getParam('fl_inadimplente') == 1){
									$vl_taxa_config = !empty($taxaCar) ? $taxaCar['vl_taxa_inadimplente'] : $rsTaxas[0]['vl_taxa_inadimplente'];
								} elseif($this->getRequest()->getParam('id_proposta_renovada') > 0 && $this->view->proposta->renovacaoSemSinistro()){
									
									$vl_taxa_config = !empty($taxaCar) ? $taxaCar['vl_taxa_renovacao'] : $rsTaxas[0]['vl_taxa_renovacao'];
								} else {
									$vl_taxa_config = !empty($taxaCar) ? $taxaCar['vl_taxa'] : $rsTaxas[0]['vl_taxa'];
								}

								if ($this->getRequest()->getParam('fl_inadimplente') != 1 && in_array($id, array(5, 30, 31, 36))) {
									$ModelProposta = new Seguro_Model_Propostas();
									$Proposta = $ModelProposta->find($parametros['id_proposta'])->current();
									
									$ProdutosAtributos = new Produto_Model_ProdutosAtributos();
									$propostaRenovada = $this->getRequest()->getParam('id_proposta_renovada') > 0;
									
									if($propostaRenovada && !$this->view->proposta->renovacaoSemSinistro()) {
										$taxaReplantio = null;
									} else {
										$taxaReplantio = $ProdutosAtributos->getTaxaReplantio(
											$Proposta['id_produto'],
											$Proposta['id_usuario_criacao'],
											$Proposta->propriedade('id_municipio'),
											$Proposta->proponente('id_proponente'),
											$propostaRenovada
										);
									}
									$vl_taxa_config = is_null($taxaReplantio) ? $vl_taxa_config : $taxaReplantio;
								}

								$cobertura['taxa'] = (float) $cobertura['taxa'];
								
								if((bccomp($cobertura['taxa'], $vl_taxa_config, 2) != 0) && $vl_taxa_config && !$this->getRequest()->getParam('usarPremioMinimo')){
									$vl_nova_comissao = explode("#", $this->getRequest()->getParam('vl_nova_comissao'));

									$coberturasComAcrescimo = [
										Produto_Model_Coberturas::COB_GEADA,
										Produto_Model_Coberturas::COB_GEADA_II,
									];
									if(in_array($id, $coberturasComAcrescimo) && $this->getRequest()->getParam('fl_acrescimo_geada')){
										//não valida no caso de acrescimo na geada da Uva de Vinho e Mesa
										//solicitação 1288
									} else if (($vl_nova_comissao[0] > $vl_nova_comissao[1]) || ($vl_nova_comissao[0] < $vl_nova_comissao[1])) {
										//nao valida se a taxa tiver variacao porque uma nova comissao foi selecionada								
									} else {
										$_SESSION['alert'] = 'Erro ao salvar coberturas. ';
										$this->getResponse()->setRedirect('/seguro/proposta/premio/id_proposta/' . $parametros['id_proposta']);
										return false;
									}
								}

								if (!empty($taxaCar)) {
									$cobertura['valorFranquiaCar'] = $taxaCar['vl_franquia'];
								}

								if (!$Coberturas->save($cobertura, $id, $this->view->proposta, true)) {
									$_SESSION['alert'] = 'Erro ao salvar coberturas. Taxa inconsistente.';
									$this->getResponse()->setRedirect('/seguro/proposta/premio');
									return false;
								}
							}
						}
					}

					// Salva coberturas adicionais do CAR
					foreach ($coberturasAdicionaisCar as $idCobertura => $cobertura) {
						$taxaCar = $mapTaxasCarAdicionaisToCobertura[$idCobertura];
						
						if (!empty($taxaCar)) { 
							$taxaValor = (new Comercializacao_Model_TaxasValores())
								->save([
									'id_taxa_agrupamento' => $idTaxaAgrupamentoCar,
									'id_cobertura' => $idCobertura,
									'vl_franquia' => $taxaCar['vl_franquia'],
									'vl_taxa' => $taxaCar['vl_taxa'],
									'vl_taxa_renovacao' => $taxaCar['vl_taxa_renovacao'],
									'vl_taxa_inadimplente' => $taxaCar['vl_taxa_inadimplente'],
									'vl_taxa_reduzida' => $taxaCar['vl_taxa_reduzida'],
									'vl_percentual_subvencao_federal' => $taxaCar['vl_percentual_subvencao_federal'],
									'fl_franquia_disponivel' => true,
									'fl_ativo' => true
								]);
						}
					}
					
					// Salva as Coberturas de Contratação Automatica (fl_contratacao_automatica)
					$Produto = $this->view->proposta->produto();
					$coberturas = $this->view->proposta->produto_coberturas();
					foreach ($coberturas as $cobertura){
						if ($cobertura['fl_contratacao_automatica'] == true) {
							$cobertura['franquia'] = 0;
							$cobertura['taxa'] = 0;
							$Coberturas->save($cobertura, $cobertura['id_cobertura'], $this->view->proposta, false);
						}
					}
				
					// Salva as Parcelamento
					if (is_array($this->getRequest()->getParam('parcela'))) {
                        $idStatusSubvencaoEstadual = $idStatusSubvencaoFederal = $propostas->getIdStatus(
                            Seguro_Model_PropostasSubvencao::DS_CHAVE_SEM_SUBVENCAO,
                            Sistema_Model_Tipostatus::DS_CHAVE_SUBVENCAO
                        );

                        $idStatusEmFilaEnvio = $propostas->getIdStatus(
                            Seguro_Model_PropostasSubvencao::DS_CHAVE_EM_FILA_ENVIO,
                            Sistema_Model_Tipostatus::DS_CHAVE_SUBVENCAO
                        );

						$Parcelas = new Seguro_Model_PropostasParcelas();
						$Parcelas->deleteProposta(
                            $this->getRequest()->getParam('id_proposta'),
                            $this->view->proposta->id_endosso
                        );
				
						foreach ($this->getRequest()->getParam('parcela') as $nro => $parcela) {
							if ($parcela['liquido']) {
								$parcela['id_endosso'] = $this->view->proposta->id_endosso;
								$Parcelas->save($parcela, $nro, $this->getRequest()->getParam('id_proposta'));
							}

                            if (Agro_Util::formatCurrencyDb($parcela['estadual']) > 0) {
                                $idStatusSubvencaoEstadual = $idStatusEmFilaEnvio;
                            }

                            if (Agro_Util::formatCurrencyDb($parcela['federal']) > 0) {
                                $idStatusSubvencaoFederal = $idStatusEmFilaEnvio;
                            }
						}

                        (new Seguro_Model_PropostasSubvencao())->save([
                            'id_proposta' => $this->getRequest()->getParam('id_proposta'),
                            'id_status_subvencao_estadual' => $idStatusSubvencaoEstadual,
                            'id_status_subvencao_federal' => $idStatusSubvencaoFederal,
                        ], true);
					} else {
						$_SESSION['alert'] = 'Erro ao salvar parcelamento.';
						$this->getResponse()->setRedirect('/seguro/proposta/premio');
						return false;
					}

					// Salva a comissao
					$comissao = explode('#', $this->getRequest()->getParam('vl_nova_comissao'));
					$propostasCorretores = new Seguro_Model_PropostasCorretores();
					$corretor = $this->view->proposta->corretor();
					$preposto = $this->view->proposta->preposto();

					// Recupera, caso existe, o percentual de comissao da assessoria
					$AssessoriasCorretores = new Sistema_Model_AssessoriasCorretores();
					$rowAssessoria = $AssessoriasCorretores->getAssessoriaByCorretor($corretor['id']);
					$percentual_assessoria = !empty($rowAssessoria) ? $rowAssessoria['vl_percentual'] : 0;

					if ($preposto) {
						$AssessoriasPrepostos = new Sistema_Model_AssessoriasPrepostos();
						$rowAssessoria = $AssessoriasPrepostos->getAssessoriaByPreposto($preposto['id']);
						$percentual_assessoria = $rowAssessoria['vl_percentual'];
					}

					if ($rowAssessoria['tp_comissao'] === Sistema_Model_Assessorias::TP_COMISSAO_FIXA) {
						if(($percentual_assessoria > $comissao[0]) || (($comissao[0] - $percentual_assessoria) < 1)) {
							$efetivar = false;
						}
					}

					if ($rowAssessoria['tp_comissao'] === Sistema_Model_Assessorias::TP_COMISSAO_PROPORCIONAL) {
						if ((($comissao[0] * $percentual_assessoria) / 100) < 1) {
							$efetivar = false;
						}
					}

					$propostasCorretores->save(
						$this->getRequest()->getParam('id_proposta'),
						$corretor['id_usuario'],
						$comissao[0],
						$preposto['id_usuario'],
						$percentual_assessoria,
						$comissao[1],
						!empty($this->getRequest()->getParam('dispensaComissaoMinima')),
						$this->getRequest()->getParam('valorComissaoAdicional')
					);
				
					// Atualiza proposta
					$Propriedade = $this->view->proposta->propriedade();
					$Comercializacao = $this->view->proposta->comercializacao($Propriedade['id_estado'], $Propriedade['id_municipio'], $this->view->proposta['id_usuario_criacao']);
				
					$Row = $propostas->find($this->view->proposta->id)->current();
					$Row->nr_digito_verificador = Agro_Util::verificador($this->view->proposta->id);
					
					$Row->id_secao = ($this->getRequest()->getParam('id_secao') ? $this->getRequest()->getParam('id_secao') : null);
					$Row->id_comercializacao = $this->getRequest()->getParam('id_comercializacao');
					$Row->id_taxa_agrupamento = !empty($taxaAgrupamento) 
						? $taxaAgrupamento->id 
						: $this->getRequest()->getParam('id_taxa_agrupamento');
				
					$dtVigenciaInicioComercializacao = strtotime($Comercializacao['dt_cobertura_inicio']);
					$dtVigenciaInicioComercializacao = mktime(0, 0, 0, date("m", $dtVigenciaInicioComercializacao), date("d", $dtVigenciaInicioComercializacao), date("Y", $dtVigenciaInicioComercializacao));
					$dtInicioVigencia = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
					
					if($Produto["ds_nome_cultura"] == "Pastagem"){
						$dtVigenciaInicioProposta = strtotime($Row->dt_vigencia_inicio);
						$dtVigenciaInicioProposta = mktime(0, 0, 0, date("m", $dtVigenciaInicioProposta), date("d", $dtVigenciaInicioProposta), date("Y", $dtVigenciaInicioProposta));

						if ($dtInicioVigencia > $dtVigenciaInicioProposta) {
							$Row->dt_vigencia_inicio = date('Y-m-d');
						}

						if($Comercializacao["tp_comercializacao"] == "O") {
							$Row->dt_vigencia_fim = $Comercializacao['dt_cobertura_fim'];
						}
					} else {
						if($dtVigenciaInicioComercializacao > $dtInicioVigencia){
							$Row->dt_vigencia_inicio = $Comercializacao['dt_cobertura_inicio'];
						} else {
							$Row->dt_vigencia_inicio = date('Y-m-d');
						}
					
						$Row->dt_transmissao  = date('Y-m-d H:i:s');
						$Row->dt_vigencia_fim = $Comercializacao['dt_cobertura_fim'];

						//Devido a mudanca do tipo de atributo que informa o número de dias quando o valor 3 é selecionado
						//Tarefa 2304141217
						$tipoFinalVigencia = explode(',', $Row->atributos('PROPRIEDADE','PROD_TIPO_FINAL_VIGENCIA'));
						if (count($tipoFinalVigencia)>1) {
							$nDias = $tipoFinalVigencia[1];
						} else {
							$nDias = 180;
						}
						$tipoFinalVigencia = $tipoFinalVigencia[0];
						
						//Se a data final de vigência for por datas, busca-se a maior data de colheita e soma-se a ela 20 dias
						//Lembrando que a vigencia total da proposta não pode ser menor que 180 nem maior que 364dias
						if ($tipoFinalVigencia == 2) {
							$Unidades = $Row->unidades(false);
							foreach($Unidades as $chave => $valor){
								$arData = explode("/",$valor['IS_DT_FINAL_COLHEITA']);
								$dtMaiorPlantio = strtotime($arData[2]."-".$arData[1]."-".$arData[0]);
								if(!$dtAnterior || $dtAnterior <= $dtMaiorPlantio){
									$dtAnterior = $dtMaiorPlantio;
								}
							}
					
							$dtFinalVigencia = mktime(0, 0, 0, date("m",$dtAnterior), date("d",$dtAnterior)+ 20, date("Y",$dtAnterior));
							$dtInicioVigencia = mktime(0, 0, 0, date("m",strtotime($Row->dt_vigencia_inicio)), date("d",strtotime($Row->dt_vigencia_inicio)), date("Y", strtotime($Row->dt_vigencia_inicio)));
							$difDias = ($dtFinalVigencia - $dtInicioVigencia);
					
							if (round(($difDias/60/60/24)) < 180){
								$dtFinalVigencia = mktime(0,0,0,date("m",strtotime($Row->dt_vigencia_inicio)), date("d",strtotime($Row->dt_vigencia_inicio))+180, date("Y",strtotime($Row->dt_vigencia_inicio)));
							}
							if(round(($difDias/60/60/24)) > 365){
								$dtFinalVigencia = mktime(0,0,0,date("m",strtotime($Row->dt_vigencia_inicio)), date("d",strtotime($Row->dt_vigencia_inicio))+365, date("Y",strtotime($Row->dt_vigencia_inicio)));
							}
					
							$dtFinalVigencia = date('Y-m-d', $dtFinalVigencia);
					
							$Row->dt_vigencia_fim = $dtFinalVigencia;
						}

						$modelComercializacao = new Comercializacao_Model_ComercializacoesOrcamentos();
						$comercializacoesOrcamentos = $modelComercializacao->getComercializacaoByProposta(
						$this->getRequest()->getParam('id_proposta')
						);

						if (!empty($comercializacoesOrcamentos)) {
							$Row->dt_vigencia_inicio = $comercializacoesOrcamentos['dt_cobertura_inicio'];
							$Row->dt_vigencia_fim = $comercializacoesOrcamentos['dt_cobertura_fim'];
						}
					
						//Se a data final de vigência for por datas, busca-se a maior data de plantio e soma-se a ela 180 dias
						//Lembrando que a vigencia total da proposta não pode ser menor que 180 nem maior que 364dias
						if (empty($comercializacoesOrcamentos) && $tipoFinalVigencia == 3) {
							$Unidades = $Row->unidades(false);
							foreach($Unidades as $chave => $valor){
								$arData = explode("/", ($valor['IS_DATA_SEMEADURA']?$valor['IS_DATA_SEMEADURA']:$valor['IS_DATA_PLANTIO_TRANSPLANTE']));
								$dtMaiorPlantio = strtotime($arData[2]."-".$arData[1]."-".$arData[0]);
								if(!$dtAnterior || $dtAnterior <= $dtMaiorPlantio){
									$dtAnterior = $dtMaiorPlantio;
								}
							}

							// Validar período máximo e mínimo de vigência
							$limiteMaximoCultivo = $Row->atributos('PROPRIEDADE', 'LIMITE_MAXIMO_CULTIVO');
							$limiteMinimoCultivo = $Row->atributos('PROPRIEDADE', 'LIMITE_MINIMO_CULTIVO');

							$limiteMaximoCultivo = !empty($limiteMaximoCultivo)
								? $limiteMaximoCultivo
								: 0;
							
							$limiteMinimoCultivo = !empty($limiteMinimoCultivo)
								? $limiteMinimoCultivo
								: 0;
							
							$dtInicioVigencia = mktime(0, 0, 0, date("m",strtotime($Row->dt_vigencia_inicio)), date("d",strtotime($Row->dt_vigencia_inicio)), date("Y", strtotime($Row->dt_vigencia_inicio)));
							$dtInicioVigencia = date('Y-m-d', $dtInicioVigencia);

							$dtFinalVigencia = mktime(0, 0, 0, date("m",$dtAnterior), date("d",$dtAnterior), date("Y",$dtAnterior));
							$dtFinalVigencia = date('Y-m-d', $dtFinalVigencia);

							$dataInicialPeriodoCultivo = new DateTime($dtInicioVigencia);
							$dataFinalPeriodoCultivo = new DateTime($dtFinalVigencia);

							$dataInicialPeriodoCultivo->add(new DateInterval("P{$limiteMinimoCultivo}D"));
							$dataFinalPeriodoCultivo->add(new DateInterval("P{$limiteMaximoCultivo}D"));

							$dateTimeFinalVigencia = new DateTime($dtFinalVigencia);
							$dateTimeFinalVigencia->add(new DateInterval("P{$nDias}D"));

							$novaDataFinalVigencia = $dateTimeFinalVigencia->format('Y-m-d');

							if (
								$limiteMinimoCultivo && $dateTimeFinalVigencia <= $dataInicialPeriodoCultivo
								|| $limiteMaximoCultivo && $dateTimeFinalVigencia >= $dataFinalPeriodoCultivo
							) {
								$novaDataFinalVigencia = $dataInicialPeriodoCultivo > $dataFinalPeriodoCultivo
									? $dataInicialPeriodoCultivo->format('Y-m-d')
									: $dataFinalPeriodoCultivo->format('Y-m-d');
							}

							$Row->dt_vigencia_fim = $novaDataFinalVigencia;
						}
					}

					if (isset($parametros['titularConta'])) {
						// Salva as informações bancárias
						$dadosBancarios = ['id' => $parametros['idInformacoesBancarias']];

						if ($parametros['titularConta'] === 'S') {
							$dadosBancarios['id_banco'] = $parametros['id_banco_titular'];
							$dadosBancarios['ds_agencia'] = $parametros['ds_agencia_titular'];
							$dadosBancarios['nu_digito_agencia'] = $parametros['nu_digito_agencia_titular'];
							$dadosBancarios['ds_conta'] = $parametros['ds_conta_titular'];
							$dadosBancarios['nu_digito_conta'] = $parametros['nu_digito_conta'];
							$dadosBancarios['ds_tipo_conta'] = $parametros['tipoConta'];
						} else {
							$dadosBancarios['id_banco'] = $parametros['id_banco_nao_titular'];
							$dadosBancarios['ds_agencia'] = $parametros['ds_agencia_nao_titular'];
							$dadosBancarios['nu_digito_agencia'] = $parametros['nu_digito_agencia_nao_titular'];
							$dadosBancarios['ds_tipo_conta'] = 'O';
						}

						$rowInformacoesBancarias = (new Sistema_Model_InformacoesBancarias())->save($dadosBancarios);

						if (!$rowInformacoesBancarias) {
							$_SESSION['alert'] = 'Erro ao salvar as informações bancárias.';
							$this->getResponse()->setRedirect('/seguro/proposta/premio/id_proposta/' . $parametros['id_proposta']);
							return false;
						}

						$dadosBancariosPropostas = [
							'id_informacoes_bancarias' => $rowInformacoesBancarias['id'],
							'id_proposta' => $parametros['id_proposta'],
							'fl_titular_conta' => $parametros['titularConta'] === 'S',
						];

						if (array_key_exists('contaConjunta', $parametros)) {
							$dadosBancariosPropostas['fl_conta_conjunta'] = $parametros['contaConjunta'] === 'S';
						}

						$modelInformacoesBancariasPropostas = new Seguro_Model_InformacoesBancariasPropostas();
						$modelInformacoesBancariasPropostas->delete('id_informacoes_bancarias', $rowInformacoesBancarias['id']);

						$rowInformacoesBancariasPropostas = $modelInformacoesBancariasPropostas->save($dadosBancariosPropostas);

						if (!$rowInformacoesBancariasPropostas) {
							$_SESSION['alert'] = 'Erro ao salvar as informações bancárias.';
							$this->getResponse()->setRedirect('/seguro/proposta/premio/id_proposta/' . $parametros['id_proposta']);
							return false;
						}
					} else {
						if (!empty($parametros['idInformacoesBancarias'])) {
							(new Sistema_Model_InformacoesBancarias())->delete($parametros['idInformacoesBancarias']);
						}
					}

					$modelPropostasBeneficiarios = new Seguro_Model_PropostasBeneficiarios();
					$modelPropostasBeneficiarios->removerAutorizacaoCreditoByProposta($parametros['id_proposta']);

					if ($parametros['idPropostaBeneficiario']) {
						$rowPropostasBeneficiarios = $modelPropostasBeneficiarios->save(
						['id' => $parametros['idPropostaBeneficiario'], 'fl_favorecido_autorizacao_credito' => 't'],
						$parametros['id_proposta']
						);

						if (!$rowPropostasBeneficiarios) {
							$_SESSION['alert'] = 'Erro ao salvar o beneficiário favorecido.';
							$this->getResponse()->setRedirect('/seguro/proposta/premio/id_proposta/' . $parametros['id_proposta']);
							return false;
						}
					}

					$Row->vl_custo_apolice = $this->view->proposta->atributos('PROPRIEDADE', 'PROD_CUSTO_APOLICE');
					$Row->vl_custo_apolice = trim($Row->vl_custo_apolice) === '' ? null : $Row->vl_custo_apolice;
				
					if($Row->id_status <> $propostas->getIdStatus("DEVOLVIDA")){
						$Row->id_status = $propostas->getIdStatus("NAO_ENVIADA");
					}

					$Row->save();
				
					if (!(new Seguro_Model_PropostasHashOrcamento())->save($parametros['id_proposta'])) {
						throw new Exception("Não foi possível criar a hash do orçamento.");
					}

					Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
					$this->view->md = $this->getRequest()->getParam('md');
					$this->view->id_proposta = $this->getRequest()->getParam('id_proposta');

				} catch (Exception $e) {
					Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();

					$_SESSION['alert'] = $e->getMessage();

					$this->getResponse()->setRedirect('/seguro/proposta/premio/id_proposta/' . $parametros['id_proposta']);
					return false;
				}	
				// Redireciona para o save
				//$this->getResponse()->setRedirect('/seguro/proposta/save/md/'.$this->getRequest()->getParam('md').'/id_proposta/'.$this->getRequest()->getParam('id_proposta'));
			}
			
			$this->view->proposta = $Model->get($this->getRequest()->getParam('id_proposta'));

			$TipoAssinaturaDocumento = new Seguro_Model_PropostasTipoAssinaturaDocumento();
			$tipoAssinaturaDocumento = $TipoAssinaturaDocumento->getByProposta($this->getRequest()->getParam('id_proposta'));
				
			$this->view->tipoAssinatura = Seguro_Model_PropostasTipoAssinaturaDocumento::NAO_INFORMADA;
	
			if (count($tipoAssinaturaDocumento) > 0) {
				$this->view->tipoAssinatura = $tipoAssinaturaDocumento[0]['tipo_assinatura'];
			}

			$this->view->md = $this->getRequest()->getParam('md');

			// exibe mensagem de problema no percentual de comissao de assessoria mas salva o orcamento
			$this->view->efetivar = $efetivar;
			if($efetivar == false) {
				if ($possuiItemSemIdentificacaoCar) {
					$this->view->showMessage('ATENÇÃO! Falta identificação de CAR em ao menos um dos itens declarados. Será necessário seleção para efetivação.', 'error');
				} else {
					$this->view->showMessage('ATENÇÃO! Comissão calculada é inferior ao percentual de assessoria ou o percentual do corretor é inferior a 1%. Entrar em contato com a AgroBrasil.', 'error');
				}
			} else {
				$this->view->showMessage(MSG_SUCCESS, 'success');
			}
		} else {
			$this->getResponse()->setRedirect('/seguro/proposta/');
		}
	}

	/**
	 * Visualizacao da proposta
	 */
	public function viewAction() {
		$this->getHelper('layout')->setLayout('popup');
		
		$Model = new Seguro_Model_Propostas();
		$this->view->proposta = $Model->find($this->getRequest()->getParam('id'))->current();

		$this->view->isAssinaturaFinalizada = (new Seguro_Model_PropostasDocusign())
			->isAssinaturaFinalizada($this->view->proposta->id);

		/*
		 * GERA CODIGO DE BARRAS ESPECIFICO PARA PROPOSTA, CROQUI, TERMO DE SUBVENCAO FEDERAL E ESTADUAL
		 */
		$rendererOptions = array();
		$barcodeOptions  = array('text' => $this->getRequest()->getParam('id').' - PRO', 'barHeight' => 25);
		$renderer = Zend_Barcode::factory('code128', 'image', $barcodeOptions, $rendererOptions);
		$handle = $renderer->draw();
		$filename = 'resources/imagens/barcode/'.$this->getRequest()->getParam('id').'-PRO.gif';
		imagegif($handle, $filename);

		$barcodeOptions  = array('text' => $this->getRequest()->getParam('id').' - CRO', 'barHeight' => 25);
		$renderer = Zend_Barcode::factory('code128', 'image', $barcodeOptions, $rendererOptions);
		$handle = $renderer->draw();
		$filename = 'resources/imagens/barcode/'.$this->getRequest()->getParam('id').'-CRO.gif';
		imagegif($handle, $filename);

		$barcodeOptions  = array('text' => $this->getRequest()->getParam('id').' - TMF', 'barHeight' => 25);
		$renderer = Zend_Barcode::factory('code128', 'image', $barcodeOptions, $rendererOptions);
		$handle = $renderer->draw();
		$filename = 'resources/imagens/barcode/'.$this->getRequest()->getParam('id').'-TMF.gif';
        imagegif($handle, $filename);

		$barcodeOptions  = array('text' => $this->getRequest()->getParam('id').' - TME', 'barHeight' => 25);
		$renderer = Zend_Barcode::factory('code128', 'image', $barcodeOptions, $rendererOptions);
		$handle = $renderer->draw();
		$filename = 'resources/imagens/barcode/'.$this->getRequest()->getParam('id').'-TME.gif';
		imagegif($handle, $filename);
		
		// Busca, se houver, locais de entrega
		if(!empty(array_intersect(array(33,40,45),array_keys($this->view->proposta->coberturas_contratadas('adicional'))))) {
			$LocaisEntrega = new Seguro_Model_PropostasCooperativas();
			$this->view->locais_entrega = $LocaisEntrega->getByIdProposta($this->getRequest()->getParam('id'))->toArray();
		}

		$this->view->title .= ' » Visualização ';
		$this->view->module = 'seguro';
		$this->view->origemSolicitacaoEndosso = $this->getRequest()->has('origemSolicitacaoEndosso');

        if ($this->view->origemSolicitacaoEndosso) {
            $rowSolicitacao = (new Endosso_Model_Solicitacao())->fetchAll(["id_proposta = {$this->getRequest()->getParam('id')}"])->toArray();
            $this->view->justificativaSolicitacao = '';
            $this->view->camposAlterados = '';

            if (!empty($rowSolicitacao)) {
                $this->view->justificativaSolicitacao = $rowSolicitacao[0]['ds_descricao'];
                $this->view->camposAlterados = $rowSolicitacao[0]['ds_campos_alteracoes'];
            }
        }
	}

	public function listsubtableAction(){
		$this->isAjax(true);
		parent::listAction();
	}

	public function listAction() {
		$Form = new Seguro_Form_AutorizadoCorretor();
		$this->view->formCorretor = $Form;

		$FormAlterarProduto = new Seguro_Form_AlterarProduto();
		$this->view->formAlterarProduto = $FormAlterarProduto;


		$user = Zend_Auth::getInstance()->getIdentity();

		$this->view->fl_autorizacao_cancelamento = $user->tp_usuario == Sistema_Model_Usuarios::TIPO_USUARIO_CORRETOR;

		if ($user->tp_usuario == Sistema_Model_Usuarios::TIPO_USUARIO_PREPOSTO) {
			$modelPrepostos = new Sistema_Model_Prepostos();
			$preposto = $modelPrepostos->findByUser($user->id);

			if (!empty($preposto) && $preposto->fl_autorizacao_cancelamento) {
				$this->view->fl_autorizacao_cancelamento = true;
			}
		}

		parent::listAction();
	}

	public function autorizadocorretorAction() {
		$this->getHelper('layout')->disableLayout();
		$User = Zend_Auth::getInstance()->getIdentity();

		$Form = new Seguro_Form_AutorizadoCorretor();

		if ($this->getRequest()->getParam('id')) {
			$Model = new Seguro_Model_Propostas();

			$Proposta = $Model->find($this->getRequest()->getParam('id'))->current();

			//se for Corretor ou usuário AgroBrasil, popula o form
			if ($User->tp_usuario == 'C' || ($User->tp_usuario == 'F' && $User->id_empresa == 20)) {
				$idUser = null;
				if ($User->tp_usuario == 'C') {
					$idUser = $User->id;
				}

				$params = $Proposta->buscaUsuarioPropostaPorUsuarioLogado($idUser);
				$params["id_proposta"] =  $this->getRequest()->getParam('id');
	
				$Form->populate($params);
			}
		}

		$this->view->usuario_logado = $User;
		$this->view->form = $Form;
	}
	
	public function alterarprodutoAction() {
	    $this->getHelper('layout')->disableLayout();
	    $User = Zend_Auth::getInstance()->getIdentity();
	    
	    $Form = new Seguro_Form_AlterarProduto();
	    
        $params["id_proposta"] =  $this->getRequest()->getParam('id');
        $Form->populate($params);
   
	    $this->view->usuario_logado = $User;
	    $this->view->form = $Form;
	}

	public function apoliceAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$id_relatorio = $this->getRequest()->getParam('id_cultura') === 102 ? 1000253 : 612; //ou pdf de Pastagem ou restante dos produtos

		$wsdl = APPLICATION_ENV !== 'production' ? WSDL_DEV : WSDL_PROD;
		$soap = new SoapClient($wsdl, array('keep_alive' => false, 'connection_timeout' => 0));
		$args = array(
			'Executar' => array(
				'Servico' => 'ObterRelatorioPDF',
				'conteudoXML' => "<i4proerp><obter_relatorio_pdf id_relatorio=\"".$id_relatorio."\" id_endosso=\"".$this->getRequest()->getParam('ds_identificador_seguradora')."\" /></i4proerp>"
			)
		);
		$options = array('location' => substr($wsdl, 0, -5));

		try {
			$result = $soap->__soapCall('Executar', $args, $options);
			$xml = simplexml_load_string(utf8_encode($result->ExecutarResult), 'SimpleXMLElement', LIBXML_NOCDATA);

			if ($xml->erro) {
				$return = array(
					'status' => false,
					'erro' => $xml->erro->attributes()->nm_retorno
				);
			} else {
				$return = array(
					'nr_apolice' => $this->getRequest()->getParam('nr_apolice'),
					'ds_identificador_seguradora' => $this->getRequest()->getParam('ds_identificador_seguradora'),
					'file' => base64_encode(base64_decode($result->ExecutarResult)),
					'status' => true
				);	
			}
		} catch (SoapFault $fault) {
			$return = array(
				'erro' => $fault->getMessage(),
				'status' => false
			);
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function getproponenteAction()
    {
        $this->isAjax();

        $retorno = ['erro' => false, 'mensagem' => ''];

        $rowPropostaProponente = (new Seguro_Model_PropostasProponentes())->get($this->getRequest()->getParam('id_proposta'));

        if (!empty($rowPropostaProponente) && $rowPropostaProponente['tp_pessoa'] === 'J') {
            $retorno['erro'] = true;
            $retorno['mensagem'] = 'Segurado é um tipo de pessoa Jurídica. Desta forma, é necessário indicar ao menos';
            $retorno['mensagem'] .= ' uma pessoa autorizada a acompanhar a(s) vistoria(s).';
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

	public function dadosbancariosAction()
    {
        $this->getHelper('layout')->disableLayout();
        $this->view->id_proposta = $this->getRequest()->getParam('id_proposta');
    }

	public function arquivosagritaskAction()
	{
		$this->isAjax(true);

		try {
			if (empty($this->getRequest()->getParam('id_proposta'))) {
				throw new Exception("Proposta não informada.");
			}

			$idProposta = $this->getRequest()->getParam('id_proposta');
			$modelPropostasCotacaoAgritask = new Seguro_Model_PropostasCotacaoAgritask();
			$idCotacao = $modelPropostasCotacaoAgritask->getCotacaoByProposta($idProposta);

			if (empty($idCotacao)) {
				throw new Exception("Nenhuma cotação encontrada para a proposta informada.");
			}

			$arquivos = glob(Seguro_Model_PropostasCotacaoAgritask::FILE_PATH . "/{$idCotacao}*.pdf");
			
			$this->view->arquivos = [];

			foreach ($arquivos as $indice => $arquivo) {

				$nomeArquivo = basename($arquivo);
				$labelArquivo = $modelPropostasCotacaoAgritask->getLabelArquivo($nomeArquivo, $indice);

				$this->view->arquivos[] = ['nomeOriginal' => $nomeArquivo, 'labelArquivo' => $labelArquivo];
			}

			$this->view->idProposta = $idProposta;
		} catch (\Throwable $th) {
			die($th->getMessage());
		}
	}

	public function cadastrararquivoagritaskAction()
	{
		$this->isAjax();
		$return = ['status'=> true, 'message' => 'Salvo com sucesso.'];

		try {
			$params = $this->getRequest()->getParams();

			if (empty($params['idProposta'])) {
				throw new Exception("Proposta não informada.");
			}

			if (empty($params['tipo'])) {
				throw new Exception("Tipo de arquivo não informado.");
			}

			if (empty($params['dtRecebimento'])) {
				throw new Exception("Data de recebimento não informado.");
			}

			if (empty($_FILES)) {
				throw new Exception("Arquivo não informado.");
			}

			$modelPropostasCotacaoAgritask = new Seguro_Model_PropostasCotacaoAgritask();
			$adapter = new Zend_File_Transfer_Adapter_Http();
			$adapter->setDestination(Seguro_Model_PropostasCotacaoAgritask::FILE_PATH);
			$adapter->addValidator('Extension', false, ['pdf']);

			if (!$adapter->isValid()) {
				throw new Exception("Formato de arquivo inválido (formato aceito: PDF).");
			}

			$files = $adapter->getFileInfo();

			foreach ($files as $file) {
				$nomeArquivo = $modelPropostasCotacaoAgritask->gerarNomeArquivo($params['idProposta'], $params['tipo'], $params['dtRecebimento']);

				if (!copy($file['tmp_name'], Seguro_Model_PropostasCotacaoAgritask::FILE_PATH . "/" . $nomeArquivo)) {
					throw new Exception("Não foi possível copiar o arquivo {$file['name']} para a pasta.");
				}
			}

		} catch (\Throwable $th) {
			$return['status'] = false;
			$return['message'] = $th->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function excluirarquivoagritaskAction()
	{
		$this->isAjax();
		$return = ['status'=> true, 'message' => 'Arquivo excluído com sucesso.'];

		try {
			$params = $this->getRequest()->getParams();

			if (empty($params['nomeArquivo'])) {
				throw new Exception("Nome do arquivo não informado.");
			}

			$arquivo = realpath(Seguro_Model_PropostasCotacaoAgritask::FILE_PATH . "/" . $params['nomeArquivo']);
			
			if (!file_exists($arquivo)) {
				throw new Exception("Arquivo não encontrado.");
			}

			if (!unlink($arquivo)) {
				throw new Exception("Erro ao excluir o arquivo.");
			}
			
		} catch (\Throwable $th) {
			$return['status'] = false;
			$return['message'] = $th->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function validarpermissaocancelamentoAction()
	{
		$this->isAjax();
		$return = ['erro' => false, 'mensagem' => ''];

		try {
			$params = $this->getRequest()->getParams();

			if (empty($params['id_proposta'])) {
				throw new Exception("ID da proposta não informada.");
			}

			if (!filter_var($params['id_proposta'], FILTER_VALIDATE_INT)) {
				throw new Exception("ID da proposta deve ser um inteiro.");
			}

			$idProposta = (int) $params['id_proposta'];

			$modelPropostas = new Seguro_Model_Propostas();
			$rowProposta = $modelPropostas->find($idProposta)->current();

			if (empty($rowProposta)) {
				throw new Exception("Proposta não encontrada.");
			}

			$return['id_proposta'] = $idProposta;

			$modelAvisosSinistro = new Sinistro2_Model_AvisosSinistro();
			$avisos = $modelAvisosSinistro->checkAvisoByProposta($idProposta);

			if (!empty($avisos)) {
				throw new Exception("Não é possível efetuar o cancelamento devido comunicado de sinistro, favor solicitar análise via abertura de Chamado.");
			}

			$modelPropostaParcelas = new Seguro_Model_PropostasParcelas();
			$modelPropostaParcelas->consultarTodasParcelasEssor($rowProposta);

			$return['possui_parcelas_pagas'] = false;

			$parcelas = $rowProposta->parcelas();
			foreach ($parcelas as $parcela) {
				if ($parcela['fl_pago']) {
					$return['possui_parcelas_pagas'] = true;
					break;
				}
			}

		} catch (\Throwable $th) {
			$return['erro'] = true;
			$return['mensagem'] = $th->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));
	}

	public function cancelarpropostaAction()
	{
		$this->isAjax(true);
		$params = $this->getRequest()->getParams();

		if (empty($params['id_proposta'])) {
			throw new Exception("ID da proposta não informada.");
		}

		if (!filter_var($params['id_proposta'], FILTER_VALIDATE_INT)) {
			throw new Exception("ID da proposta deve ser um inteiro.");
		}

		if (!isset($params['possui_parcelas_pagas'])) {
			throw new Exception("Parâmetro possui parcelas pagas não informado.");
		}

		$possuiParcelasPagas = filter_var($params['possui_parcelas_pagas'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

		if (is_null($possuiParcelasPagas)) {
			throw new Exception("Parâmetro possui parcelas pagas deve ser um valor boolean.");
		}

		$modelTupoCancelamento = new Atendimento_Model_TipoCancelamento();
		$motivos = $modelTupoCancelamento->getCancelamentoPropostaCorretor();

		if ($possuiParcelasPagas) {
			foreach ($motivos as $index => $motivo) {
				if ($motivo['id'] == Atendimento_Model_TipoCancelamento::CANC_PROP_CORRETOR_FALTA_PAGAMENTO_PARCELA) {
					unset($motivos[$index]);
				}
			}
		}

		$this->view->motivos = $motivos;
		$this->view->idProposta = (int) $params['id_proposta'];
	}

	public function removerCoberturaPorId($coberturas, $idCoberturaParaRemover) {
		return array_filter($coberturas, function($cobertura) use ($idCoberturaParaRemover) {
			return $cobertura['id_cobertura'] !== $idCoberturaParaRemover;
		});
	}

    public function geracaoapoliceAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        try {
            $idProposta = (int) $this->getRequest()->getParam('id_proposta');
			
			$modelProposta = new Seguro_Model_Propostas();
			$proposta = $modelProposta->find($idProposta)->current();

			if (empty($proposta)) {
				throw new Exception('Proposta não encontrada.', 1);
			}

			if ($proposta->id != $proposta->id_proposta_mae) {
				$dateTime = $modelProposta->getDataTransmissaoPropostaMae($idProposta);
			} else {
				$dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $proposta->dt_transmissao);
			}

			$nomeArquivo = $modelProposta->getNomeArquivoEnvioEcm($proposta, Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_APOLICE);
			$caminhoArquivo = Seguro_Service_SalvarArquivoFormularioEcmPlugEssor::MAP_TIPO_ENVIO_FILE_PATH[Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_APOLICE]
				. "/{$nomeArquivo}";
			
			if ($dateTime->format('Y-m-d H:i:s') >= DATA_CORTE_ENVIO_PDF_ECM) {
				if (file_exists($caminhoArquivo)) {
					$pdfBase64 = base64_encode(file_get_contents($caminhoArquivo));
				} else {
					$retorno = (new Seguro_Service_ConsultarDocumentoEndossoPlugEssor())->executar(
						$idProposta,
						Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_APOLICE
					);
					
					$pdfBase64 = $retorno['base64'];
					$fileName = $retorno['filename'];
				}
			} else {
				$serviceApolice = new Seguro_Service_Apolice($idProposta);
            	[$pdfBinary, $fileName] = $serviceApolice->gerarPdf();
			}

			$return = [
                'filename' => $fileName,
                'file' => $pdfBase64 ?? base64_encode($pdfBinary),
                'status' => true
            ];
        } catch (\Throwable $exception) {
            $return = [
                'erro' => $exception->getCode() === 1 ? $exception->getMessage() : 'Erro ao gerar PDF.',
                'status' => false
            ];
        }

        $this->getResponse()->setBody(Zend_Json::encode($return));
    }

	public function enviarformularioecmplugessorAction()
	{
		$this->isAjax();

		$modelProposta = new Seguro_Model_Propostas();
		$serviceEnviarFormularioEcmPlugEssor = new Seguro_Service_EnviarFormularioEcmPlugEssor();
		$retorno = [];

		try {
			$idProposta = $this->getRequest()->getParam('id_proposta');
			$tipoEnvio = $this->getRequest()->getParam('tipo_envio');
			$pdfBase64 = $this->getRequest()->getParam('pdf_base64');
			
			if (empty($idProposta) || !filter_var($idProposta, FILTER_VALIDATE_INT)) {
				throw new InvalidArgumentException('ID Proposta inválido.', 1);
			}

			$proposta = $modelProposta->find($idProposta)->current();

			if (empty($proposta)) {
				throw new Exception('Proposta não encontrada.', 1);
			}

			if (empty($tipoEnvio) || !filter_var($tipoEnvio, FILTER_VALIDATE_INT)) {
				throw new InvalidArgumentException('Tipo envio inválido.', 1);
			}

			if (empty($pdfBase64)) {
				throw new InvalidArgumentException('PDF base64 não informado.', 1);
			}

			$idEndossoErp = (new Log_Model_PropostasTransmissao())->getIdEndossoErp($proposta->id);

            if (empty($idEndossoErp) || !filter_var($idEndossoErp, FILTER_VALIDATE_INT)) {
                throw new Exception('ID endosso do ERP inválido.');
            }
			
			$serviceEnviarFormularioEcmPlugEssor->executar($proposta, $tipoEnvio, $pdfBase64, $idEndossoErp);

		} catch (Throwable $e) {
			$retorno = ['erro' => true, 'mensagem' => $e->getMessage()];
		}

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}

	public function enviarformularioscomerroecmplugessorAction()
	{
		$this->isAjax();
		
		$dataInicio = $this->getRequest()->getParam('dataInicio');
		
		try {
			$dateTimeInicio = DateTime::createFromFormat('Y-m-d', $dataInicio);

			if (!$dateTimeInicio) {
				throw new Exception("Data informada está errada. Deve seguir o formato 'Y-m-d', ex: 2025-05-01");
			}

			$rs = (new Log_Model_EnvioFormularioEcmPlugEssor())->getFormulariosErroEnvio($dateTimeInicio);
			
			$serviceGerarPdfProposta = new Seguro_Service_GerarPdfProposta();
			$modelProposta = new Seguro_Model_Propostas();

			$retorno = $dtos = [];
			$tamanhoLote = 10;

			foreach ($rs as $row) {
				if ($row['ds_chave_tipo_envio'] == 'COTACAO') {
					$tipoEnvio = Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_COTACAO;
				} elseif ($row['ds_chave_tipo_envio'] == 'PROPOSTA') {
					$tipoEnvio = Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_PROPOSTA;
				} else {
					$tipoEnvio = Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_APOLICE;
				}

				$idProposta = (int) $row['id_proposta'];
				$proposta = $modelProposta->find($idProposta)->current();
				
				if (empty($proposta)) {
					throw new Exception('Proposta não encontrada');
				}
				
				$nomeArquivo = $modelProposta->getNomeArquivoEnvioEcm($proposta, $tipoEnvio);
				$caminhoArquivo = Seguro_Service_SalvarArquivoFormularioEcmPlugEssor::MAP_TIPO_ENVIO_FILE_PATH[$tipoEnvio]
					. "/{$nomeArquivo}";

				if (file_exists($caminhoArquivo)) {
					$pdf = file_get_contents($caminhoArquivo);
				} else {
					if (in_array(
							$tipoEnvio,
							[
								Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_COTACAO,
								Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_PROPOSTA
							]
						)
					) {
						$pdf = $serviceGerarPdfProposta->executar($idProposta, true);
					} else {
						list($pdf) = (new Seguro_Service_Apolice($idProposta))->gerarPdf();
					}
				}
				
				$dtos[] = Seguro_Dto_FormularioFilaEcmPlugEssor::fromArray([
					'id_proposta' => $idProposta,
					'tipo_envio' => $tipoEnvio,
					'pdf_base64' => base64_encode($pdf)
				]);

				unset($pdf);

				if (count($dtos) === $tamanhoLote) {
					$serviceEnvioFila = new Seguro_Service_EnviarFormularioFilaEcmPlugEssor();
					$serviceEnvioFila->executar($dtos);
					
					unset($dtos);
					gc_collect_cycles();
					$dtos = [];
					
					sleep(2);
				}
			}

			if (!empty($dtos)) {
				$serviceEnvioFila = new Seguro_Service_EnviarFormularioFilaEcmPlugEssor();
				$serviceEnvioFila->executar($dtos);
			}

			$retorno = [
				'mensagem' => 'sucesso'
			];
		} catch (Exception $e) {
			$retorno['erros'][] = $e->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}
}
