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
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).
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.
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).
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