01. DADOS GERAIS
| Produto: | |
|---|
| Linha de Produto: | |
|---|
| Segmento: | |
|---|
| Módulo: | |
|---|
| 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
Fazer a busca do T7A, com status 1 ou 3.
Criar um método/classe que a cada registro da tabela T7A, chamará método do xml, passando seus respectivos parâmetros, que retornará o xml pronto.
Com o xml chamará a função do TSS para envio SEFAZ
Com retorno do TSS, chamará a método/classe para atualização do status (T7A_STATUS) para 2/4/5 e gravação do Log (T7D).
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.
- Registra retorno em T7D via TafSaveLogsMonitorEvents() (cria log com UUID, data/hora e mensagem).
- Atualiza T7A_STATUS (2 enviado / 4 cancelado / 5 falha) com RecLock / MsSeek / MsUnLock.
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).
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_TAFSURL 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
