Histórico da Página
...
Aviso |
---|
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. |
Projeto Interno
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.
Atualmente o pacote centralizador do TSI no AtuSx é o 009134 (release 33). Aqui tem a criação dos campos stamp nas tabelas do TAF e a criação da tabela de log V5R.
Pontos de melhorias, dúvidas ou discussões sobre a execução, podem ser colocados no dontpad do TSI, para posterior implementação, se necessário expor em review ou retrospectiva.
Divisão na execução
Quando é necessário criar um novo leiaute no TSI, precisamos trabalhar em alguns pontos, são eles:
Extração do ERP
Aviso |
---|
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, |
Aqui é contemplado a regra de extração apenas do ERP Protheus, que em muito(s) casos a(s) regra(s) consta(m) nos extratores:
- extrator fiscal (...\Master\Fontes\Livros Fiscais\Extrator\ExtFisxTaf.prw),
- extrator financeiro(...\Master\Fontes\Adm\FINA989.prw) ou
- extrator contábil (...\Master\Fontes\Adm\ECD\CTBS001.prw e CTBS103.prw).
...
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.
...
Construção APIS
...
Bloco de código | ||
---|---|---|
| ||
{
"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":""
}
]
}
]
} |
...
Aviso |
---|
Para melhor desempenho no processamento dos participantes com as tabelas SA1, SA2 e C1H totalmente compartilhadas (CCC), o schedule não deverá estar configurado para processar as filiais paralelamente e sim no modo sequencial. |
O que é TSI?
- É o novo serviço de integração do SIGATAF com o ERP-Protheus.
- O TAF Service Integration ( 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
- 1. Requer um banco de dados homologado.
- 2. Requer um TOTVS Application Server build 7.00.170117A com geração superior a 23/09/2019.
- 3. Requer um TOTVS DbAccess igual ou superior a 19/11/2019
- 4. Executar o UpdDistr ( sdfbra.txt referente ao pacote acumulado do SIGATAF ).
- 5. Aplicar a patch com os fontes atualizados do acumulado ( .ptm da expedição contínua ).
Banco de Dados Homologados
- A integração com TSI depende do novo campo S_T_A_M_P_ e sua criação está disponível para os Banco de Dados MSSQL, ORACLE e POSTGRES.
O que é stamp?
- Um campo interno para tabelas do DBAccess, não visíveis na estrutura de acesso pelo AdvPL, que registra 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_ com a informação completa ( data e horário ), por exemplo no formato yyyy-mm-dd hh:MM:ss.mmm,
deve ser feito um CAST. Confira mais sobre stamp na documentação do DbAccess: Implementação - Campo de controle adicional no DBAccess - S_T_A_M_P_
Exemplo de STAMP em uma tabela no TAF:
Exemplo de STAMP em uma tabela do ERP:
Exemplo de query em MSSQL realizando o cast para converter o campo em string:
Select cast( to_char(SA1.S_T_A_M_P_,'DD.MM.YYYY HH24:MI:SS.FF') AS VARCHAR2(23) ) From SA1T10
Configuração
Dicionário
- Já foi incorporado no segregado e agora está disponível no portal através do pacote acumulado 21/01/2022.
- No dicionário constam os campos stamp nas tabelas do TAF, a criação da tabela de log V5R ( logs ) e V80 ( data e hora de corte ), conforme:
- Campos C/ STAMPS
X3_ARQUIVO | X3_CAMPO | X3_TIPO | X3_TAMANHO | X3_DECIMAL | X3_TITULO |
C0A - NCM | C0A_STAMP | C | 23 | 0 | Stamp |
C1G - Processos Referenciados | C1G_STAMP | C | 23 | 0 | Stamp |
C1H - Participantes | C1H_STAMP | C | 23 | 0 | Stamp |
C1J - Unidade de Medida | C1J_STAMP | C | 23 | 0 | Stamp |
C1L - Item da NF | C1L_STAMP | C | 23 | 0 | Stamp |
C1N - Natureza de Operação | C1N_STAMP | C | 23 | 0 | Stamp |
C1O - Plano de Contas | C1O_STAMP | C | 23 | 0 | Stamp |
C20 - Nota Fiscal | C20_STAMP | C | 23 | 0 | Stamp |
C2S - Apuração de ICMS | C2S_STAMP | C | 23 | 0 | Stamp |
C3J - Apuração de ICMS ST | C3J_STAMP | C | 23 | 0 | Stamp |
C3Q - Informações Complementares | C3Q_STAMP | C | 23 | 0 | Stamp |
C5M - CPRB | C5M_STAMP | C | 23 | 0 | Stamp |
LEM - Faturas/Recibo | LEM_STAMP | C | 23 | 0 | Stamp |
T9C - Cadastro de Obras | T9C_STAMP | C | 23 | 0 | Stamp |
- V80
X2_CHAVE | X2_NOME | X2_MODO | X2_MODOUN | X2_MODOEMP | X2_UNICO |
V80 | Data de corte TSI | E | E | E | V80_FILIAL+V80_ALIAS |
X3_ARQUIVO | X3_ORDEM | X3_CAMPO | X3_TIPO | X3_TAMANHO | X3_DECIMAL | X3_TITULO | X3_DESCRIC | X3_PICTURE | X3_BROWSE | X3_VISUAL | X3_CONTEXT |
V80 | 1 | V80_FILIAL | C | 8 | 0 | Filial | Filial | S | A | R | |
V80 | 2 | V80_ALIAS | C | 3 | 0 | Alias | Alias | @! | S | A | R |
V80 | 3 | V80_STAMP | C | 23 | 0 | Stamp | Stamp | @! | S | A | R |
INDICE | ORDEM | CHAVE |
V80 | 1 | V80_FILIAL+V80_ALIAS |
- V5R
X2_CHAVE | X2_NOME | X2_MODO | X2_MODOUN | X2_MODOEMP | X2_UNICO |
V5R | Log TSI | C | C | C | V5R_FILIAL+V5R_CODFIL+V5R_ALIAS+V5R_REGKEY |
X3_ARQUIVO | X3_ORDEM | X3_CAMPO | X3_TIPO | X3_TAMANHO | X3_DECIMAL | X3_TITULO | X3_DESCRIC | X3_PICTURE | X3_BROWSE | X3_VISUAL | X3_CONTEXT |
V5R | 1 | V5R_FILIAL | C | 8 | 0 | Filial | Filial | S | A | R | |
V5R | 2 | V5R_CODFIL | C | 8 | 0 | Filial | Filial | @! | S | V | R |
V5R | 3 | V5R_ALIAS | C | 3 | 0 | Alias Tabela | Alias da tabela | @! | S | A | R |
V5R | 4 | V5R_REGKEY | C | 228 | 0 | Chave Reg. | Chave do registro | @! | S | A | R |
V5R | 5 | V5R_MSGERR | M | 999 | 0 | Msg. Erro | Mensagem de erro | @! | S | A | R |
V5R | 6 | V5R_DATA | D | 8 | 0 | Data | Data do erro | S | A | R | |
V5R | 7 | V5R_HORA | C | 8 | 0 | Hora | Hora do erro. | @! | S | A | R |
V5R | 8 | V5R_STAMP | C | 23 | 0 | Stamp | Stamp | @! | N | V | R |
V5R | 9 | V5R_ERPKEY | C | 228 | 0 | Chav Reg ERP | Chave do Registro no ERP | @! | S | A | R |
INDICE | ORDEM | CHAVE | DESCRICAO |
V5R | 1 | V5R_FILIAL+V5R_CODFIL+V5R_ALIAS+V5R_REGKEY | Filial + Alias Tabela + Chave Reg. |
V5R | 2 | V5R_FILIAL+V5R_CODFIL+DTOS(V5R_DATA)+V5R_HORA+V5R_ALIAS | Filial + Data + Hora + Alias Tabela |
Wizard Configuração TAF
- Para que a opção do "TSI - TAF SERVICE INTEGRATION" seja exibida no Wizard do TAF, é necessário ter executado os pré-requisitos e que exista ao menos uma nota escriturada no fiscal ( SF3/SFT ).
- A wizard de configuração do TAF ganhou uma nova opção para criação dos campos S_T_A_M_P_, basta executar marcando a nova opção, [X] TSI - TAF Integration Service
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, SE1, SE2, CCF, SF1, SF2, SF3, CCE, SYD, CDH, SON e CKX.
Obs: Em breve a CDT e CDG serão disponibilizadas com S_T_A_M_P_.
Qtd | tablename | columnname |
01 | CCE | S_T_A_M_P_ |
02 | CCF | S_T_A_M_P_ |
03 | CDH | S_T_A_M_P_ |
04 | CDN | S_T_A_M_P_ |
05 | CKX | S_T_A_M_P_ |
06 | CT1 | S_T_A_M_P_ |
07 | F2Q | S_T_A_M_P_ |
08 | SA1 | S_T_A_M_P_ |
09 | SA2 | S_T_A_M_P_ |
10 | SA4 | S_T_A_M_P_ |
11 | SAH | S_T_A_M_P_ |
12 | SB1 | S_T_A_M_P_ |
13 | SB5 | S_T_A_M_P_ |
14 | SE1 | S_T_A_M_P_ |
15 | SE2 | S_T_A_M_P_ |
16 | SF1 | S_T_A_M_P_ |
17 | SF2 | S_T_A_M_P_ |
18 | SF3 | S_T_A_M_P_ |
19 | SF4 | S_T_A_M_P_ |
20 | SFT | S_T_A_M_P_ |
21 | SON | S_T_A_M_P_ |
22 | SYD | S_T_A_M_P_ |
Schedule Configurador
- O TSI deverá ser incluído no agendamento ( schedule do SIGACFG ) 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:
Usabilidade ( menus )
Menu Log de Integração
- Através desta rotina é possível visualizar o detalhamento das mensagens de integração que apontaram falhas no processamento ( tabela V5R ) e não foram integradas ao TAF.
Módulo | Nome do Menu | Submenu | Nome da Rotina | Programa |
---|---|---|---|---|
Totvs Automação Fiscal | Miscelânea | Integração | Log de Processamentos TSI | TAFA564 |
Browse com Log
Detalhamento dos Erros
Menu Filtro Data de Corte
- Através desta rotina é possível visualizar o último processamento por layout, a tabela V80 foi criada para melhorar o desempenho do filtro, referente ao registros que ainda não foram processados.
Módulo | Nome do Menu | Submenu | Nome da Rotina | Programa |
---|---|---|---|---|
Totvs Automação Fiscal | Miscelânea | Integração | Data de Processamento TSI | TAFA599 |
Browse com Log
Como identificar erros
Quando acionar o TAFCONOUT para verificar possíveis falhas
- Caso não ocorra integração ou deseje acompanhar em que passo está a integração é possível ligar o log de mensagem do TSI, para isso basta atualizar o appserver.ini:
[GENERAL]
TAFCONOUT=1
Onde avaliar os erros de integração
- Consultar o console para verificar se o serviço está em execução ou se ocorreu alguma falha.
- Pode ser verificado na tabela V5R, através da chave do registro ( TAFA564 - Cadastro de Log de integração ).
- Consulte a aba "Erros de Integração" na documentação TSI - TAF Service Integration, para maiores informações sobre as mensagens de erros e suas possíveis soluções
- Consulte a aba "Análise Técnica" na documentação TSI - TAF Service Integration, para maiores informações sobre as mensagens de erros.
Estrutura de Log na V5R
- Os erros são aglutinados e gravados em uma única linha na V5R (por chave do cadastro) por registro, substituindo o erro anterior caso exista.
- A filial é gravada no campo V5R_CODFIL e não na V5R_REGCHAVE.
- Caso seja realizado o ajuste no registro e o mesmo seja integrado no TAF, o log é apagado na sequência.
Aviso |
---|
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. |
As principais validações no TSI são por modelo do mvc (VldData) ou regras específicas:
- Por tipo de dados, ex: data, numérico, lógico ou caractere (FWNOSTRUCT);
- Obrigatório (OBRIGAT);
- Se código existe na consulta padrão F3 (NOTFOUND);
- Se o tamanho é excedido (FWNOWIDTH);
- Se o conteúdo consta no combox (FWNOLIST);
- Se o registro existe na origem (NOTEXIST);
- Se o conteúdo pode ser editado (FWWHEN);
- Regra de modelo específico, exemplo: Se a nota necessita de item (TAFHLPNF017);
- Se o commit do modelo é válido e não estoura o uniqline (UNIQUELINE);
- Se o formato de data é válido (DATE);
- Se é válido apagar uma chave estrangeira (FWFORMCANCEL);
- Se houve falha na atribuição de conteúdo (LOADVALUE)
Quais tabelas são utilizadas
Entidades | Tabelas ERP | Tabelas TAF |
Participante e dependentes | SA1\SA2\DHT | C1H\V3R |
Unidade Medida | SAH | C1J |
Item (Produto) | SB1\SB5\F2Q\CDN | C1L |
Natureza de Operação \ TES | SF4 | C1N |
Centro de Custo | CTT | C1P |
Conta Contábil | CT1 | C1O |
Inscrição do estabelecimento substituto (Inscrições Estaduais) | MV_SUBTRIB | C1F |
Processos referenciados e suspensões | CCF | C1G\T5L |
Informações Complementares | CCE | C3Q |
NCM | SYD | C0A |
Nota Fiscal | SFT\SF3\SF1\ | C20\C2F\ C30\C35\ C2D\ Transporte C39 Info Compl. C21 Compl. Processo T9Q |
Apuração ICMS | CDH | C2S\C2T |
Apuração ICMS ST | CDH | C3J\C3K |
Cadastro de Obras | SON | T9C |
CPRB | CKX\F2S\F3Z | C5M\T9T\V48 |
Índice do Banco de Dados Sugeridos ( Performance )
Aviso |
---|
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],[FT_PRODUTO], 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_)
Onde encontrar as documentações
Documentação Oficial SIGATAF TSI para Clientes
Implementação - Campo de controle adicional no DBAccess - S_T_A_M_P_
Fontes Envolvidos
Qtd Layout | Entidades | (C)ad. (M)ov. (A)pur. | JOB TSI? (S)im (N)ão | Tabelas ERP | Tabelas TAF | Layout TAF | Extração ( ERP ) | Gravação ( API TAF ) | Obrigações |
01 | Participante | C | S | SA1\SA2 | C1H | T003 | TAFA556 | WSTAF027 | GIA\REINF |
02 | Unidade Medida *predecessor produto | C | S | SAH | C1J | T005 | TAFA557 | WSTAF030 | - |
03 | Item (Produto) | C | S | SB1\SB5\F2Q\CDN | C1L | T007 | TAFA559 | WSTAF026 | GIA\REINF |
04 | Natureza de Operação \ TES | C | S | SF4 | C1N | T009 | TAFA560 | WSTAF025 | GIA |
05 | Centro de Custo | C | N | CTT | C1P | T011 | TAFA562 | WSTAF029 | - |
06 | Conta Contábil | C | N | CT1 | C1O | T010 | TAFA563 | Sem Construção | - |
07 | Inscrição do estabelecimento substituto (Inscrições Estaduais) | C | N | MV_SUBTRIB | C1F | T001AA | TAFA569 | WSTAF031 | GIA |
08 | Processos referenciados e suspensões. | C | S | CCF | C1G\T5L | T001AB\T001AO | TAFA572 | WSTAF032 | REINF |
09 | Informações Complementares | C | S | CCE | C3Q | T001AK | TAFA575 | WSTAF035 | GIA |
10 | NCM *predecessor produto | C | S | SYD | C0A | (auto contida) | TAFA561 | WSTAF036 | - |
11 | Nota Fiscal | M | S | SFT\SF3\SF1\ SD1\SF2\SD2 | C20\C2F\ | T013\T013AP\ | TAFA574 | WSTAF034 | GIA\REINF |
12 | Apuração ICMS | A | S | CDH | C2S\C2T | T020\T020AA\T020AG | TAFA584 | WSTAF039 | GIA |
13 | Apuração ICMS ST | A | S | CDH | C3J\C3K | T021\T021AA | TAFA586 | WSTAF040 | GIA |
14 | Cadastro de Obras | C | S | SON | T9C | T157 | TAFA596 | WSTAF042 | REINF |
15 | CPRB | A | S | CKX/F2S/F3Z | C5M/T9T/V48 | T082/T082AC/T082AD | TAFA566 | WSTAF043 | REINF |
Rotinas Envolvidas
Fonte | Processo | Detalhamento da rotinas |
ERP/ TAFA558 | Alteração Fake | Alteração fake nos cadastros predecessores com base nas movimentações, |
TSI/ | Schedule TSI | Mecanismo responsável por executar o JOB do TSI na seguinte ordem: |
TAF/ TAFA564 | Log | Cadastro de Log de integração (MVC tabela V5R). |
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). |
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: |
TSI/ TSIXFUN | Funções genéricas TSI | GetTafId Rertorna o _ID de cada consulta F3 |
TAF/ TAFA599 | Data de Corte | Filtro para extrair e processar mais rápido tabela V80. |
ERP/ TAFA600 | Alteração Fake SFT | Com 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
Aviso |
---|
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, |
Aqui é contemplado a regra de extração apenas do ERP Protheus, que em muito(s) casos a(s) regra(s) consta(m) nos extratores:
- extrator fiscal (...\Master\Fontes\Livros Fiscais\Extrator\ExtFisxTaf.prw),
- extrator financeiro(...\Master\Fontes\Adm\FINA989.prw) ou
- extrator contábil (...\Master\Fontes\Adm\ECD\CTBS001.prw e CTBS103.prw).
Entender e elaborar a regra de extração.
- 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
- Aqui também é necessário utilizar o pacote centralizador do TSI no atusx, para criar o campo STAMP na tabela legado do SIGATAF.
- 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.
- 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.
- 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.
- 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. - 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. - 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.
- 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.
- Colocar a rotina dentro do Schedule ( TAFA573 ).
Construção APIS
Aqui será construídas as APIS para substituir o layout TAF.
- Construir API que recebe mensagem JSON e grava no cadastro MVC do TAF o respectivo leiaute.
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=63014000Bloco de código language java title ex: json no body collapse true { "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":"" } ] } ] }
- 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.
- 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).
- 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.
- Baixar o TTalk
https://github.com/totvs/ttalk-standard-message
cd C:\api
git clone https://github.com/totvs/ttalk-standard-message.git
- TTALK STANDARD MESSAGE
renomear para standard-message (constará uma pasta 1xAPI 1xSchemma) - instalar (no terminal --> npm install )
- Baixar tafintegrationservices_1-000j.json e TafIntegrationService_v1_000.json (estão anexos a issue de cada leiaute).
Importante renomear com "_1"
→ tafintegrationservices_1-000j.json em schemas → C:\api\standard-message\jsonschema\schemas
→ TafIntegrationService_v1_000.json em apis → C:\api\standard-message\jsonschema\apis
- baixar plugin x vs ( openapi-designer )
- Mudar referencia por causa do preview, alterar no v1
de ./jsonschema/schemas
para ../schemas
Salvar - ctrl + shift + P ( openApi Preview In Browse )
- Posicionar no V1
Voltar o v1 para ./jsonschema/schemas
de ../schemas
para ./jsonschema/schemas
Salvar - executar npm run test
de 32655 passing (2m)
para 32656 passing - Verificar se existe branch e subir, exemplo: oficial (master), homologação em definição*.
Dependência de Fontes
Aviso |
---|
Para gerar pacote no Jira por dependência automática é necessário fazer pelo menos 2 check-ins, |
TSI | ||
1 | TAF/Integração/TSI/TAFA573.PRW (13. dep. aut. extração ) | Schedule TSI |
2 | TAF/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 ) |
4 | TAF/Integração/TSI/TAF/TAFA565.PRW (12. dep. aut. integração ) | Motor para os Cadastros |
5 | TAF/Integração/TSI/TAF/TAFA585.prw (13. dep. aut. integração ) | Motor Pai, Filho, Neto |
6 | TAF/Integração/TSI/ERP/TAFA599.PRW | Data Corte ( V80 ) |
7 | TAF/Integração/TSI/TAF/WSTAF025.prw | Natureza de Operação / TES |
8 | TAF/Integração/TSI/TAF/WSTAF026.prw (03. dep. aut. integração ) | Produto |
9 | TAF/Integração/TSI/TAF/WSTAF027.prw | Participante |
10 | TAF/Integração/TSI/TAF/WSTAF029.prw | Centro de Custo |
11 | TAF/Integração/TSI/TAF/WSTAF030.prw (02. dep. aut. integração ) | Unidade de Medida |
12 | TAF/Integração/TSI/TAF/WSTAF031.prw (05. dep. aut. integração ) | Inscrição do estabelecimento substituto (Inscrições Estaduais) |
13 | TAF/Integração/TSI/TAF/WSTAF032.prw (11. dep. aut. integração ) | Processos referenciados e suspensões. |
14 | TAF/Integração/TSI/TAF/WSTAF034.prw (08. dep. aut. integração ) | Nota Fiscal |
15 | TAF/Integração/TSI/TAF/WSTAF035.prw (06. dep. aut. integração ) | Informações Complementares |
16 | TAF/Integração/TSI/TAF/WSTAF036.prw | NCM |
17 | TAF/Integração/TSI/TAF/WSTAF039.prw (09. dep. aut. integração ) | Apuração ICMS |
18 | TAF/Integração/TSI/TAF/WSTAF040.prw (10. dep. aut. integração ) | Apuração ICMS ST |
19 | TAF/Integração/TSI/TAF/WSTAF042.prw | Cadastro de Obras |
20 | TAF/Integração/TSI/TAF/WSTAF043.PRW | CPRB |
TSI ERP ( extração ) | ||
21 | TAF/Integração/TSI/ERP/TAFA556.prw ( 01. dep. aut. extração ) | Participante |
22 | TAF/Integração/TSI/ERP/TAFA557.prw ( 02.dep. aut. extração ) | Unidade Medida |
23 | TAF/Integração/TSI/ERP/TAFA558.PRW ( 12. dep. aut. extração ) | Alteração Fake Cadastros |
24 | TAF/Integração/TSI/ERP/TAFA559.prw ( 03. dep. aut. extração ) | Item (Produto) |
25 | TAF/Integração/TSI/ERP/TAFA560.PRW ( 04. dep. aut. extração ) | Natureza de Operação \ TES |
26 | TAF/Integração/TSI/ERP/TAFA561.PRW ( 07 dep. aut. extração ) | NCM |
27 | TAF/Integração/TSI/ERP/TAFA562.PRW | Centro de Custo |
28 | TAF/Integração/TSI/ERP/TAFA563.PRW | Conta Contábil |
29 | TAF/Integração/TSI/ERP/TAFA566.PRW | CPRB |
30 | TAF/Integração/TSI/ERP/TAFA569.PRW ( 05. dep. aut. extração ) | Inscrição do estabelecimento substituto (Inscrições Estaduais) |
31 | TAF/Integração/TSI/ERP/TAFA572.PRW ( 11. dep. aut. extração ) | Processos referenciados e suspensões. |
32 | TAF/Integração/TSI/ERP/TAFA574.prw ( 08 dep. aut. extração ) | Nota Fiscal |
33 | TAF/Integração/TSI/ERP/TAFA575.prw ( 06. dep. aut. extração ) | Informações Complementares |
34 | TAF/Integração/TSI/ERP/TAFA584.prw ( 09 dep. aut. extração ) | Apuração ICMS |
35 | TAF/Integração/TSI/ERP/TAFA586.prw ( 10 dep. aut. extração ) | Apuração ICMS ST |
36 | TAF/Integração/TSI/ERP/TAFA596.PRW | Cadastro de Obras |
37 | TAF/Integração/TSI/ERP/TAFA600.PRW (15. dep. aut. integração ) | Alteração Fake SFT |
Auto Contidas | ||
38 | TAF/Tabelas Dinâmicas/TAFA010A.PRW | |
39 | TAF/Tabelas Dinâmicas/TAFA010.PRW | |
TAF PROCESSAMENTOS | ||
40 | TAF/Processamentos/TAFACONT.PRW | |
UPDATE | ||
41 | TAF/Update/RUPTAF.PRW | |
42 | TAF/Update/UPDTAF.PRW | |
GENÉRICOS | ||
43 | TAF/Genéricos/Bibliotecas/TAFXFUN.PRW | |
44 | TAF/Genéricos/Configuração/TAFINIT.PRW | |
45 | TAF/Genéricos/Configuração/TafLoad.PRW | |
EXTRATOR | ||
46 | Livros Fiscais/Extrator/ExtT013.PRW | |
47 | Livros Fiscais/Extrator/FisaExtWiz_Class.prw | |
48 | Livros Fiscais/Extrator/ExtT013XX.prw | |
49 | Livros Fiscais/Extrator/ExtT015.PRW | |
TAF CADASTROS FISCAIS | ||
50 | TAF/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.
...
OPEN API
Em construção.
Par de Fontes e Tabelas
...
SFT\SF3\SF1\
SD1\SF2\SD2
...
C20\C30\C35\
C39\C2F\C2D
...
Processos
...
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.
...
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);
...
Cadastro de Log de integração (MVC tabela V5R).
Os mecanismos possuem a chamada da função PutTSIV5R para inserir registros nessa tabela.
...
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
...
Função que efetua inclusão e alteração do cadastro no MVC e seu respectivo filhos/netos ( com mais de uma tabela).
...
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.
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.
- Exemplo de Informações Genéricas
HMSet( oHash, 'm_o_d_e_l_' , 'TAFA062' )
HMSet( oHash, 'm_o_d_e_l_C_2_0_', 'MODEL_C20' )
HMSet( oHash, 's_o_u_r_c_e_' , 'TAFA062' )
HMSet( oHash, 'a_r_e_a_' , 'C20' )
HMSet( oHash, 'o_r_d_e_r_' , 1 )
HMSet( oHash, 'k_e_y_' , cKey )
HMSet( oHash, 's_e_e_k_' , cSeek )
HMSet( oHash, 't_a_g_i_d_' , 'invoiceId' )
Para cadastros ou movimentos, na estrutura pai, filho e neto, existem as tags de o model, submodel e submodel2, exemplo na utilização da apuração de ICMS:Exemplo de Informações Genéricas
HMSet( oHash, 'm_o_d_e_l_' , 'MODEL_C2STAFA062' )
HMSet( oHash, 's_u_b_m_o_d_e_l_C_2_0_', {{ 'MODEL_C2T'/*model filho*/,'adjustmentApuration' /* tag filho*/, 'HashC2T()' /* hash filho*/ }} )C20' )
HMSet( oHash, 's_o_u_b_m_o_dr_c_e_l_2' , {{ 'adjustmentApuration'/* tag filho*/,'MODEL_T02'/*model neto*/,'accumulatedAdjust'/*tag neto*/, 'HashT02()' /*hash neto*/}} )
Exemplo com "de/para"
Apenas o campo: SetHashKey(oHashC20, "taxDocumentNumber" ,"C20_NUMDOC" )
Com consulta padrão: SetHashKey(oHashC20, "participatingCode" ,"C20_CODPAR#F3#")
Tipo data: SetHashKey(oHashC20, "fiscalDocumentDate" ,"C20_DTDOC#DT#" )
Estrutura LOG
...
- TAFA062' )
HMSet( oHash, 'a_r_e_a_' , 'C20' )
HMSet( oHash, 'o_r_d_e_r_' , 1 )
HMSet( oHash, 'k_e_y_' , cKey )
HMSet( oHash, 's_e_e_k_' , cSeek )
HMSet( oHash, 't_a_g_i_d_' , 'invoiceId' )
Para cadastros ou movimentos, na estrutura pai, filho e neto, existem as tags de o model, submodel e submodel2, exemplo na utilização da apuração de ICMS:
HMSet(oHash, 'm_o_d_e_l_' , 'MODEL_C2S')
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*/}} ) - Exemplo com "de/para"
Apenas o campo: SetHashKey(oHashC20, "taxDocumentNumber" ,"C20_NUMDOC" )
Com consulta padrão: SetHashKey(oHashC20, "participatingCode" ,"C20_CODPAR#F3#")
Tipo data: SetHashKey(oHashC20, "fiscalDocumentDate" ,"C20_DTDOC#DT#" )
...