Ir para conteúdo
  • Cadastre-se

dev botao

Retorno de Lote


Ver Solução Respondido por Paulo Aguiar Junior,
  • Este tópico foi criado há 2438 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa noite.

Estou gerando o evento de tabela s1010. Criei um lote com todos os eventos da tabela de Rubricas

 

DMGestor.QEventos.close;
 DMGestor.QEventos.SQL.CommaText:= 'Select * from RENDESC where eSocialStatus="I" and eSocialAceite=false';
 DMGestor.QEventos.Open;
 DMFG.TCaged.Open;
 While not  DMGestor.QEventos.Eof do
  begin
    with ACBreSocial1.Eventos.Tabelas.S1010.Add do
    begin
      evtTabRubrica.id := '1';
      if (TpAmbToStr(ACBreSocial1.Configuracoes.WebServices.Ambiente)='1') then
        evtTabRubrica.IdeEvento.TpAmb := taProducao
      else
       evtTabRubrica.IdeEvento.TpAmb := taProducaoRestrita;

      evtTabRubrica.IdeEvento.ProcEmi := TpProcEmi(0);
      evtTabRubrica.IdeEvento.VerProc := '1.0';


      if length(RetiraPontos(DMGeral.TEmpresasCGC.AsString))=11 then
        evtTabRubrica.IdeEmpregador.TpInsc := tiCPF
      else
        evtTabRubrica.IdeEmpregador.TpInsc := tiCNPJ;

      evtTabRubrica.IdeEmpregador.NrInsc := RetiraPontos(DMGeral.TEmpresasCGC.AsString);


      //Aqui set a o modo de lançamento Inclusão ou alteração
      if Tipo='I' then
        evtTabRubrica.ModoLancamento := TModoLancamento(0);
      if Tipo='A' then
        evtTabRubrica.ModoLancamento := TModoLancamento(1);
      if Tipo='E' then
        evtTabRubrica.ModoLancamento := TModoLancamento(2);


        evtTabRubrica.infoRubrica.IdeRubrica.CodRubr    := DMGestor.QEventosCodigo.AsString;
        evtTabRubrica.infoRubrica.IdeRubrica.ideTabRubr := DMGestor.QEventosCodigo.AsString;

        evtTabRubrica.infoRubrica.IdeRubrica.IniValid := FormatDateTime('YYYY-MM',now);
        //evtTabRubrica.infoRubrica.IdeRubrica.FimValid := '2015-06';

        evtTabRubrica.infoRubrica.DadosRubrica.dscRubr := DMGestor.QEventosDescricao.AsString;

       // If DMGestor.QEventosSinal_RD.AsString='R' then
       if ((DMGestor.QEventoseSocialNatRubr.isnull) or (DMGestor.QEventoseSocialNatRubr.asstring='')) then
        evtTabRubrica.infoRubrica.DadosRubrica.natRubr := 1000
       else
        evtTabRubrica.infoRubrica.DadosRubrica.natRubr := DMGestor.QEventoseSocialNatRubr.AsInteger;

        evtTabRubrica.infoRubrica.DadosRubrica.tpRubr := iif(DMGestor.QEventosSinal_RD.AsString='R',tpTpRubr(0),tpTpRubr(1));



        evtTabRubrica.infoRubrica.DadosRubrica.codIncCP := iif(DMGestor.QEventosINSS.AsBoolean,tpCodIncCP(1),tpCodIncCP(2)) ;
        evtTabRubrica.infoRubrica.DadosRubrica.codIncIRRF := iif(DMGestor.QEventosIR.AsBoolean,tpCodIncIRRF(1),tpCodIncIRRF(2));
        evtTabRubrica.infoRubrica.DadosRubrica.codIncFGTS := tpCodIncFGTS(1);
        evtTabRubrica.infoRubrica.DadosRubrica.codIncSIND := tpCodIncSIND(1);
        evtTabRubrica.infoRubrica.DadosRubrica.observacao := '';

        evtTabRubrica.infoRubrica.DadosRubrica.IdeProcessoCP.Clear;
   end;
    DMGestor.QEventos.Next;
  end;

  //Cria Evento Mestre
  TGestor.Insert;
  TGestorEVENTO.AsString:='S-1010';
  TGestorOPERACAO.AsString:=TIPO;
  TGestorSTATUS.AsString:='P';
  TGestorDATA_GERACAO.AsDateTime:=now;
  TGestorPROTOCOLO.AsString:=Enviar;
  TGestorAmbiente.AsString:= AmbientePh;
  TGestor.Post;


end;

 

até ai tudo ok.. Recebi o retorno do envio do lote. Consultei o protocolo e foi aceito.

 

O problema é que quero marcar no meu banco cada uma das rubricas que foram aceitas, para caso não tenha sido todas. eu reeenvie somente elas corrigidas.

Como fazer isso? qual campo usar?

meu retorno é algo do tipo:

<?xml version="1.0" encoding="UTF-8"?>

-<eSocial xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/retornoProcessamento/v1_3_0">


-<retornoProcessamentoLoteEventos>


-<ideEmpregador>

<tpInsc>1</tpInsc>

<nrInsc>40759227</nrInsc>

</ideEmpregador>


-<ideTransmissor>

<tpInsc>1</tpInsc>

<nrInsc>40759227000130</nrInsc>

</ideTransmissor>


-<status>

<cdResposta>201</cdResposta>

<descResposta>Lote processado com sucesso.</descResposta>

</status>


-<dadosRecepcaoLote>

<dhRecepcao>2018-03-20T08:31:59.187</dhRecepcao>

<versaoAplicativoRecepcao>0.1.0-A0283</versaoAplicativoRecepcao>

<protocoloEnvio>1.2.201803.0000000000006233402</protocoloEnvio>

</dadosRecepcaoLote>


-<dadosProcessamentoLote>

<versaoAplicativoProcessamentoLote>1.0.0.0</versaoAplicativoProcessamentoLote>

</dadosProcessamentoLote>


-<retornoEventos>


-<evento Id="ID1407592270000002018032008313655847">


-<retornoEvento>


-<eSocial xmlns="http://www.esocial.gov.br/schema/evt/retornoEvento/v1_2_0">


-<retornoEvento Id="ID1407592270000002018032008313655847">


-<ideEmpregador>

<tpInsc>1</tpInsc>

<nrInsc>40759227</nrInsc>

</ideEmpregador>


-<recepcao>

<tpAmb>2</tpAmb>

<dhRecepcao>2018-03-20T08:31:59.187</dhRecepcao>

<versaoAppRecepcao>0.1.0-A0283</versaoAppRecepcao>

<protocoloEnvioLote>1.2.201803.0000000000006233402</protocoloEnvioLote>

</recepcao>


-<processamento>

<cdResposta>201</cdResposta>

<descResposta>Sucesso.</descResposta>

<versaoAppProcessamento>8.0.1-A2876</versaoAppProcessamento>

<dhProcessamento>2018-03-20T08:32:01.253</dhProcessamento>

</processamento>


-<recibo>

<nrRecibo>1.2.0000000000028996980</nrRecibo>

<hash>mvjq0BrGfHx7XNnNJAS7VeE5dV547dqecXvIPsnG1Ac=</hash>

</recibo>

</retornoEvento>


-<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">


-<SignedInfo>

<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>

<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>


-<Reference URI="">


-<Transforms>

<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>

<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>

</Transforms>

<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>

<DigestValue>GTztTrNpP8cgcz14g8JE4hO2PdhKvgu07lwGYXGbBRs=</DigestValue>

</Reference>

</SignedInfo>

<SignatureValue>x02JSLQ2mFjkIQ6qzr4uLeEV/joIwz71Kl+CVa6zGQDOEAuF/iOc3GhgJ2FWNxn9rcIXvoFimW6XmBs7z9jSixU0NpEdEqQFMTBn2zGLI/Y+1gWvpwj1jpa1ItCaF6rsA0b8k9ZDijhfy8G0zAG/BydTmLdrp7vyIAznA9tPBmXkp77Nu1bsI4aJQQlq5Mq3EWX01RtX2CLkrzCN1HTa/VQx2tkj2YbN9WUyE9gi08KVxYZbMYM9NUk9B2sJdC/VFMVZNSH2dN54Az0Db+lUchJHedjtcz6hqvofzx3Fm8Yrx7TXzJ/K++XHQnO/Z7g87pr42x8pdZW9H1rteruZxg==</SignatureValue>


-<KeyInfo>


-<X509Data>

<X509Certificate>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</X509Certificate>

</X509Data>

</KeyInfo>

</Signature>

</eSocial>

</retornoEvento>

</evento>

estou penando para evoluir nesse sentido.

  • Solution
Postado

Alisson,

Cada registro S-1000 corresponde a um registro no seu banco de dados, correto?

Você precisa salvar o ID de cada evento gerado no seu respectivo registro no banco (é o único campo que você pode vincular quando efetuar a consulta), e após consultar, você deve percorrer a estrutura RetConsultaLote.RetEventos.Count, e ir localizando (em uma query, por exemplo) pelo RetConsultaLote.RetEventos.Items.Id.

No meu caso, nessa query que eu citei, eu dou um select em todos os registros do banco de dados que contém aquele protocolo de envio que eu estou consultando, ou seja, esse é outro campo que eu preencho para cada registro que foi gerado no meu lote. Dessa forma, dou o select em todos os registros do lote que vou consultar, consulto, percorro o retorno (RetConsultaLote.RetEventos.Count), e faço um dmESocial.qryBuscaEventosProtocolo.Locate('ID_EVENTO', RetConsultaLote.RetEventos.Items.Id, []) para encontrar o registro no meu banco.

No loop, você pode verificar o RetConsultaLote.RetEventos.Items.Processamento.cdResposta, para saber se o registro foi processado ou não. Caso tenha sido processado, o campo RetConsultaLote.RetEventos.Items.Recibo.nrRecibo estará preenchido com o devido recibo, caso em que você deve armazenar esse recibo (que é o seu comprovante de entrega), caso contrário, percorra a estrutura RetConsultaLote.RetEventos.Items.Processamento.Ocorrencias.Count, para pegar as ocorrências (erros) desse registro que está percorrendo e armazenar p/ mostrar para o usuário.

Essa é mais ou menos a lógica que estamos utilizando aqui...

 

 

Postado
33 minutos atrás, Paulo Aguiar Junior disse:

Alisson,

Cada registro S-1000 corresponde a um registro no seu banco de dados, correto?

Você precisa salvar o ID de cada evento gerado no seu respectivo registro no banco (é o único campo que você pode vincular quando efetuar a consulta),

 

Exatamente esse campo. Como pego o Id no momento da geração? eu adiciono todos os eventos ao lote e depois assino. Estou apanhando somente nesse detalhe. pegar esse id antes do envio!

 

Postado (editado)

    try    

      bValido := evtInfoEmpregador.GerarXML;
  except
    on e:Exception do
    begin
      AdicionaInconsistencia('ERRO', e.Message);
    end;

  end;

  if ( bValido ) then
    Result := evtInfoEmpregador.Id
  else
  begin
    dmESocial.ACBreSocial.Eventos.Iniciais.S1000.Delete(dmESocial.ACBreSocial.Eventos.Iniciais.S1000.Count-1);
    Result := '';
  end;

No exemplo disponibilizado pelo ACBr, adiciona-se todos os eventos, e no final, chama-se o ACBreSocial.Eventos.GerarXMLs, que percorre todas as estruturas (Iniciais, Periodicos, NaoPeriodicos) e sai gerando os xmls...

Eu preferi fazer de outra forma, para cada evento que eu adiciono, eu já chamo o GerarXML para ele, e verifico se houve algum erro na geração desse xml (schema por exemplo), quando há erro, eu já removo ele do lote dmESocial.ACBreSocial.Eventos.Iniciais.S1000.Delete(dmESocial.ACBreSocial.Eventos.Iniciais.S1000.Count-1), pois mesmo quando há falha na validação do schema o evento já está adicionado ao lote.

E quando não há erro na geração do xml desse evento, pego o atributo Id que foi gerado...

Editado por Paulo Aguiar Junior
  • Obrigado 1
Postado
7 minutos atrás, AlissonMarcel disse:

Essa mesma técnica vc utiliza para os eventos de Tabela?²

 

Sim, utilizo o mesmo mecanismo para todos os eventos.

Resumindo:

Usuário seleciona 50 eventos na grid, gero cada um deles e armazeno o ID de cada um.

Após enviar, atualizo em cada registro enviado nesse lote, o Nº do Protocolo de Envio gerado.

Ao consultar determinado protocolo de envio, dou um select retornando os registros que foram enviados nesse lote (ou seja, os que possuem o nº de protocolo que estou consultando).

E ai basta percorrer o RetConsultaLote.RetEventos e ir localizando o  RetConsultaLote.RetEventos.Items.Id na query, como expliquei no outro post.

Não estou dizendo que seja a melhor maneira de fazer, tem gente fazendo de outras formas.

Mas essa forma segue o "fluxo natural" das rotinas, e está funcionando bem.

  • Obrigado 1
  • Este tópico foi criado há 2438 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.