NUNCA PUBLIQUE ESTA PÁGINA. POR LIMITAÇÃO DA FERRAMENTA, NÃO PODEMOS MAIS CRIAR PÁGINAS RESTRITAS A CLIENTES. A ALTERNATIVA QUE ACHAMOS FOI CRIAR ESTA PÁGINA COMO RASCUNHO, ASSIM APENAS USUÁRIOS LOGADOS PODEM ACESSAR O CONTEÚDO.

O que é TSI?

O serviço de integração do TAF ( TAF Service Integration ) é o novo mecanismo de integração ERP-Protheus Vs TAF.
O TSI foi criado exclusivamente para clientes que usam o TAF como módulo do ERP-Protheus, ou seja, ambos no mesmo banco de dados.

Pré Requisitos

Banco de Dados Homologados

O que é stamp?

Um campo interno para tabelas do DBAccess, não visíveis na estrutura de acesso pelo AdvPL, que registre um datetime e/ou timestamp para cada registro inserido e/ou alterado na base de dados. 
O tipo do campo criado na tabela é DATETIME (para MSSQL) e TIMESTAMP (para Postgres e Oracle)

Para recuperar o campo de controle S_T_A_M_P_ e recuperar a informação completa ( data e horário ), por exemplo no formato yyyy-mm-dd hh:MM:ss.mmm
( Ano com 4 dígitos, mês com 2 dígitos, dia com 2 dígitos, e horário completo (24h) com precisão de milissegundos, deve ser feito um CAST específico para retornar a informação como "C" Caractere no AdvPL,
para cada banco de dados, vide exemplos abaixo:

Confira mais sobre stamp na documentação do DbAccess: Implementação - Campo de controle adicional no DBAccess - S_T_A_M_P_

Implantação

Dicionário

Configuração Inicial Para utilização

Configuração no SIGATAF

A wizard de configuração do TAF ganhou uma nova opção para criação dos campos S_T_A_M_P_
Para que a opção do "TSI - TAF SERVICE INTEGRATION" seja exibida no Wizard TAF, é necessário que exista pelo menos uma nota escriturada (Tabelas SF3 e SFT) cadastrada no sistema e rodar o UpdDistr antes.

Execute a wizard, resultando em sucesso, será apresentada a tela com a mensagem conforme abaixo.

Tabelas Afetadas Criação STAMP

As tabelas do Protheus que sofrerão a criação do campo S_T_A_M_P_ são:

SB1, SFT, SF4, SB5, SA1, SA2, SA4, SAH, CT1, F2Q, CDN, CTT, SE1, SE2, CCF, SF1, SF2, SF3, CCE, SYD, CDH, SON, CKX, CDT e CDG.

Configuração no SIGACFG

O TSI deverá ser incluído no agendamento ( schedule ) como um serviço ( job ) sempre ativo.
Desta maneira, ao incluir ou alterar um novo cadastro ou movimento no ERP, o JOB se encarregará de executar a integração automaticamente de forma transparente ao usuário.
O controle é feito através da comparação dos campos do ERP-Protheus S_T_A_M_P_  Vs  XXX_STAMP do TAF.
Exemplo de configuração:

Índices do banco de dados sugeridos ( Performance )

Referente a performance possuímos a sugestão de criação do índice no banco de dados.

Se atentar ao grupo de empresa que pode mudar no nome da tabela e a ordem do índice, ex:  TABELA + GRUPO + DESCRIÇÃO

SFTT10ESP, SF3T10ESP e SFT010STP

CREATE NONCLUSTERED INDEX SFTT10ESP ON SFTT10(FT_FILIAL, [FT_NFISCAL] ,[FT_SERIE], [FT_CLIEFOR], [FT_LOJA],[FT_IDENTF3], [FT_ENTRADA],[FT_ESPECIE], R_E_C_N_O_, D_E_L_E_T_)

CREATE NONCLUSTERED INDEX SF3T10ESP ON SF3T10(F3_FILIAL, [F3_NFISCAL] ,[F3_SERIE], [F3_CLIEFOR], [F3_LOJA],[F3_IDENTFT], [F3_ENTRADA],[F3_ESPECIE], R_E_C_N_O_, D_E_L_E_T_)

CREATE NONCLUSTERED INDEX SFT010STP ON SFT010(FT_FILIAL, S_T_A_M_P_, R_E_C_N_O_, D_E_L_E_T_)

Par de Fontes e Tabelas

Qtd
Layout
Entidades(C)ad.
(M)ov.
JOB TSI?
(S)im
(N)ão
Tabelas ERPTabelas TAFLayout TAFExtração
ERP
API
TAF
Obrigações
01ParticipanteCSSA1\SA2C1HT003TAFA556WSTAF027GIA\REINF
02Unidade Medida
*predecessor produto
CSSAHC1JT005TAFA557WSTAF030-
03Item (Produto)CSSB1\SB5\F2Q\CDNC1LT007TAFA559WSTAF026GIA\REINF
04Natureza de Operação \ TESCSSF4C1NT009TAFA560WSTAF025GIA
05Centro de CustoCNCTTC1PT011TAFA562WSTAF029-
06Conta ContábilCNCT1C1OT010TAFA563Sem Construção-
07Inscrição do estabelecimento substituto
(Inscrições Estaduais)
CNMV_SUBTRIBC1FT001AATAFA569WSTAF031GIA
08Processos referenciados e suspensões.CSCCFC1G\T5LT001AB\T001AOTAFA572WSTAF032REINF
09Informações ComplementaresCSCCEC3QT001AKTAFA575WSTAF035GIA
10NCM
*predecessor produto
CSSYDC0A (auto contida)TAFA561WSTAF036-
11Nota FiscalMS

SFT\SF3\SF1\

SD1\SF2\SD2

Transporte:
DUD, DT6

Info Compl.
CDT

Compl. Processo:
CDG

C20\C2F\
C30\C35\ C2D\

Transporte:
C39

Info Compl.
C21

Compl. Processo:
T9Q

T013\T013AP\
T015\T015AE\

Transporte:
T015AI

Info Compl.
T013AA

Compl. Processo:
T015AK

TAFA574WSTAF034GIA\REINF
12Apuração ICMS MSCDHC2S\C2TT020\T020AA\T020AGTAFA584WSTAF039GIA
13Apuração ICMS STMSCDHC3J\C3KT021\T021AATAFA586WSTAF040GIA
14Cadastro de ObrasCSSONT9CT157TAFA596WSTAF042REINF
15CPRBMSCKX/F2S/F3ZC5M/T9T/V48T082/T082AC/T082ADTAFA566WSTAF043REINF

Processos

FonteProcessoDetalhamento da rotinas
ERP/
TAFA558
Alteração Fake

Alteração fake nos cadastros predecessores com base nas movimentações,
através da comparação dos stamps nas tabelas SFT x C20 e SE1\SE2 x LEM.

TSI/
TAFA573

Schedule TSI

Mecanismo responsável por executar o JOB do TSI na seguinte ordem:
1. Efetua a alteração FAKE;
2. Extração e integração dos CADASTROS que possuem stamp preenchido ( ver coluna acima "JOB TSI?=S")
3. Após a gravação de todos os cadastros é realizado a integração da NOTA FISCAL;
4. Gravação de Layouts de MVC com filho, neto ( Apuração ICMS e ICMS ST);

TAF/
TAFA564
Log

Cadastro de Log de integração (MVC tabela V5R).
Os mecanismos possuem a chamada da função PutTSIV5R para inserir registros nessa tabela.

TAF/
TAFA565
Motor para os Cadastros

Método responsável por persistir os dados enviados via JSON e gravar o MVC de cadastro básico (apenas uma tabela).
putTsiV5r: Método responsável por persistir os dados na tabela de log de erros
AgrupaErro: Aglutina todos os erros por chave de registro

TAF/
TAFA585
Motor Pai, Filho, Neto

Função que efetua inclusão e alteração do cadastro no MVC e seu respectivo filhos/netos ( com mais de uma tabela).

Colocar na função do hash pai as inforções de s_u_b_m_o_d_e_l_ ( filhos ) e s_u_b_m_o_d_e_l_2 ( netos ), conforme abaixo:

HMSet(oHash, 's_u_b_m_o_d_e_l_' , {{'MODEL_C2T'/*model filho*/,'adjustmentApuration' /* tag filho*/, 'HashC2T()' /* hash filho*/ }} )

HMSet(oHash, 's_u_b_m_o_d_e_l_2' , {{'adjustmentApuration'/* tag filho*/,'MODEL_T02'/*model neto*/,'accumulatedAdjust'/*tag neto*/, 'HashT02()' /*hash neto*/}} )
*Nessa tag filho do submodel2 informa quem é o pai desse neto.

TSI/
TSIXFUN
Funções genéricas TSI

GetTafId        Rertorna o _ID de cada consulta F3
GetTafId2()    Funcão utilizada para retornar id de registro a partir de chave composta
SetHashKey  Método responsável por montar HashMap de Cadastros
RetErroTaf     Método responsável por montar msg de error na integração
SetErroJs       Método responsável por retornar os erros no JSon de integração
VldExecute    Função responsável por validar os dados de empresa e filial para requisição
ClearV5R       Apaga Registro V5R caso o nota seja incluída com sucesso.
WsTSIVldGet No caso de conteúdo vazio para retorno ao get, retorna com 0 se for campo numérico e '' se for outro tipo de dado.
ValTsiData     Função para tratar o conteúdo tipo data, retornando a data no formato SQL AAAAMMDD
TsiGetJson     Motor que realiza de para de campo com hash para parsear registros em json. Monta o objeto json de forma automatizada.

TAF/
TAFA599
Data de CorteFiltro para extrair e processar mais rápido tabela V80.
ERP/
TAFA600
Alteração Fake SFTCom base no ERPKEY da V5R para o alias C20 é realizado a alteração fake nas notas que constam no log.

Projeto Interno ( DEVS )

O objetivo deste guia é ajudar os membros da equipe a entender a composição do projeto e como nos organizamos para planejar, desenvolver, testar e documentar o TAF TSI.
A documentação oficial publicada para os clientes consta em TSI - TAF Service Integration.
O projeto consta no diretório: .../Master/Fontes/TAF/Integração/TSI, sendo composto por fontes na raiz (genéricos) , subpasta ERP (extração dos módulos do protheus) e subpasta TAF (APIS que fazem operações nas tabelas legados do TAF).
O controle com o nome dos fontes, descrição e analista que desenvolveram o TSI, fica disponível no google docs \Tabelas TAF.

Divisão na execução do Desenvolvimento

Quando é necessário criar um novo leiaute no TSI, precisamos trabalhar em alguns pontos, são eles:

Extração do ERP

A regra deve considerar registros onde o stamp do ERP é superior ao do TAF, ou se no ERP tem conteúdo e no TAF está nulo, em algumas situações também é verificado se o STAMP do ERP é superior ao do log gravado na tabela V5R,
para não ficar repetindo a extração caso exista erro, até que seja ajustado a correção do lado do ERP.

Aqui é contemplado a regra de extração apenas do ERP Protheus, que em muito(s) casos a(s) regra(s) consta(m) nos extratores:

  1. Entender e elaborar a regra de extração.

  2. Nessa etapa são levantados todos os campos necessários na extração,  a planilha interna com o layout consta em google drive em Layout TAF.xlsx

  3. Aqui também é necessário utilizar o pacote centralizador do TSI no atusx, para criar o campo STAMP na tabela legado do SIGATAF.

  4. Conforme DOD dessa tarefa, aqui também é esperado a geração do JSON com o conteúdo dos campos do layout nas tags pré definidas para integração.

  5. Controle do Stamp criado na Tabela do ERP e Mecanismo de validação do STAMP entre Protheus x TAF finalizado.

Integração ERP e TAF ( Json x Hash )

Etapa onde o layout já está sendo extraído pelo TSI (geração do json mencionado na etapa 4 da extração do ERP) e agora será construído a integração das informações para o TAF.

  1. Construir Hash do JSON para o TAF pai, filho e netos (se houver), o modelo dos fontes com hash consta em TAF\Integração\TSI\TAF\WSTAFXXX.prw.

  2. Realizar o processo de gravação das tabelas do TAF, através de um mecanismo que irá receber os dados do JSON  (utilizar o motor de cadastro básico TAFA565 ou motor pai, filho e netos TAFA585).
    Integração do JSON com o TAF finalizado para o evento, iremos instanciar o modelo do respectivo cadastro que será integrado e alimentá-lo com as informações extraídas do Protheus.

  3. Validar se o Commit foi possível (Tabelas do TAF gravadas com os dados do JSON), se sim grava o campo TAFSTAMP com o mesmo valor do STAMP trazido do Protheus para o respectivo evento
    (Controle do STAMP nas tabelas do TAF implementado), precisa ser a última instrução da função.

    Ponto de atenção: não é necessário instanciar o modelo a cada novo registro de integração, todo o processo acima precisa estar dentro de controle de transação, ou seja, se cair a conexão durante o processo
    o campo TAFSTAMP não será preenchido e o registro será reintegrado no novo processamento do TSI.

  4. Gravação da tabela V5R para os erros de integração, caso não seja possível a integração gravar a tabela de "Erros de Integração TSI" (Tabela V5R), veja os principais itens a serem validados em estrutura de log.

  5. Para auxiliar a equipe de suporte, ou na análise de um possível problema, devemos avaliar pontos onde é válido adicionar conouts (TAFCONOUT), ver em documentação oficial TAF Service Integration \ Análise Técnica \ Lista de Erros.

  6. Colocar a rotina dentro do Schedule ( TAFA573 ).

Construção APIS

Aqui será construídas as APIS para substituir o layout TAF.

  1. Construir API que recebe mensagem JSON e grava no cadastro MVC do TAF o respectivo leiaute.

  2. Construir as APIs com os seguintes tipos de requisição:

    PUT ( pode receber um código ou uma lista para atualizar )
    http://localhost:8099/REST/api/tsi/v1/tsiCommonExternalTariff/63013000/?sourceBranch=T1D MG 01
    http://localhost:8080/rest/api/tsi/v1/tsiinvoice/?sourceBranch=T1D
    MG 01 (+Body)

    DELETE ( pode receber parâmetros ou uma lista para apagar
    http://localhost:8080/rest/api/tsi/v1/tsiinvoice?sourceBranch=T1D MG 01&operationType=1&modelIdentificationCode=55&taxDocumentSeries=1&taxDocumentNumber=000000002 &fiscalDocumentDate=20201015&participatingCode=CSP000101
    http://localhost:8099/REST/api/tsi/v1/tsiCommonExternalTariff/?sourceBranch=T1D MG 01 (+Body)

    POST ( pode receber uma lista para inserir )
    http://localhost:8080/rest/api/tsi/v1/tsiinvoice/?sourceBranch=T1D MG 01 (+Body)
    http://localhost:8099/REST/api/tsi/v1/tsiCommonExternalTariff/?sourceBranch=T1D MG 01 (+Body)

    GETID ( pode retornar um único código )
    http://localhost:8099/REST/api/tsi/v1/tsiCommonExternalTariff/63013000/?sourceBranch=T1D MG 01
    http://localhost:8080/rest/api/tsi/v1/tsiinvoice/idTsiinvoice/?sourceBranch=T1D MG 01&taxDocumentNumber=NTSAIDA

    GETLIST ( pode retornar uma lista com paginação, tratar os parâmetros: HasNext, Page, PageSize, Do Código, Até Código, ordenação, etc... )
    http://localhost:8080/rest/api/tsi/v1/tsiinvoice/?sourceBranch=T1M SP 03&Page=1&PageSize=50&invoiceOf= &invoiceUp=ZZZZ
    http://localhost:8099/REST/api/tsi/v1/tsiCommonExternalTariff/?sourceBranch=T1D MG 01&commonExternalTariffOf=63013000&commonExternalTariffUp=63014000

    {
        "invoice": [
            {
                "stamp": "2020-11-19 13:44:42.480",
                "finalDocumentNumber": "0000000003",
                "AIDFNumber": "",
                "electronicKeyDocument": "",
                "identificationSituation": "00",
                "federativeUnitOrigin": "SP",
                "shippingIndicator": "1",
                "valueOfGoods": 9000,
                "valueOfServices": 0,
                "documentType": "00",
                "fiscalDocumentDate": "15/10/20",
                "insuranceAmount": 0,
                "documentValue": 9000,
                "placeOfDelivery": "",
                "freight": 0,
                "untaxedAllowanceAmount": 0,
                "taxDocumentIssuer": "0",
                "taxDocumentSeries": "1",
                "valueReducedISSMaterials": 0,
                "modelIdentificationCode": "55",
                "participatingCode": "CSP000101",
                "taxDocumentNumber": "00000000",
                "typeOfPayment": "1",            
                "amountOfAccessoryExpenses": 0,
                "discountAmount": 0,
                "operationType": "1",
                "taxDocumentEntryAndExitDate": "15/10/20",
                "otherExpenses": 0,
                "fiscalDocumentItems": [
                    {
                        "itemNumber": "0001",
                        "cfopIndicator": "5933",
                        "itemAdditions": 0,
                        "originIdentCode": "1",
                        "operationNature": "503",
                        "accountingValue": 6000,
                        "socialSecurityExemption": "2",
                        "itemAmount": 1,
                        "itemValue": 6000,
                        "discountValue": 0,
                        "physicalMovement": "",
                        "itemTotalValue": 6000,
                        "acessoryExpense": 0,
                        "unitOfMeasurement": "UN",
                        "itemCode": "ISS",
                        "serviceCode": "",
                        "cityServiceCode": "",
                        "serviceType": "",
                        "dipamCode":""
                    }
                ]        
            }
        ]
    }
  3. Definimos que a tabela de log de erros será gravada nas integrações via REST para todas as validações necessárias, as mensagens precisam ser criadas a nível de usuário, sem nenhum detalhe técnico com relação ao erro encontrado.

  4. Criar o mecanismo de integração via REST para as linhas e via função para o Protheus (item deve ser alinhado com a etapa de integração do ERP Protheus).

  5. Layout Integrado na tabela específica do TAF.

OPEN API

Aqui serão catalogadas e disponibilizadas as APIS construídas para os nossos clientes.

Implementar a estrutura para a documentação do API.TOTVS.COM.BR. Utilizar o cost center como exemplo.

*Ainda não publicar mas ao final da entrega iremos sim publicar a API para uso dos clientes;

Poderá ser feito com o openAPI Preview in Browse ou com o swagger.

Dependência de Fontes

Para gerar pacote no Jira por dependência automática é necessário fazer pelo menos 2 check-ins,
sendo pelo menos 1 fonte qualquer relacionado a extração ( verde ) e 1 fonte qualquer relacionado a integração ( vermelho ).


TSI
1TAF/Integração/TSI/TAFA573.PRW 
(13. dep. aut. extração )
Schedule TSI
2TAF/Integração/TSI/TSIXFUN.PRW 
(14. dep. aut. extração )
Funções genéricas TSI

TSI TAF ( api )
3

TAF/Integração/TSI/TAF/TAFA564.PRW

(15. dep. aut. extração )

Log ( V5R )
4TAF/Integração/TSI/TAF/TAFA565.PRW
(12. dep. aut. integração )
Motor para os Cadastros
5TAF/Integração/TSI/TAF/TAFA585.prw
(13. dep. aut. integração )
Motor Pai, Filho, Neto
6

TAF/Integração/TSI/ERP/TAFA599.PRW
(14. dep. aut. integração )

Data Corte ( V80 )
7

TAF/Integração/TSI/TAF/WSTAF025.prw
(04. dep. aut. integração )

Natureza de Operação / TES
8TAF/Integração/TSI/TAF/WSTAF026.prw
(03. dep. aut. integração )
Produto
9

TAF/Integração/TSI/TAF/WSTAF027.prw
(01. dep. aut. integração )

Participante
10TAF/Integração/TSI/TAF/WSTAF029.prwCentro de Custo
11TAF/Integração/TSI/TAF/WSTAF030.prw
(02. dep. aut. integração )
Unidade de Medida
12TAF/Integração/TSI/TAF/WSTAF031.prw
(05. dep. aut. integração )
Inscrição do estabelecimento substituto
(Inscrições Estaduais)
13TAF/Integração/TSI/TAF/WSTAF032.prw
(11. dep. aut. integração )
Processos referenciados e suspensões.
14TAF/Integração/TSI/TAF/WSTAF034.prw
(08. dep. aut. integração )
Nota Fiscal
15TAF/Integração/TSI/TAF/WSTAF035.prw
(06. dep. aut. integração )
Informações Complementares
16

TAF/Integração/TSI/TAF/WSTAF036.prw
(07. dep. aut. integração )

NCM
17TAF/Integração/TSI/TAF/WSTAF039.prw
(09. dep. aut. integração )
Apuração ICMS
18TAF/Integração/TSI/TAF/WSTAF040.prw
(10. dep. aut. integração )
Apuração ICMS ST
19TAF/Integração/TSI/TAF/WSTAF042.prwCadastro de Obras
20TAF/Integração/TSI/TAF/WSTAF043.PRWCPRB

TSI ERP ( extração )
21TAF/Integração/TSI/ERP/TAFA556.prw 
( 01. dep. aut. extração )
Participante
22TAF/Integração/TSI/ERP/TAFA557.prw 
( 02.dep. aut. extração )
Unidade Medida
23TAF/Integração/TSI/ERP/TAFA558.PRW
( 12. dep. aut. extração )
Alteração Fake Cadastros
24TAF/Integração/TSI/ERP/TAFA559.prw 
( 03. dep. aut. extração )
Item (Produto)
25TAF/Integração/TSI/ERP/TAFA560.PRW 
( 04. dep. aut. extração )
Natureza de Operação \ TES
26TAF/Integração/TSI/ERP/TAFA561.PRW 
( 07 dep. aut. extração )
NCM
27TAF/Integração/TSI/ERP/TAFA562.PRWCentro de Custo
28TAF/Integração/TSI/ERP/TAFA563.PRWConta Contábil
29TAF/Integração/TSI/ERP/TAFA566.PRWCPRB
30TAF/Integração/TSI/ERP/TAFA569.PRW 
( 05. dep. aut. extração )
Inscrição do estabelecimento substituto
(Inscrições Estaduais)
31TAF/Integração/TSI/ERP/TAFA572.PRW
( 11. dep. aut. extração )
Processos referenciados e suspensões.
32TAF/Integração/TSI/ERP/TAFA574.prw 
( 08 dep. aut. extração )
Nota Fiscal
33TAF/Integração/TSI/ERP/TAFA575.prw 
( 06. dep. aut. extração )
Informações Complementares
34TAF/Integração/TSI/ERP/TAFA584.prw 
( 09 dep. aut. extração )
Apuração ICMS 
35TAF/Integração/TSI/ERP/TAFA586.prw 
( 10 dep. aut. extração )
Apuração ICMS ST
36TAF/Integração/TSI/ERP/TAFA596.PRWCadastro de Obras
37TAF/Integração/TSI/ERP/TAFA600.PRW
(15. dep. aut. integração )
Alteração Fake SFT

Auto Contidas
38TAF/Tabelas Dinâmicas/TAFA010A.PRW
39TAF/Tabelas Dinâmicas/TAFA010.PRW

TAF PROCESSAMENTOS
40TAF/Processamentos/TAFACONT.PRW

UPDATE
41TAF/Update/RUPTAF.PRW
42TAF/Update/UPDTAF.PRW

GENÉRICOS
43TAF/Genéricos/Bibliotecas/TAFXFUN.PRW
44TAF/Genéricos/Configuração/TAFINIT.PRW
45TAF/Genéricos/Configuração/TafLoad.PRW

EXTRATOR
46Livros Fiscais/Extrator/ExtT013.PRW
47Livros Fiscais/Extrator/FisaExtWiz_Class.prw
48Livros Fiscais/Extrator/ExtT013XX.prw
49Livros Fiscais/Extrator/ExtT015.PRW

TAF CADASTROS FISCAIS
50TAF/Cadastros Fiscais/TAFA062.PRW


Lista dos fontes que não estão pasta $/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Integração/TSI do TFS mas foram alterados para o TSI.

Outros Fontes
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Genéricos/Configuração/TAFINIT.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/Livros Fiscais/Extrator/ExtT013.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/Livros Fiscais/Extrator/FisaExtWiz_Class.prw
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/Livros Fiscais/Extrator/ExtT013XX.prw
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/Livros Fiscais/Extrator/ExtT015.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Update/RUPTAF.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Update/UPDTAF.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Genéricos/Bibliotecas/TAFXFUN.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Cadastros Fiscais/TAFA062.PRW

$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Tabelas Dinâmicas/TAFA010.PRW

$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Tabelas Dinâmicas/TAFA010A.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Processamentos/TAFACONT.PRW
$/Protheus_Padrao/Fontes_Doc/Master/Fontes/TAF/Genéricos/Configuração/TAFLOAD.PRW

Estrutura HashMap

O hash é montado nos fontes que constam na pasta TAF\Integração\TSI\TAF (API TSI). Para cada pai, possuímos o hash com informações genéricas para auxiliar na gravação do modelo.
Para cada tabela possuímos um hash com o "de/para" ( Tag x Campo). Todos os hashs são estáticos, ou seja a estrutura é montada apenas no início do chamado do programa.

Estrutura LOG

Os erros são aglutinados e gravados em uma única linha na V5R (por chave do cadastro), substituindo o erro anterior caso exista.
Incluir VLDDATA para tratamento nos mesmos moldes do que foi feito no cadastro de nota fiscal.
Filial sendo gravada no campo V5R_CODFIL e não na V5R_REGCHAVE.
Caso o ajuste seja realizado e chave do registro seja "comitado" no TAF, o log é apagado na sequência.

Caso o log gravado na V5R não possua algum campo de chave e depois o usuário corrigiu e refez a integração.
Esse registro não será removido da V5R de forma automática, pois a chave composta mudou. Nessa situação o registro deverá ser apagado de forma manual.


As principais validações no TSI são por modelo do mvc (VldData) ou regras específicas: