<?php

class Sinistro_RotinasController extends Agro_Controller_Action{

	public function init() {
		$this->view->title = 'Sinistro » Rotinas';
		ini_set('memory_limit','1024M');
		require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");
	}

	public function getModel() {
		return new Sinistro_Model_Rotinas();
	}

	public function indexobservacoesAction(){
		parent::indexAction();
		$this->view->title = 'Sinistro » Rotinas » Importar Observações';
	}
	
	public function indexreservasAction(){
		parent::indexAction();
		$this->view->title = 'Sinistro » Rotinas » Importar Ajustes de Reservas';
		
		$file = fopen(APPLICATION_PATH."/upload_files/xml_transmissao_error/log_reserva.csv", "w+");
		fwrite($file, "Execute a operacao!");
		fclose($file);
	}	

	public function indexcobrancavistoriasAction(){
		parent::indexAction();
		$this->view->title = 'Sinistro » Rotinas » Cobrança de Agendamentos e Vistorias';
	}
	
	public function desabilitarlaudospreliminaresAction(){
		parent::indexAction();
		$this->view->title = 'Sinistro » Rotinas » Desabilitar Laudos Preliminares';
	}

	public function importaobservacoesarquivoAction() {
		
		$this->isAjax();
		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = $Adapter->getFileInfo();

		if(!$Adapter->receive($file['file']['name'])) {
			$alert = 'Erro ao importar Observações!';
			$result = 0;
		} else {

			$extensao = explode('.',$file['file']['name']);

			if(end($extensao) == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['file']['name'],"r");
				$Model = $this->getModel();
				
				$linha = 0;
				$result = 1;
				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false && $result != 0){
					$data[$linha]['nota'] = utf8_encode($dados[0]);
					$data[$linha]['proposta'] = utf8_encode($dados[1]);
					$data[$linha]['tipo_laudo'] = utf8_encode($dados[2]);
					$data[$linha]['quadra'] = utf8_encode($dados[3]);
					$data[$linha]['variedade'] = utf8_encode($dados[4]);
					$data[$linha]['sinistro'] = utf8_encode($dados[5]);
					$data[$linha]['data'] = utf8_encode($dados[6]);

					try{
						//pula a primeira linha pois é cabeçalho
						if($linha != 0){
							$Processos = new Sinistro_Model_Processos();

							$id_processo = $Processos->getIdProcessoByProposta($data[$linha]['proposta']);
							if(!$id_processo){
								$alert = 'Proposta  '.$data[$linha]['proposta'].' na linha '.($linha+1).' não possui processo! Importação cancelada!';
								$result = 0;

							}else{
								$data[$linha]['id_processo'] = $id_processo;
								$Model->save($data[$linha]);
							    
								$alert = 'Observações de Processos importadas com sucesso!';
							    $result = 1;

							}
						}
					}catch(Exception $e){

						Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
						
						$linha++;
						$alert = "Erro ao importar Observações! Informações da linha $linha inválidas!";
						$result = 0;
					}
					$linha++;
				}

	  			fclose($arquivo);

			    Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
	  			
			}else{
				
				$alert  = 'Formato de arquivo inválido!';
				$result = 0;
			}
		}
		
		$this->getResponse()->setBody(
			"<script>window.top.window.stopUpload($result);
				alert(\"$alert\");
			</script>"
		);

	}
	
	public function importareservasarquivoAction() {
	
		$this->isAjax();
		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
	
		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = each($Adapter->getFileInfo());
		
		$Propostas = new Seguro_Model_Propostas();
		$Model     = $this->getModel();
		$User      = Zend_Auth::getInstance()->getIdentity();
		
		if(!$Adapter->receive()) {
			$alert = 'Erro ao importar Reservas!';
			$return = 0;
		} else {
	
			$extensao = explode('.',$file[1]['name']);
	
			if(end($extensao) == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file[1]['name'],"r");
				$linha   = 0;
				$return  = 1;
				
				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false && $return != 0){
					$data[$linha]['proposta']   = utf8_encode($dados[0]);
					$data[$linha]['apolice']    = utf8_encode($dados[1]);
					$data[$linha]['aviso']      = utf8_encode($dados[2]);
					$data[$linha]['cobertura']  = utf8_encode($dados[3]);
					$data[$linha]['valor']      = utf8_encode($dados[4]);
					$data[$linha]['tipo']       = utf8_encode($dados[5]);
					
					if (APPLICATION_ENV != 'production') {
						$client = new nusoap_client(WSDL_DEV, true, false, false, false, false, 3600, 3600);
					} else {
						$client = new nusoap_client(WSDL_PROD, true, false, false, false, false, 3600, 3600);
					}					

					try{
						//pula a primeira linha pois é cabeçalho
						if($linha != 0){
							$mysoapmsg  = $this->montaXMLTransmissao($data[$linha]['aviso'], $data[$linha]['cobertura'], $data[$linha]['valor'], $data[$linha]['tipo']);
							
							$params = array('Servico' => 'InserirMovimentoSinistro', 'conteudoXML' => $mysoapmsg);
							$result = $client->call('ExecutarRow', array($params));

							if ($client->getError()) {
								$Propostas->gravaLogTransmissao(
										array(
												'id_proposta'        => $data[$linha]['proposta'],
												'ds_retorno'         => "Aviso de Sinistro: ".$data[$linha]['aviso']." - ".utf8_encode($client->getError()),
												'fl_sucesso'         => 'f',
												'ds_tipo_transmissao' => 'InserirMovimentoSinistro - Ajuste de Reserva',
												'ds_xml_transmissao' => $mysoapmsg
										)
								);
								Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
								$return = 0;
								$alert  = "Erro de conexão!";
								break;
							
							} else {

								$result_xml = simplexml_load_string(utf8_encode($result['ExecutarRowResult']), 'SimpleXMLElement', LIBXML_NOCDATA);

								if($result_xml['cd_retorno'] == 'OK'){
									$Propostas->gravaLogTransmissao(
											array(
												'id_proposta'        => $data[$linha]['proposta'],
												'ds_retorno'         => "Ajuste de Reserva: ".$data[$linha]['aviso']." - ".$result_xml['retorno'],
												'fl_sucesso'         => 't',
												'ds_tipo_transmissao' => 'InserirMovimentoSinistro - Ajuste de Reserva',
												'ds_xml_transmissao' => $mysoapmsg
											)
									);
									
									$rsAviso = $Model->getAvisoReserva($data[$linha]['aviso'], $data[$linha]['cobertura']);
									
									if($data[$linha]['tipo'] == 'AJUSTE_MAIS'){
										$vl_reserva = $rsAviso['vl_reserva'] + $data[$linha]['valor'];
									} else {
										$vl_reserva = $rsAviso['vl_reserva'] - $data[$linha]['valor'];
									}
									
									$AvisosTransmissao = new Sinistro_Model_AvisosTransmissaoSeguradora();
									$AvisosTransmissao->update(array('vl_reserva' => $vl_reserva, 'dt_alteracao' => 'now()', 'id_usuario_alteracao' => $User->id), "id_aviso = {$data[$linha]['aviso']} and id_cobertura = {$data[$linha]['cobertura']}");
									
								} else {
									$Propostas->gravaLogTransmissao(
											array(
												'id_proposta'        => $data[$linha]['proposta'],
												'ds_retorno'         => "Ajuste de Reserva: ".$data[$linha]['aviso']." - ".$result_xml->erro['nm_retorno'],
												'fl_sucesso'         => 'f',
												'ds_tipo_transmissao' => 'InserirMovimentoSinistro - Ajuste de Reserva',
												'ds_xml_transmissao' => $mysoapmsg
											)
									);
									
									$this->geraSalvaXml('log_reserva.csv', $data[$linha]['proposta'].";".$data[$linha]['apolice'].";".$data[$linha]['aviso'].";".$data[$linha]['cobertura'].";".$data[$linha]['valor'].";".$data[$linha]['tipo'].";".$result_xml->erro['nm_retorno'].chr(13).chr(10));
									
									//Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
									//$return = 0;
									//$alert  = "Erro ao importar Reservas (1)! Informações da linha $linha inválidas!";
								}
							}
						}
					}catch(Exception $e){
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
						$linha++;
						$alert  = "Erro ao importar Reservas (2)! Informações da linha $linha inválidas!";
						$return = 0;
					}
					$linha++;
				}
				
				fclose($arquivo);
				
				if($return == 1){
					$alert = 'Reservas ajustadas com sucesso!';
					Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
				}
	
			}else{
				$alert  = 'Formato de arquivo inválido!';
				$return = 0;
			}
		}
	
		$this->getResponse()->setBody(
				"<script>window.top.window.stopUpload($return);
				alert(\"$alert\");
				</script>"
		);
	}

	public function atualizarreservasAction() {
	
		$this->isAjax();
		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
	
		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = $Adapter->getFileInfo();

		$User      = Zend_Auth::getInstance()->getIdentity();
		
		if(!$Adapter->receive($file['file_reservas']['name'])) {
			$alert = 'Erro ao atualizar Reservas!';

			$return = 0;
		} else {

			$extensao = explode('.',$file['file_reservas']['name']);
	
			if(end($extensao) == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['file_reservas']['name'],"r");
				$linha   = 0;
				$return  = 1;

				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false && $return != 0){
					
					$data[$linha]['cd_identificador_seguradora']   = utf8_encode($dados[0]);
					$data[$linha]['valor']      = utf8_encode($dados[1]);

					try{
						//pula a primeira linha pois é cabeçalho
						if($linha != 0){
							$AvisosTransmissao = new Sinistro_Model_AvisosTransmissaoSeguradora();
							$AvisosTransmissao->update(array('vl_reserva' =>  $data[$linha]['valor'], 'dt_alteracao' => 'now()', 'id_usuario_alteracao' => $User->id), "cd_identificador_seguradora = '{$data[$linha]['cd_identificador_seguradora']}'");								
						}
					}catch(Exception $e){
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
						$linha++;
						$alert  = "Erro ao atualizar Reservas! Informações da linha $linha inválidas!";
						$return = 0;
					}
					$linha++;
					
				}
	
				fclose($arquivo);
	
				if($return == 1){
					$alert = 'Reservas atualizadas com sucesso!';
					Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
				}
	
			}else{
				$alert  = 'Formato de arquivo inválido!';
				$return = 0;
			}
		}
	
		$this->getResponse()->setBody(Zend_Json::encode($alert));
	}	
	
	public function atualizarindenizacoesAction() {

		$this->isAjax();
		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
	
		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = $Adapter->getFileInfo();
	
		$User      = Zend_Auth::getInstance()->getIdentity();
	
		if(!$Adapter->receive($file['file_indenizacoes']['name'])) {
			$alert = 'Erro ao atualizar Indenizações!';
			$return = 0;
		} else {
	
			$extensao = explode('.',$file['file_indenizacoes']['name']);
	
			if(end($extensao) == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['file_indenizacoes']['name'],"r");
				$linha   = 0;
				$return  = 1;
	
				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false && $return != 0){
					$data[$linha]['cd_identificador_seguradora']   = utf8_encode($dados[0]);
					$data[$linha]['valor']      = utf8_encode($dados[1]);
	
					try{
						//pula a primeira linha pois é cabeçalho
						if($linha != 0){
							$AvisosTransmissao = new Sinistro_Model_AvisosTransmissaoSeguradora();
							$AvisosTransmissao->update(array('vl_indenizacao' =>  $data[$linha]['valor'], 'dt_alteracao' => 'now()', 'id_usuario_alteracao' => $User->id), "cd_identificador_seguradora = '{$data[$linha]['cd_identificador_seguradora']}'");
						}
					}catch(Exception $e){
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
						$linha++;
						$alert  = "Erro ao atualizar Indenizações! Informações da linha $linha inválidas!";
						$return = 0;
					}
					$linha++;
				}
	
				fclose($arquivo);
	
				if($return == 1){
					$alert = 'Indenizações atualizadas com sucesso!';
					Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
				}
	
			}else{
				$alert  = 'Formato de arquivo inválido!';
				$return = 0;
			}
		}
	
		$this->getResponse()->setBody(Zend_Json::encode($alert));
	}	
	
	public function montaXMLTransmissao($id_aviso, $id_cobertura, $valor, $tipo) {
	
		$Model          = $this->getModel();
		$rsAviso        = $Model->getAvisoReserva($id_aviso, $id_cobertura);

		$ModelPropostas = new Seguro_Model_Propostas();
		$Proposta       = $ModelPropostas->find($rsAviso['id_proposta'])->current();
	
		$Proponente  = $Proposta->proponente();
		$Propriedade = $Proposta->propriedade();
		$Produto     = $Proposta->produto();
		$Safra       = $Proposta->safra();
	
		$ds_pessoa_sinistrada = str_replace("&", "e", $Proponente['ds_nome_proponente']);
		$cpf_cnpj_sinistrada  = str_replace('.', '', str_replace('/', '', str_replace('-', '', $Proponente['cpf_cnpj'])));
		if($Proponente['tp_pessoa'] == 'F') {
			$tp_pessoa_sinistrada = 1;
		} else {
			$tp_pessoa_sinistrada = 2;
		}
	
		switch ($rsAviso->cobertura){
			case 'GRANIZO':            $idCoberturaSeguradora = 240; break;
			case 'GEADA':              $idCoberturaSeguradora = 239; break;
			case 'PRODUÇÃO MÍNIMA':    $idCoberturaSeguradora = 245; break;
			case 'QUEDA DE PARREIRAL': $idCoberturaSeguradora = 252; break;
			case 'MULTIRISCO':         $idCoberturaSeguradora = 244; break;
			default:                   $idCoberturaSeguradora = 240; 
		}
		
		switch($tipo){
			case 'AJUSTE_MAIS':  $idTipoAjuste = 10102; break;
			case 'AJUSTE_MENOS': $idTipoAjuste = 10104; break;
		}
	
		$xml ="
		<i4proerp>
			<insereMovimentoSinistroRural>
				<insereMovimento>
					<apolice>".$Proposta->nr_apolice."</apolice>
					<dtMovimento></dtMovimento>
					<endosso>".$Proposta->ds_identificador_seguradora."</endosso>
					<sinistro>".$rsAviso['cd_identificador_seguradora']."</sinistro>
					<evento>".$idTipoAjuste."</evento>
					<cobertura>". Produto_Model_ProdutosCoberturas::deParaI4Pro($rsAviso['id_proposta'], $idCoberturaSeguradora) ."</cobertura>
					<valorOperacao>".$valor."</valorOperacao>
					<observacao>Ajuste de Reserva</observacao>
					<tipoMovimento></tipoMovimento>
					<nomeFavorecido>".$Proponente['ds_nome_proponente']."</nomeFavorecido>
					<tipoPessoaFavorecido>".$tp_pessoa_sinistrada."</tipoPessoaFavorecido>
					<nrCnpjCpfFavorecido>".$cpf_cnpj_sinistrada."</nrCnpjCpfFavorecido>
					<dtNascimentoFavorecido>1980-01-01</dtNascimentoFavorecido>
					<sexoFavorecido>1</sexoFavorecido>
					<nrDocumentoFavorecido>".$cpf_cnpj_sinistrada."</nrDocumentoFavorecido>
					<dtAgendamento></dtAgendamento> 
					<nrCi></nrCi> 
					<ajusta></ajusta> 
					<descontaPremioPendente></descontaPremioPendente> 
					<liberaConsistencias>1</liberaConsistencias>
					<tributaIndenizacao>0</tributaIndenizacao>
					<meioPagamento></meioPagamento>
					<nrBanco></nrBanco>
					<nrAgencia></nrAgencia>
					<nrDacAgencia></nrDacAgencia>
					<nrContaCorrente></nrContaCorrente>
					<nrDacContaCorrente></nrDacContaCorrente>
					<nrCheque></nrCheque>
					<nrEventoSequenciaEstorno></nrEventoSequenciaEstorno>
					<tipoDocumento></tipoDocumento>
					<serieDocumento></serieDocumento>
					<nrDocumento></nrDocumento>
					<dtNotaFiscal></dtNotaFiscal>
					<encerraSinistro>0</encerraSinistro>
				</insereMovimento>
			</insereMovimentoSinistroRural>
		</i4proerp>";
		
		return $xml;
	}
	
	
	public function desabilitarlaudosarquivoAction() {
		
		$this->isAjax();
		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');
		$file = $Adapter->getFileInfo();

		if(!$Adapter->receive($file['file']['name'])) {
			$alert = 'Erro ao desabilitar Laudos Preliminares!';
			$result = 0;
		} else {

			$extensao = explode('.',$file['file']['name']);

			if(end($extensao) == 'csv'){
				//abre o arquivo
				$arquivo = fopen(APPLICATION_PATH.'/upload_files/temp/' . $file['file']['name'],"r");
				$Model = $this->getModel();
				
				$linha = 0;
				$result = 1;
				
				$Model = new Sinistro_Model_AvisosSinistro();
				
				//processa o csv
				while(($dados = fgetcsv($arquivo, 0, ";")) != false && $result != 0){
					$id_aviso = $dados[0];

					try{
						//pula a primeira linha pois é cabeçalho
						if($linha != 0){
        					$Aviso = $Model->find($id_aviso)->current();
        					$Aviso->fl_dispensa_preliminar = true;
        					$Aviso->save();
        					
        					$alert = 'Ok';
						}
						
					}catch(Exception $e){
						Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
						$linha++;
						$alert = "Erro ao desabilitar Laudos Preliminares! Informações da linha $linha inválidas!";
						$result = 0;
					}
					$linha++;
				}

	  			fclose($arquivo);

			    Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
	  			
			}else{
				
				$alert  = 'Formato de arquivo inválido!';
				$result = 0;
			}
		}
		
		$this->getResponse()->setBody(
			"<script>window.top.window.stopUpload($result);
				alert(\"$alert\");
			</script>"
		);

	}
	
	public function cobraragendamentosvistoriasAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		if( $this->getRequest()->getParam('agendamentoVP') ||
		    $this->getRequest()->getParam('agendamentoVPL') ||
		    $this->getRequest()->getParam('agendamentoVF') ||
		    $this->getRequest()->getParam('digitacaoVP') ||
		    $this->getRequest()->getParam('digitacaoVPL') ||
		    $this->getRequest()->getParam('digitacaoVF')
		) {
		    Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		    $result['status'] = 'Processo executado com sucesso!';

		    Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} else {
		    $result['status'] = 'Selecione ao menos alguma opção de Cobrança!';
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function geraSalvaXml($nomeArquivo, $msg) {
		$file = fopen(APPLICATION_PATH."/upload_files/xml_transmissao_error/{$nomeArquivo}", "w+");
		fwrite($file, $msg);
		fclose($file);
	}	
}
