
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
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:
- 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 dos dados através de um mecanismo que irá receber o JSON e realizar a integração com o TAF (motor cadastro básico TAFA565 ou motor pai, filho e netos TAFA585).
Iremos instanciar o modelo do respectivo cadastro que será integrado e alimentá-lo com as informações extraídas do Protheus,
após isso validar se o Commit foi possível, se sim grava o campo TAFSTAMP com o mesmo valor do STAMP trazido do Protheus
para o respectivo evento ( precisa ser a última instrução da função ), caso não seja possível a integração gravar a tabela de "Erros de Integração TSI" (Tabela V5R),
veja em estrura de log, os principais tipos a serem validados.
( 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.
Para auxiliar a equipe de suporte, ou na análise de um possível problema, devemos avaliar pontos onde é válido adicionar conouts (TAFCONOUT),
para podermos rastrear de forma mais simples até onde o processamento chegou em caso de travamento, erros etc. - Colocar a rotina dentro do Schedule ( TAFA573 ).
Construção de APIS
Open API
Fontes e Tabelas
Entidades | (C)ad. (M)ov. | JOB TSI? (S)im (N)ão | Tabelas ERP | Tabelas TAF | Layout TAF | Extração ERP | API TAF |
Participante | C | S | SA1\SA2 | C1H | T003 | TAFA556 | WSTAF027 |
Unidade Medida | C | S | SAH | C1J | T005 | TAFA557 | WSTAF030 |
Item (Produto) | C | S | SB1\SB5\F2Q\CDN | C1L | T007 | TAFA559 | WSTAF026 |
Natureza de Operação \ TES | C | S | SF4 | C1N | T009 | TAFA560 | WSTAF025 |
Centro de Custo | C | N | CTT | C1P | T011 | TAFA562 | WSTAF029 |
Conta Contábil | C | N | CT1 | C1O | T010 | TAFA563 | Sem Construção |
Inscrição do estabelecimento substituto | C | N | MV_SUBTRIB | C1F | T001AA | TAFA569 | WSTAF031 |
Processos referenciados e suspensões. | C | N | CCF | C1G\T5L | T001AB\T001AO | TAFA572 | WSTAF032 |
Informações Complementares | C | S | CCE | C3Q | T001AK | TAFA575 | WSTAF035 |
NCM | C | S | SYD | C0A | (auto contida) | TAFA561 | WSTAF036 |
Nota Fiscal | M | S | SFT\SF3\SF1\ SD1\SF2\SD2 | C20\C30\C35\ C39\C2F\C2D | T013\T013AP\ T015\T015AE | TAFA574 | WSTAF034 |
Apuração ICMS | M | S | CDH | C2S\C2T | T020\T020AA\T020AG | TAFA584 | WSTAF039 |
Apuração ICMS ST | M | S | CDH | C3J\C3K | T021\T021AA | TAFA586 | WSTAF040 |
Processos
Fonte | Processo | Detalhamento da rotinas: |
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. |
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); |
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.
|
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 |
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.
|
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. |
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:
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#" )
Estrutura LOG
Os erros são aglutinados e gravados em uma única linha na V5R substituindo o erro anterior caso exista.
Incluir VLDDATA para tratamento nos mesmos moldes do que foi feito no cadastro de nota fiscal.
Erros sendo gravados aglutinados por chave do cadastro;
Filial sendo gravada no campo V5R_CODFIL e não na V5R_REGCHAVE
Quando já existir um erro anterior para a chave o mesmo deve ser substituído pelo novo erro aglutinado encontrado;