<?

class Nobre_AvisosinistroController extends Agro_Controller_Action {
	
	public function init() {
		$this->view->title = 'Sinistro » Avisos » Gerência';
		
		$this->session = new Zend_Session_Namespace('pesquisa_avisos');
	}
	
	public function getModel() {
		return new Sinistro_Model_AvisosSinistro();
	}
	
	public function getForm() {
		return new Sinistro_Form_PesquisaAviso();
	}
	
	public function indexAction() {
		$this->view->title .= " » Listagem";

		$this->view->formPesquisaProposta = new Seguro_Form_PesquisaProposta();
		$options = array(''=>'','id'=>'Número de Aviso');
		$this->view->formPesquisaProposta->addOptions($options);
        
		$this->view->form = $this->getForm();
	    $User = Zend_Auth::getInstance()->getIdentity();
	    
	    $Funcionarios = new Sistema_Model_Funcionarios();
	    $dsChaveCategoria = $Funcionarios->getCategoriaEmpresaByidUsuario($User->id)->ds_chave;
	    
        if($dsChaveCategoria != '') {
            $this->view->form->init($dsChaveCategoria);
        }

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

		$Session = new Zend_Session_Namespace('filtro');
		$params = $Session->{$Module}->{$Controller};
		
		if (is_object($this->view->form) && $params) {
			$this->view->form->populate($params);
		}

		if ($this->getRequest()->getParam('avisoProcessado')) {
			$this->view->showMessage(MSG_SUCESS, 'success');
		}

	}
	
	public function getFilter() {
		$where = array();
		$filter = array();
		
		$User = Zend_Auth::getInstance()->getIdentity();
		
		if ($this->getRequest()->getParam('tipo_pesquisa') && $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;
		}
		
		if($User->tp_usuario == 'C') {
		    
		    $Corretores = new Sistema_Model_Corretores();
		    $Corretor = $Corretores->findByUser($User->id);
		    
            $filter['field'] = 'id_corretor';
            $filter['operator'] = '=';
            $filter['value'] = $Corretor->id;   
            $where[] = $filter;
		}
		
		if($User->tp_usuario == 'P') {
		    $Prepostos = new Sistema_Model_Prepostos();
		    $Preposto = $Prepostos->findByUser($User->id);
		    
            $filter['field'] = 'id_preposto';
            $filter['operator'] = '=';
            $filter['value'] = $Preposto->id;   
            $where[] = $filter;
		}
        
		if ($this->getRequest()->getParam('id_safra')) {
			$filter['field'] = 'id_safra';
			$filter['operator'] = '=';
			$filter['value'] = $this->getRequest()->getParam('id_safra');	
			$where[] = $filter;
		}		
		if ($this->getRequest()->getParam('id_status')) {
			$filter['field'] = 'id_status';
			$filter['operator'] = '=';
			$filter['value'] = $this->getRequest()->getParam('id_status');	
			$where[] = $filter;
		}
		if ($this->getRequest()->getParam('id_produto')) {
			$filter['field'] = 'id_produto';
			$filter['operator'] = '=';
			$filter['value'] = $this->getRequest()->getParam('id_produto');	
			$where[] = $filter;
		}
		if ($this->getRequest()->getParam('cpf_cnpj')) {
			$filter['field'] = 'cpf_cnpj';
			$filter['operator'] = '=';
			$filter['value'] = $this->getRequest()->getParam('cpf_cnpj');	
			$where[] = $filter;
		}
		if ($this->getRequest()->getParam('id_municipio')) {
			$filter['field'] = 'id_municipio';
			$filter['operator'] = '=';
			$filter['value'] = $this->getRequest()->getParam('id_municipio');	
			$where[] = $filter;
		}
		
	    if ($this->getRequest()->getParam('id_estado')) {
            $filter['field'] = 'id_estado';
            $filter['operator'] = '=';
            $filter['value'] = $this->getRequest()->getParam('id_estado');   
            $where[] = $filter;
        }
        
		return $where;
	}
	
    public function getmunicipiosavisosAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
        
		$where = $this->getFilter();
        
        $AvisosSinistro = $this->getModel();
        $Municipios = $AvisosSinistro->getMunicipiosAvisos($where);

        $optionsMunicipios = array();
        if(count($Municipios) > 0) {
            foreach($Municipios as $Municipio) {
                $optionsMunicipios[$Municipio['id_municipio']] = $Municipio['ds_nome_municipio'];
            }
        }
		
		$this->getResponse()->setBody(Zend_Json::encode($optionsMunicipios));
    }

    public function getestadosavisosAction() {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();
        
        $where = $this->getFilter();
        
        $AvisosSinistro = $this->getModel();
        $Estados = $AvisosSinistro->getEstadosAvisos($where);

        $optionsEstados = array();
        if(count($Estados) > 0) {
            foreach($Estados as $Estado) {
                $optionsEstados[$Estado['id_estado']] = $Estado['ds_sigla'];
            }
        }
        
        $this->getResponse()->setBody(Zend_Json::encode($optionsEstados));
    }
    
	public function viewAction()
    {
        $this->getHelper('layout')->setLayout('popup');

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

        $this->view->adminView = false;

        if (Zend_Auth::getInstance()->getIdentity()->tp_usuario == 'F') {
            $this->view->adminView = true;
        }

        $model = new Seguro_Model_PropostaPrint();
        $proposta = $model->getProposta($idProposta);

        $this->view->proposta = $proposta;
        $this->view->title .= ' » Visualização';
        $this->view->module = 'sinistro';

        $modelAtendimento = new Atendimento_Model_Proposta();
        $this->view->informacoesAdicionais = $modelAtendimento->getInfoAdicionais($idProposta);

        // Verificar produto e acrescenta condições especiais a carência se necessário
        if ($this->view->proposta['produto']['ds_chave_produto'] == 'UVA_VINHO_MASTER') {
            $condicao = 'Condições Especiais Uva de Vinho Master: Lembramos que esse produto já possui automaticamente';
            $condicao .= ' as coberturas de proteção fitossanitária, queda de parreiral, qualidade e ajuste de dano.';

            $this->view->proposta['carencia'][] = array('ds_condicao_especial' => $condicao);
        }

        // Verificar produto e acrescenta condições especiais a carência se necessário
        if ($this->view->proposta['produto']['ds_chave_produto'] == 'MACA_MASTER') {
            $condicao = 'Condições Especiais Maçã Master: Lembramos que esse produto já possui automaticamente a';
            $condicao .= ' cobertura de proteção fitossanitária.';

            $this->view->proposta['carencia'][] = array('ds_condicao_especial' => $condicao);
        }

        $model = $this->getModel();
        $aviso = $model->fetchRow($model->getAdapter()->quoteInto('id = ?', $this->getRequest()->getParam('id')));

        //testa se existe o id do aviso passado pela url
        if ($aviso) {
            $this->view->form = new Sinistro_Form_AceitacaoAviso();

            if ($this->getRequest()->getParam('status_aviso') == 'enviado') {
                $this->enviarAviso();
            } elseif ($this->getRequest()->getParam('status_aviso') == 'recusado') {
                //Habilitar campos obrigatórios
                $this->view->form->id_aviso->setRequired(true);
                $this->view->form->motivo_recusa->setRequired(true);

                if ($this->view->form->isValid($this->getRequest()->getPost())) {
                    $this->recusarAviso();
                } else {
                    $this->view->showMessage($this->getHtmlFormError($this->view->form->getMessages()), 'error');
                }
            }

            $this->view->title .= ' » Visualizar';
            $this->view->data = $model->loadAvisoSinistro($this->getRequest()->getParam('id'));

            $propostaCobertura = new Seguro_Model_PropostasCoberturas();
            $this->view->listChaveCoberturas = $propostaCobertura->getChaveCoberturasByProposta(
                $this->view->data['id_proposta']
            );

            $this->view->form->id_proposta->setValue($this->view->data['id_proposta']);
            $this->view->form->id_aviso->setValue($this->view->data['id_aviso']);

            if ($this->view->data['ds_chave_status'] == 'PENDENTE') {
                list($dtAviso) = explode(' ', $this->view->data['dt_sinistro']);

                $this->view->data['arAvisosExistentes'] = $model->getAvisosByPropostaDataAviso(
                    $idProposta,
                    $this->view->data['id_aviso'],
                    $dtAviso
                );
            }

            //Identifica se já existe um processo relacionado à proposta do aviso
            $processo = new Sinistro_Model_Processos();
            $processo = $processo->fetchRow('id_proposta = ' . $this->view->data['id_proposta']);

            if ($processo) {
                $processo = $processo->toArray();
                $this->view->form->id_processo->setValue($processo['id']);

                // Definindo valor default para combo de empresas
                $processoEmpresa = $processo->getEmpresaVistoriadora($processo['id']);

                if ($processoEmpresa) {
                    $this->view->idEmpresaProcesso = $processoEmpresa['id'];
                    $this->view->form->empresas->setValue($processoEmpresa['id']);
                }

                $this->view->data['dsNomeEmpresaVistoriadora'] = $processoEmpresa['ds_nome_fantasia'];
                $this->view->data['id_processo'] = $processo['id'];
            } else {
                /*
                 * Verifica se já existe Processo de Sinistro para alguma outra proposta do segurado e em caso
                 * positivo sugere que o novo processo seja encaminhado para a mesma empresa do existente
                 */
                $empresa = (new Sinistro_Model_AvisosSinistro())->getVistoriadoraByCpfCnpjSeguradoSafra(
                    $proposta['proponente']['cpf_cnpj'],
                    $proposta['produto']['id_safra']
                );

                if ($empresa) {
                    $this->view->idEmpresaProcesso = $empresa->id;
                    $this->view->form->empresas->setValue($empresa->id);
                    $this->view->vistoriadoraByCpfCnpjNome = $empresa->ds_nome_fantasia;
                }

                $this->view->form->id_processo->setValue(null);
            }
        }
    }
	
	public function enviarAviso(){
		$idAviso	= $this->getRequest()->getParam('id_aviso');
		$idEmpresa  = $this->getRequest()->getParam('id_empresa');
		$idProposta = $this->getRequest()->getParam('id_proposta');
		$idProcesso = $this->getRequest()->getParam('id_processo');
		$dtSinistro = $this->getRequest()->getParam('dt_sinistro');
		
		$data = $this->getRequest()->getParams();
		
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();
		
		$post = $this->getRequest()->getParams();
		$hasVistoriaPendente = false;
		try {
			
			if (is_array($post['vistorias_pendentes']) && count($post['vistorias_pendentes']) > 0){
				$hasVistoriaPendente = true;
				$VistoriaEmpresa = new Sistema_Model_VistoriasEmpresas();
				foreach ($post['vistorias_pendentes'] as $item) {
					if ($post['fl_vistoria_pendente-' . $item] == 'N') {
						$VistoriaEmpresa->delete($item);
						
						$data = array();				
						$data['id_vistoria'] = $item;				
						$data['id_empresa'] = $post['id_empresa'];
						$VistoriaEmpresa->insert($data);
					}
				}
			}
			
			// Altera o status do aviso para 'aceito'
			$AvisoSinistro = new Sinistro_Model_AvisosSinistro();
			$data = array();
			$data['id_status'] = $AvisoSinistro->getIdStatus('ACEITO', 'SA');
			$data['dt_aceitacao'] = date('Y-m-d H:i:s');
			$AvisoSinistro->update($data, "id = $idAviso");

			if(!$idProcesso){
				$Processo = new Sinistro_Model_Processos();
				$data = array();
				$data['id_proposta'] = $idProposta;
				$data['id_status'] = $Processo->getIdStatus('ABERTO_REGULACAO', 'SP');

				$idProcesso = $Processo->insert($data);
				unset($data);
				
				$ProcessoEmpresa = new Sinistro_Model_ProcessosEmpresas();
				$data = array();
				$data['id_processo'] = $idProcesso;
				$data['id_empresa'] = $idEmpresa;
				
				$ProcessoEmpresa->insert($data);	
			}else{
				
				$ProcessoEmpresa = new Sinistro_Model_ProcessosEmpresas();
				$where = 'id_processo = ' . $idProcesso . ' and fl_ativo = true';
				$processoEmpresa = $ProcessoEmpresa->fetchRow($where);
				$processoEmpresa = $processoEmpresa->toArray();
				
				if($processoEmpresa){
					if($processoEmpresa['id_empresa'] != $idEmpresa){
						$ProcessoEmpresa->update(
							array('fl_ativo'=>'false'),
							"id_processo = {$processoEmpresa['id_processo']} and
							id_empresa = {$processoEmpresa['id_empresa']}"
						);
						
						$data = array();
						$data['id_processo'] = $idProcesso;
						$data['id_empresa'] = $idEmpresa;
							
						$ProcessoEmpresa->insert($data);
					}
				}else{
					$data = array();
					$data['id_processo'] = $idProcesso;
					$data['id_empresa'] = $idEmpresa;
						
					$ProcessoEmpresa->insert($data);
				}
			}
			
			$arrayCoberturasAviso = $AvisoSinistro->getCoberturasByAviso($idProposta, $idAviso);
			if (count($arrayCoberturasAviso) > 0) {

				$VistoriaCobertura = new Sistema_Model_VistoriasCoberturas();
				foreach ($arrayCoberturasAviso as $item) {
					$idCobertura = $item['id_cobertura'];				
					$flVistoriaPreliminar = $item['fl_vistoria_preliminar'];

					if ($flVistoriaPreliminar) {
						$rs = $VistoriaCobertura->getVistoriaByCoberturaComVistPreliminar($idProposta, $idCobertura);
						if (count($rs) > 0) {
							foreach ($rs as $it) {
								if ($it['dt_inicio'] && $it['dt_fim']) {
									$idVistoriaPreliminar = $it['id_vistoria'];
									$dtInicio             = Agro_Util::formatDate($it['dt_inicio'], 'yyyyMMdd');
									$dtFim                = Agro_Util::formatDate($it['dt_fim'], 'yyyyMMdd');
									$dtSinistro           = Agro_Util::formatDate($dtSinistro, 'yyyyMMdd');
									if ($dtInicio <= $dtSinistro && $dtFim >= $dtSinistro) {
										$item = array();
										$item['id_vistoria'] = $idVistoriaPreliminar;
										$item['id_aviso'] = $idAviso;
										
										$VistoriaAviso = new Sinistro_Model_VistoriasAvisos();
										$VistoriaAviso->insert($item);
									}
								}
							}
						}
					} else {
						$rs = $VistoriaCobertura->getVistoriaByCoberturaSemVistPreliminar($idProcesso, $idCobertura, $dtSinistro);
						if ($rs) {
							$VistoriaAviso = new Sinistro_Model_VistoriasAvisos();
							$item = array();
							$item['id_vistoria'] = $rs['id_vistoria'];
							$item['id_aviso'] = $idAviso;

							$VistoriaAviso->insert($item);
						}
					}
				}
			}
			
			$this->sendMailAceitacaoAviso($idAviso);
			
			$Db->commit();
			
			if (!$hasVistoriaPendente) {
				$this->view->dadosGravados = 'S';
			}
		}catch(Exception $e){
			$Db->rollback();
			if (!$hasVistoriaPendente) {
				$this->view->dadosGravados = 'N';
			}
			echo $e->getMessage();
		}
	}
	
	public function recusarAviso(){
		$idAviso = $this->getRequest()->getParam('id_aviso');
		$motivoRecusa = $this->getRequest()->getParam('motivo_recusa');
		
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();

		try{
			$AvisoRecusa = new Sinistro_Model_AvisosRecusas();
			$data = array();
			$data['id_aviso'] = $idAviso;
			$data['ds_motivo_recusa'] = $motivoRecusa;
		
			// Altera o status do aviso para 'recusado'
			$AvisoSinistro = new Sinistro_Model_AvisosSinistro();
			$idStatus = $AvisoSinistro->getIdStatus('RECUSADO', 'SA');
			$AvisoSinistro->update(array('id_status'=>$idStatus),"id = $idAviso");
			$AvisoRecusa->insert($data);
			
			$this->sendMailRecusaAviso($idAviso);
			
			$Db->commit();		
			
			$this->view->dadosGravados = 'S';
		}catch (Exception $e){
			$Db->rollback();
			$this->view->dadosGravados = 'N';
		}
		
	}
	
	public function sendMailAceitacaoAviso($idAviso){
	    
		$AvisoSinistro = new Sinistro_Model_AvisosSinistro();
		$aviso = $AvisoSinistro->getDadosEmailAviso($idAviso);
		
		if($aviso){
		    
		    // Endereço de e-mail da empresa de vistoria
            $To = array($aviso['ds_nome_vistoriadora']=>$aviso['ds_email_vistoriadora']);
                      	    
			$assunto = "AVISO DE SINISTRO (Processo) - {$aviso['ds_nome_proponente']} - Proposta: {$aviso['id_proposta']} - {$aviso['ds_nome_produto']}";
			
			$content = "
				NOVO AVISO DE SINISTRO \n\n
				
				Processo de Sinistro Nro: {$aviso['id_processo']} \n\n
				
				Proposta Nro: {$aviso['id_proposta']} \n
				Nome do Segurado: {$aviso['ds_nome_proponente']} \n
				Produto: {$aviso['ds_nome_produto']} \n
				
				\n\n\n
				
				ATENÇÃO: esta é uma mensagem automática. Por favor, não responda. ";
			
			if(EMAIL_SINISTRO){
				$content .= "Se desejar entrar em contato, escreva para ".EMAIL_SINISTRO;
			}
			
			$content .= " \n\n
			Agrobrasil Operadora de Seguro Agrícola";
			
            try {
                $Mail = new Agro_Mail();
                $Mail->addTo($To);
                $Mail->setBody($content);
                $Mail->setSubject($assunto);
                $Mail->send();

                return true;
            } catch (Exception $e) {
                return false;
                echo $e->getMessage();
            }
			
			
		}else{
			return false;
		}
	}
	
	public function sendMailRecusaAviso($idAviso){
		$AvisoSinistro = new Sinistro_Model_AvisosSinistro();
		$aviso = $AvisoSinistro->getDadosEmailAviso($idAviso);
		
		if(is_array($aviso) && count($aviso) > 0){
			
			// Endereço de e-mail do corretor
			$To = array($aviso['ds_nome_corretor']=>$aviso['ds_email_corretor']);
			
			// Recupera os endereços de e-mail para os quais o alerta de aviso recusado deve ser enviado
			$Cc = array();
			$arEmailAlertaAvisoRecusado = explode('|',AR_EMAIL_ALERTA_AVISO_RECUSADO);
			foreach ($arEmailAlertaAvisoRecusado as $dsEmailAlertaAvisoRecusado) {
				list($nome, $email) = explode(':', $dsEmailAlertaAvisoRecusado);
				$Cc[$nome] = $email;
			}
			
			$assunto = "AVISO RECUSADO - {$aviso['ds_nome_proponente']} - Proposta: {$aviso['id_proposta']} - {$aviso['ds_nome_produto']}";
			
			$content = "AVISO DE SINISTRO RECUSADO\n\n";
			$content .= "Processo de Sinistro Nro: {$aviso['id_processo']}\n\n";
			$content .= "Proposta Nro: {$aviso['id_proposta']}\n";
			$content .= "Nome do Segurado: {$aviso['ds_nome_proponente']}\n";
			$content .= "Produto: {$aviso['ds_nome_produto']}\n\n";
			$content .= "Motivo da recusa: {$aviso['ds_motivo_recusa']}\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->addCc($Cc);
				$Mail->setBody($content);
				$Mail->setSubject($assunto);
				$Mail->send();

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

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

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

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

		$data = array();
			
		$idProcesso = $this->getRequest()->getParam('idProcesso');
		$idEmpresaProcesso = $this->getRequest()->getParam('idEmpresaProcesso');
		
		$VistoriaAviso = new Sinistro_Model_VistoriasAvisos();
		$vistorias = $VistoriaAviso->getVistoriasSemLaudo($idProcesso);
		
		if (count($vistorias)) {
			$data['hasVistoria'] = true;			

			$Empresa = new Sistema_Model_Empresas();
			$rs = $Empresa->find($idEmpresaProcesso)->current();
			$data['dsNomeEmpresa'] = $rs['ds_nome_fantasia'];
			
			$data['vistorias'] = array();
			
			foreach ($vistorias as $item) {
				$data['vistorias'][$item['id_vistoria']]['avisos'] = $VistoriaAviso->getAvisos($item['id_vistoria']);
				$data['vistorias'][$item['id_vistoria']]['ds_tipo'] = $item['ds_tipo'];
			}
		} else {
			$data['hasVistoria'] = false;			
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($data));
	}
}
