<?php

class Atendimento_PropostaController extends Agro_Controller_Proposta
{
	public function getFilter()
    {
		$where = parent::getFilter();

		if ($this->getRequest()->getParam('ds_chave_menu') == 'devolvida') {

			$data = Zend_Date::now();

			$where[] = array(
				'field'    => 'sst.ds_chave',
				'operator' => '=',
				'value'    => 'DEVOLVIDA'
			);

			$where[] = array(
				'field'    => 'sps.fl_ativo',
				'operator' => '=',
				'value'	   => 'true'
			);

			$where[] = array(
					'field'    => "TO_CHAR(sps.dt_criacao,'DD/MM/YYYY')",
					'operator' => '<=',
					'value'	   => Agro_Util::formatDate($data->sub('2', Zend_Date::DAY), Zend_Date::DATES)
			);

			$where[] = array(
					'field'    => 'ppr.id_safra',
					'operator' => '>=',
					'value'    => '15'
			);
		}

        if (!empty($this->getRequest()->getParam('pendenciasChamados'))) {
            $where[] = array(
                'field'    => 'spr.id',
                'operator' => 'in',
                'value'    => '(' .
                    (new Agronet_Model_Index())->countChamadosTecnica(
                        $this->getRequest()->getParam('safras'),
                        $this->getRequest()->getParam('id_status_chamados'),
                        $this->getRequest()->getParam('fl_pendencia_agro'),
                        (int)Zend_Auth::getInstance()->getIdentity()->id,
                        ['c.id_proposta'],
                        false
                    ) . ')'
            );
        }

		return $where;
	}

	/**
	 * Coloca o title da página para todas as páginas
	 *
	 */
	public function init() {
		$this->view->title = 'Atendimento » Conferência de Propostas';
		require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");
	}

	/**
	 * Retorna a classe de acesso aos dados
	 *
	 */
	public function getModel() {
		return new Atendimento_Model_Proposta();
	}

	public function listAction() {
		$this->getHelper('layout')->disableLayout();
		$this->view->params = $this->getRequest()->getParams();
		$Model = new Seguro_Model_Propostas();
		$where = $this->getFilter();

		// Habilita ou Desabilita a paginacao pelo combo na tela
		if( $this->getRequest()->getParam('ds_chave_menu') == 'devolvida' ) {
			$this->_paginator = false;
		} else {
			$this->_paginator = $this->getRequest()->getParam('show_paginacao');
		}

		$recordsPerPage = ($this->recordsPerPage ? $this->recordsPerPage :  RECORDS_PER_PAGE);
		if ($this->getRequest()->getParam("o")) {
			$Model->_order = trim($this->getRequest()->getParam("o") .' '. $this->getRequest()->getParam("s"));
		}
		$Rs = $Model->fetchAllPaginator($where, $this->getRequest()->getParam('page'), $recordsPerPage, $this->_paginator);
		$this->view->paginator = $Rs;
	}

	/**
	 * Visualizacao da proposta
	 */
	public function viewAction() {
		$this->getHelper('layout')->setLayout('popup');
		$this->view->title .= ' » Visualização';

		if ($this->getRequest()->getParam('id')) {

			// Adiciona os dados da proposta na View
			$Propostas = new Seguro_Model_Propostas();
			$Produtos = new Produto_Model_Produtos();
			$modelTaxasAgrupamentoOrcamentos = new Comercializacao_Model_TaxasAgrupamentoOrcamentos();
			$modelTaxasValores = new Comercializacao_Model_TaxasValores();
			$modelComercializacoesOrcamentos = new Comercializacao_Model_ComercializacoesOrcamentos();
			$modelValorTonelada = new Comercializacao_Model_TaxaAgrupamentoItemSeguradoValorTonelada();

			$idAcaoAbaTaxaComercializacao = (new Sistema_Model_Acoes())
				->getIdAcao('atendimento', 'proposta', 'liberarabataxacomercializacao');

			$usuario = Zend_Auth::getInstance()->getIdentity();
			$isUsuarioAgroTi = (new Sistema_Model_Usuarios())->isUsuarioAgroTi($usuario->ds_nome_usuario);
			
			$this->view->liberarAbaTaxaComercializacao = false;
			if (
				$isUsuarioAgroTi
				|| (new Sistema_Model_UsuarioAcao())->checkPermission($usuario->id, $idAcaoAbaTaxaComercializacao)
			) {
				$this->view->liberarAbaTaxaComercializacao = true;
			}

			$this->view->proposta = $Propostas->get($this->getRequest()->getParam('id'));
			$this->view->produto = $Produtos->find($this->view->proposta->id_produto)->current();
			$this->view->proponente = $this->view->proposta->proponente();
			$this->view->proponente_ppe = $this->view->proposta->proponente_ppe();
			$this->view->propriedade = $this->view->proposta->propriedade();
			$this->view->questionarios = $this->view->produto->questionarios();
			$this->view->questionarios_atendimento = $this->view->produto->questionarios(null,true);
			$this->view->respostas = $this->view->proposta->respostas();
			$this->view->beneficiarios = $this->view->proposta->beneficiarios();
			$this->view->croquis = $this->view->proposta->croquis();
			$this->view->coberturas = $this->view->produto->coberturas(false);
			$this->view->coberturas_proposta = $this->view->proposta->coberturas_contratadas();
			$this->view->propriedades = $this->view->produto->propriedades();
			$this->view->premio_liquido = $this->view->proposta->premio_liquido();
			$this->view->parcelamento = $this->view->proposta->parcelamento();
			$this->view->chamados = $this->view->proposta->chamados();
			$this->view->infoProcessoSinistro = $this->buscaInfoSinistro($this->getRequest()->getParam('id'));
			$this->view->infoAvisosSinistro = $this->buscaInfoAvisosSinistro($this->getRequest()->getParam('id'));
			$this->view->pessoa_autorizada = $this->view->proposta->pessoa_autorizada();
			$this->view->consulta_subvencao_sem_retorno = $this->view->proposta->verifica_consulta_sem_retorno();
			$this->view->subvencao_concedida = $this->view->proposta->verifica_subvencao_concedida();
			$this->view->coberturas_taxas_orcamento = $Propostas->getCoberturasTaxasOrcamento($this->getRequest()->getParam('id'));
			$this->view->valores = new Comercializacao_Form_TaxaValor();
			$this->view->taxa_agrupamento = null;
			$this->view->taxas_valores = [];
			$this->view->vl_produtividade_estimada = null;
			$this->view->vl_tonelada = null;
			
			$itens = (new Seguro_Model_ItensSegurados())
				->getItensDisponiveisByProposta($this->getRequest()->getParam('id'), true);
			
			$valorToneladaLimiteIsProposta = $modelValorTonelada->buscaLimiteProposta($this->getRequest()->getParam('id'));

			$this->view->itens = [];
			foreach ($itens as $item) {
				$this->view->itens[$item['id']] = [
					'idItem' => $item['id'],
					'nrItem' => $item['nr_item_segurado'],
					'nomeItem' => $item['ds_item_segurado'],
					'nomeVariedade' => $item['ds_nome_variedade'],
					'produtividadeEstimada' => '',
					'valorTonelada' => $valorToneladaLimiteIsProposta ?? $item['vl_valor_tonelada']
				];
			}
			
			$idsBeneficiarios = [];
			foreach ($this->view->beneficiarios as $ben) {
				if (!empty($ben['id_beneficiario'])) {
					$idsBeneficiarios[] = $ben['id_beneficiario'];
				}
			}

			$this->view->htmlAvisoModeracaoNegocio = (new Atendimento_Service_Htmlavisomoderacaonegocio())->getHtml(
				$this->view->proposta->id,
				$this->view->proponente['id_proponente'],
				$idsBeneficiarios
			);

			$taxaAgrupamento = $modelTaxasAgrupamentoOrcamentos->getTaxaAgrupamentoByProposta($this->getRequest()->getParam('id'));
			$taxasPEItem = null;
			
			if ($taxaAgrupamento) {
                $this->view->taxa_agrupamento = $taxaAgrupamento->toArray();

				$this->view->tipo_limite_is_item = $this->view->taxa_agrupamento['fl_valor_tonelada_por_item'];

				$taxasPEItem = (new Comercializacao_Model_TaxaAgrupamentoOrcamentoItem())
					->findByIdTaxaAgrupamento((int) $this->view->taxa_agrupamento['id']);

				foreach ($taxasPEItem as $taxa) {
					$this->view->itens[$taxa['id_item_segurado']]['produtividadeEstimada']
						= $taxa['vl_produtividade_estimada'];
				}

				$taxasItensSeguradosValorTonelada = (new Comercializacao_Model_TaxaAgrupamentoItemSeguradoValorTonelada())
					->findByIdTaxaAgrupamento((int) $this->view->taxa_agrupamento['id']);

				$this->view->possui_taxa_valor_tonelada = !empty($taxasItensSeguradosValorTonelada);

				$valorToneladaProposta = !empty($taxasItensSeguradosValorTonelada)
					? $taxasItensSeguradosValorTonelada[0]['vl_tonelada']
					: null;

				$this->view->vl_tonelada = $this->view->taxa_agrupamento['fl_valor_tonelada_por_item']
					? null
					: $valorToneladaProposta;

				$this->view->possuiLimiteValorTonelada= !empty($taxasItensSeguradosValorTonelada);

				foreach ($taxasItensSeguradosValorTonelada as $taxa) {
					$this->view->itens[$taxa['id_item_segurado']]['valorTonelada']
						= $taxa['vl_tonelada'];
				}

                $this->view->taxas_valores = $modelTaxasValores->getCoberturas(
                  $this->view->proposta['id_produto'],
                  $this->view->taxa_agrupamento['id']
                );

                $modelTaxaAgrupamentoMunicipio = new Comercializacao_Model_TaxasAgrupamentoMunicipios();
                $rowsTaxaAgrupamentoMunicipio = $modelTaxaAgrupamentoMunicipio->getTaxaAgrupamento($this->view->taxa_agrupamento['id'])->toArray();

                foreach ($rowsTaxaAgrupamentoMunicipio as $taxasAgrupamentoMunicipio) {
                    if ($taxasAgrupamentoMunicipio['id_municipio'] === $this->view->propriedade['id_municipio']) {
                        $this->view->vl_produtividade_estimada = $taxasAgrupamentoMunicipio['vl_produtividade_estimada'];
                    }
                }
            }
			
			$this->view->comercializacao = new Comercializacao_Form_Comercializacao();
			$comercializacoesOrcamentos = $modelComercializacoesOrcamentos->getComercializacaoByProposta(
              $this->view->proposta['id']
            );

			if (empty($comercializacoesOrcamentos)) {
                $this->view->comercializacao->dt_cobertura_inicio->setValue(Agro_Util::formatDate($this->view->proposta['dt_vigencia_inicio'], Zend_Date::DATES));
                $this->view->comercializacao->dt_cobertura_fim->setValue(Agro_Util::formatDate($this->view->proposta['dt_vigencia_fim'], Zend_Date::DATES));
            }

			if ($comercializacoesOrcamentos) {
                $comercializacoesOrcamentos = $comercializacoesOrcamentos->toArray();

                $this->view->comercializacao->id_comercializacao->setValue($comercializacoesOrcamentos['id']);
                $this->view->comercializacao->nome_comercializacao->setValue($comercializacoesOrcamentos['ds_nome_comercializacao']);
                $this->view->comercializacao->comercializacao_inicio->setValue(date('d/m/Y', strtotime($comercializacoesOrcamentos['dt_comercializacao_inicio'])));
                $this->view->comercializacao->comercializacao_fim->setValue(date('d/m/Y', strtotime($comercializacoesOrcamentos['dt_comercializacao_fim'])));
                $this->view->comercializacao->dt_cobertura_inicio->setValue(date('d/m/Y', strtotime($comercializacoesOrcamentos['dt_cobertura_inicio'])));
                $this->view->comercializacao->dt_cobertura_fim->setValue(date('d/m/Y', strtotime($comercializacoesOrcamentos['dt_cobertura_fim'])));
            }

			$observacoes = $this->view->proposta->observacoes_arquivos_geral(null, false);

			if (is_array($observacoes)) {
				$this->view->observacoes_adicionais = array();
				$this->view->observacao_principal = array();

				foreach ($observacoes as $observacao) {
					if ($observacao['fl_principal']) {
						$this->view->observacao_principal = $observacao;
					} else {
						$this->view->observacoes_adicionais[] = $observacao;
					}
				}
			}
			
			// Adiciona os Orgaos Expedidores na View
			$OrgaosExpedidores = new Sistema_Model_OrgaosExpedidores();
			$this->view->orgaos_expedidores = $OrgaosExpedidores->getCombo();

			// Adiciona os Bancos na View
			$Bancos = new Sistema_Model_Bancos();
			$this->view->bancos = $Bancos->getCombo();

			// Adiciona os Estados Civis na View
			$EstadoCivil = new Sistema_Model_EstadosCivis();
			$this->view->estados_civis = $EstadoCivil->getCombo();

			// Adiciona as Atividades Economicas na View
			$AtividadeEconomica = new Sistema_Model_AtividadeEconomica();
			$this->view->atividades_economicas = $AtividadeEconomica->getCombo();

			// Adiciona os Status na View
			$Status = new Sistema_Model_Status();
			$this->view->status = $Status->getCombo('PR',true);

			// Adiciona os Corretores na View
			$Corretores = new Sistema_Model_Corretores();
			$this->view->corretores = $Corretores->getComboUsuario();

			// Adiciona as Pendencias na View
			$Pendencias = new Atendimento_Model_Pendencia();
			$this->view->pendencias = $Pendencias->getPendenciasProposta($this->getRequest()->getParam('id'),'PENDENCIA_CONFERENCIA');
			if ($this->view->proposta->ds_chave_status == 'CONF_PENDENCIAS') {
				$this->view->prazo = $Pendencias->getPazoPendencias($this->getRequest()->getParam('id'));
			}

			// Adiciona os Motivos de Cancelamento na View
			$Motivos = new Atendimento_Model_TipoCancelamento();
			$this->view->motivos = $Motivos->getMotivosCancelamento();

			// Adiciona os erros na transmissao
			$Analise_Transmissao = new Seguro_Model_PropostasAnaliseTransmissao();
			$this->view->analise_transmissao = $Analise_Transmissao->getAnaliseTransmissao($this->getRequest()->getParam('id'));

			// Adiciona as Rendas na view
			$Rendas = new Sistema_Model_FaixasRemuneracao();
			$this->view->rendas = $Rendas->getCombo();
			
			// Adiciona as Receitas na view
			$Receitas = new Sistema_Model_FaixasReceita();
			$this->view->receitas = $Receitas->getCombo();

			// Verifica se é preciso validar zoneamento ou não
			$Validacoes = new Produto_Model_Validacoes();
			$arValidacoes = $Validacoes->getValidacaoProduto($this->view->proposta->id_produto);

			// Busca, se houver, locais de entrega
			if(!empty(array_intersect(array(33,40,45),array_keys($this->view->coberturas_proposta)))) {
				$LocaisEntrega = new Seguro_Model_PropostasCooperativas();
				$this->view->locais_entrega = $LocaisEntrega->getByIdProposta($this->getRequest()->getParam('id'))->toArray();
			}

			$this->view->flValidaZoneamento = false;
			foreach ($arValidacoes as $VerificaValidacao) {
			    if ($VerificaValidacao->ds_chave == 'VALIDACAO_ZONEAMENTO') {
			        $this->view->flValidaZoneamento = true;
			    }
			}

			if (!empty($this->getRequest()->getParam('tab'))) {
                $this->view->tabClick = 'tabs-taxas-comercializacao';
            }

			$this->view->formChamado = new Atendimento_Form_Chamado();

			$idPropostaVigente = $Propostas->getPropostasVigentes([$this->getRequest()->getParam('id')])[0]['id_proposta'];
			
            $this->view->itensCar = (new Seguro_Service_Car())->buscarItensTalhoesCar(
                [
                    'sis.ds_item_segurado',
                    'sis.nr_item_segurado',
                    'spct.ds_coordenadas_centroide',
                    'sisc.ds_car',
                    'sis.vl_lmga',
                ],
                ['spc.fl_vigente is true', "sis.id_proposta = {$idPropostaVigente}"]
            );
			
			$agrupamentoCar = $this->view->proposta->_agrupamentoCar();

			if (!empty($agrupamentoCar)) {
				$this->view->tipoTaxa = "CAR - id: {$agrupamentoCar['principal'][0]['id_taxa_agrupamento']}";
			} else {
				$agrupamento = $this->view->proposta->agrupamento();

				if ($agrupamento['tp_taxa_agrupamento'] == 'M') {
					$this->view->tipoTaxa = "Município - id: {$agrupamento['id']}";
				} elseif ($agrupamento['tp_taxa_agrupamento'] == 'E') {
					$this->view->tipoTaxa = "Estado - id: {$agrupamento['id']}";
				} elseif ($agrupamento['tp_taxa_agrupamento'] == 'O') {
					$this->view->tipoTaxa = "Orçamento - id: {$agrupamento['id']}";
				} elseif ($agrupamento['tp_taxa_agrupamento'] == 'P') {
					$this->view->tipoTaxa = "Proponente - id: {$agrupamento['id']}";
				} elseif ($agrupamento['tp_taxa_agrupamento'] == 'U') {
					$this->view->tipoTaxa = "Usuário - id: {$agrupamento['id']}";
				} else {
					$this->view->tipoTaxa = '';
				}
			}
		}
	}

	/**
	 * Busca resumo da proposta
	 *
	 * @author Renato - 20/08/2010
	 */
	public function buscaresumoAction() {

		$this->getHelper('layout')->disableLayout();
		$dados       = $this->getRequest()->getParams();
		$id_proposta = $this->getRequest()->getParam('id_proposta');
		//$Proposta    = new Zend_Session_Namespace('proposta');

		$Propostas  = new Seguro_Model_Propostas();
		$Produtos   = new Produto_Model_Produtos();
		$DocFisicos = new Atendimento_Model_PropostaDocumentoFisico();
		$Model      = $this->getModel();
		$this->view->menu                     = $dados['menu'];
		$this->view->proposta                   = $Propostas->get($this->getRequest()->getParam('id_proposta'));
		$this->view->proposta_mae               = $Propostas->get($this->view->proposta->id_proposta_mae);
		$this->view->produto                    = $Produtos->find($this->view->proposta->id_produto)->current();
		$this->view->proponente                 = $this->view->proposta->proponente();
        $this->view->proponenteRestricaoTecnicaProposta = (new Seguro_Model_ProponentesRestricoesTecnicas())->getRestricoesByProponente(
            $this->view->proponente['id_proponente'],
            $this->view->proposta['id']
        );

		$this->view->propriedade                = $this->view->proposta->propriedade();
		$this->view->respostas                  = $this->view->proposta->respostas();
		$this->view->beneficiarios              = $this->view->proposta->beneficiarios();
		$this->view->coberturaPrincipal         = $Model->getCoberturaPrincipal($id_proposta);
		$this->view->coberturaAdicional         = $Model->getCoberturaAdicional($id_proposta);
		$this->view->parcelamento               = $this->view->proposta->parcelamento();
		$this->view->boletos                    = $this->buscaBoletos($id_proposta);
		$this->view->pessoa_autorizada          = $this->view->proposta->pessoa_autorizada();
		$this->view->subvencaoConcedida         = $this->buscaSubvencaoConcedida($this->view->proposta->id_proposta_mae);
		$this->view->subvencaoEstadualConcedida = $this->buscaSubvencaoEstadualConcedida($this->view->proposta->id_proposta_mae);
		$this->view->pg                         = $this->view->proposta->atributos('PROPRIEDADE', 'PROD_PRODUCAO_GARANTIDA');
		$this->view->logTransmissoes            = $this->buscaLogTransmissao($id_proposta);
		$this->view->status                     = $this->buscaResumoStatus($id_proposta);
		$this->view->infoAdicionais             = $this->buscaInfoAdicionais($id_proposta);
		$this->view->infoProcessoSinistro       = $this->buscaInfoSinistro($id_proposta);
		$this->view->infoAvisosSinistro         = $this->buscaInfoAvisosSinistro($id_proposta);
		$this->view->historico_status           = $DocFisicos->getHistoricoStatus($id_proposta);
		$this->view->taxa                       = $this->buscarTaxa($id_proposta);

		foreach($this->view->parcelamento as $parcela){
			$vl_segurado_total += $parcela['vl_segurado'];
			$vl_subvencao_federal_total += $parcela['vl_subvencao_federal'];
			$vl_subvencao_estadual_total += $parcela['vl_subvencao_estadual'];
		}
		$vl_premio_total = $vl_segurado_total + $vl_subvencao_federal_total + $vl_subvencao_estadual_total;
		$arPremio['vl_segurado_total'] = $vl_segurado_total;
		$arPremio['vl_subvencao_federal_total'] = $vl_subvencao_federal_total;
		$arPremio['vl_subvencao_estadual_total'] = $vl_subvencao_estadual_total;
		$arPremio['vl_premio_total'] = $vl_premio_total;
		$this->view->premio = $arPremio;

		$observacoes = $this->view->proposta->observacoes();

		if (is_array($observacoes)) {
			$this->view->observacoes_adicionais = array();
			$this->view->observacao_principal = array();
			foreach ($observacoes as $observacao) {
				if ($observacao['fl_principal']) {
					$this->view->observacao_principal = $observacao;
				} else {
					$this->view->observacoes_adicionais[] = $observacao;
				}
			}
		}

		$modelPropostaCotacaoAgritask = new Seguro_Model_PropostasCotacaoAgritask();
		$rowPropostaCotacaoAgritask = $modelPropostaCotacaoAgritask->getRow($id_proposta);
		$this->view->fl_orcamento_teste = (!empty($rowPropostaCotacaoAgritask) && $rowPropostaCotacaoAgritask['fl_orcamento_teste']);

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

		$this->view->id_proposta = $this->getRequest()->getParam('id_proposta');
		$this->view->desabilitar_liberacao = 'disabled';
		
		if ($this->view->proposta['id_status'] == Seguro_Model_Propostas::ID_STATUS_CANCELADA) {
			
			$this->view->desabilitar_liberacao = '';
			$modelPropostasDevolucoes = new Seguro_Model_PropostasDevolucoes();
			$select = $modelPropostasDevolucoes->getData(["pd.id_proposta = {$this->view->id_proposta}"]);
            $rs = $modelPropostasDevolucoes->fetchAll($select);
			
            if (!empty($rs[0]['ds_chave_devolucao']) && in_array($rs[0]['ds_chave_devolucao'], ['DEVOLUCAO_EFETUADA', 'DEVOLUCAO_EFETUADAO_COM_TERMO', 'FINALIZADO_CREDITO_REAPROVEITADO'])) {
				$this->view->desabilitar_liberacao = 'disabled';
			}
		}

		$this->view->is_usuario_corretor = Sistema_Model_Usuarios::isUsuarioLogadoCorretorPreposto();
		$this->view->aba_destino = !empty($dados['aba']) ? $dados['aba'] : 'abaresumoproposta';

		$this->view->apresentarAbaProrrogacaoParcelas = false;

		$statusInvalidos = [
			Seguro_Model_Propostas::ID_STATUS_NAO_ENVIADA,
			Seguro_Model_Propostas::ID_STATUS_CANCELADA,
			Seguro_Model_Propostas::ID_STATUS_APOLICE_CANCELADA,
			Seguro_Model_Propostas::ID_STATUS_ENDOSSO_CANCELADO,
			Seguro_Model_Propostas::ID_STATUS_ENDOSSO_ANULADO,
		];
		$validacaoCorretor = $this->view->is_usuario_corretor && !in_array($this->view->proposta['id_status'], $statusInvalidos);
		
		if (Agro_Util::checkPermission('atendimento:proposta:prorrogacaoboletos')
			&& (Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro() || $validacaoCorretor)) {
			$this->view->apresentarAbaProrrogacaoParcelas = true;
		}
	}

	public function buscaLogTransmissao($id_proposta) {
		$Model = $this->getModel();
		return $Model->getLog($id_proposta);
	}

	public function buscaBoletos($id_proposta) {
		$Model = $this->getModel();
		return $Model->getBoleto($id_proposta);
	}

	public function buscaSubvencaoConcedida($id_proposta) {
		$Model = $this->getModel();
		return $Model->subvencaoConcedida($id_proposta, true);
	}

	public function buscaSubvencaoEstadualConcedida($id_proposta) {
		$Model = $this->getModel();
		return $Model->subvencaoEstadualConcedida($id_proposta, true);
	}

	public function buscaResumoStatus($id_proposta) {
		$Model = $this->getModel();
		return $Model->getResumoStatus($id_proposta);
	}

	public function buscaInfoAdicionais($id_proposta){
		$Model = $this->getModel();
		return $Model->getObservacoesProposta($id_proposta);
	}

	public function buscaInfoSinistro($id_proposta){
		$Model = new Sinistro2_Model_Processos();
		return $Model->fetchAll($Model->getData("id_proposta = ".$id_proposta));
	}

	public function buscaInfoAvisosSinistro($id_proposta){
		$Model = new Sinistro2_Model_Processos();
		return $Model->getAvisosResumo($id_proposta);
	}

	public function buscaobservacoesAction() {
		$this->getHelper('layout')->disableLayout();

		$Proposta = new Atendimento_Model_Proposta();
		$this->view->proposta = $Proposta->find($this->getRequest()->getParam('id_proposta'))->current();
	}

	public function loadobservacaoAction() {
		$Model = new Seguro_Model_PropostasObservacoes();
		$this->isAjax();

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

		if ($Row) {
			$this->getResponse()->setBody(Zend_Json::encode($Row->toArray()));
		}
	}

	public function salvaobservacoesAction() {
		$dados = $this->getRequest()->getParams();
		$this->isAjax();

		try {
			if ($dados['id_proposta']) {
				$PropostasObservacoes = new Seguro_Model_PropostasObservacoes();
				$dados['id_observacao'] = $PropostasObservacoes->save($dados);

				if (!$_FILES['arquivo']['error']) {
					$ext = Agro_Util::getExtension($_FILES['arquivo']['name']);

					if ($dados['id_observacao']) {
						$dados['ds_nome_arquivo'] = "{$dados['id_proposta']}-{$dados['id_observacao']}.{$ext}";

						if (!$_FILES['arquivo']['error']) {
							$path = APPLICATION_PATH . '/upload_files/proposta_observacoes/' . $dados['ds_nome_arquivo'];
							$sanitizedPath = realpath($path); // Resolves any relative paths and removes unnecessary elements

							if (file_exists($sanitizedPath)){
								unlink($sanitizedPath);
							}

							if (copy($_FILES['arquivo']['tmp_name'], APPLICATION_PATH.'/upload_files/proposta_observacoes/'.$dados['ds_nome_arquivo'])) {
								$PropostasObservacoesArquivos = new Seguro_Model_PropostasObservacoesArquivos();
								$PropostasObservacoesArquivos->clear($dados['id_observacao']);

								if (!$PropostasObservacoesArquivos->save($dados)) {
									echo "<script>alert('Não foi salvar a observação.');</script>";
									return false;
								}
							} else {
								echo "<script>alert('Não foi possível copiar o arquivo para a pasta.');</script>";
								return false;
							}
						}
					}
				}

				echo "<script>alert('Operação realizada com sucesso.');</script>";
				return false;
			} else {
				echo "<script>alert('Não foi informada uma proposta.');</script>";
				return false;
			}
		} catch (Exception $e) {
			echo "<script>alert('Ocorreu um erro inesperado.');</script>";
			return false;
		}
	}

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

		if ($this->getRequest()->getParam('id')) {
			$Propostas = new Atendimento_Model_Proposta();

			$Proposta = $Propostas->find($this->getRequest()->getParam('id'))->current();
			$this->view->observacoes = $Proposta->observacoes_arquivos_geral();
		}

		$this->view->idProposta = $this->getRequest()->getParam('id');
		$this->view->origemPrevia = false;

		if ($this->getRequest()->getParam('origemPrevia') && $this->getRequest()->getParam('origemPrevia') === 'true') {
		    $this->view->origemPrevia = true;
        }
	}

	public function tableobservacoesinternasAction(): void
	{
		$this->isAjax(true);
		$this->view->idProposta = null;
		$this->view->observacoesInternas = [];

		if ($this->getRequest()->getParam('id')) {

			$this->view->idProposta = $this->getRequest()->getParam('id');
			$propostaAtendimento = (new Atendimento_Model_Proposta())->find($this->view->idProposta)->current();
			$coberturasAdicionais = $propostaAtendimento->coberturas_contratadas('adicional');
			$coberturaPrincipal = $propostaAtendimento->coberturas_contratadas('principal');
			
			if (!empty($coberturaPrincipal['ds_observacao_interna'])) {
				$this->view->observacoesInternas[] = $coberturaPrincipal;
			}

			foreach ($coberturasAdicionais as $coberturaAdicional) {
				if (!empty($coberturaAdicional['ds_observacao_interna'])) {
					$this->view->observacoesInternas[] = $coberturaAdicional;
				}
			}
		}
	}

	public function autorizadorenovacaoAction() {
		$this->getHelper('layout')->disableLayout();

		$Form = new Atendimento_Form_AutorizadoRenovacao();

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

			$Proposta = $Model->find($this->getRequest()->getParam('id'))->current();
			$params = $Proposta->buscaUsuarioRenovacao();
			$params["id_proposta"] =  $this->getRequest()->getParam('id');

			$Form->populate($params);
		}

		$this->view->form = $Form;
	}

	public function geraxlsAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$Model = $this->getModel();

		$ret = $Model->getDadosXls();
		require_once(APPLICATION_PATH . "/../library/Agro/xls/PhpSimpleXlsGen.php");

		$myxls = new PhpSimpleXlsGen();
		$myxls->totalcol = 7;
		$myxls->InsertText('Doc.');
		$myxls->InsertText('Segurado');
		$myxls->InsertText('Produto');
		$myxls->InsertText(utf8_decode('Início Vigência'));
		$myxls->InsertText(utf8_decode('Município/UF'));
		$myxls->InsertText('Digitador');
		$myxls->InsertText('Status');
		$myxls->InsertText('Seção');

		foreach($ret as $linha) {
			$myxls->InsertText($linha['id'].' ');
			$myxls->InsertText( utf8_decode($linha['ds_nome_proponente']) . ' ');
			$myxls->InsertText( utf8_decode($linha['ds_nome_abreviado']) . ' ');
			$myxls->InsertText(Agro_Util::formatDate($linha['dt_vigencia_inicio'], 'dd/MM/Y'));
			$myxls->InsertText( utf8_decode($linha['ds_nome_municipio_propriedade']) .'/'. $linha['ds_sigla_propriedade']. ' ');
			$myxls->InsertText( utf8_decode($linha['ds_nome_usuario']) . ' ');
			$myxls->InsertText( utf8_decode($linha['id_status']) . ' ');
			$myxls->InsertText( utf8_decode($linha['id_secao']) . ' ');
		}

		$myxls->SendFile();
	}

	public function cancelaAction(){
		$this->getHelper('layout')->disableLayout();
		$dados = $this->getRequest()->getParams();

		if ($this->getRequest()->getParam('id')) {
			$Propostas = new Seguro_Model_Propostas();
			$this->view->proposta = $Propostas->get($this->getRequest()->getParam('id'));
		}
	}

	public function loadxmltransmissaoAction(){
		$this->getHelper('layout')->setLayout('popup');
		$this->view->title .= ' » Xml - '.$this->getRequest()->getParam('id');

		$Model = $this->getModel();
		$this->view->xml = $Model->getXmlTransmissao($this->getRequest()->getParam('id'));

	}

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

	public function buscaboletosAction(){
		$this->isAjax(true);
		$this->view->boletos = $this->buscaBoletos($this->_getParam('id'));
	}

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

        $idProposta = (int)$this->getRequest()->getParam('id_proposta');
        $this->view->id_proposta = $idProposta;
        $this->view->nr_endosso = (new Seguro_Model_Propostas())->find($idProposta)->current()->nr_endosso();
        $this->view->form = new Atendimento_Form_TipoCancelamento();

        $dadosPropostaMae = (new Seguro_Service_Proposta())->dadosPropostaMae($idProposta);
        $this->view->form->getElement('dt_inicio_vigencia_cancelamento')->setValue(
            Agro_Utils_Date::create($dadosPropostaMae['dt_vigencia_inicio'])->toString(Agro_Utils_Date::FORMAT_PT_BR)
        );
    }

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

		$data = array('acao' => 'enviar',
					  'campo' => 'on',
					  'commit' => 'Consultar DAF');

		if ($this->getRequest()->getParam('tp_pessoa') == 'F') {
			$merged = array_merge( array('prontuarioPF' => $this->getRequest()->getParam('daf')), $data);
		} elseif ($this->getRequest()->getParam('tp_pessoa') == 'J') {
			$merged = array_merge( array('prontuarioPJ' => $this->getRequest()->getParam('daf')), $data);
		}

		$options = array(
			'http' => array(
				'header' => "Content-type: application/x-www-form-urlencoded\r\n",
				'method' => 'POST',
				'content' => http_build_query($merged)
			),
		);

		$context = stream_context_create($options);

		$this->view->context = file_get_contents(URL_DAF, false, $context);
	}

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

		$Propostas   = new Seguro_Model_Propostas();
		$Transmissao = new Seguro_Model_TransmissaoEssor();
		$TipoCancelamento = new Atendimento_Model_TipoCancelamento();
		$PropostaDigitalizado = new Seguro_Model_PropostaStatusDocumentoDigitalizado();
        $servicePropostasCancelamentoApolice = new Seguro_Service_PropostaCancelamentoApolice();

		$Proposta    = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
		$Produto = $Proposta->produto();
		$return = array();

		if ($this->getRequest()->getParam('id_motivo_cancelamento_apolice')) {
			$motivos = $TipoCancelamento->fetchAll("ds_chave = 'APOLICE_CANCELADA' and id in (".implode(',', $this->getRequest()->getParam('id_motivo_cancelamento_apolice')).") ")->toArray();
			foreach ($motivos as $motivo) {
				$mtv[] = $motivo['ds_tipo_cancelamento'];

				if (($motivo['ds_tipo_cancelamento'] == 'Outro.') && ($this->getRequest()->getParam('ds_observacao_cancelamento_apolice') == '')){
					$return['status'] = false;
					$return['message'] = 'Quando o motivo "Outro" é selecionado, uma observação é obrigatório.';
				} else {
					$return['status'] = true;
				}
			}
		} else {
			$return['status'] = true;
		}
		
		$dataInicioVigenciaCancelamento = $this->getRequest()->getParam('dt_inicio_vigencia_cancelamento');
		if (
			!empty($dataInicioVigenciaCancelamento)
			&& $Proposta->id == $Proposta->id_proposta_mae
		) {
			try {
				$cancelamentoApoliceSalvo = $servicePropostasCancelamentoApolice->salvar([
					'id_proposta' => $this->getRequest()->getParam('id_proposta'),
					'dt_inicio_vigencia_cancelamento' => $dataInicioVigenciaCancelamento
				]);

				if (!$cancelamentoApoliceSalvo) {
					$return['status'] = false;
					$return['message'] = 'Erro ao salvar o cancelamento de apólice.';
				}
				
			} catch (Exception $erro) {
				$return['status'] = false;
				$return['message'] = $erro->getMessage();
			}
		} else {
			$return['status'] = true;
		}
		
		if ($return['status'] != false) {

			if (count($mtv) > 0) {
				$ds_motivo = implode(' ', $mtv);
				$ds_motivo = $this->getRequest()->getParam('ds_observacao_cancelamento_apolice') ? $ds_motivo . ' ' . $this->getRequest()->getParam('ds_observacao_cancelamento_apolice') : $ds_motivo;
			} else {
				$ds_motivo = $this->getRequest()->getParam('ds_observacao_cancelamento_apolice');
			}

			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);
			}

			$xml         = $Transmissao->montaXMLTransmissaoEssor($this->getRequest()->getParam('id_proposta'), 'CANCELAMENTO', $Proposta->ds_identificador_seguradora, $ds_motivo);
			$mysoapmsg   = $client->serializeEnvelope($xml);

			$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_proposta'),
								'ds_retorno'         => utf8_encode($client->getError()),
								'fl_sucesso'         => 'f',
								'ds_tipo_transmissao' => 'EMITIR_PROPOSTA',
								'ds_xml_transmissao' => $mysoapmsg,
								'dt_envio'           => $dtEnvio,
								'dt_retorno'         => $dtRetorno
						)
				);

			} 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.";

					$Propostas->gravaLogTransmissao(
							array(
									'id_proposta'        => $this->getRequest()->getParam('id_proposta'),
									'ds_retorno'         => $result_xml->nm_retorno,
									'fl_sucesso'         => 'f',
									'ds_tipo_transmissao' => 'EMITIR_PROPOSTA - (cancelamento)',
									'ds_xml_transmissao' => $mysoapmsg,
									'dt_envio'           => $dtEnvio,
									'dt_retorno'         => $dtRetorno
							)
					);

				} else {
					if($result_xml->id_endosso){
						$return['message'] = 'Apólice/Endosso cancelado com sucesso.';
						$return['status'] = true;

						$Propostas->gravaLogTransmissao(
								array(
										'id_proposta'        => $this->getRequest()->getParam('id_proposta'),
										'ds_retorno'         => $result_xml->id_endosso,
										'fl_sucesso'         => 't',
										'ds_tipo_transmissao' => 'EMITIR_PROPOSTA - (cancelamento)',
										'ds_xml_transmissao' => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno
								)
						);
					} else {
						$return['status'] = false;
						$return['message'] = 'Erro: Falha de recepção na Seguradora.';

						$Propostas->gravaLogTransmissao(
								array(
										'id_proposta'        => $this->getRequest()->getParam('id_proposta'),
										'ds_retorno'         => $result_xml->nm_retorno,
										'fl_sucesso'         => 'f',
										'ds_tipo_transmissao' => 'EMITIR_PROPOSTA - (cancelamento)',
										'ds_xml_transmissao' => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno
								)
						);
					}
				}
			}

			if($return['status'] == true){
				$ModelStatus = new Sistema_Model_Status();

				if($Proposta->versao_endosso(false) > 0){

					if($this->getRequest()->getParam('anular_apolice') == 'true'){
						$id_novo_status = $ModelStatus->getIdStatus('ENDOSSO_ANULADO');
					} else {
						$id_novo_status = $ModelStatus->getIdStatus('ENDOSSO_CANCELADO');
					}

					if ($this->getRequest()->getParam('id_proposta') != $Proposta->id_proposta_mae) {
						$PropostaDigitalizado->atualizarStatus(
							$this->getRequest()->getParam('id_proposta'),
							Seguro_Model_PropostaStatusDocumentoDigitalizado::STATUS['DOC_DISPENSADO'],
							$ds_motivo
						);
					}

					if($Proposta->proposta_vigente()){
						$id_proposta_reativacao = $Proposta->id_proposta_reativacao();

						//Transfere processo de sinistro para a proposta a ser reativada
						$PropostaEndosso = new Endosso_Model_Propostas();
						$Sinistro        = $PropostaEndosso->find($this->getRequest()->getParam('id_proposta'))->current();

						if($Sinistro->id){
							if (!$PropostaEndosso->endossarSinistro($Sinistro->id, $id_proposta_reativacao)) {
								Zend_Db_Table_Abstract::getDefaultAdapter()->rollBack();
								$return = array('message' => 'Não foi possível realizar o endosso.');
								$this->getResponse()->setBody(Zend_Json::encode($return));
								return false;
							}
						}

						//Desativa Endosso e o coloca como Endosso Cancelado
						$Propostas->changeStatusId($this->getRequest()->getParam('id_proposta'), $id_novo_status, $ds_motivo);

						//Reativa Endosso anterior
						$PropostasEndosso = new Seguro_Model_PropostasEndosso();
						$PropostasEndosso->save(array('id_proposta_nova' => $id_proposta_reativacao, 'id_proposta_antiga' => $this->getRequest()->getParam('id_proposta')));
						$return['message'] = 'Endosso cancelado com sucesso. Endosso/Apólice anterior ativado.';
					} else {

						//Desativa Endosso e o coloca como Endosso Cancelado
						$Propostas->changeStatusId($this->getRequest()->getParam('id_proposta'), $id_novo_status, $ds_motivo);
						$return['message'] = 'Endosso cancelado com sucesso.';
					}

					$this->cancelarVistoriaPrevia($this->getRequest()->getParam('id_proposta'));
				} else {
					//Cancela toda a Apolice e seus endossos marcando todos como APOLICE_CANCELADA
					$PropostasEndosso = $Proposta->propostas_endosso($Proposta->id_endosso());
					foreach($PropostasEndosso as $chave => $propostaCancelar){
						$Propostas->changeStatusId($propostaCancelar['id'], $ModelStatus->getIdStatus('APOLICE_CANCELADA'), $ds_motivo);
						$this->cancelarVistoriaPrevia($propostaCancelar['id']);
					}
					$PropostaRow = $Propostas->get($this->getRequest()->getParam('id_proposta'));

					//imagem da assinatura
					$Mail = new Agro_Mail();
					$Mail->clearFrom();
					$Mail->setFrom('atendimento@agrobrasilseguros.com.br', 'AgroBrasil - Agronet 2.0');
					$filename = RESOURCES . "/imagens/assinatura_email.png";
					$at = $Mail->createAttachment(file_get_contents($filename));
					$at->type = $this->mimeByExtension($filename);
					$at->disposition = Zend_Mime::DISPOSITION_INLINE;
					$at->encoding = Zend_Mime::ENCODING_BASE64;
					$at->id = 'cid_' . md5_file($filename);

					//Notifica Corretor sobre o cancelamento
					$Subject = "Alerta de CANCELAMENTO: Proposta {$PropostaRow->doc()} / {$PropostaRow->ds_nome_proponente}";//"Alteração de Status da Proposta {$PropostaRow->doc()}: {$PropostaRow->status()}";
					$infoProposta = $PropostaRow->id_ramo.'.'.$PropostaRow->id_seguradora.'.'.$PropostaRow->id_produto.'.'.$PropostaRow->id.'-'.$PropostaRow->nr_digito_verificador;
					$Body = "
	<p style=\"margin-bottom: 15px\">Prezado Corretor, </p>

	<p style=\"margin-bottom: 15px\">
	Informamos O CANCELAMENTO da apólice <b>{$PropostaRow->nr_apolice}</b> referente à proposta <b>{$infoProposta}</b>, conforme motivo abaixo:
	</p>

	<p style=\"margin-bottom: 15px\">
	Motivo: <b>{$ds_motivo}</b>
	</p>

	<p style=\"margin-bottom: 15px; font-weight: bold\">
	Alertamos que este cancelamento deverá ser informado de imediato, para evitar qualquer prejuízo ao Segurado.
	</p>

	<p style=\"margin-bottom: 15px\">
	Acesse o sistema Agronet 2.0 através do endereço: <a href=\"http://agronet.agrobrasilseguros.com.br/\">http://agronet.agrobrasilseguros.com.br/</a>
	</p>

	<img src=\"cid:".$at->id."\" height=\"61\" width=\"467\" />
	<br />
	<span style=\"color: grey; margin: 0!important;  font-family: Verdana; font-size: .5em; text-align: left; display: block;\">
	<font face='webdings' style=\"color: darkgreen\">i</font> 
	<span style=\"color: darkblue\"> Este e-mail, inclusive anexos, podem conter informações confidenciais de propriedade exclusiva da AgroBrasil Seguros,
	<br />não devendo ser utilizado, copiado ou revelado sem prévia autorização.</span> This e-mail, including attachments, is intended<br /> for
	the person(s) or company named and may contain confidential and/or legally privileged information. Unauthorized<br /> disclosure,
	copying or use of this information may be unlawful and is prohibited. If you are not the intended recipient,<br /> please delete this
	message and notify the sender.
	</span>
	<br />
	<span style=\"color: grey; margin: 0!important; font-family: Verdana; font-size: .5em; text-align: left; display: block\">
	<font face='webdings'  style=\"color: darkgreen\">P</font> <span style=\"font-weight: bold\">Antes de imprimir, pense em seu compromisso com o Meio Ambiente.</span> Before printing, think about your<br /> commitment
	to the environment.
	</div>
	";

	//				$Body  = "O Status da proposta {$PropostaRow->doc()} em nome de {$PropostaRow->ds_nome_proponente}, foi alterado para {$PropostaRow->status()}.\n\n";
	//				$Body .= "Observação: ".$this->getRequest()->getParam('ds_motivo_cancelamento_apolice');

					if (!$this->getRequest()->getParam('lote')) {
						$Mail->notificarCorretor($PropostaRow, $Subject, $Body, array('html' => true), false);
					}

					$mensagem = 'Apólice (e Endossos quando existirem) cancelada com sucesso.';

					if ($Produto["ds_nome_cultura"] == "Pastagem") {
						try {
							$AgriTaskCotacao = new Agro_AgritaskCotacao();
							$AgriTaskCotacao->atualizarStatus($this->getRequest()->getParam('id_proposta'), Agro_AgritaskCotacao::STATUS_APOLICE_CANCELADA);
						} catch (\Throwable $th) {
							$mensagem = "Apólice (e Endossos quando existirem) cancelada com sucesso, porém não foi possível atualizar o status na Agritask.";
							$Propostas->gravaLogTransmissao(
								array(
										'id_proposta' => $this->getRequest()->getParam('id_proposta'),
										'ds_retorno' => $th->getMessage(),
										'fl_sucesso' => 'f',
										'ds_tipo_transmissao' => 'AGRITASK_ATUALIZAR_STATUS',
										'dt_envio'            => $dtEnvio,
										'dt_retorno'          => $dtRetorno
								)
							);
						}
					}

					$return['message'] = $mensagem;
				}
			} else {
                if (empty($return['message'])) {
                    $return['message'] = 'Erro ao cancelar Endosso.';
                }
			}
		}

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

    private function mimeByExtension($filename)
    {
        if (is_readable($filename) ) {
            $extension = pathinfo($filename, PATHINFO_EXTENSION);
            switch ($extension) {
                case 'gif':
                    $type = 'image/gif';
                    break;
                case 'jpg':
                case 'jpeg':
                    $type = 'image/jpg';
                    break;
                case 'png':
                    $type = 'image/png';
                    break;
                default:
                    $type = 'application/octet-stream';
            }
        }

        return $type;
    }

    public function uploadpropostaAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();
        
        $model = new Seguro_Model_PropostasArquivos();
        
        $idProposta = !Agro_Util::filterVariable($this->getRequest()->getParam('id_proposta'))
            ? 0
            : (int)$this->getRequest()->getParam('id_proposta');
        $result = 'false';
        $tipo = !Agro_Util::filterVariable($this->getRequest()->getParam('id_tipo_arquivo'))
            ? 0
            : (int)$this->getRequest()->getParam('id_tipo_arquivo');

        if (!empty($_FILES['file']['name']) && is_array($_FILES)) {
            $path = APPLICATION_PATH . '/upload_files/digitalizados';

            foreach ($_FILES as $file) {
                $ext = end(explode('.', $file['name']));

                if (Agro_File::isInvalidExtension($ext)) {
                    $result = false;
                }

                if ($result) {
                    $tmpFile = $file['tmp_name'];
                    $newName = $this->newName($idProposta, $tipo) . '.' . $ext;
                    $target = $path . '/' . $newName;

                    if (copy($tmpFile, $target)) {
                        $dados['id_proposta'] = $idProposta;
                        $dados['id_tipo_arquivo'] = $tipo;
                        $dados['ds_nome_arquivo'] = $newName;
                        $dados['id_status'] = 194; //PENDENTE DE ANÁLISE

                        $condicao = 'id_proposta = ' . $idProposta;
                        $condicao .= ' and fl_ativo = true and id_tipo_arquivo = ' . $tipo;
                        $oldFile = $model->fetchRow($condicao);

                        //se não existir arquivo da proposta não tem porque setar para false
                        if ($oldFile) {
                            $disabled = $model->setArquivoFalse($oldFile['id']);
                            if ($model->saveDigitalizados($dados) && $disabled) {
                                $result = true;
                            }
                        } else {
                            if ($model->saveDigitalizados($dados)) {
                                $result = true;
                            }
                        }
                    }
                }
            }
        }

        $this->getResponse()->setBody("<script>window.top.window.stopUpload(" . $result . "," . $idProposta . ");</script>");
    }

    //Gera um novo nome de arquivo
    private function newName($idProposta, $idTipoArquivo) {
        $files = new Seguro_Model_PropostasArquivos();
        $splited = explode('.',end(explode('_', $files->getLastArquivoByProposta($idProposta, $idTipoArquivo))));
        $newname = str_pad($splited[0]+1, 3, 0, STR_PAD_LEFT);

        switch ($idTipoArquivo) {
            case 17: return $idProposta.'_'.$newname;
                break;
            case 18: return $idProposta.'_FEDERAL_'.$newname;
                break;
            case 19: return $idProposta.'_ESTADUAL_'.$newname;
                break;
        }

    }

    public function propostadigitalizadaAction() {
        $this->getHelper('layout')->disableLayout();
        $Model = new Seguro_Model_PropostasArquivos();
        $this->view->id_proposta = $this->getRequest()->getParam('id_proposta');
        $this->view->arquivos_propostas = $Model->listArquivosDigitalizados($this->getRequest()->getParam('id_proposta'), 17);
        $this->view->arquivos_federal = $Model->listArquivosDigitalizados($this->getRequest()->getParam('id_proposta'), 18);
        $this->view->arquivos_estadual = $Model->listArquivosDigitalizados($this->getRequest()->getParam('id_proposta'), 19);
   		$PropostaLoad = new Seguro_Model_PropostaLoad($this->getRequest()->getParam('id_proposta'));
		$Proposta = new Zend_Session_Namespace('proposta');

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

    }

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

    public function salvaanalisadigitalizadoAction() {
        $this->getHelper('layout')->disableLayout();
        $this->getHelper('ViewRenderer')->setNoRender();
        $return = array('status' => 'false', 'message' => 'Nenhuma ação efetuada.');

        $ModelArquivoPendencias = new Seguro_Model_PropostasArquivosPendencias();
        $ModelArquivo = new Seguro_Model_PropostasArquivos();

        Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

        //pega o registro do arquivo
        $arquivo = $ModelArquivo->fetchRow('id = '. $this->getRequest()->getParam('id_arquivo'))->toArray();

        //seta registro anterior para false
        if ($ModelArquivo->setArquivoFalse($this->getRequest()->getParam('id_arquivo'))) {
            $arquivo['id_status'] = $this->getRequest()->getParam('id_status_arquivo');

            //salva arquivo novo
            $newArquivo = $ModelArquivo->saveDigitalizados($arquivo);

            //se tiver pendências (status 195)
            if (($newArquivo) && ($this->getRequest()->getParam('id_status_arquivo') == 195)) {
                $data['id_proposta_arquivo'] = $newArquivo;

                //para cada pendência salva se houver erro sai do loop
                foreach ($this->getRequest()->getParam('id_pendencia') as $pendencia) {
                    $data['id_pendencia'] = $pendencia;

                    if ($ModelArquivoPendencias->save($data)) {
                        $return['status'] = true;
                        $return['message'] = 'Pendências salvas com sucesso.';
                    } else {
                        $return['status'] = false;
                        $return['message'] = "Atenção\nErro ao salvar pendência.";
                        Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
                        $this->getResponse()->setBody(Zend_Json::encode($return));
                        return;
                    }
                }
                Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

            //só arquivo sem pendência (status 196)
            } elseif ($newArquivo) {
               $return['status'] = true;
               $return['message'] = 'Status atualizado.';
               Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

            } else {
               $return['status'] = false;
               $return['message'] = "Atenção!\nErro ao salvar novo arquivo(s).";
               Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
            }
        } else {
            $return['status'] = false;
            $return['message'] = "Atenção!\nErro na desabilitação do registro de arquivo anterior.";
            Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
        }

        $this->getResponse()->setBody(Zend_Json::encode($return));
    }
    
    public function cancelarapolicelotesemessorAction(){
    	$this->isAjax();
    
    	$Propostas   = new Seguro_Model_Propostas();
    	$PropostaDigitalizado = new Seguro_Model_PropostaStatusDocumentoDigitalizado();
    	$Proposta    = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();

    	$return['status'] = false;
    	$return['status'] = true;
    
    	if($return['status'] == true){
    		$ModelStatus = new Sistema_Model_Status();
    
    		if($Proposta->versao_endosso(false) > 0){
    
    			if($this->getRequest()->getParam('anular_apolice') == 'true'){
    				$id_novo_status = $ModelStatus->getIdStatus('ENDOSSO_ANULADO');
    			} else {
    				$id_novo_status = $ModelStatus->getIdStatus('ENDOSSO_CANCELADO');
    			}

				if ($this->getRequest()->getParam('id_proposta') != $Proposta->id_proposta_mae) {
					$PropostaDigitalizado->atualizarStatus(
						$this->getRequest()->getParam('id_proposta'),
						Seguro_Model_PropostaStatusDocumentoDigitalizado::STATUS['DOC_DISPENSADO'],
						$this->getRequest()->getParam('ds_motivo_cancelamento_apolice')
					);
				}
    
    			if($Proposta->proposta_vigente()){
    				$id_proposta_reativacao = $Proposta->id_proposta_reativacao();
    
    				//Transfere processo de sinistro para a proposta a ser reativada
    				$PropostaEndosso = new Endosso_Model_Propostas();
    				$Sinistro        = $PropostaEndosso->find($this->getRequest()->getParam('id_proposta'))->current();
    
    				if($Sinistro->id){
    					if (!$PropostaEndosso->endossarSinistro($Sinistro->id, $id_proposta_reativacao)) {
    						Zend_Db_Table_Abstract::getDefaultAdapter()->rollBack();
    						$return = array('message' => 'Não foi possível realizar o endosso.');
    						$this->getResponse()->setBody(Zend_Json::encode($return));
    						return false;
    					}
    				}
    					
    				//Desativa Endosso e o coloca como Endosso Cancelado
    				$Propostas->changeStatusId($this->getRequest()->getParam('id_proposta'), $id_novo_status, $this->getRequest()->getParam('ds_motivo_cancelamento_apolice'));
    
    				//Reativa Endosso anterior
    				$PropostasEndosso = new Seguro_Model_PropostasEndosso();
    				$PropostasEndosso->save(array('id_proposta_nova' => $id_proposta_reativacao, 'id_proposta_antiga' => $this->getRequest()->getParam('id_proposta')));
    				$return['message'] = 'Endosso cancelado com sucesso. Endosso/Apólice anterior ativado.';
    			} else {
    
    				//Desativa Endosso e o coloca como Endosso Cancelado
    				$Propostas->changeStatusId($this->getRequest()->getParam('id_proposta'), $id_novo_status, $this->getRequest()->getParam('ds_motivo_cancelamento_apolice'));
    				$return['message'] = 'Endosso cancelado com sucesso.';
    			}
    		} else {
    			$PropostaCancelamento = new Seguro_Model_PropostasCancelamento();
    			//Cancela toda a Apolice e seus endossos marcando todos como APOLICE_CANCELADA
    			$PropostasEndosso = $Proposta->propostas_endosso($Proposta->id_endosso());
    			foreach($PropostasEndosso as $chave => $propostaCancelar){
    				$Propostas->changeStatusId($propostaCancelar['id'], $ModelStatus->getIdStatus('APOLICE_CANCELADA'), $this->getRequest()->getParam('ds_motivo_cancelamento_apolice'));
    				
    				//salvando motivo cancelamento
    				$PropostaCancelamento->save(array('id_proposta' => $propostaCancelar['id'], 'id_motivo_cancelamento' => 35));
    				
    			}
    
    			$PropostaRow = $Propostas->get($this->getRequest()->getParam('id_proposta'));
    
    			$return['message'] = 'Apólice (e Endossos quando existirem) cancelada com sucesso.';
    		}
    	} else {
    		$return['message'] = 'Erro ao cancelar Endosso.';
    	}
    	$this->getResponse()->setBody(Zend_Json::encode($return));
    }
	
	public function checarcroquiAction() {
		$this->isAjax(true);
		$PropostaCroquis = new Seguro_Model_PropostasCroquis();
		$croqui = $PropostaCroquis->getLastInsertCroqui($this->getRequest()->getParam('id_proposta'));
		$this->view->ds_nome_arquivo = $croqui[0]['ds_nome_arquivo'];
	}

	public function buscarTaxa($id_proposta)
    {
        if (empty($id_proposta)) {
            return [];
        }

        $modelPropostasTaxasAgrupamento = new Seguro_Model_PropostasTaxasAgrupamento();
        $rowTaxaAgrupamento = $modelPropostasTaxasAgrupamento->getTaxaAgrupamento($id_proposta);

		if (empty($rowTaxaAgrupamento)) {
            return [];
        }

        $dados = $rowTaxaAgrupamento->toArray();

        switch ($dados['tp_taxa_agrupamento']) {
			case Comercializacao_Model_TaxasAgrupamentos::TIPO_CAR:
				$dados['tipo_taxa'] = 'Propriedade';
				$proposta = (new Seguro_Model_Propostas())->get($id_proposta);

				$taxas = $proposta->_agrupamentoCar();
				$ids =  implode(', ', $taxas['idsTaxasAgrupamentoUtilizadas']);
				
				$dados['id'] = $ids;

				break;
            case Comercializacao_Model_TaxasAgrupamentos::TIPO_MUNICIPIO:
                $dados['tipo_taxa'] = 'Município';

                break;
            case Comercializacao_Model_TaxasAgrupamentos::TIPO_USUARIO:
                $dados['tipo_taxa'] = 'Usuário';

                break;
            case Comercializacao_Model_TaxasAgrupamentos::TIPO_PROPONENTE:
                $dados['tipo_taxa'] = 'Proponente';

                break;
            case Comercializacao_Model_TaxasAgrupamentos::TIPO_ORCAMENTO:
                $dados['tipo_taxa'] = 'Orçamento';

                break;
            default:
                $dados['tipo_taxa'] = 'Estado';
                break;
        }
		
        return $dados;
    }
	
	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 cadastrarobservacaoAction()
    {
        $this->getHelper('layout')->disableLayout();

        $parametros = $this->getRequest()->getParams();

        if (isset($parametros['id_proposta'])) {
            $this->view->proposta = (new Atendimento_Model_Proposta())->find($parametros['id_proposta'])->current();
        }
    }

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

        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();
        $this->_return['mensagem'] = 'Observações salvas com sucesso.';
        $this->_return['propostasErro'] = [];
        $this->_return['indiceLinhaSucesso'] = [];

        $modelProposta = new Seguro_Model_Propostas();
        $modelPropostasObservacoes = new Seguro_Model_PropostasObservacoes();
        $modelPropostasObservacoesArquivos = new Seguro_Model_PropostasObservacoesArquivos();
        $zip = new ZipArchive();
        $temArquivoLote = false;

        if (isset($_FILES['arquivoLote'])) {
            $zipFile = $zip->open($_FILES['arquivoLote']['tmp_name']);

            if ($zipFile !== true) {
                switch ($zipFile) {
                    case ZipArchive::ER_NOZIP:
                        throw new Exception('Arquivo inválido.');

                    default:
                        throw new Exception('Erro ao abrir o arquivo compactado.');
                }
            }

            $temArquivoLote = true;
        }

        foreach ($_FILES as $indice => $file) {
            $indiceExplode = explode('_', $indice);
            $idProposta = trim((int)$this->_requestParams["idProposta_{$indiceExplode[1]}"]);
            $descricao = trim($this->_requestParams["descricao_{$indiceExplode[1]}"]);
            $errosLinha = [];
            $idPropostaObservacao = null;

            try {
                $adapter->beginTransaction();

                if (empty($idProposta)) {
                    $errosLinha[] = "- Proposta não informada ou inválida.";
                }

                if (empty(trim($descricao))) {
                    $errosLinha[] = "- Descrição não informada.";
                }

                if (!empty($idProposta) && !empty($descricao)) {
                    $rowProposta = $modelProposta->find($idProposta)->toArray();

                    if (empty($rowProposta)) {
                        $errosLinha[] = "- Proposta não encontrada.";
                    } elseif (in_array((int) $rowProposta[0]['id_status'], [Seguro_Model_Propostas::ID_STATUS_INCOMPLETA, Seguro_Model_Propostas::ID_STATUS_ENDOSSO_INCOMPLETO])) {
                        $errosLinha[] = "- O número informado não é uma proposta válida.";
                    } else {
                        $idPropostaObservacao = $modelPropostasObservacoes->save([
                            'id_proposta' => $idProposta,
                            'ds_observacao' => $descricao,
                            'fl_observacao_endosso' => isset($this->_requestParams["mostrarVistoriador_{$indiceExplode[1]}"]),
                            'fl_ocultar_itens_segurados' => isset($this->_requestParams["ocultarItens_{$indiceExplode[1]}"]),
                        ]);

                        if (!$idPropostaObservacao) {
                            throw new Exception("Erro ao salvar a observação.");
                        }
                    }
                }

                $nomeArquivoEsperado = trim($this->_requestParams["nomeArquivo_{$indiceExplode[1]}"]);

                if ($temArquivoLote && !empty($nomeArquivoEsperado)) {
                    $arquivoEncontrado = false;

                    for ($i = 0; $i < $zip->numFiles; $i++) {
                        $arquivoAtual = $zip->getNameIndex($i);

                        if ($arquivoAtual === $nomeArquivoEsperado) {
                            $arquivoEncontrado = true;
                            $fileInfo = pathinfo($arquivoAtual);
                            $ext = Agro_Util::getExtension($fileInfo['basename']);
                            $nomeArquivo = "{$idProposta}-{$idPropostaObservacao}.{$ext}";
                            $caminhoArquivo = APPLICATION_PATH . "/upload_files/proposta_observacoes/{$nomeArquivo}";

                            if (copy("zip://{$_FILES['arquivoLote']['tmp_name']}#{$arquivoAtual}", $caminhoArquivo)) {
                                $modelPropostasObservacoesArquivos->clear($idPropostaObservacao);

                                if (!$modelPropostasObservacoesArquivos->save([
                                    'id_observacao' => $idPropostaObservacao,
                                    'ds_nome_arquivo' => $nomeArquivo,
                                ])) {
                                    throw new Exception("Erro ao salvar o arquivo da observação.");
                                }
                            } else {
                                throw new Exception("Não foi possível copiar o arquivo para pasta de destino.");
                            }
                        }
                    }

                    if (!$arquivoEncontrado) {
                        $errosLinha[] = "- Arquivo {$nomeArquivoEsperado} não encontrado no arquivo .zip.";
                    }
                }

                if (!$temArquivoLote && !empty($file['name'])) {
                    $ext = Agro_Util::getExtension($file['name']);
                    $nomeArquivo = "{$idProposta}-{$idPropostaObservacao}.{$ext}";
                    $caminhoArquivo = APPLICATION_PATH . "/upload_files/proposta_observacoes/{$nomeArquivo}";

                    if (file_exists($caminhoArquivo)) {
                        unlink($caminhoArquivo);
                    }

                    if (copy($file['tmp_name'], $caminhoArquivo)) {
                        $modelPropostasObservacoesArquivos->clear($idPropostaObservacao);

                        if (!$modelPropostasObservacoesArquivos->save([
                            'id_observacao' => $idPropostaObservacao,
                            'ds_nome_arquivo' => $nomeArquivo,
                        ])) {
                            throw new Exception("Erro ao salvar o arquivo da observação.");
                        }
                    } else {
                        throw new Exception("Não foi possível copiar o arquivo para pasta de destino.");
                    }
                }

                if (!empty($errosLinha)) {
                    throw new Exception(implode("<br>", $errosLinha));
                }

                $this->_return['indiceLinhaSucesso'][] = $indiceExplode[1];

                $adapter->commit();
            } catch (Exception $erro) {
                $adapter->rollBack();

                $this->_return['erro'] = true;
                $this->_return['mensagem'] = 'Observações salvas com sucesso. Porém, erros foram encontrados.';
                $this->_return['propostasErro'][] = [
                    'idProposta' => $idProposta,
                    'indiceLinha' => $indiceExplode[1],
                    'erro' => $erro->getMessage(),
                ];
            }
        }

        if (empty($this->_return['indiceLinhaSucesso']) && empty($this->_return['propostasErro'])) {
            $this->_return['erro'] = true;
            $this->_return['mensagem'] = 'Nenhuma proposta/descrição informada.';
        }

        $zip->close();

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