Árvore de páginas


01. DADOS GERAIS

Produto:

TOTVS Backoffice

Linha de Produto:

Linha Protheus

Segmento:

Backoffice

Módulo:

TOTVS Backoffice (Linha Protheus) - Automação Fiscal

Função:

totvs.protheus.fiscal.taf.xmlmonitorevent.tlpp

TAFA621EVT.prw

País:Brasil
Ticket:Não há.
Requisito/Story/Issue (informe o requisito relacionado) :DSERTAF4-2596


02. SITUAÇÃO/REQUISITO

Desenvolver uma rotina responsável por buscar os eventos pendentes de processamento (T7A_STATUS = 1 ou 3) via processamento SmartSchedule e executar a integração com o TSS para envio do mesmo para SEFAZ, aguardar o retorno do processamento e atualizar o status do evento para 2 = Enviado em caso de sucesso de processamento, 4 - Cancelado, em caso de sucesso do cancelamento do evento de origem ou 5 = Falha de processamento, que poderá ocorrer por Rejeição, falha no schema ou duplo processamento na SEFAZ.

Além de atualizar o status do evento, irá gravar a tabela de log de processamento na tabela T7D, com o retorno do TSS e o ID de execução.

03. SOLUÇÃO

Resumo

  • Responsabilidade: localizar eventos pendentes no TAF, montar os XMLs de evento (usando SchemaXMLEvents), enviar ao TSS e registrar logs/atualizar status.
  • Escopo: tratamento de eventos com e sem itens, suporte a eventos de cancelamento, agrupamento de linhas de item (IBS/CBS) por item, e integração com o serviço TSS (TSSEnvEven).

Fluxo principal

  1. Descoberta

    • TAFGetXmlMonitorEvent() é chamado pelo agendador (TAFA621EVT).
    • Chama TAFEventsEnabledForSubmission() que retorna um alias com os registros de T7A (status = 1 ou 3) com LEFT JOIN em T7E para sinalizar se há itens (campo T7E_TEMITE).
  2. Iteração

    • Para cada registro retornado: obtém identificador (T7A_IDENT), código do evento (T7A_TPEVEN), chNFe (T7A_CHVNF), tp/órgão autor e flags (cancelamento, lHasItems).
    • Chama TafAssemblingXmlEvent(...) passando cIdEvento, cEventCode, cOrgaoAutor, cTpAutor, cChNFe, lHasItems, lEventCancel.
  3. Montagem do XML

    • TafAssemblingXmlEvent usa SchemaXMLEvents para montar header/footer do <detEvento>.
    • Se lHasItems = .T.:
      • Se evento cred. presumido (211110): usa TAFEventItemsCredPresumido() (leitura T7B) para montar bloco único.
      • Senão: usa TAFEventItems(cIdEvento) (leitura T7C) e agrupa linhas por T7C_ITEM; cada grupo pode ter duas linhas (IBS e CBS). Para cada item chama um único método de SchemaXMLEvents que retorna o fragmento do item (ex.: XmlItem211124), concatena ao corpo e, ao final, anexa footer com <tpEvento> e <chNFe>.
    • Se lHasItems = .F.: usa TAFEventWithoutItems(cIdEvento) (leitura T7A) e delega ao método XmlEventXXX correspondente (ex.: XmlEvent112110).
  4. Envio e logs

    • Se XML gerado: chama TSSEnvEven(@cError, cUrl, cIdEnti, cXmlCreated, @cMsg) para envio ao TSS. Na sequência, se o retorno do ID gerado na SPED150 for verdadeiro, utiliza o TafStatusMonitorEvents para buscar o retorno e atualizar a tabela T7A com o status e protocolo (caso autorizado) e retorno do envio.
    • Registra retorno em T7D via TafSaveLogsMonitorEvents() (cria log com UUID, data/hora e mensagem).

Componentes e métodos (resumo)

  • TAFGetXmlMonitorEvent(): orquestra descoberta, montagem, envio e log.
  • TAFEventsEnabledForSubmission(): monta query (ChangeQuery + FwExecStatement) e retorna alias dos eventos habilitados.
  • TafAssemblingXmlEvent(...): monta o XML; aceita flags lHasItems e lEventCancel; usa SchemaXMLEvents.
  • TAFEventItems(cIdEvent): retorna alias com linhas T7C para um evento (usado para agrupar itens).
  • TAFEventItemsCredPresumido(cIdEvent): retorna alias com linhas T7B para crédito presumido.
  • TAFEventWithoutItems(cIdEvent): retorna alias com dados T7A usados por eventos sem itens.
  • TafSaveLogsMonitorEvents(...): grava T7D (log) e atualiza status em T7A.
  • SchemaXMLEvents (classe externa): encapsula geração de header/footer e métodos XmlEventXXX / XmlItemXXX (fragmentos por item).
  • TafStatusMonitorEvents: Método responsável por buscar o retorno do TSS dos eventos transmitidos.

Boas práticas e observações

  • Agrupamento de itens: o código agrupa por T7C_ITEM para garantir que cada item invoque o método de evento apenas uma vez (concatena IBS/CBS).
  • Normalização de campos: comparar sempre com AllTrim/Upper quando necessário (ex.: códigos de tributação com padding).
  • Queries: sempre usar ChangeQuery() antes de FwExecStatement(); openAlias retorna objeto alias a ser avançado e fechado.
  • Concorrência e integridade: usar RecLock / MsUnLock ao gravar (T7A/T7B/T7C/T7D) e MsSeek para localizar registro antes de update.
  • UUID: usar FwUUIDv4(.T.) para identificadores de 36 caracteres.
  • Configuração: MV_SPEDURL definido em MV para endpoint do TSS; RetIdEnti() para identificação da entidade.
  • Erro/rollback: tratar erros de envio e setar T7A_STATUS = 5 em caso de falha; manter logs detalhados em T7D.

Resumo final

  • A classe centraliza geração, envio e logging de eventos do TAF. A montagem de XML é delegada a SchemaXMLEvents; a classe garante agrupamento correto de itens IBS/CBS por item e atualiza o fluxo de acordo com sucesso/falha do envio ao TSS.

04. DEMAIS INFORMAÇÕES


Não há

05. ASSUNTOS RELACIONADOS