<?php

class Sinistro_TransmissaoavisosessorController extends Agro_Controller_Proposta {
	protected $_paginator = false;
	public $wsdl;
	public $propostas_erros = array();
	public $propostas_enviadas = array();

	public function getModel() {
		return new Sinistro_Model_TransmissaoAvisosEssor();
	}

	public function init() {
	    ini_set('memory_limit','1024M');
		$this->view->title = 'Avisos » Transmissão Essor';
		require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");
	}

	/**
	 * Monta a tela de pesquisa de propostas
	 *
	 */
	public function indexAction() {
		$this->view->form = new Sinistro_Form_TransmissaoSearch();
	}

	public function getFilter() {
		$where = array();

		if ($this->getRequest()->getParam('id_safra')) {
			$where[] = array(
				'field' => 'id_safra',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_safra')
			);
		}

		if ($this->getRequest()->getParam('id_produto')) {
			$where[] = array(
				'field' => 'id_produto',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_produto')
			);
		}

		if ($this->getRequest()->getParam('id_corretor')) {
			$where[] = array(
				'field' => 'id_usuario',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_corretor')
			);
		}

		if ($this->getRequest()->getParam('vl_pesquisar_por')) {
			switch ($this->getRequest()->getParam('pesquisar_por')) {
				case 'ds_nome_proponente':
					$field = $this->getRequest()->getParam('pesquisar_por');
					$value = "%".$this->getRequest()->getParam('vl_pesquisar_por')."%";
					$operator = 'ilike';
				case 'ds_cpf_proponente':
					$field = 'pp.cpf_cnpj';
					$value = "%".$this->getRequest()->getParam('vl_pesquisar_por')."%";
					$operator = 'ilike';
					break;
				case 'id':
					$field = 'id_proposta';
					$value = $this->getRequest()->getParam('vl_pesquisar_por');
					$operator = '=';
					break;
				default:
					$field = $this->getRequest()->getParam('pesquisar_por');
					$value = $this->getRequest()->getParam('vl_pesquisar_por');
					$operator = '=';
					break;
			}

			$where[] = array (
				'field' => $field,
				'operator' => $operator,
				'value' => $value
			);
		}
		return $where;
	}

	public function transmitirAction(){
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$return       = array("status" => true, "dados" => "", "message" => "");
		$arquivo_OK   = time()."_TRANSMISSAO_AVISOS_OK.txt";
		$arquivo_ERRO = time()."_TRANSMISSAO_AVISOS_ERRO.txt";

		$Processos = new Sinistro_Model_Processos();
		$Avisos    = new Sinistro_Model_AvisosSinistro();
		$Propostas = new Seguro_Model_Propostas();

		$ListAvisos = $this->getRequest()->getParam("id_aviso");

		if ($this->getRequest()->getParam("id_aviso")){

			foreach($ListAvisos as $chave => $arAviso){

				$arAviso   = explode("_", $arAviso);
				$aviso     = $arAviso[0];
				$cobertura = $arAviso[1];

				switch ($cobertura){
					case 'GRANIZO':            $idCobertura = 1; break;
					case 'GEADA':              $idCobertura = 3; break;
					case 'PRODUÇÃO MÍNIMA':    $idCobertura = 15; break;
					case 'QUEDA DE PARREIRAL': $idCobertura = 11; break;
					case 'MULTIRISCO':         $idCobertura = 18; break;
					case 'MULTIRISCO II':      $idCobertura = 32; break;
					default:                   $idCobertura = 1;
				}

				$idProcesso = $Processos->getProcessoByAviso($aviso);
				$idProposta = $Avisos->getIdPropostaByIdAviso($aviso);

			    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);
		        }

				$mysoapmsg  = $this->montaXMLTransmissao($aviso,$cobertura);

				$params = array('Servico' => 'InserirAvisoSinistro', 'conteudoXML' => $mysoapmsg['xml']);
				$result = $client->call('ExecutarRow', array($params));

				if ($client->getError()) {
					$return['status'] = false;
					$return['message'] = "Erro ao enviar Aviso de Sinistro. (conexão)";

					$Propostas->gravaLogTransmissao(
							array(
									'id_proposta'        => $idProposta,
									'ds_retorno'         => "Aviso de Sinistro: ".$aviso." - cobertura: ".$cobertura." - ".utf8_encode($client->getError()),
									'fl_sucesso'         => 'f',
									'ds_tipo_transmissao' => 'InserirAvisoSinistro',
									'ds_xml_transmissao' => $mysoapmsg['xml']
							)
					);
					$this->geraSalvaXml($proposta, $arquivo_ERRO, $aviso." - ".$client->getError().chr(13).chr(10));
					$return['arquivo_erro'] = $arquivo_ERRO;

				} else {
					$result_xml = simplexml_load_string(utf8_encode($result['ExecutarRowResult']), 'SimpleXMLElement', LIBXML_NOCDATA);

					if($result_xml->nm_erro){

						$return['status'] = false;
						$return['message'] = "Erro: Transmissão Seguradora.";

						$Propostas->gravaLogTransmissao(
								array(
										'id_proposta'        => $idProposta,
										'ds_retorno'         => "Aviso de Sinistro: ".$aviso." - cobertura: ".$cobertura." - ".$result_xml->nm_erro,
										'fl_sucesso'         => 'f',
										'ds_tipo_transmissao' => 'InserirAvisoSinistro',
										'ds_xml_transmissao' => $mysoapmsg['xml']
								)
						);
						$this->geraSalvaXml($proposta, $arquivo_ERRO, $aviso." - cobertura: ".$cobertura." - ".$result_xml->nm_erro);
						$return['arquivo_erro'] = $arquivo_ERRO;

					} else {
						if($result_xml->numeroSinistro){

							$Processos->update(array('id_processo_seguradora' => $idProcesso), "id = $idProcesso");
							$Avisos->update(array('fl_transmissao_seguradora' => true), "id = $aviso");

							$Propostas->gravaLogTransmissao(
									array(
											'id_proposta'        => $idProposta,
											'ds_retorno'         => "Aviso de Sinistro: ".$aviso." - cobertura: ".$cobertura,
											'fl_sucesso'         => 't',
											'ds_tipo_transmissao' => 'InserirAvisoSinistro',
											'ds_xml_transmissao' => $mysoapmsg['xml']
									)
							);

							//Registra o código do aviso de sinistro na Seguradora para a Cobertura informada
							$AvisosTransmissao = new Sinistro_Model_AvisosTransmissaoSeguradora();
							$Row = $AvisosTransmissao->getRow();
							$Row->id_aviso     = $aviso;
							$Row->id_cobertura = $idCobertura;
							$Row->vl_reserva   = $mysoapmsg['vl_reserva'];
							$Row->cd_identificador_seguradora = $result_xml->numeroSinistro;
							$Row->save();

							$this->geraSalvaXml($aviso, $arquivo_OK, $aviso." - ".$result_xml->numeroSinistro.chr(13).chr(10));
							$return['arquivo_ok'] = $arquivo_OK;
						} else {
							$Propostas->gravaLogTransmissao(
									array(
											'id_proposta'        => $idProposta,
											'ds_retorno'         => "Aviso de Sinistro: ".$aviso." - cobertura: ".$cobertura,
											'fl_sucesso'         => 'f',
											'ds_tipo_transmissao' => 'InserirAvisoSinistro',
											'ds_xml_transmissao' => $mysoapmsg['xml']
									)
							);
							$this->geraSalvaXml($proposta, $arquivo_ERRO, $aviso." - cobertura: ".$cobertura." - ".$result_xml->nm_erro);
							$return['arquivo_erro'] = $arquivo_ERRO;

							$return['status'] = false;
							$return['message'] = "Erro: Transmissão Seguradora.";
						}
					}
				}
			}
			$return['status'] = true;
			$return['message'] = "Processamento concluído com sucesso.";
		} else {
			$return['status'] = false;
			$return['message'] = "Marque ao menos um aviso.";
		}

		$this->getResponse()->setBody(Zend_Json::encode($return));

	}

	public function montaXMLTransmissao($id_aviso, $cobertura) {

		$Model = $this->getModel();
		$where[] = array('field' => 'sinistro.v_avisos_transmissao_essor.id', 'operator' => '=','value' => $id_aviso);
		$where[] = array('field' => 'sinistro.v_avisos_transmissao_essor.cobertura', 'operator' => '=','value' => $cobertura);
		$rsAviso = $Model->fetchRow($Model->getData($where));

		$ModelPropostas = new Seguro_Model_Propostas();
		$Proposta = $ModelPropostas->find($rsAviso->id_proposta)->current();

		$Proponente    = $Proposta->proponente();
		$Propriedade   = $Proposta->propriedade();
		$Corretor      = $Proposta->corretor(true);
		$Produto       = $Proposta->produto();
		$Safra         = $Proposta->safra();

		$ds_reclamante       = str_replace("&", "e", $Corretor['ds_nome_corretor']);
		$cpf_cnpj_reclamante = str_replace('.', '', str_replace('/', '', str_replace('-', '', $Corretor['cpf_cnpj'])));
		if($Corretor['tp_pessoa'] == 'J'){
			$tp_reclamante = 2;
		} else {
			$tp_reclamante = 1;
		}

		$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;
		}

		$arCultura['6']  =5;  //Alho
		$arCultura['28'] =11; //Cebola
		$arCultura['80'] =16; //Uva de Mesa
		$arCultura['81'] =5;  //Uva de Vinho
		$arCultura['43'] =14; //Kiwi
		$arCultura['67'] =6;  //Pimentão
		$arCultura['75'] =21; //Tomate
		$arCultura['7']  =36; //Ameixa
		$arCultura['26'] =18; //Caqui
		$arCultura['40'] =75; //Goiaba
		$arCultura['53'] =5;  //Maça
		$arCultura['54'] =11; //Melancia
		$arCultura['62'] =36; //Nectarina
		$arCultura['68'] =13; //Pêra
		$arCultura['69'] =15; //Pêssego
		$arCultura['74'] =36; //Tangerina
		$arCultura['5']  =5;  //Algodão
		$arCultura['11'] =12; //Arroz Irrigado
		$arCultura['15'] =60; //Aveia Branca
		$arCultura['25'] =12; //Canola
		$arCultura['29'] =21; //Cevada
		$arCultura['36'] =22; //Feijão
		$arCultura['56'] =11; //Milho
		$arCultura['58'] =15; //Milho S2
		$arCultura['72'] =22; //Soja
		$arCultura['77'] =25; //Trigo

		unset($vlIntensidade);
		$vlIntensidade = $arCultura[$rsAviso->id_cultura];

		if(!$vlIntensidade){
			$vlIntensidade = 15;
		}

		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;
			case 'MULTIRISCO II':      $idCoberturaSeguradora = 340; break;
		}

		$xml ="
				<i4proerp>
				<AvisaSinistroRural>
				    <InsereSinistro>
					    <NrProcesso>".$rsAviso->id_processo."</NrProcesso>
					    <NrAvisoParceiro>".$id_aviso."</NrAvisoParceiro>
	 		            <Apolice>".$rsAviso->nr_apolice."</Apolice>
				        <Reclamante>".$ds_reclamante."</Reclamante>
				        <TipoPessoaReclamante>".$tp_reclamante."</TipoPessoaReclamante>
				        <CNPJ_CPF_Reclamante>".$cpf_cnpj_reclamante."</CNPJ_CPF_Reclamante>
				        <Perito>Perito Teste</Perito>
				        <TipoPessoaPerito>1</TipoPessoaPerito>
				        <CNPJ_CPF_Perito>97462373068</CNPJ_CPF_Perito>
				        <DtNascimentoPerito>1980-01-01</DtNascimentoPerito>
				        <SexoPerito>1</SexoPerito>
				        <EstadoCivilPerito>1</EstadoCivilPerito>
				        <Endosso>".$Proposta->ds_identificador_seguradora."</Endosso>
						<Itens>
						<NrItem>1</NrItem>";
						foreach($Proposta->unidades(false) as $item) {
						    if($item[IS_LMGA_PARCIAL] > 0){
	    					    $xml .="
		    							<Item>
		    				                <SubItem>".$item[IS_ITEM]."</SubItem>
		    				                <PercentualDano>".$vlIntensidade."</PercentualDano>
		    				            </Item>";
						    }
						    $somaPrejuizo += ($item[IS_LMGA_PARCIAL] * $vlIntensidade)/100;
						}

						if(!$Proponente['dt_nascimento']){
							$Proponente['dt_nascimento'] = '1970-01-01';
						}
		$xml .="
						</Itens>
						<Cobertura>". Produto_Model_ProdutosCoberturas::deParaI4Pro($rsAviso->id_proposta, $idCoberturaSeguradora) ."</Cobertura>
				        <Causa>". Produto_Model_CoberturasEventos::deParaI4Pro($rsAviso->id_proposta, $rsAviso->evento_seguradora) ."</Causa>
				        <ValorEstimado>".$somaPrejuizo."</ValorEstimado>
				        <DataComunicacao>".$this->formataData($rsAviso->dt_criacao)."</DataComunicacao>
				        <DataOcorrencia>".$this->formataData($rsAviso->dt_sinistro)."</DataOcorrencia>
				        <PessoaSinistrado>".$ds_pessoa_sinistrada."</PessoaSinistrado>
				        <TipoPessoaSinistrado>".$tp_pessoa_sinistrada."</TipoPessoaSinistrado>
				        <CNPJ_CPF_Sinistrado>".$cpf_cnpj_sinistrada."</CNPJ_CPF_Sinistrado>
				        <DataNascimentoSinistrado>".$this->formataData($Proponente['dt_nascimento'])."</DataNascimentoSinistrado>
				        <LocalOcorrencia>Local 1</LocalOcorrencia>
						<UfOcorrencia>".$Propriedade['ds_sigla']."</UfOcorrencia>
				        <CidadeOcorrencia>".$Propriedade['ds_nome_municipio']."</CidadeOcorrencia>
				        <LiberaConsistencias>1</LiberaConsistencias>
				        <Resseguro>0</Resseguro>
				        <Juridico>0</Juridico>
				        <EstadoFenologico>1</EstadoFenologico>
				    </InsereSinistro>
				</AvisaSinistroRural>
				</i4proerp>";

		$arReturn = array();
		$arReturn['xml']        = $xml;
		$arReturn['vl_reserva'] = $somaPrejuizo;

		return $arReturn;
	}

	public function marcapropostasAction() {
		$this->isAjax();

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');

		$file = $Adapter->getFileInfo();
		if(!$Adapter->receive($file['propostas']['name'])){
			$result['status'] = false;
		} else {
			$dados = file_get_contents(APPLICATION_PATH.'/upload_files/temp/' . $file['propostas']['name']);
			$dados = str_replace("\r\n", ",", $dados);
			$result['propostas'] = $dados;
			$result['status'] = true;
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function geraSalvaXml($idAviso, $nomeArquivo, $msg) {
		$file = fopen(APPLICATION_PATH."/upload_files/xml_transmissao_error/{$nomeArquivo}", "a+");
	    fwrite($file, $msg);
	    fclose($file);
	}

	public function formataData( $dtData ){
	 	$arData = explode( "-", $dtData );

		$ano = substr( $dtData, 0, 4 );
		$mes = substr( $dtData, 5, 2 );
		$dia = substr( $dtData, 8, 2 );
	    $dtDataFormatada = $ano.'-'.$mes.'-'.$dia;
	    return $dtDataFormatada;
	}
}