<?php

class Sinistro_AgendamentovistoriaController extends Agro_Controller_Action {

	public function getForm() {
		return new Sinistro_Form_AgendamentoVistoria();
	}
	
	public function formAction() {
		$this->getHelper('layout')->disableLayout();
		
		$Form = $this->getForm();
		
		$params = $this->getRequest()->getParams();
		
		$Model_Vistorias = new Sistema_Model_Vistorias();
		$Model_VistoriasCoberturas = new Sistema_Model_VistoriasCoberturas();
		$Model_Agendamentos = new Sistema_Model_Agendamentos();
		$Model_VistoriasAgendamentos = new Sistema_Model_VistoriasAgendamentos();
		$Model_VistoriasProcessos = new Sinistro_Model_VistoriasProcessos();
		$Model_VistoriasEmpresas = new Sistema_Model_VistoriasEmpresas();
		$Model_ProcessosEmpresas = new Sinistro_Model_ProcessosEmpresas();
		$Model_Avisos = new Sinistro_Model_AvisosSinistro();
		
		$Form->populate($params);
		
		if ($this->getRequest()->isPost()) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			
			try {
				if ($Form->isValid($Form->getValues())) {					
					/**
					 * Valida se o agendamento não foi anterior ao sinistro
					 */					
					$menor_data_aceitacao_aviso = new Zend_Date();
					$menor_data_aceitacao_aviso->set($Model_Avisos->buscaDataAceitacaoAvisoMaisAntigo($params), Zend_Date::DATES);

					$dt_agendamento = new Zend_Date();
					$dt_agendamento->set($params["dt_agendamento"], Zend_Date::DATES);
					
					/**
					 * Valida se o agendamento já tem na mesma data
					 */
					$query = "SELECT
					 			count(a.id) as nid
							  FROM	sistema.agendamentos a
							  INNER JOIN sistema.vistorias_agendamentos va
							  ON va.id_agendamento = a.id
							  INNER JOIN sinistro.vistorias_processos vp
							  ON vp.id_vistoria = va.id_vistoria
							  WHERE vp.id_processo = {$params["id_processo"]}
							  AND a.dt_agendamento = '".$dt_agendamento->get(Zend_Date::W3C)."'";
						
					$contAgendamentos = Zend_Db_Table::getDefaultAdapter()->fetchOne($query);
										
					if ($dt_agendamento->get(Zend_Date::W3C) < $menor_data_aceitacao_aviso->get(Zend_Date::W3C)){
						$params['mensagem'] = "A data da vistoria deve ser posterior ou igual a ".$menor_data_aceitacao_aviso->get(Zend_Date::DATES);
						$params['fl_success'] = 0;						
												
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
						
					} else {
						
						$query = "select 
									max(a.dt_agendamento)
								FROM
									sistema.agendamentos a inner JOIN
									sistema.vistorias_agendamentos va on va.id_agendamento = a.id inner JOIN
									sinistro.vistorias_processos vp on vp.id_vistoria = va.id_vistoria
								where 
									vp.id_processo = {$params["id_processo"]} and
									a.dt_agendamento < '".$dt_agendamento->get(Zend_Date::W3C)."'";
						
						
						
						$data = Zend_Db_Table::getDefaultAdapter()->fetchOne($query);
						
						if (!$data){
							$DtUltimoAgendamento = new Zend_Date($dt_agendamento->get(Zend_Date::W3C));
							//$DtUltimoAgendamento->sub(10, Zend_Date::DAY);
							
						} else {
							$DtUltimoAgendamento = new Zend_Date($data);
							
						}
						
						$DtUltimoAgendamento->add(4, Zend_Date::DAY);
						
						if (($DtUltimoAgendamento->get(Zend_Date::W3C) < $dt_agendamento->get(Zend_Date::W3C)) && ($contAgendamentos == 0) || Agro_Util::checkPermission('sinistro:agendamentovistoriafinal:preliminarfinalmesmodia')) {							
							
							// Salva dados da vistoria
							$data = $params;
							if ($params['id_vistoria']) {
								$data['id'] = $params['id_vistoria'];
							}
							$params['id_vistoria'] = $Model_Vistorias->save($data);
							
							// Cria relacionamento entre vistoria e cobertura
							$Model_VistoriasCoberturas->save($params);					
							
							// Salva dados do agendamento
							$data = $params;
							if ($params['id_agendamento']) {
								$data['id'] = $params['id_agendamento'];
							}
							$data['id_status'] = $Model_Agendamentos->getIdStatus('AGENDADO');
							
							$params['id_agendamento'] = $Model_Agendamentos->save($data);
							
							// Cria relacionamento entre vistoria e agendamento
							$Model_VistoriasAgendamentos->save($params);
							
							// Cria relacionamento entre vistoria e processo
							$Model_VistoriasProcessos->save($params);	
							
							// Cria relacionamento entre vistoria e empresa vistoriadora
							$params['id_empresa'] = $Model_ProcessosEmpresas->getEmpresaByProcesso($params['id_processo']);
							$Model_VistoriasEmpresas->save($params);
							
							$params['fl_success'] = 1;
							$params['mensagem'] = "Agendamento efetuado com sucesso.";
							
							Agro_Db_Table_Abstract::getDefaultAdapter()->commit();							
							
						} else {
							Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
							$params['mensagem'] = "Um novo agendamento só poderá ser feito 4 dias após o anterior.\n\n A data da vistoria deve ser posterior ou igual a ".$DtUltimoAgendamento->get(Zend_Date::DATES)."\n\n";
							$params['fl_success'] = 0;
						}
					}
				} else {
					Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
					$params['fl_success'] = 1;
					$params['mensagem'] = "'{$this->getAllFormErros(array($Form),$Form->getValues())}'";
				}
			} catch (Exception $e) {
				Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
				$params['fl_success'] = 0;
				$params['mensagem'] = "'{$e->getMessage()}'";
			}
			
		} else {
			if($params['id_vistoria']) {
				$params = $Model_Agendamentos->getAgendamento($params['id_vistoria']);
			}
		}

		$Form->populate($params);
		
		$this->view->form = $Form;
	}

	public function excluirAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		
		$Json = new Zend_Json();
		
		$idVistoria = $this->getRequest()->getParam('id_vistoria');
		
		
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();
		try {	
			//Buscar id_agendamento da vistoria
			$VistoriaAgendamento = new Sistema_Model_VistoriasAgendamentos();
			$ag = $VistoriaAgendamento->fetchRow($VistoriaAgendamento->getAdapter()->quoteInto('id_vistoria = ?',$idVistoria))->toArray();
			$idAgendamento = $ag['id_agendamento'];

			$ModelCobrancaVistorias = new Sinistro_Model_CobrancaRelatorioVistorias();
			
			if($ModelCobrancaVistorias->checkStatus($idVistoria)){
				$ModelCobrancaVistorias->delete($idVistoria,'id_vistoria');
			}
			
			// Exclui vistoria
			$Vistoria = new Sistema_Model_Vistorias();
			$Vistoria->delete($idVistoria);
			
			// Exclui agendamento
			$Agendamento = new Sistema_Model_Agendamentos();
			$Agendamento->delete($idAgendamento);
			
			$Db->commit();

			$return['message'] = "Registro excluído com sucesso";
			
			$this->getResponse()->setBody(Zend_Json::encode($return));
			
		} catch (Exception $e) {
			if($e->getCode() == 23503){
				$return['message'] = "Atenção!\n\n Este laudo não pode ser excluído, pois está relacionado com uma nota fiscal de cobrança.
									 \n\n Se realmente for necessário a correção, devolva o relatório de cobrança, oriente o perito a corrigir 
									 o laudo e a refazer a cobrança.";
			}else{
				$return['message'] = "ERRO: \n\n" . $e->getMessage();
			}
			$Db->rollback();
			$this->getResponse()->setBody(Zend_Json::encode($return));
		}
	}
}