<?
/**
 * Classe responsável pelo envio de aviso de sinistro
 */
class Sinistro2_EnvioavisoController extends Agro_Controller_Action{

	public function init() {
		$this->view->title = 'Sinistro » Avisos » Envio de Aviso';
		
		if($this->getRequest()->getParam('popup')){
			$this->getHelper('layout')->setLayout('popup');
		}		
	}

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

	public function getForm() {
		return new Sinistro2_Form_EnvioAviso();
	}

	public function indexAction() {
		$Module = $this->getRequest()->getModuleName();
		$Controller = $this->getRequest()->getControllerName();

		$Session = new Zend_Session_Namespace('filtro');
		$params = $Session->{$Module}->{$Controller};

		if (is_object($this->view->formPesquisaProposta) && $params) {
			$this->view->formPesquisaProposta->populate($params);
		}

		$this->view->title .= " » Listagem";

		$this->view->formPesquisaProposta = new Seguro_Form_PesquisaProposta();
	}

	public function getFilter() {

		$where = array();
		$filter = array();
	
		if ($this->getRequest()->getParam('tipo_pesquisa')) {
	
			if ($this->getRequest()->getParam('valor_pesquisa')) {
				$filter['field'] = $this->getRequest()->getParam('tipo_pesquisa');

				if (is_numeric(trim($this->getRequest()->getParam('valor_pesquisa')))) {
					$filter['operator'] = '=';
					$filter['value'] = trim($this->getRequest()->getParam('valor_pesquisa'));
	
				} else {
					$filter['operator'] = 'ilike';
					$filter['value'] = '%'.$this->getRequest()->getParam('valor_pesquisa').'%';
				}
	
				$where[] = $filter;

				if ($this->getRequest()->getParam('tipo_pesquisa') == 'ds_nome_proponente' && $this->getRequest()->getParam('safra')) {
					
					$filter['field'] = 'ds_nome_safra';
					$filter['operator'] = '=';
					$filter['value'] = $this->getRequest()->getParam('safra'); 
		
					$where[] = $filter;
				
				}
			}else if($this->getRequest()->getParam('safra')){
				$filter['field'] = 'ds_nome_safra';
				$filter['operator'] = '=';
				$filter['value'] = $this->getRequest()->getParam('safra'); 
				$where[] = $filter;
			}
		} 
	
		/*
		 * Se não for funcionário, vê somente suas propostas.
		 */
		$Usuario = Zend_Auth::getInstance()->getIdentity();
	
		if($Usuario->tp_usuario != 'F') {
			if($Usuario->tp_usuario == 'C') {
				$filter['field'] = 'id_corretor';
				$filter['operator'] = '=';
				$filter['value'] = $Usuario->id;
	
				$where[] = $filter;
	
			} else {
				$filter['field'] = 'id_usuario_criacao';
				$filter['operator'] = '=';
				$filter['value'] = $Usuario->id;
	
				$where[] = $filter;
			}
		}

		return $where;
	}

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

		$where = $this->getFilter();

		$safra = $this->getRequest()->getParam('safra');
	
		// Habilita ou Desabilita a paginacao pelo combo na tela
		if (array_key_exists('show_paginacao', $this->getRequest()->getParams())) {
			$this->_paginator = $this->getRequest()->getParam('show_paginacao');
		}

		$Module = $this->getRequest()->getModuleName();
		$Controller = $this->getRequest()->getControllerName();

		$Session = new Zend_Session_Namespace('filtro');
		$Session->{$Module}->{$Controller} = $this->getRequest()->getParams();

		$Model = $this->getModel();

		if ($this->getRequest()->getParam("o")) {
			$Model->_order = trim($this->getRequest()->getParam("o") .' '. $this->getRequest()->getParam("s"));
		}

		$recordsPerPage = ($this->recordsPerPage ? $this->recordsPerPage :  RECORDS_PER_PAGE);

		$Rs = $Model->fetchAllPaginator($where, $this->getRequest()->getParam('page'), $recordsPerPage, $this->_paginator);

		$alert = false;
		foreach ($Rs as $rs){
			if(($rs->id_status == Agro_Util::getIdStatus('CONF_PENDENCIAS', 1) && !$safra)|| ($rs->id_status == Agro_Util::getIdStatus('ENVIADA_AGUARDANDO_CONF', 1) && !$safra)){
				$alert = true;
				$this->getResponse()->setBody("<script>alert('Proposta encontra-se em análise de aceitação do risco. Pedimos que entre em contato com o departamento de Atendimento da Agrobrasil.');</script>");
			}
		}

		if(!$alert) $this->view->paginator = $Rs;

	}

	public function formAction()
    {
        $this->view->form = $this->getForm();
        $this->view->title .= ' » Formulário';
        $this->view->back = '/sinistro2/envioaviso';
        $this->view->values = array(
            'eventos' => array(),
            'fl_ocorrencia_queda_parreiral' => '',
            'fl_ocorrencia_replantio' => ''
        );

        $idProposta = !Agro_Util::filterVariable($this->getRequest()->getParam('proposta'))
            ? 0
            : (int)$this->getRequest()->getParam('proposta');

        $this->view->listDtAvisos = (new Sinistro2_Model_AvisosSinistro())->getDtSinistroAvisos($idProposta);
        $this->view->listChaveCoberturas = (new Seguro_Model_PropostasCoberturas())->getChaveCoberturasByProposta(
            $idProposta
        );
        
        $proposta = (new Seguro_Model_Propostas())->find($idProposta)->current();
        $this->view->form->getElement('ds_email_segurado')->setValue($proposta->proponente('ds_email_proponente'));
        $this->view->pessoa_autorizada = $proposta->pessoa_autorizada();

        $modelProduto = new Produto_Model_Produtos();
        $this->view->produto = $modelProduto->get((int)$proposta->id_produto);

        if ($this->getRequest()->isPost()) {
            $post = $this->getRequest()->getPost();
            $errors = $this->validateFields($post);

            if (!count($errors)) {
                $alerts = $this->verifyAlerts($post);
            }

            if ($this->view->form->isValid($post) && !count($errors) && !count($alerts)) {
                $this->save($post);
            } else {

                if (!empty($errors)) {
                    $errorsMessages = $this->view->form->getMessages();

                    foreach ($errors as $error) {
                        $errorsMessages[$error['field']][$error['type']] = $error['message'];
                    }

                    $this->view->showMessage($this->getHtmlFormError($errorsMessages), 'error');
                } elseif (!empty($alerts)) {
                    foreach ($alerts as $alert) {
                        $alertsMessages = array();
                        $alertsMessages[$alert['field']][$alert['type']] = $alert['message'];
                    }

                    $this->view->form->fl_verify_alerts->setValue(0);

                    $this->view->showMessage($this->getHtmlFormError($alertsMessages), 'alert');
                }
                $this->loadFields($idProposta, $post, $this->getRequest()->getParam('id_proposta_mae'));
            }
        } else {
            // Verifica se existe quadras pra enviar o aviso.
            if (!(new Sinistro2_Model_AvisosEncerramento())->existemQuadrasParaEncerrar($idProposta)) {
                $this->view->msgEncerramento = true;
            }

            // Se tiver id_proposta, mostra form de cadastro de aviso.
            if ($idProposta) {
                $this->loadFields($idProposta, null, $this->getRequest()->getParam('id_proposta_mae'));
            } else {
                $this->_redirect('/sinistro2/avisosinistro');
            }
        }
    }

	public function sendEmailsProponenteRT($params) {
		$modelPropostaProponentes = new Seguro_Model_PropostasProponentes;
		$modelProponente = new Seguro_Model_Proponentes;
		$ModelProposta = new Seguro_Model_Propostas();
		$ModelFuncionario = new Sistema_Model_Funcionarios();
		$propostaProponente = $modelPropostaProponentes->get($params['id_proposta']);
		$proponente = $modelProponente->getProponente($propostaProponente->cpf_cnpj);
		$Proposta  = $ModelProposta->find($this->getRequest()->getParam('proposta'))->current();
		$comercial = $Proposta->comercial();

		if ($proponente['fl_restricao']) {
			$email = new Agro_Mail();
	        if (APPLICATION_ENV == 'production') {
	            $config = array(
	                'ssl' => MAIL_SSL,
	                'port' => MAIL_PORT,
	                'auth' => MAIL_AUTH,
	                'username' => MAIL_USERNAME,
	                'password' => MAIL_PASSWORD
	            );

	            $transport = new Zend_Mail_Transport_Smtp(MAIL_SMTP, $config);
	            $email->setDefaultTransport($transport);
	        }
	        //Coordenadores
	        $email->addTo('luana.beck@agrobrasilseguros.com.br', 'Luana Beck');
			$email->addCc('randal.brandolt@agrobrasilseguros.com.br', 'Randal Brandolt');
			$email->addCc('tiago.zschornack@agrobrasilseguros.com.br', 'Tiago Zschornack');

	        //TI
	        $email->addBcc('ti@agrobrasilseguros.com.br', 'TI - Agrobrasil');

	        //Comercial
			if (!empty($comercial)) {
				$dadosComercial = $ModelFuncionario->getFuncionarioByIdUsuario($comercial["id_comercial"]);

				if (!empty($dadosComercial)) {
					$email->addCc($dadosComercial['ds_email'],  $dadosComercial['ds_nome_funcionario']);
				}
			}

	        $email->setSubject('Alerta de Aviso de Sinistro de proposta em MN - Proposta '.$params['id_proposta']);

	        $today = new Datetime;
	        $body = "
	        <p style=\"margin-bottom: 15px\">
			Informamos que foi emitido um aviso de Sinistro Vinculado a proposta <b>{$params['id_proposta']} na data de <b>{$today->format('d/m/Y')}</b>.
	        </p>

	        <p style=\"margin-bottom: 15px\">
	        Atenciosamente
	        </p>";

	        $email->setBodyHtml($body);
	        $email->send();
	    }
	}

	public function verifyAlerts($post) {
		$alerts = array();
		/*
		 * Verifica se já exite um aviso de sinistro com data de sinistro anterior ao aviso que está sendo enviado.
		 */
		if ($post['fl_verify_alerts'] == 1) {
			$AvisosSinistro = new Sinistro2_Model_AvisosSinistro();
			$date = Agro_Util::formatDate($post['dt_sinistro'].' '.$post['hr_sinistro'].' '.$post['min_sinistro'], 'yyyy-MM-dd HH:mm');
			if ($AvisosSinistro->hasAvisoSinistroAnteriorByIdProposta($post['id_proposta'], $date)) {
				$alerts[] = array('field'=>'dt_sinistro','type'=>'warning','message'=>'Já existe um aviso de sinistro com data de sinistro posterior a data de sinistro do aviso atual.');
			}
		}

		return $alerts;
	}

	public function validateFields(&$post) {
		$errors = array();

		if(!isset($post['id_evento'])) {
			$errors[] = array('field'=>'eventos','type'=>'isEmpty','message'=>'Selecione um evento.');
		}

		/*
		 * Verifica se a data de ocorrência informada é posterior a data em que o aviso está sendo enviada, e em caso positivo
		 * impede o envio do aviso
		 */

		$date = new Zend_Date($post['dt_sinistro'].' '.$post['hr_sinistro'].' '.$post['min_sinistro'], 'dd/MM/yyyy HH:mm:ss');
		$agora = new Zend_Date();

		if($date->compareDate($agora) == 1) {
		    $errors[] = array('field'=>'dt_sinistro','type'=>'isInvalid','message'=>'A data do sinistro não pode ser posterior a data de hoje.');
		}

		/*
		 * Verifica se a data de ocorrência do sinistro informada está fora do período de vigência da proposta, e em caso positivo
		 * impede o envio do aviso
		 */

		$date = new Zend_Date($post['dt_sinistro'].' '.$post['hr_sinistro'].' '.$post['min_sinistro'], 'dd/MM/yyyy');

		$Propostas = new Seguro_Model_Propostas();
		$Proposta = $Propostas->getProposta($post['id_proposta']);
		$dtVigenciaInicio = new Zend_Date($Proposta['dt_vigencia_inicio'], 'dd/MM/yyyy');
		$dtVigenciaFim = new Zend_Date($Proposta['dt_vigencia_fim'], 'dd/MM/yyyy');

		if($date->isEarlier($dtVigenciaInicio) or $date->isLater($dtVigenciaFim)) {
			$errors[] = array('field'=>'dt_sinistro','type'=>'isInvalid','message'=>'A data do sinistro está fora do período de vigência da proposta.');
		}

		if (in_array('COB_QUEDA_PARREIRAL', $this->view->listChaveCoberturas)  || in_array('COB_QUEDA_PARREIRAL_ESTENDIDA', $this->view->listChaveCoberturas)) {
			if(!$post['fl_ocorrencia_queda_parreiral']) {
				$errors[] = array('field'=>'fl_ocorrencia_queda_parreiral','type'=>'isEmpty','message'=>'Informe se houve Queda de Parreiral.');
			} else {
			    /*
			     * Verifica se o evento 'Ventos Fortes' foi assinalado e se foi respondido 'Sim' na questão 'Ocorreu Queda de Parreiral', e em
			     * positivo exibe a mensagem de erro, pois o evento 'Ventos Fortes' só possui cobertura quando houver ocorrência de queda de parreiral
			     */
				if(array_key_exists('id',$post['id_evento']) && $post['ds_chave_evento'] == 'EV_VENTOS_FORTES' && $post['fl_ocorrencia_queda_parreiral'] == 'N') {
		           $errors[] = array('field'=>'eventos','type'=>'isEmpty','message'=>'O evento "Ventos Fortes" só possui cobertura em caso de ocorrência de Queda de Parreiral.');
		       }
			}
		}

		if (in_array('COB_REPLANTIO', $this->view->listChaveCoberturas) || in_array('COB_REPLANTIO_SEM_ESTIAGEM', $this->view->listChaveCoberturas) || in_array('COB_REPLANTIO_EXCESSO_CHUVA', $this->view->listChaveCoberturas)) {
			if(!$post['fl_ocorrencia_replantio']) {
				$errors[] = array('field'=>'fl_ocorrencia_replantio','type'=>'isEmpty','message'=>'Informe se houve Replantio.');
			}
		}

		return $errors;
	}

	public function loadFields($idProposta, $post = null, $idPropostaMae = null) {
		$this->view->id_proposta = $idProposta;
		$this->view->id_proposta_mae = $idPropostaMae;

		// Monta checkboxes eventos
		$Evento = new Produto_Model_Eventos();
		$this->view->eventos = $Evento->getEventosPorProposta($idProposta)->toArray();
		$this->view->eventosQueda =  $Evento->getEventosPorProposta($idProposta, false, true)->toArray();
		$this->view->eventosReplantio = $Evento->getEventosPorProposta($idProposta, true)->toArray();
		$this->view->eventoCondicaoQueda = null;

		foreach($this->view->eventos as $indice => $evento) {
		    if ((int) $evento['id_cultura'] === Produto_Model_Culturas::PASTAGEM && $evento['ds_chave_evento'] !== Produto_Model_Eventos::DS_CHAVE_ESTIAGEM) {
                unset($this->view->eventos[$indice]);
		        continue;
            }

			if ($evento['ds_chave_evento'] === Produto_Model_Eventos::DS_CHAVE_EV_VENTOS_FORTES) {
				$this->view->eventoCondicaoQueda = $evento;
			}
		}

		/* Se form foi postado e ocorreu algum erro,
		   carrega valores dos campos que não são gerados por Zend_Form */
		if(!is_null($post)){
    		$this->view->values['fl_ocorrencia_queda_parreiral'] = $post['fl_ocorrencia_queda_parreiral'];
			$this->view->values['fl_ocorrencia_replantio'] = $post['fl_ocorrencia_replantio'];
			$this->view->values['pessoa_contato'] = $post['pessoa_contato'];
		}
	}

	public function save(array $post) {
		
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();

		try {
			$Model = new Sinistro2_Model_AvisosSinistro();
			$data = array();

			$data['id_proposta'] = $post['id_proposta'];
			$data['dt_sinistro'] = Agro_Util::formatDate($post['dt_sinistro'].' '.$post['hr_sinistro'].' '.$post['min_sinistro'], 'yyyy-MM-dd HH:mm');

			if (in_array('COB_QUEDA_PARREIRAL', $this->view->listChaveCoberturas) || in_array('COB_QUEDA_PARREIRAL_ESTENDIDA', $this->view->listChaveCoberturas)) {
				$data['fl_ocorrencia_queda_parreiral'] = $post['fl_ocorrencia_queda_parreiral'] == 'S' ? 1 : 0;
			}
			if (in_array('COB_REPLANTIO', $this->view->listChaveCoberturas) || in_array('COB_REPLANTIO_SEM_ESTIAGEM', $this->view->listChaveCoberturas) || in_array('COB_REPLANTIO_EXCESSO_CHUVA', $this->view->listChaveCoberturas)) {
				$data['fl_ocorrencia_replantio'] = $post['fl_ocorrencia_replantio'] == 'S' ? 1 : 0;
			}

			/*
			 * VERIFICA PARA MARCAR FLAGS DE CARENCIA E ALERTA DE CANCELAMENTO
			 */
			$ModelProposta = new Seguro_Model_Propostas();
			$Proposta      = $ModelProposta->get($data['id_proposta']);

			$vigencia      = $Proposta->dt_vigencia_inicio_original;
			$idProduto     = $Proposta->id_produto;

			$ModelProdutoCoberturaEvento = new Produto_Model_ProdutosCoberturasEventos();

			$dataAtual = date('d/m/Y');

			$ModelCoberturaEvento = new Produto_Model_CoberturasEventos();
			$coberturas = $ModelCoberturaEvento->getCoberturasByEvento($post['id_evento']);

			foreach ($coberturas as $key => $cobertura){
				if(in_array($cobertura['ds_chave_cobertura'], $this->view->listChaveCoberturas)){
					//cobertura do evento enviado existe na proposta
					$coberturaValida = $cobertura['id_cobertura'];
					continue;
				}
			}
			
			$RowProdutoCoberturaEvento = $ModelProdutoCoberturaEvento->find($idProduto, $coberturaValida, $post['id_evento'])->current();
			$carencia     = $RowProdutoCoberturaEvento->nr_dias_carencia;
			$alerta       = $RowProdutoCoberturaEvento->nr_dias_alerta_aviso;
			$cancelamento = $RowProdutoCoberturaEvento->nr_dias_cancelamento;

			if($carencia){
				if(Agro_Util::contarDiasEntreDatas($vigencia, $post['dt_sinistro']) <= $carencia){
					$data['fl_dias_carencia'] = true;
				}
			}

			if($alerta){
				if(Agro_Util::contarDiasEntreDatas($post['dt_sinistro'], $dataAtual) >= $alerta &&  Agro_Util::contarDiasEntreDatas($post['dt_sinistro'], $dataAtual) < $cancelamento){
					$data['fl_dias_alerta_aviso'] = true;
				}
			}

			if($cancelamento){
				if(Agro_Util::contarDiasEntreDatas($post['dt_sinistro'], $dataAtual) >= $cancelamento){
					$data['fl_dias_cancelamento'] = true;
				}
			}
			/*
			 * FIM VERIFICA PARA MARCAR FLAGS DE CARENCIA E ALERTA DE CANCELAMENTO
			*/

			/*
			 * verifica se a data mínima de plantio/transplante/semeadura dos itens segurados é anterior ou posterior ao evento de sinistro
			*/
			$min_dt_semeadura_plantio = $Proposta->min_dt_semeadura_plantio();

			if($min_dt_semeadura_plantio){
				if(Agro_Util::contarDiasEntreDatas($min_dt_semeadura_plantio, $post['dt_sinistro']) < 0){
					$this->view->showMessage("Em virtude da data de ocorrência do sinistro ser anterior à data de plantio informada na proposta, não há cobertura para o sinistro. Por favor, entre em contato com o Dpto. Técnico da AgroBrasil para verificação.", 'error');
					$this->loadFields($post['id_proposta'], $post);
					$Db->rollback();
					return false;
				}
			}
			/*
			 * FIM: verifica se a data mínima de plantio/transplante/semeadura dos itens segurados é anterior ou posterior ao evento de sinistro
			*/

            /**
             * "Solução alternativa" necessária pois há um tempo que deve ser respeitado para envio de outro aviso para
             * mesma proposta, no mesmo dia (trigger sinistro.aviso_before_insert da tabela sinistro.avisos)
             */
            $rowAvisoProposta = $Model->fetchAll([
                "id_proposta = {$data['id_proposta']}",
                "to_number(to_char(age(dt_criacao, now()), 'YYYYMMDDHH24MISS'), '9999999999999999') <= 60"
            ])->toArray();

            if (!empty($rowAvisoProposta)) {
                sleep(60);
            }

			$id_aviso = $Model->insert($data);

			/*
			 * SE NÃO EXISTE PROCESSO CRIADO PARA A PROPOSTA, CRIA
			 * SE JÁ EXISTE, APENAS SETA O STATUS DO PROCESSO COMO ABERTO E VINCULA O NOVO AVISO A ELE
			 */
			$ModelProcesso = new Sinistro2_Model_Processos();
			$id_processo = $ModelProcesso->getIdProcessoByProposta($data['id_proposta']);

			if(!$id_processo){
				$dataProcesso = array();
				$dataProcesso['id_proposta'] = $data['id_proposta'];
				$dataProcesso['id_status']   = $Processo->id_status = Agro_Util::status("ABERTO_SEM_EMPRESA", "SP");
				$id_processo = $ModelProcesso->abreProcessoSemEmpresa($dataProcesso);
			} else {
				/*
				$Processo            = $ModelProcesso->find($id_processo)->current();
				$Processo->id_status = Agro_Util::status("ABERTO_REGULACAO", "SP");
				$Processo->save();

				$ModelProcessoObs = new Sinistro2_Model_ProcessosObservacoes();
				$ProcessoObs      = $ModelProcessoObs->createRow();
				$ProcessoObs->id_processo   = $Processo->id;
				$ProcessoObs->ds_observacao = "Processo <b>REATIVADO</b>.<br><b>Motivo: </b>".str_ireplace("\n", "<br>", "Novo aviso de sinistro");
				$ProcessoObs->save();
				*/
			}
			
			/*
			 * FIM
			 * SE NÃO EXISTE PROCESSO CRIADO PARA A PROPOSTA, CRIA
			 * SE JÁ EXISTE, APENAS SETA O STATUS DO PROCESSO COMO ABERTO E VINCULA O NOVO AVISO A ELE
			*/

			/*
			 * VINCULA AVISO DE SINISTRO COM EVENTO
			 */
			$Model->relacionarAvisoEvento($id_aviso, $post['id_evento']);

			/*
			 * SALVA PESSOAS DE CONTATO ADICIONAIS
			 */
			if(count($post['pessoa_contato']) > 0){
			    foreach($post['pessoa_contato'] as $key => $pessoa_contato) {
			        if(trim($pessoa_contato['ds_nome'] != "" && trim($pessoa_contato['ds_telefone'] != "")))
			            $Model->relacionarPessoasContato($id_aviso, $pessoa_contato);
			    }
			}
			
            $rowInformacoesBancariasProposta = (new Sistema_Model_InformacoesBancarias())
				->getInformacoesBancariasByProposta((int) $data['id_proposta']);
			$rsInformacoesBancariasBeneficiarios = (new Seguro_Model_InformacoesBancariasBeneficiarios())
				->getInformacoesBancariasBeneficiariosByProposta((int) $data['id_proposta']);

			$modelSeguroInformacoesBancarias = new Seguro_Model_InformacoesBancarias();

            if (!empty($rowInformacoesBancariasProposta)) {
				$rowProponente = (new Seguro_Model_PropostasProponentes())->get($data['id_proposta']);
                $rowSeguroInformacoesBancarias = $modelSeguroInformacoesBancarias->fetchAll([
                    "id_proposta = {$data['id_proposta']}", "cpf_cnpj = '{$rowProponente['cpf_cnpj']}'"
                ])->toArray();

                if (empty($rowSeguroInformacoesBancarias)) {
                    $informacoesBancarias = [
                        'cpf_cnpj' => $rowProponente['cpf_cnpj'],
                        'id_proposta' => $data['id_proposta'],
                        'id_banco' => $rowInformacoesBancariasProposta['id_banco'],
                        'nu_conta_corrente' => $rowInformacoesBancariasProposta['ds_conta'],
                        'nu_digito_conta_corrente' => $rowInformacoesBancariasProposta['nu_digito_conta'],
                        'nu_agencia' => $rowInformacoesBancariasProposta['ds_agencia'],
                        'nu_digito_agencia' => $rowInformacoesBancariasProposta['nu_digito_agencia'],
                        'id_forma_pagamento' => $rowInformacoesBancariasProposta['fl_titular_conta'] === true
							? Sistema_Model_FormasPagamento::ID_STATUS_DOC_TED
							: Sistema_Model_FormasPagamento::ID_STATUS_ORDEM_PAGAMENTO,
                    ];

                    if (!$modelSeguroInformacoesBancarias->save($informacoesBancarias)) {
                        throw new Exception('Erro ao salvar as informações bancárias.');
                    }
                }
            }
			
			foreach ($rsInformacoesBancariasBeneficiarios as $info) {
				if ($info['id_status_arquivos'] != Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA) {
					continue;
				}

				$dadosBeneficiario = $modelSeguroInformacoesBancarias
					->findByPropostaCpfCnpj((int) $data['id_proposta'], $info['nr_cpf_cnpj']);

				$id = '';

				if (!empty($dadosBeneficiario)) {
					$id = $dadosBeneficiario['id'];
				}

				$informacoesBancariasBeneficiario = [
					'id' => $id,
					'cpf_cnpj' => $info['nr_cpf_cnpj'],
					'id_proposta' => $data['id_proposta'],
					'id_banco' => $info['id_banco'],
					'nu_conta_corrente' => $info['ds_conta'],
					'nu_digito_conta_corrente' => $info['nu_digito_conta'],
					'nu_agencia' => $info['ds_agencia'],
					'nu_digito_agencia' => $info['nu_digito_agencia'],
					'id_forma_pagamento' => $info['id_forma_pagamento']
				];

				if (!$modelSeguroInformacoesBancarias->save($informacoesBancariasBeneficiario)) {
					throw new Exception('Erro ao salvar as informações bancárias referentes ao beneficiário.');
				}
			}

            (new Sinistro2_Service_AvisoEmailSegurado())->concluirEnvioAviso([
                'id_aviso' => $id_aviso,
                'ds_email_segurado' => $this->getRequest()->getParam('ds_email_segurado'),
            ]);
			
			$Db->commit();

			//ENVIA EMAILS DE NOTIFICAÇÂO
			$this->sendEmailsProponenteRT($post);

			/*
			* E-MAIL NOTIFICANDO AVISO DE SINISTRO EM PRODUTO EM COMERCIALIZAÇÃO
			*/
			$propriedades = $Proposta->propriedade();
			$Comercializacao = new Comercializacao_Model_Comercializacoes();
			if ($Comercializacao->checkComercializacao(
				$idProduto, $propriedades['id_estado'], $propriedades['id_municipio'], $Proposta->proponente()['cpf_cnpj'], $Proposta->id_usuario_criacao
			)) {
				$this->sendMailComercializacao($id_aviso);
			}

			$this->sendMailSinistroPrevia($id_aviso, (int) $this->getRequest()->getParam('id_proposta_mae'));

			/*
			 * TRANSMITE AVISO PARA SEGURADORA ESSOR
			* SOMENTE SE A PROPOSTA TIVER APOLICE EMITIDA
			*/
			if($Proposta->nr_apolice){
			    $ModelTransmissao = new Sinistro2_Model_TransmissaoAvisosEssor();
			    $TransmissaoAviso = $ModelTransmissao->getAvisoTransmissao($id_aviso);

			    Agro_Webservice::transmitirSinistroEssor($id_aviso, $TransmissaoAviso->cobertura);
			}
			/*
			 * FIM TRANSMITE AVISO PARA SEGURADORA ESSOR
			*/

			$this->_redirect('/sinistro2/envioaviso/response/id/' . $id_aviso);

		} catch (Exception $e) {
			//$Db->rollback();
			$this->view->showMessage(MSG_ERROR . "<br />" . $e->getMessage() . '<br><pre>'. $e->getTraceAsString() . '</pre>', 'error');
			$this->loadFields($post['id_proposta'],$post);
		}
	}

	/*
	* E-mail comunicando que houve um sinistro em produto sendo comercializado
	*/
	public function sendMailComercializacao($idAviso) {
		$AvisoSinistro = new Sinistro2_Model_AvisosSinistro();

		if ($idAviso) {
			$aviso = $AvisoSinistro->getDadosEmailAviso($idAviso);

			$assunto = "Ocorrência de Sinistro em Produto em Vendas";

			$corpo  = "\nProduto: {$aviso['ds_nome_produto']} \n";
			$corpo .= "\nCultura: {$aviso['ds_nome_cultura']} \n";
			$corpo .= "\nProposta: {$aviso['id_proposta_mae']} \n";
			$corpo .= "\nData de ocorrência do Sinistro: {$aviso['dt_sinistro']} \n";
			$corpo .= "\nMunicípio/UF: {$aviso['ds_nome_municipio']}/{$aviso['ds_sigla']} \n";
			$corpo .= "\nEvento: {$aviso['ds_nome_evento']} \n";

			try {
				$mail = new Agro_Mail();
				$mail->addTo('tais.silveira@agrobrasilseguros.com.br');
				$mail->addCc('henrique.alves@agrobrasilseguros.com.br');
				$mail->addCc('karina.silva@agrobrasilseguros.com.br');
				$mail->addCc('tiago.zschornack@agrobrasilseguros.com.br');
				$mail->addCc('diego.cecagno@agrobrasilseguros.com.br');
				$mail->addCc('luana.beck@agrobrasilseguros.com.br');
				$mail->addCc('randal.brandolt@agrobrasilseguros.com.br');
				$mail->setBody($corpo);
				$mail->setSubject($assunto);
				$mail->send();
				return true;
			} catch (Exception $e) {
				return false;
			}
		} else {
			return false;
		}
	}

	public function responseAction() {
		$Model = new Sinistro2_Model_AvisosSinistro();
		$aviso = $Model->fetchRow($Model->getAdapter()->quoteInto('id = ?',$this->getRequest()->getParam('id')));
		if($aviso){
			$this->view->title .= ' » Visualizar';
			$this->view->back = "/sinistro2/envioaviso/";

			$this->view->data = $Model->loadAvisoSinistro($this->getRequest()->getParam('id'));

			$PropostaCobertura = new Seguro_Model_PropostasCoberturas();
			$this->view->listChaveCoberturas = $PropostaCobertura->getChaveCoberturasByProposta($this->view->data['id_proposta']);
		}else{
			$this->_redirect('/sinistro2/envioaviso/');
		}

	}

    /**
     * Envia e-mail em caso de aviso com prévia
     * @param int $idAviso
     * @param int $idPropostaMae
     * @return bool
     */
    public function sendMailSinistroPrevia(int $idAviso, int $idPropostaMae)
    {
        $modelPropostas = new Seguro_Model_Propostas();
        $rowsPropostas = $modelPropostas->fetchAll("id_proposta_mae = {$idPropostaMae}")->toArray();
        $enviarEmail = false;

        foreach ($rowsPropostas as $proposta) {
            $modelVistoriaPrevia = new Seguro_Model_VistoriaPrevia();
            $rowVistoriaPrevia = $modelVistoriaPrevia->fetchAll("id_proposta = {$proposta['id']}")->toArray();

            foreach ($rowVistoriaPrevia as $vistoriaPrevia) {
                $statusVistoria = [
                  Sistema_Model_Status::VP_AGUARDANDO_VISTORIA,
                  Sistema_Model_Status::VP_ENC,
                  Sistema_Model_Status::VP_TRANSMITIDA,
				  Sistema_Model_Status::VP_TRANSMITIDA_SEM_FOTOS
                ];

                $statusAnalise = [
                  Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_AGUARDANDO_NOVA_VISTORIA,
                  Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_ANALISANDO,
                  Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_NAO_ANALISADO,
                  Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_NAO_RECEBIDA,
                  Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_PENDENCIA_CORRETOR,
                  Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_PENDENCIA_PERITO,
                  Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_PENDENCIA_PERITO_CORRETOR,
                ];

                if (!in_array($vistoriaPrevia['id_status'], $statusVistoria)) {
                    continue;
                }

                if (!in_array($vistoriaPrevia['id_status_analise'], $statusAnalise)) {
                    continue;
                }

                $enviarEmail = true;
            }
        }

        if (!$enviarEmail) {
            return false;
        }

        $modelAvisoSinistro = new Sinistro2_Model_AvisosSinistro();
        $aviso = $modelAvisoSinistro->getDadosEmailAviso($idAviso);

        $assunto = "Ocorrência de Sinistro em Proposta com Prévia";

        $corpo  = "\nProduto: {$aviso['ds_nome_produto']} \n";
        $corpo .= "\nCultura: {$aviso['ds_nome_cultura']} \n";
        $corpo .= "\nProposta: {$aviso['id_proposta_mae']} \n";
        $corpo .= "\nData de ocorrência do Sinistro: {$aviso['dt_sinistro']} \n";
        $corpo .= "\nMunicípio/UF: {$aviso['ds_nome_municipio']}/{$aviso['ds_sigla']} \n";

        try {
            $mail = new Agro_Mail();
            $mail->addTo('karina.silva@agrobrasilseguros.com.br', 'Karina Fernanda da Silva');
            $mail->addTo('flavia.dupont@agrobrasilseguros.com.br');
            $mail->addTo('raphael.funchal@agrobrasilseguros.com.br');
            $mail->setBody($corpo);
            $mail->setSubject($assunto);
            $mail->send();

            return true;
        } catch (Exception $e) {
            return false;
        }
    }
}
