<?

class Safra12_FhgranizoController extends Agro_Controller_Action{
	
	public function init() {
		$this->view->title = 'Sinistro » Processos » Laudo Preliminar » Frutas / Hortaliças';
		$this->view->back = "/sinistro/processo/view/id/".$this->getRequest()->getParam('id_processo');	
		$this->session = new Zend_Session_Namespace('laudo_preliminar');
	}
	
	public function getModel() {
		return new Safra12_Model_FHGranizos();
	}
	
	public function getForm() {
		return new Safra12_Form_FHGranizo();
	}
	
	public function formAction() {
		$params = $this->getRequest()->getParams();
		
		$this->view->form = $this->getForm();
		$this->view->formAssinatura = new Sinistro_Form_AssinaturaLaudoPreliminar();
		$this->view->formDadosVistoria = new Sistema_Form_DadosVistoria();
		
		$this->view->title .= ' » Formulário';
		
		$this->view->idVistoria  = $params['id_vistoria'];
		$this->view->idCobertura = $params['id_cobertura'];
		$this->view->idProposta  = $params['id_proposta'];
		$this->view->idProcesso  = $params['id_processo'];
		
		$this->session->idVistoria  = $params['id_vistoria']; 
		$this->session->idCobertura = $params['id_cobertura'];
		$this->session->idProposta  = $params['id_proposta']; 
		$this->session->idProcesso  = $params['id_processo']; 
				
		$this->view->form->setBttBack($this->view->idProcesso);
		
		$this->view->tbItensIndenizacao = true;

		$this->view->vistoriadores = array();
		
		$User = Zend_Auth::getInstance()->getIdentity();

		$this->session->userVistoriaMesmaEmpresa = true;
		if ($User->tp_usuario != 'F') {
			$Funcionario = new Sistema_Model_Funcionarios();
			$f = $Funcionario->fetchRow('id_usuario = '.$User->id);
			$idEmpresaUserLogado = $f['id_empresa'];
	
			$VistoriaEmpresa = new Sistema_Model_VistoriasEmpresas();
			$idEmpresaVistoria = $VistoriaEmpresa->getEmpresaByVistoria($this->session->idVistoria);
			
			$this->session->userVistoriaMesmaEmpresa = $idEmpresaUserLogado == $idEmpresaVistoria ? true : false;
		}
		$this->view->userVistoriaMesmaEmpresa = $this->session->userVistoriaMesmaEmpresa;

		$VistoriaAviso = new Sinistro_Model_VistoriasAvisos();
		$this->view->hasVistoriaFinal = $VistoriaAviso->hasVistoriaFinal($this->session->idVistoria, $this->session->idCobertura);

		if ($this->getRequest()->isPost()) {
					
			$formFHGranizo	   = $this->view->form;
			$formAssinatura    = $this->view->formAssinatura;
			$formDadosVistoria = $this->view->formDadosVistoria;
			
			$additionals = array();

			$additionals[] = array(
				'type'	  => 'checkbox',
				'fields'   => 'vistoriadores',
				'minCheckeds' => 1,
				'label'   => 'Vistoriadores',
				'message' => MSG_ERRO_LP_VISTORIADOR
			);
			
			if($this->getRequest()->getParam('fl_evento_nao_constatado')){
				$formFHGranizo->id_intensidade->setRequired(false);
				$formFHGranizo->fl_area_atingida->setRequired(false);
				$formFHGranizo->fl_indenizacao_fitossanitaria->setRequired(false);
				
				$formFHGranizo->ds_estadio_cultura->setRequired(false);
				$formFHGranizo->ds_aspectos_gerais_cultura->setRequired(false);
				$formFHGranizo->ds_data_colheita_variedade->setRequired(false);
				$formFHGranizo->ds_diametro_medio_frutos_variedade->setRequired(false);
				
			}else{
				
				/* identificação dos campos que não foram gerados pelo Zend Form para validação*/
				$additionals[] = array(
					'type'	  => 'checkbox',
					'fields'   => 'itens_segurados',
					'label'   => 'Quadras Atingidas',
					'message' => MSG_ERRO_LP_QUADRAS_ATINGIDAS
				);
				
				if($this->getRequest()->getParam('fl_indenizacao_fitossanitaria')){
					$additionals[] = array(
						'type'	  => 'checkbox',
						'fields'   => 'itens_indenizacao',
						'label'   => 'Quadras com direito a indenização',
						'message' => MSG_ERRO_LP_QUADRAS_INDENIZACAO
					);
				}
				
				$checkboxes = array('fl_danos_folhas','fl_danos_ramos','fl_danos_flores','fl_danos_frutos','fl_danos_vegetacao_adjacente');
			    $additionals[] = array(
						'type'	  => 'checkbox',
						'fields'   => $checkboxes,
						'label'   => 'Houve Danos',
						'message' => MSG_ERRO_LP_DANOS
					);
				
				/*Se o fl_indenizacao_fitossanitaria-0 estiver setado, o campo ds_observacao deve ser obrigatório*/
				if(!$this->getRequest()->getParam('fl_indenizacao_fitossanitaria')){
					$additionals[] = array(
						'type'	  => 'text',
						'fields'  => 'ds_observacao',
						'label'   => 'Observações',
						'message' => MSG_ERRO_LP_OBSERVACOES
					);
				}
			}			
			
			$forms = array($formDadosVistoria,$formFHGranizo,$formAssinatura);
			
			$errorMsg = $this->getAllFormErros($forms,$this->getRequest()->getPost(),$additionals);
			
			if(!$errorMsg){
				$this->view->tbItensIndenizacao = false;
				$this->save($this->getRequest()->getParams());
			}else{
				$this->view->form->populate($this->getRequest()->getParams());
				$this->view->showMessage($errorMsg, 'error');
				
				$arrayItens = $this->getRequest()->getParam('itens_segurados');
				$this->view->itensSegurados = $this->getItensSegurados(null,$arrayItens ? $arrayItens : array());
												
				$arrayItens = $this->getRequest()->getParam('itens_indenizacao');
				$this->view->itensIndenizacao = $arrayItens ? $arrayItens : array();
				
			}
			
		} else{
			$VistoriaFuncionario = new Sistema_Model_VistoriasFuncionarios();
			$this->view->vistoriadores = $VistoriaFuncionario->getVistoriadoresByVistoria($this->session->idVistoria);
						
			/* Busca ítens segurados */		
			$this->view->itensSegurados = $this->getItensSegurados($this->getRequest()->getParam('id'));
			
			/*Carrega os ítens disponíveis para indenização*/
			$FHGranizo = new Safra12_Model_FHGranizos();
			$this->view->itensIndenizacao = $FHGranizo->getItensIndenizacao($this->getRequest()->getParam('id'));
			
			if ($this->getRequest()->getParam('id')) {
				$row = $this->getRow();
				
				$this->view->form->populate($row);
				$this->view->formAssinatura->populate($row);
				$this->view->formDadosVistoria->populate($row);
				
				$this->view->ds_chave_status = $row['ds_chave_status'];
				
				if($row['ds_chave_status'] == 'SALVO'){
					$this->view->form->ds_status->setValue('salvo');
				}elseif($row['ds_chave_status'] == 'ENVIADO'){
					$this->view->form->ds_status->setValue('enviado');
				}
				
			}
		}
	}
	
	public function getRow() {
		if ($this->getRequest()->getParam('id')) {
			
			$Safra = new Safra12_Model_FHGranizos();
			$row = $Safra->getDataLaudoPeliminar($this->getRequest()->getParam('id'));
			
			return $row;
		}
	}
	
	public function save(array $post) {
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Db->beginTransaction();
		
		try {
			/* Edita as informações da vistoria ******************************************/
			$data = array(
				'dt_inicio'	=> Agro_Util::formatDate($post['dt_inicio'], Zend_Date::W3C),
				'dt_fim'    => Agro_Util::formatDate($post['dt_fim'], Zend_Date::W3C)
			);
		    $Vistora = new Sistema_Model_Vistorias();
			$Vistora->update($data, 'id = '.$this->view->idVistoria);

			$AvisoSinistro = new Sinistro_Model_AvisosSinistro();
			$rs = $AvisoSinistro->getAvisosByCoberturaVistoriaPreliminar($this->session->idProposta, $this->session->idCobertura);
			
			if (count($rs) > 0) {
				foreach ($rs as $it) {
					$dtSinistro = Agro_Util::formatDate($it['dt_sinistro'], 'yyyyMMdd');
					if ($dtSinistro) {
						$dtInicio = Agro_Util::formatDate($post['dt_inicio'], 'yyyyMMdd');
						$dtFim    = Agro_Util::formatDate($post['dt_fim'], 'yyyyMMdd');
						if ($it['id_vistoria'] == $this->session->idVistoria) {
							if ($dtInicio < $dtSinistro) {
								throw new Exception('A data da vistoria não pode ser anterior a data do sinistro.');
							}
						} else {
							if (!$it['id_vistoria']) {
								if ($dtInicio >= $dtSinistro) {
									$item = array();
									$item['id_vistoria'] = $this->session->idVistoria;
									$item['id_aviso'] = $it['id_aviso'];
									
									$VistoriaAviso = new Sinistro_Model_VistoriasAvisos();
									$VistoriaAviso->insert($item);
								}
							}
						}
					}
				}				
			}
			/* Insere as informações do laudo preliminar (no esquema sinistro)***********/
			$dsChaveStatus = array_key_exists('enviar',$post) ? 'ENVIADO' : 'SALVO';

			$LaudoPreliminar = new Sinistro_Model_LaudosPreliminares();
			$Status = new Sistema_Model_Status();
			
			$idStatus = $LaudoPreliminar->getIdStatusLP($dsChaveStatus); 
			
			$data = array(
				'id_processo' 			   => $this->view->idProcesso,
				'id_status'				   => $idStatus,
				'id_cobertura' 			   => $this->view->idCobertura,
				'ds_observacao'		  	   => $post['ds_observacao'],
			    'fl_assinatura_regulador'  => $post['fl_assinatura_regulador'],
			    'fl_assinatura_segurado'   => $post['fl_assinatura_segurado'],
			    'fl_evento_nao_constatado' => $post['fl_evento_nao_constatado']
			);
			
			if($post['id']){
				$LaudoPreliminar->update($data,"id = {$post['id']}");
				$idLaudoPreliminar = $post['id'];
			}else{
				$idLaudoPreliminar = $LaudoPreliminar->insert($data);
			}
			
			if(!$post['id']){
				/* Insere as informações da relação entre vistoria e laudo preliminar *****/
				$data = array(
					'id_vistoria' => $this->view->idVistoria,
	  				'id_laudo_preliminar' => $idLaudoPreliminar
				);
				$VistoraLaudo = new Sistema_Model_VistoriasLaudosPreliminares();
				$VistoraLaudo->insert($data);
			}
			
			/* Insere as informações da relação entre vistoria e vistoriador ***********/
			$VistoriaFuncionarios = new Sistema_Model_VistoriasFuncionarios();
			if ($post['id']) {
				$VistoriaFuncionarios->delete($this->session->idVistoria);
			}
			foreach ($post['vistoriadores'] as $value) {
				$idVistoriador = $value;
				
				$funcionario = array();
				$funcionario['id_funcionario'] = $idVistoriador;
				$funcionario['id_vistoria']    = $this->session->idVistoria;
				
				$VistoriaFuncionarios->insert($funcionario);
			}
			
			/* Insere as informações do laudo preliminar ******************************/
			$data = array(
				'id_laudo_preliminar'				  => $idLaudoPreliminar,
				'id_processo'				  		  => $this->view->idProcesso,
				'id_cobertura'				  		  => $this->view->idCobertura,
			    'id_intensidade' 					  => $post['id_intensidade'],
			    'fl_acompanhado_vento' 				  => $post['fl_acompanhado_vento'],
			    'ds_direcao_evento' 			  	  => $post['ds_direcao_evento'],
			    'fl_acompanhado_chuva' 				  => $post['fl_acompanhado_chuva'],
			    'ds_diametro_medio_granizo' 		  => $post['ds_diametro_medio_granizo'],
			    'fl_danos_benfeitorias' 			  => $post['fl_danos_benfeitorias'],
			    'fl_area_atingida' 					  => $post['fl_area_atingida'],
			    'fl_area_mesma_intensidade' 		  => $post['fl_area_mesma_intensidade'],
			    'ds_area_mesma_intensidade' 		  => $post['ds_area_mesma_intensidade'],
			    'ds_estadio_cultura' 				  => $post['ds_estadio_cultura'],
			    'ds_aspectos_gerais_cultura' 		  => $post['ds_aspectos_gerais_cultura'],
			    'ds_data_colheita_variedade' 		  => $post['ds_data_colheita_variedade'],
			    'ds_diametro_medio_frutos_variedade'  => $post['ds_diametro_medio_frutos_variedade'],
			    'fl_danos_folhas' 					  => $post['fl_danos_folhas'],
			    'fl_danos_ramos' 					  => $post['fl_danos_ramos'],
			    'fl_danos_flores' 					  => $post['fl_danos_flores'],
			    'fl_danos_frutos' 					  => $post['fl_danos_frutos'],
			    'fl_danos_vegetacao_adjacente'  	  => $post['fl_danos_vegetacao_adjacente'],
			    'fl_indenizacao_fitossanitaria' 	  => $post['fl_indenizacao_fitossanitaria']
   			);
   			
   			// Instancia model FHGranizos da safra da proposta em questão
		    $Safra = new Produto_Model_Safras();
			$nomeModel = $Safra->getSafraModel($this->view->idProposta,'FHGranizos');
		    $FHGranizo = new $nomeModel;
		   	
		 	if($post['id']){
				$FHGranizo->update($data,'id_laudo_preliminar = '.$post['id']);
			}else{
				$FHGranizo->insert($data);
			}
			
		    /* Insere as informações dos Itens Segurados */
			$SinistroItensSegurados = new Sinistro_Model_LaudosPreliminaresItensSegurados();
			$VistoriaItensSegurados = new Sistema_Model_VistoriasItensSegurados();
			
	    	$Safra = new Produto_Model_Safras();
			$nomeModel = $Safra->getSafraModel($this->view->idProposta,'LaudosPreliminaresFrutasHortalicasItensSegurados');
			$Safra12Itens = new $nomeModel;
			
			
			$SinistroItensSegurados->deleteItensLaudoPreliminar($idLaudoPreliminar);
			$VistoriaItensSegurados->delete($this->view->idVistoria);
			
		    foreach($post['itens_segurados'] as $item){
				
				$data = array();
				$data['id_vistoria']      = $this->view->idVistoria;
				$data['id_item_segurado'] = $item;
				$VistoriaItensSegurados->insert($data);

				$data = array();
				$data['id_laudo_preliminar'] = $idLaudoPreliminar;
				$data['id_item_segurado']    = $item;
	
			   	$idLaudoPreliminarItemSegurado = $SinistroItensSegurados->insert($data);

				$data = array();
				$data['id_laudo_preliminar_item_segurado'] = $idLaudoPreliminarItemSegurado;
				$data['vl_area_replantada']                = $post['area_item_segurado-' . $item];
				if (in_array($item,$post['itens_indenizacao'])){
					$data['fl_indenizacao_fitossanitaria'] = 'true';
				}else{
					$data['fl_indenizacao_fitossanitaria'] = 'false';
				}
				$Safra12Itens->insert($data);
		    }
		    
		    
		    
		    $Db->commit();
			$this->_redirect('/sinistro/processo/view/id/' . $this->view->idProcesso);
			
		} catch (Exception $e) {
			$Db->rollback();
			$this->view->showMessage(MSG_ERROR . "<br />" . $e->getMessage(), 'error');
			echo "<br>ERRO!! " . $e->getMessage() . "<br><br>";
		}
	}
	
	/**
	 * Busca os ítens segurados e acrescenta a informação de se eles
	 * já foram selecionados ou não.
	 *
	 * @param int $idLaudoPreliminar
	 * @param array $checkeds - Recebe ítens checados do post
	 * @return array $itens
	 */
	private function getItensSegurados($idLaudoPreliminar=null,array $checkeds=array()){
		// Busca os ítens segurados
		$ItenSegurado = new Seguro_Model_ItensSegurados();
		$itens = $ItenSegurado->getItemSeguradoByProposta($this->view->idProposta);
		
		// No caso de o laudo estar sendo editado, busca os ítens segurados relacionados
		$arrayLaudoItem = array();
		if($idLaudoPreliminar){
			$checkeds = array();
			$LaudoItem = new Sinistro_Model_LaudosPreliminaresItensSegurados();
			$fetch = '
				fl_ativo = true and '.
				$LaudoItem->getAdapter()->quoteInto('id_laudo_preliminar = ?',$idLaudoPreliminar);
			
			$arrayLaudoItem = $LaudoItem->fetchAll($fetch)->toArray();
			
			foreach ($arrayLaudoItem as $item){
				$checkeds[] = $item['id_item_segurado'];
			}
			
		}
		
		//Caso tenha sido gerada uma exceção no preenchimento do laudo,
		// carrega os ítens segurados checados que vieram por post
		
		for($i=0; $i < count($itens); $i++){
			if(in_array($itens[$i]['id'],$checkeds)){
				$itens[$i]['checked'] = true;
			}else{
				$itens[$i]['checked'] = false;
			}
		}
		
		
		return $itens;
	}
}