Ir para conteúdo
  • Cadastre-se

Ronaldo Carlos

Membros
  • Total de ítens

    2
  • Registro em

  • Última visita

Tudo que Ronaldo Carlos postou

  1. Wallyson, Matheus e demais participantes... Cada um de nós tivemos ou estamos tendo um problema diferente! GRAÇAS A DEUS e alguns colegas aqui estou a mais de 25 dias sem qualquer problema. Ocorre que a maioria dos problemas foram causados pela DEMORA no retorno do SERVIDOR DO DATASUS ao implementar o "CANAIS SEGUROS" SSL/TLS . Ou seja, é nítido que no comentário do sgeinformatica ao fazer um LOOP ( insistindo até obter o devido retorno ) foi a solução, pois certamente com a implementação da criptografia ( canais seguros ) o consumo do web service tornou-se no minimo mais lento. Talvez lento o suficiente para não obter o retorno logo na Primeira solicitação! Dai a necessidade de um LOOP para "forçar" a conclusão e sucesso do consumo do serviço em questão. Enfim, PARTICULARMENTE e muitos irão concordar comigo que é um LIXO o suporte do DATASUS... Lá "segundo ELES" sempre esta 100% operacional e direcionam para encaminhar e-mail para o dito suporte que não responde em tempo hábil. E quando respondem, chega ser um absurdo sugerir usar o GBAS.EXE para gerar o DNA no lugar da DLL fornecidas por eles mesmos. RESUMINDO: temos que dar um jeito por nossa conta e ter como auxilio os colegas da área. Como considero que RESOLVI a questão e meus clientes PARARAM de me acionar com a questão: "E ai a Farmacia Popular! tá travando dinovo? " Vou repassar um trecho do meu código, que acredito dará uma "LUZ" para alguns que ainda não estão na calmaria pós tesmpestade! Obs: em um postagem minha, mencionei que a questão do DNA absurdamente era RESOLVIDA trocando a DATA DA EMISSÃO DA RECEITA! Portanto, alterei meu código para procurar uma "Data" que não retorna-se o erro do DNA INVALIDO. Nem precisa dizer, que isso é a famosa " G A M B I A R R A ", né? mas foi melhor do que ter que usar o GBAS.EXE ! ! ! ah! e só será repassado uma outra "data de receita" (Solicitação da Fase 1) caso retornar com o erro do DNA INVALIDO, do contrário a DATA INFORMADA segue normalmente. Vou repassar "trechos" do meu código ( o qual está funcionando 100% !!! ), mas ANTES convido a prestar ATENÇÃO nas seguintes variavéis: Status_Solicitacao_1_Fase Status_Solicitacao_2_Fase Status_Solicitacao_3_Fase Qtde_Tentativas Time_Tentativa Erro_DNA ********** SÃO ELAS que "insistem" até OBTER o correto consumo do serviço do WEBSERVICE do DataSus *********** Vamos lá ao trecho do código da 1 Fase , que trata do consumo do serviço de PRE-AUTORIZAÇÃO do WebService do DATASUS: Procedure Pre_Autorizacao( _CPF: AnsiString; _CRM: AnsiString; _UF: AnsiString; DT_RECEITA: AnsiString; _CUPOM_INTERNO : AnsiString ); Var wDataSUS : ServicoSolicitacaoWS; Ret_Itens : string[03]; Data_Receita_Passa : TXSDateTime; Erro_DNA : Boolean; begin Data_Receita_Passa := TXSDateTime.Create; Data_Rec_Oficial := ''; Data_Rec_Passa := ''; Erro_DNA := False; Repeat { ficará em loop até que NÃO de retorno de erro DNA | obsevar que a data variavel Data_Receita_Passa será decrementada até passar sem DNA INVALIDO } ctd_tentativas := 0; Ret_Itens := ''; NrAutoriz := ''; edtCNPJ.text := LrTrim( RemoveChars( edtCNPJ.text,['.','/','-', ',', ' ' ] ) ); edtCPFVendedor.Text := LrTrim( RemoveChars( edtCPFVendedor.Text,['.','/','-', ',', ' ' ] )); _CPF := LrTrim( RemoveChars( _CPF, ['.','/','-', ',',' '])); _CRM := LrTrim( RemoveChars( _CRM, ['.','/','-', ',',' '])); _UF := LrTrim( RemoveChars( _UF, ['.','/','-', ',',' '])); HTTPRIO1.URL := edtWebService.Text; HTTPRIO1.WSDLLocation := edtWebService.Text + '?wsdl'; HTTPRIO1.Service := 'ServicoSolicitacaoWSService'; HTTPRIO1.Port := 'ServicoSolicitacaoWS'; (** Foi retirado essa atribuição e trocada pela logo abaixo, pois funcionava e do nada passou NÃO FUNCIONAR... assim pesquisando na Net tive que trocar wDataSUS := HTTPRIO1 AS ServicoSolicitacaoWS; **) wDataSUS := GetServicoSolicitacaoWS(false, HTTPRIO1.WSDLLocation, HTTPRIO1); Usuario := UsuarioFarmaciaDTO.Create; Usuario.usuarioFarmacia := edtUsuario.text; Usuario.senhaFarmacia := edtSenha.text; Usuario.usuarioVendedor := edtCPFVendedor.Text; Usuario.senhaVendedor := edtSenhaVendedor.Text; Solicitacao := SolicitacaoDTO.Create; Solicitacao.coSolicitacaoFarmacia := LrTrim( _CUPOM_INTERNO ); Solicitacao.dtEmissaoReceita := TXSDateTime.Create; Data_Rec_Oficial := DT_RECEITA; hora_str := TimeToStr(Time); if ( Erro_DNA = True ) then begin Data_Receita_Passa.AsDateTime := Data_Receita_Passa.AsDateTime - 1; Solicitacao.dtEmissaoReceita.AsDateTime := Data_Receita_Passa.AsDateTime; end else begin Solicitacao.dtEmissaoReceita.AsDateTime := strToDate( DT_RECEITA ) + StrToTime(hora_str); Data_Receita_Passa.AsDateTime := Solicitacao.dtEmissaoReceita.AsDateTime; end; data_str := DateToStr(Solicitacao.dtEmissaoReceita.AsDateTime); Data_Rec_Passa := data_str; Solicitacao.nuCnpj := edtCNPJ.text; Solicitacao.nuCpf := _CPF; Solicitacao.nuCrm := _CRM; Solicitacao.sgUfCrm := _UF; itens := TStringList.Create; itens.LoadFromFile( 'C:\FPopular\TEMP\PRODS.TXT' ); SetLength(Medicamentos, itens.Count ); for Item := 0 to (itens.Count-1) do begin _vlr := Copy( itens.Strings[Item], 17,08 ); insert( DecimalSeparator, _vlr, 7 ); MedicamentoS[Item] := MedicamentoDTO.Create; MedicamentoS[Item].coCodigoBarra := Copy( itens.Strings[Item], 01,13 ); MedicamentoS[Item].qtSolicitada := StrToInt( Copy( itens.Strings[Item], 14,03 ) ); MedicamentoS[Item].vlPrecoVenda := StrToFloat( _vlr ); MedicamentoS[Item].qtPrescrita := StrToInt( Copy( itens.Strings[Item], 25,03 ) ); end; Solicitacao.arrMedicamentoDTO := MedicamentoS; Solicitacao.dnaEstacao := ObterSolicitacao( Solicitacao.nuCpf, Solicitacao.nuCnpj, Solicitacao.nuCrm, Solicitacao.sgUfCrm, data_str ); Autorizacao := AutorizacaoDTO.Create; Status_Solicitacao_1_Fase := false; ctd_tentativas := 0; Repeat inc( ctd_tentativas ); try Autorizacao := wDataSUS.executarSolicitacao(Solicitacao, Usuario); Status_Solicitacao_1_Fase := True; except on E: Exception do begin if ( ctd_tentativas = Qtde_Tentativas ) then Showmessage( 'Tentativa nr: ' + IntToStr(ctd_tentativas) + ' || '+ E.Message ); Sleep( Time_Tentativa ) end; end; Until (Status_Solicitacao_1_Fase = True) or (ctd_tentativas = Qtde_Tentativas); if ( ctd_tentativas = Qtde_Tentativas ) then Showmessage('1.Fase || Ocorreu '+ IntToStr(ctd_tentativas) + ' tentativas ' + 'SEM SUCESSO de retorno do DATASUS' ); Erro_DNA := ( Autorizacao.inAutorizacaoSolicitacao = '51S' ); Until ( Erro_DNA = False ); end; **************************************************************************************** Trecho do código da 2 Fase , que trata do consumo do serviço de CONFIRMAÇÃO DA PRE-AUTORIZAÇÃO do WebService do DATASUS: Procedure Confirma_Pre_Autorizacao( _NumeroCupomECF : String ); Var wDataSUS : ServicoSolicitacaoWS; begin if (Status_Solicitacao_1_Fase = True) then begin HTTPRIO1.URL := edtWebService.Text; HTTPRIO1.WSDLLocation := edtWebService.Text + '?wsdl'; HTTPRIO1.Service := 'ServicoSolicitacaoWSService'; HTTPRIO1.Port := 'ServicoSolicitacaoWS'; (** Foi retirado essa atribuição e trocada pela logo abaixo, pois funcionava e do nada passou NÃO FUNCIONAR... assim pesquisando na Net tive que trocar wDaTaSUS := HTTPRIO1 AS ServicoSolicitacaoWS; **) wDataSUS := GetServicoSolicitacaoWS(false, HTTPRIO1.WSDLLocation, HTTPRIO1); confirmacao := ConfirmacaoDTO.Create; confirmacao.coSolicitacaoFarmacia := Solicitacao.coSolicitacaoFarmacia; confirmacao.nuAutorizacao := Autorizacao.nuAutorizacao; confirmacao.nuCupomFiscal := _NumeroCupomECF; Retorno_Aut := ConfirmacaoAutorizacaoDTO.Create; ctd_tentativas := 0; Status_Solicitacao_2_Fase := False; Repeat inc( ctd_tentativas ); try Retorno_Aut := wDataSUS.confirmarAutorizacao( confirmacao, Usuario); Status_Solicitacao_2_Fase := True; except on E: Exception do begin if ( ctd_tentativas = Qtde_Tentativas ) then Showmessage( 'Tentativa nr: ' + IntToStr(ctd_tentativas) + ' || '+ E.Message ); Sleep( Time_Tentativa ); end else Status_Solicitacao_2_Fase := True; end; Until (Status_Solicitacao_2_Fase = True) or (ctd_tentativas = Qtde_Tentativas); if ( ctd_tentativas = Qtde_Tentativas ) then Showmessage('2.Fase || Ocorreu '+ IntToStr(ctd_tentativas) + ' tentativas ' + 'SEM SUCESSO de retorno do DATASUS' ); end; end; **************************************************************************************** Trecho do código da 3 Fase , que trata do consumo do serviço d GRAVAR A CONFIRMAÇÃO e GERAR O CUPOM DA AUTORIZAÇÃO feita no WebService do DATASUS: Procedure Recibo_Retorno; Var wDataSUS : ServicoSolicitacaoWS; Cp_Vinculado : TextFile; ix : Integer; begin if (Status_Solicitacao_2_Fase = True) then begin HTTPRIO1.URL := edtWebService.Text; HTTPRIO1.WSDLLocation := edtWebService.Text + '?wsdl'; HTTPRIO1.Service := 'ServicoSolicitacaoWSService'; HTTPRIO1.Port := 'ServicoSolicitacaoWS'; (** Foi retirado essa atribuição e trocada pela logo abaixo, pois funcionava e do nada passou NÃO FUNCIONAR... assim pesquisando na Net tive que trocar wDaTaSUS := HTTPRIO1 AS ServicoSolicitacaoWS; **) wDataSUS := GetServicoSolicitacaoWS(false, HTTPRIO1.WSDLLocation, HTTPRIO1); Recebimento := RecebimentoDTO.Create; Recebimento.nuAutorizacao := Retorno_Aut.nuAutorizacao; Recebimento.nuCupomFiscal := Retorno_Aut.nuCupomFiscal; Recebimento.arrMedicamentoDTO := Retorno_Aut.arrMedicamentoDTO; ctd_tentativas := 0; Status_Solicitacao_3_Fase := False; Repeat inc( ctd_tentativas ); try Conf_Recbto := wDataSUS.confirmarRecebimento( Recebimento, Usuario); Status_Solicitacao_3_Fase := True; except on E: Exception do begin if ( ctd_tentativas = Qtde_Tentativas ) then Showmessage( 'Tentativa nr: ' + IntToStr(ctd_tentativas) + ' || '+ E.Message ); Sleep( Time_Tentativa ); end else Status_Solicitacao_3_Fase := True; end; Until (Status_Solicitacao_3_Fase = True) or (ctd_tentativas = Qtde_Tentativas); if ( ctd_tentativas = Qtde_Tentativas ) then Showmessage('3.Fase || Ocorreu '+ IntToStr(ctd_tentativas) + ' tentativas ' + 'SEM SUCESSO de retorno do DATASUS' ); if (Status_Solicitacao_3_Fase = True) then begin {$I-} AssignFile(Cp_Vinculado, 'C:\FPopular\VINCULAD.TXT'); ReWrite(Cp_Vinculado); if ( Data_Rec_Oficial <> Data_Rec_Passa) then WriteLn( Cp_Vinculado, '---------- rec = ',Data_Rec_Passa,' ----------'); try NrAutoriz := Conf_Recbto.nuAutorizacao; For ix := 1 to Length( Conf_Recbto.cupomVinculado ) do begin if ( Conf_Recbto.cupomVinculado[ix] = '@' ) then WriteLn( Cp_Vinculado ) else Write( Cp_Vinculado, Conf_Recbto.cupomVinculado[ix] ); end; finally CloseFile(R); CloseFile(Cp_Vinculado); end; {$I+} end; end end; ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************** Bom era isso! espero que minha postagem, de alguma forma, esclareça e auxilie alguem. Caso de duvida e/ou criticas! fiquem a vontade Abçs, Ronaldo. P.S: lembrando que são APENAS "trechos" do meu código... Inclusive foi criado para atuar como um "monitor" , onde recebe informações via arquivo TEXTO e tmb. retorna em TEXTO.
  2. Boa tarde! Vou relatar minha experiencia com a comunicação com WebService da Farmacia Popular nestes ultimos dias . Eu já havia preparado o meu sistema para funcionar com ambos WebService ( DNS antigo e DNS NOVO) isso lá no inicio de Dez/2018. E estava funcionando, em diversos clientes, com o NOVO DNS+GBAS ATUALIZADO, até dia 25/Fev/2019 próximo das 16Hrs.... Depois só passou a retornar a mensagem: " Solicitação não autorizada. DNA da transação gerado pelo GBAS é inválido." Porem constatei que algumas operações eram concluídas sem qualquer problema. Ainda NÃO RESOLVI mas detectei o "porque" determinada OPERAÇÃO retorna o erro acima e outras não. Caso esteja com o mesmo problema, faça este TESTE: informe para a DATA DA RECEITA e siga com a opração, caso retorne a mensagem citada: informe uma data que seja UM DIA ANTERIOR em relação a DATA ATUAL (data do sistema). Persistindo a mensagem, vou sucessivamente DECREMENTADO a data até que a operação ocorra sem restrições. Um absurdo, não é? mas só dessa maneira a operação é executada sem qualquer problema!! Acredito que seja algo teria que que ser resolvido no servidor do DATASUS/FARMACIA POPULAR. E desde ontem (01-Março-2019) finalzinho da tarde (16:30hrs aprox) a "coisa" normalizou, ou seja, todas as operações são validadas sem fazer qualquer tipo de manobra. Infelizmente é um absurdo, visto que nós desenvolvedores NÃO TINHAMOS o que fazer, pois o problema era GERADO pelo servidor do DATATSUS/Farm.Popular Mas aproveitei e gastei mais um tempinho e fiz um LOOP até que a operação não seja negada pelo errro = 51S, DECREMENTANDO a data oficial da receita. Funcionará perfeitamente caso a data oficial da receita apresente o erro = 51S, do contrario da data da receita permanecerá informada pelo usuário. Espero que meus cometários sejam uteis Abç, t+
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...