Novo sincronismo
O novo sincronismo é uma estratégia de marcação horizontal de dados, envio flexível e otimizado para compactação.
O nome do projeto do novo sincronismo é TamoJunto.
Como Simular uma Requisição do TJ
- Passo 1 - Instalar um plugin do chrome chamado Advanced REST client (https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo)
- Passo 2 - Pegar o token para poder pegar os dados.
- Passo 3 - Mandar a requisição de sincronismo para pegar os dados
Ambiente de teste/beta
O host do TamoJunto é o host do beta. Na versão 4.0.1 4.0.2 4.0.3 4.0.6, o mesmo host usado para o SyncServer será usado para o TamoJunto, de tal sorte que o usuário não precisará entrar com dados novos no momento do sincronismo, e a porta está fixada como 8015 sempre.
No ambiente beta, existe um SyncServer e um TamoJunto configurado. O endereço do host é beta.softsitemobile.com, a porta do SyncServer é 8015.
A base HugoCini2 está configurada devidamente para o novo sincronismo.
Teste comparativo
A versão básica para comparação é a 3.22.9. Ela é a base para ver se tem algum dado faltoso ou se tem algum comportamento distinto.
Por hora, a única tabela que está no novo esquema é ORG_VENDA_CLIENTE
Criando novos ambientes
O primeiro passo no novo sincronismo é subir o servidor do TamoJunto na porta 8015. O TamoJunto roda sobre o Java 7, homologado no container Tomcat 8.
Cadastro de novas empresas
Dado um ambiente conhecido (no caso, Ares), vamos colocar uma empresa para esse novo sincronismo.
O primeiro ponto é travar totalmente a base. Importação, Claudus, Portal e qualquer outro serviço precisa ser parado para essa base, TOTALMENTE.
Aplique o script de migração na base. Então faça as verificações de que tudo está no canto.
Depois dessa migração, religue TODOS os sistemas.
Cadastre a versão 4.0.3 para sincronizar (ou a última versão 4.x.y) para a empresa. Coloque para sincronizar as tabelas desejadas. As tabelas disponíveis são:
ORG_VENDA_CLIENTE
Códigos de erro
Ao terminar um sincronismo mal sucedido, o sincronismo do TamoJunto lança um código na tela do usuário. O código tem o seguinte formato: IXHHH
. A parte I
se refere ao instante, a parte X
se refere ao erro lançado, e a parte HHH
se refere ao retorno HTTP.
Os possíveis valores pra I
são:
- 1 : autenticação
/auth
- 2 : sincronismo
/sync
- 3 : truncagem
/truncate
- 8 : desconhecido
- 9 : não relacionado ainda
Os possíveis valores pra X
são:
- 0 : erro de IO
- 1 : erro de HTTP; o código HTTP de erro segue na parte
HHH
- 2 : erro de host
- 3 : erro de SQL
- 9 : erro desconhecido
Os códigos de erro HTTP podem ser encontrados na página da Wikipedia, ou então tem ainda uma lista rápida com gatos.
Caso alguma chamada do TamoJunto retorne um código HTTP diferente de 200, o protocolo reconhece como erro.
Os erros HTTP mais comuns (e seus respectivos significados comuns) retornados pelo TamoJunto são:
- 000 : possivelmente não se conectou num servidor HTTP? Ou um timeout? Se for timeout, analisa o debugconsole. O mesmo irá repassar informações se alguma tabela está sempre apresentando erro de leitura dos campos.
- 400 : o dispositivo falhou ao montar a requisição; deve-se contatar imediatamente o Anderson e reportar essa problema; também pode ser um sinal de que o usuário esqueceu de preencher o ID palm ou a senha
- 401 : erro de usuário e senha; o ID palm não confere com a senha para aquela empresa, ou o usuário colocou um ID palm errado. Ou não existem conexões disponíveis para sincronismo no TJ para aquela empresa.
- 404 : empresa não cadastrada
- 500 : internal server error; deve-se contatar imediatamente o Anderson e reportar essa problema
NÃO ESQUECER
- SEMPRE que for instalar o TJ em um servidor TROCAR o jdbc.properties no diretorio /WEB-INF/classes/jdbc.properties pelo jdbc de conexões apropriado.
Caso não seja feito esse passo, o TJ vai acessar uma base diferente.
Passo a passo migração para o novo Sincronismo
- Passo 1
* Executar os seguintes scripts
/****** Object: Table [dbo].[TAMOJUNTO_TABELA_FUNCAO] Script Date: 26/01/2017 17:02:53 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TAMOJUNTO_TABELA_FUNCAO]( [ID] [int] IDENTITY(-2147483648,1) NOT NULL, [NM_TABLE] [varchar](256) NOT NULL, [NM_FN] [varchar](256) NOT NULL, [FL_ATIVA] [bit] NULL, PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
CREATE TABLE [dbo].[tamojunto_auth]( [cd_vendedor] [int] NOT NULL, [token] [varchar](255) NULL, [dt_criacao] [datetime] NULL, [dt_validade] [datetime] NULL )
CREATE TABLE [dbo].[tamojunto_data_geracao_registro]( [id] [int] IDENTITY(-2147483648,1) PRIMARY KEY NOT NULL, [dt_geracao] [datetime] NOT NULL, [cd_vendedor] [int] NOT NULL )
/****** Object: StoredProcedure [dbo].[sp_get_auth_token] Script Date: 10/11/2016 17:15:21 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO if exists (select top 1 1 from sys.sysobjects where name = 'sp_get_auth_token') begin drop proc [sp_get_auth_token] end go CREATE PROCEDURE [dbo].[sp_get_auth_token] (@id_palm CHAR(10), @ds_senha VARCHAR(20)) AS BEGIN ;WITH mysource AS (SELECT dv.cd_vendedor, substring(convert(varchar, hashbytes('SHA1', Cast(dv.cd_vendedor AS VARCHAR) + CONVERT(VARCHAR, Getdate(), 126)), 1), 3, 128) AS token, Getdate() AS dt_criacao, Dateadd(hh, 1, Getdate()) AS dt_validade FROM dados_vendedor dv LEFT JOIN tamojunto_auth tau ON ( dv.cd_vendedor = tau.cd_vendedor ) WHERE dv.id_palm = @id_palm AND dv.ds_senha = @ds_senha) MERGE tamojunto_auth AS mytarget using mysource ON mysource.cd_vendedor = myTarget.cd_vendedor WHEN matched THEN UPDATE SET token = mysource.token, dt_criacao = mysource.dt_criacao, dt_validade = mysource.dt_validade WHEN NOT matched THEN INSERT ( cd_vendedor, token, dt_criacao, dt_validade ) VALUES ( mysource.cd_vendedor, mysource.token, mysource.dt_criacao, mysource.dt_validade ) output mysource.token; END GO
/****** Object: UserDefinedFunction [dbo].[fn_STRING_JSON] Script Date: 10/11/2016 17:11:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[fn_STRING_JSON](@ID_VENDEDOR int, @DT_LAST_SINC datetime, @FN VARCHAR(256) ) RETURNS VARCHAR(MAX) BEGIN DECLARE @LIN INT = 0 DECLARE @I INT DECLARE @NAME VARCHAR(256) DECLARE @system_type_id tinyint DECLARE @scale tinyint DECLARE @CMD VARCHAR(MAX) = ' SELECT ''{''' DECLARE @AUX TABLE ( NAME VARCHAR(256), LIN SMALLINT, system_type_id tinyint, scale tinyint ) INSERT INTO @AUX SELECT C.NAME, ROW_NUMBER() OVER(ORDER BY C.column_id) LIN, C.system_type_id, C.scale FROM SYS.objects O INNER JOIN SYS.COLUMNS C ON C.OBJECT_ID = O.OBJECT_ID WHERE O.NAME = @FN SET @I = ISNULL((SELECT MAX(LIN) FROM @AUX),0) WHILE @I > @LIN BEGIN SET @LIN = @LIN + 1 SELECT @NAME = NAME, @system_type_id = system_type_id, @scale = scale FROM @AUX WHERE LIN = @LIN SET @CMD = @CMD + ' + CASE WHEN '+ @NAME +' IS NOT NULL THEN ''"'+lower(@NAME)+'"'' + '':"'' + ' + case when @system_type_id = 61 then 'convert(varchar, ' + @NAME + ', 126)' when @scale > 0 then 'case when ' + @NAME + ' = 0 then ''0'' when abs(' + @NAME + ') - floor(abs(' + @NAME + ')) = 0 and ' + @NAME + ' >= -2147483648 AND ' + @NAME + ' <= 2147483647 then cast(cast(' + @NAME + ' as integer) as varchar(max)) else cast(' + @NAME + ' as varchar(max)) end' else 'replace(rtrim(cast('+@NAME+' as varchar(max)) collate SQL_Latin1_General_CP1_CI_AI), ''"'', ''\"'')' end + ' + ''"' + (case when @LIN = @I then '' else ',' end) + '''ELSE '''' END ' END SET @CMD = @CMD + '+''},'' as json FROM ' + @FN + '('+CONVERT(VARCHAR(30),@ID_VENDEDOR)+','+ ISNULL(quotename(convert(varchar, @DT_LAST_SINC, 126),char(39)),'NULL')+')' RETURN @CMD END GO
- Passo 2
* Deve ser executado o programa ScriptGenerator do projeto TamoJunto. Na classe main devem ser especificado para quais tabelas devem ser gerados os scripts de migração.
private final String[] tabelas = { "org_venda_cliente", "lista_produto", "lista_produto_lote", "faixa_preco_produto", "valor_original_produto", "produto_custo", "produto_estoque", "cliente_rota", "rota", "produto", "tributacao", "tributacao_produto", "tributacao_cliente", "cliente" };
- Nessa etapa pode acontecer uma exceção na hora da geração dos scripts devido a alguma trigger fora do padrão na tabela a ser migrada que pode gerar algum erro. Nessa situação será mostrada uma mensagem no console e o script não será gerado. Exemplos de mensagens:
cliente_rota possui triggers que podem afetar a conversão: TR_DELETE_CLIENTE_ROTA, TR_INSERT_CLIENTE_ROTA
tributacao possui triggers que podem afetar a conversão: TRATAR_INSERT_TRIBUTACAO
Nesses casos você deve analisar as triggers e verificar se isso pode ser corrigido ou se a triggers pode ser modificada por uma ação da integração.
Após efetuar os ajustes foi possível efetuar a geração de scripts para as tabelas solicitadas.
- Passo 3
Nesta etapa, deve-se aplicar os scripts gerados no passo anterior.
- Passo 4
Nesta etapa deve-se fazer as mudanças necessárias na procedure sp_gerar_registro e nas procedures correlacionadas de geração de registro. A primeira mudança é adicionar o seguinte trecho de código acima da instrução commit tran -- will release the lock:
PRINT CONVERT(VARCHAR(MAX) ,GETDATE(),13) + ' - tamojunto_data_geracao_registro' INSERT INTO tamojunto_data_geracao_registro (cd_vendedor, dt_geracao) VALUES (@CDVENDEDOR,GETDATE())
Esta parte é muito importante e tem que ter bastante atenção por ser um processo manual. Você terá que retirar os inserts de log para todas as tabelas que estão no novo modelo de sincronismo. Basta comentar esses trechos.
- Passo 5
Nesta etapa deve-se aplicar as funções de consultas de dados das tabelas migradas e inserir na tabela de funções o nome das funções. As funções inseridas foram:
- fn_registro_sync_validade_tj
- fn_registro_sync_org_venda_cliente
- fn_REGISTRO_SYNC_LISTA_PRODUTO
Devem ser inseridos os registros na tabela TAMOJUNTO_TABELA_FUNCAO com os seguintes exemplos
INSERT INTO TAMOJUNTO_TABELA_FUNCAO (NM_TABLE, NM_FN, FL_ATIVA) VALUES ('VALIDADE_TJ', 'fn_registro_sync_validade_tj', 1) INSERT INTO TAMOJUNTO_TABELA_FUNCAO (NM_TABLE, NM_FN, FL_ATIVA) VALUES ('ORG_VENDA_CLIENTE', 'fn_registro_sync_org_venda_cliente', 1) INSERT INTO TAMOJUNTO_TABELA_FUNCAO (NM_TABLE, NM_FN, FL_ATIVA) VALUES ('LISTA_PRODUTO', 'fn_REGISTRO_SYNC_LISTA_PRODUTO', 1)