<?
/**
 * Classe responsável pelo envio de aviso de sinistro
 */
class Sinistro_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 Sinistro_Model_EnvioAviso();
	}

	public function getForm() {
		return new Sinistro_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($this->getRequest()->getParam('valor_pesquisa'))) {
					$filter['operator'] = '=';
					$filter['value'] = $this->getRequest()->getParam('valor_pesquisa');

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

				$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 formAction() {
		$this->view->form = $this->getForm();
		$this->view->title .= ' » Formulário';
		$this->view->back = '/sinistro/envioaviso';


		$this->view->values = array(
								'eventos' => array(),
								'fl_ocorrencia_queda_parreiral' => '',
								'fl_ocorrencia_replantio' => ''
							  );

		$AvisoSinistro = new Sinistro_Model_AvisosSinistro();
		$this->view->listDtAvisos = $AvisoSinistro->getDtSinistroAvisos($this->getRequest()->getParam('proposta'));

		$PropostaCobertura = new Seguro_Model_PropostasCoberturas();
		$this->view->listChaveCoberturas = $PropostaCobertura->getChaveCoberturasByProposta($this->getRequest()->getParam('proposta'));

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

			$errors = array();
			$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(count($errors) > 0) {
					$Errors = $this->view->form->getMessages();

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

					$this->view->showMessage($this->getHtmlFormError($Errors), 'error');
				} else if (count($alerts) > 0) {

					foreach($alerts as $alert){
						$Alerts = array();
						$Alerts[$alert['field']][$alert['type']] = $alert['message'];
					}

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

					$this->view->showMessage($this->getHtmlFormError($Alerts), 'alert');
				}
				$this->loadFields($this->getRequest()->getParam('proposta'),$post);
			}
		} else {
			// Se tiver id_proposta, mostra form de cadastro de aviso.
			if($this->getRequest()->getParam('proposta')){
				$this->loadFields($this->getRequest()->getParam('proposta'));
			} else{
				$this->_redirect('/sinistro/avisosinistro');
			}

		}
	}

	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 Sinistro_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->isLater($agora->get('dd/MM/yyyy HH:mm:ss'))) {
            $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)) {
			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) {
		$this->view->id_proposta = $idProposta;

		// Monta checkboxes eventos
		$Evento = new Produto_Model_Eventos();
		$this->view->eventos = $Evento->getEventosPorProposta($idProposta);

		/* 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['id_evento'] = $post['id_evento'];
		}
	}

	public function save(array $post) {

		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();
		try {
			$Model = new Sinistro_Model_AvisosSinistro();
			$data = array();
			// Inclusão na tabela de avisos
			$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');
			$data['ds_pessoa_contato'] = $post['ds_pessoa_contato'];
			$data['ds_telefone_contato'] = $post['ds_telefone_contato'];
			$data['ds_observacoes'] = $post['ds_observacoes'];

			if (in_array('COB_QUEDA_PARREIRAL', $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;
			}
			
			$ModelProposta = new Seguro_Model_Propostas();
			$Proposta      = $ModelProposta->get($data['id_proposta']);
			
			/*
			 * 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();
			
			//die('data: '.Agro_Util::contarDiasEntreDatas('15/10/2015', '14/10/2015'));
			//die('data: '.$post['dt_sinistro']);
			
			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
			*/
					

			/*
			 * verifica flags de carência, alerta e cancelamento
			 */				
			$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 flags de carência, alerta e cancelamento
			*/

			$idAviso = $Model->insert($data);
						
			//se o processo está desativado/cancelado, reativa-o
			$ModelProcesso = new Sinistro_Model_Processos();
			$id_processo = $ModelProcesso->getProcessoByAviso($idAviso);			

			if($id_processo){
				$Processo = $ModelProcesso->find($id_processo)->current();
	
				if ($Processo->id_status == Agro_Util::status("CANCELADO", "SP")){
					
					//altera status do processo e salva o log de alteração
					$ModelProcessoObs = new Sinistro_Model_ProcessosObservacoes();
					$Processo->id_status = Agro_Util::status("ABERTO_REGULACAO", "SP");
					$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");			
	
					$Processo->save();
					$ProcessoObs->save();				
				}
			
			}
			
			//inclusão na tabela de avisos_eventos
			
			$Model->relacionarAvisoEvento($idAviso, $post['id_evento']);
			
			$this->sendMailAviso($idAviso);

			$Db->commit();

			$this->_redirect('/sinistro/envioaviso/response/id/' . $idAviso);
		} 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);
		}
	}

	public function sendMailAviso($idAviso){

		$AvisoSinistro = new Sinistro_Model_AvisosSinistro();
		$aviso = $AvisoSinistro->getDadosEmailAviso($idAviso);

		if ($idAviso) {
			$To = 'tiago.zschornack@agrobrasilseguros.com.br';

			$assunto = "AVISO SINISTRO ({$aviso['ds_nome_evento']})- {$aviso['ds_nome_proponente']} - Proposta: {$aviso['id_proposta']} - {$aviso['ds_nome_produto']} - ({$aviso['ds_nome_municipio']} -  {$aviso['ds_sigla']})";
			$content = "\nAVISO DE SINISTRO Nro: {$aviso['id']} \n";
			$content .= "Em: {$aviso['dt_criacao']} \n\n";

			$content .= "Proposta Nro: {$aviso['id_proposta']} \n";
			$content .= "Apólice Nro: {$aviso['nr_apolice']} \n";
			$content .= "Nome do Segurado: {$aviso['ds_nome_proponente']} \n";
			$content .= "Produto: {$aviso['ds_nome_produto']} \n";
			$content .= "Evento: {$aviso['ds_nome_evento']} \n";
			
			$content .= "Localidade: {$aviso['ds_nome_municipio']} -  {$aviso['ds_sigla']}\n\n\n";

			$content .= "ATENÇÃO: esta é uma mensagem automática. Por favor, não responda.\n\n";

			$content .= "Se desejar entrar em contato, escreva para ".EMAIL_SINISTRO."\n\n";

			$content .= "\nAgrobrasil Operadora de Seguro Agrícola";

    		try {

				$Mail = new Agro_Mail();
				$Mail->addTo($To);
				$Mail->setTipoUsuario('Usuário');
				$Mail->setBody($content);
				$Mail->setSubject($assunto);
				$Mail->send();

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

	public function responseAction() {
		$Model = new Sinistro_Model_AvisosSinistro();
		$aviso = $Model->fetchRow($Model->getAdapter()->quoteInto('id = ?',$this->getRequest()->getParam('id')));
		if($aviso){
			$this->view->title .= ' » Visualizar';
			$this->view->back = "/sinistro/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('/sinistro/envioaviso/');
		}

	}
}
