Sincronismo
A definifição de Sincronismo é quando o dado vem do sistema de terceiros para o NFS.
A busca de dados no banco para saber se será feito um insert/update é definido pelos campos que são definidos como Primary Key (Chave Primária), então é bom sempre fazer uma análise nos dados que serão recebidos e verificar se ele é uma chave primária ou não, isso não quer dizer que ele será uma PK no DB do NFS e sim serão valores unicos.
Estrutura
Estrutura Pai
{
"alias": "NomeTabelaApelido",
"table": "TABELA_NOME",
"field": {
}
}
Chave | Obrigatório | Valor | Descrição |
---|---|---|---|
alias | Sim | ApelidoTabela | Deve ser um apelido para tabela sem espaço. |
table | Sim | TABELA_NOME | É a Tabela Nome que está na nfs_core_ds_tabela, usada para referênciar a uma tabela do NFS |
field | Sim | Conjunto de Json | É onde ficam configurados os json de cada campo que vira do sincronismo, veja na tabela abaixo a configuração desses campos de forma detalhada, basicamento é o nome do campo que vem do terceiro e suas propriedades. |
deleteExistData | Não | true/false | Por padrão é false e se for definido como true, os dados existentes são deletados e inseridos novos. |
Compartilhado
Para inserir um dado que é compartilhado, a primeira coisa é conferir na nfs_core_sys_tabela_compartilhada e ver se suas tabelas estão compartilhadas para filial e local, se não pode não funcionar. O segundo item é configurar na Api na hierarquia principal é possível usar a propriedade filial e local da seguinte forma:
{
"alias": "NomeTabelaApelido",
"table": "TABELA_NOME",
"filial": { "share": true},
"field": {
}
}
Vale ressaltar que é independente, no caso acima a filial inserida sempre vai ser 9999.
{
"alias": "NomeTabelaApelido",
"table": "TABELA_NOME",
"local": { "share": true},
"field": {
}
}
por local ou até ambos
{
"alias": "NomeTabelaApelido",
"table": "TABELA_NOME",
"filial": { "share": true},
"local": { "share": true},
"field": {
}
}
Estrutura do Field
Será descrito com mais detalhes o que pode conter na configuração do fields.
{
"alias": "NomeTabelaApelido",
"table": "TABELA_NOME",
"field": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da Operacao",
"primaryKey": true,
"required" : true
},
"CodigoOperacao": {
"column": "CODIGO",
"type": "Varchar",
"size": 100,
"description": "CodigoOperacao da Operacao",
"primaryKey": true,
"required" : true
}
}
}
Como é possível observar CodigoEmpresa e CodigoOperacao, são campos que vem num json que é enviado por um sistema de terceiro e para cada um deles vai ter uma configuração.
Chave | Obrigatório | Valor | Descrição |
---|---|---|---|
column | Sim | STRING | Nome da Coluna no NFS. |
type | Sim | Varchar | Tipo da Coluna, geralmente é varchar |
size | Sim | INTEGER | Tamanho maximo do dado que está sendo sincronizado, ainda não é usado esse valor, mas será útil para validações futuras |
description | Não | STRING | Descrição da chave/Coluna, pode ser que isso ajude na manutenção para outras pessoas entenderem o que foi realizado, para que ser, de onde pertence. |
primaryKey | Não | true/false | Indica que aquela chave/coluna é chave primária, pode até não ser no banco mas ela é importanta para fazer buscas verificando se existe o campo no banco do NFS para ver se é necessário fazer um update ou insert |
required | Não | true/false | É um atributo importante, se marcado como true exije que o sistema de terceiro envie o valor, se não enviar será enviado uma mensagem de erro dizendo que o campo é obrigatório. Lembrando que se o campo não é obrigado não é necessário usar esse atributo |
fieldMsgReturn | Não | STRING | É usado como um apelido para o campo de mensagem na primeira validação que é quando há uma pré condição para fazer um sincronismo, por exemplo, no caso de OS se ela já foi integrada não pode ser mais atualizada pelo sincronismo, e o campo é CodigoOS mas o cliente deseja que seja somente OS com isso na mensagem de retorno vai Exibir OS ao invés de CodigoOS, veja mais em mensagem de retorno |
fk | Não | true/false | Indica que a coluna é uma FK |
tableOrigin | Não | STRING | É somente usada quando o campo é marcado com "fk" : true e indica qual a tabela de origem. |
columnOrigin | Não | STRING | É somente usada quando o campo é marcado com "fk" : true, "tableOrigin" : "ESTADO" e indica qual é a coluna que representa, no caso pode ser que seja enviada a sigla do estado ficando "fk" : true, "tableOrigin" : "ESTADO", "columnOrigin" : "SIGLA" , com isso será salvo o ESTADO_SEQ_DB com o valor da SIGLA enviado Exemplo de config com FK. |
fieldsComp | Não | Json Array | Usado quando a FK depende de mais de um campo que é enviado, o que chamamos de fk composta, na tabela de equipamento para ele ser unico depende CodigoLinhaEquip(LINHA), CodigoModeloEquip(MODELO), Chassi(CHASSI) veja no exemplo Exemplo de Configuração com FK Composta |
multipleFK | Não | Json Array | Usado quando é o campo FK da tabela origem também é um FK veja no Exemplo de Configuração Multiple FK |
parent | Não | true/false | Utilizado para quando precisa obter o valor de um informação que esteja no json pai, veja mais em Exemplo de Configuração de Parent |
Tipos do Field
- varchar: Tipo básico que representa strings
- boolean: Tipo verdadeiro ou falso e aceita os seguintes valores verdadeiros: 1, yes, s, sim, ativo, a, verdadeiro. Tudo diferente desses valores vai ser considerado como falso.
- int: Tipo inteiro
- float: Tipo ponto flutuante
Se for passado um tipo que não existe acima vai ser considerado como uma string.
Exemplos
Configuração de Operação [Simples]
{
"alias": "OperacaoServico",
"table": "OPERACAO",
"field": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da Operacao",
"primaryKey": true,
"required" : true
},
"CodigoLinhaOper": {
"column": "CODIGO_LINHA",
"type": "Varchar",
"size": 100,
"description": "Codigo Linha da Operacao",
"primaryKey": true,
"required" : true
},
"CodigoOperacao": {
"column": "CODIGO",
"type": "Varchar",
"size": 100,
"description": "CodigoOperacao da Operacao",
"primaryKey": true,
"required" : true
},
"Descricao": {
"column": "DESCRICAO",
"type": "Varchar",
"size": 100,
"description": "Descricao da Operacao",
"required" : true
},
"DescricaoCompl": {
"column": "DESCRICAO_COMPLETA",
"type": "Varchar",
"size": 100,
"description": "Descricao Completa da Operacao"
},
"TipoOperacao": {
"column": "TIPO_OPERCAO",
"type": "Varchar",
"size": 2,
"description": "Tipo da Operacao",
"required" : true
}
}
}
Exemplo de Configuração Cliente
{
"alias": "Cliente",
"table": "CLIENTE",
"field": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial do Cliente",
"primaryKey": true,
"required": true
},
"CodigoCliente": {
"column": "CODIGO",
"type": "Varchar",
"size": 20,
"description": "Código do Cliente Endereço no DMS 999999EEE (Pessoa/Ender)",
"primaryKey": true,
"required": true
},
"Nome": {
"column": "DESCRICAO",
"type": "Varchar",
"description": "Nome do Cliente",
"required": true
},
"Tipo": {
"column": "TPPESSOA",
"type": "Varchar",
"size": 10,
"description": "Tipo (Fisica/Juridica) do Cliente",
"required": true
},
"CpfCnpj": {
"column": "CNPJCPF",
"type": "Varchar",
"size": 100,
"description": "Cpf ou Cnpj do Cliente",
"required": true
},
"NomeEndereco": {
"column": "ENDERECO",
"type": "Varchar",
"size": 100,
"description": "Endereço do Cliente",
"required": true
},
"Logradouro": {
"column": "LOGRADOURO",
"type": "Varchar",
"size": 100,
"description": "Logadouro do Cliente",
"required": true
},
"Numero": {
"column": "NUMERO",
"type": "Varchar",
"size": 100,
"description": "Numero do Cliente"
},
"Complemento": {
"column": "COMPLEMENTO",
"type": "Varchar",
"size": 100,
"description": "Complemento do Cliente"
},
"Bairro": {
"column": "BAIRRO",
"type": "Varchar",
"size": 30,
"description": "Bairro do Cliente"
},
"Cidade": {
"column": "MUNICIPIO",
"type": "Varchar",
"size": 30,
"description": "Municipio do Cliente",
"required": true
},
"UF": { // Exemplo FK
"column": "ESTADO_SEQ_DB",
"type": "Varchar",
"size": 30,
"description": "Numero do Cliente",
"fk": true,
"tableOrigin": "ESTADO",
"columnOrigin": "SIGLA",
"required": true
}
}
}
Exemplo de configuração com FK Composta e validação de OS
{
"alias": "OrdemServico",
"table": "OS",
"conditions": [
"STATUS_OS_SEQ_DB IN (3)"
],
"msgForCondictions" : "OS já integrado ou encerrada!",
"field": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da OS",
"primaryKey": true,
"required" : true
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required" : true
},
"CodigoOS": {
"column": "CODIGO",
"type": "Varchar",
"size": 20,
"description": "Codigo da OS",
"primaryKey": true,
"required" : true
},
"CodigoCliente": {
"column": "CLIENTE_SEQ_DB",
"type": "Varchar",
"description": "Cliente da OS",
"fk": true,
"tableOrigin": "CLIENTE",
"columnOrigin": "CODIGO",
"required" : true
},
"CodigoLinhaEquip": { // Exemplo de Obter o equipamento da OS
"column": "EQUIPAMENTO_SEQ_DB",
"type": "Varchar",
"description": "Codigo da Linha da OS",
"fk": true,
"tableOrigin": "EQUIPAMENTO",
"columnOrigin": "LINHA",
"fkComp": true,
"fieldsComp": {
"CodigoModeloEquip": {
"column": "MODELO",
"type": "Varchar",
"size": 100,
"description": "Codigo Modelo da OS"
},
"Chassi": {
"column": "CHASSI",
"type": "Varchar",
"size": 100,
"description": "Chassi da OS"
}
}
},
"DescricaoProblema": {
"column": "DESCRICAO_PROBLEMA",
"type": "Varchar",
"size": 100,
"description": "Descricao Problema da OS",
"required" : true
},
"DataAbertura": {
"column": "DATA_ABERTURA",
"type": "Varchar",
"size": 100,
"description": "Descricao Problema da OS",
"required" : true
},
"Chassi": {
"column": "CHASSI",
"type": "Varchar",
"size": 100,
"description": "Chassi da OS"
},
"Linha": {
"column": "LINHA",
"type": "Varchar",
"size": 100,
"description": "Linha da OS",
"required" : true
},
"Modelo": {
"column": "MODELO",
"type": "Varchar",
"size": 100,
"description": "Modelo da OS",
"required" : true
},
"IdOS": {
"column": "",
"type": "Varchar",
"size": 100,
"description": "SEQ_DB da OS no NFS"
},
"Servicos": {
"type": "lovn",
"table": "SERVICO",
"aliasOrigin": "Operacao",
"tableLovn": "OS_SERVICO"
},
"Tecnicos": {
"type": "lovn",
"aliasOrigin": "Tecnico",
"tableLovn": "OS_TECNICO"
},
"AgendaTecnicos": {
"type": "lovn",
"aliasOrigin": "AgendaTecnicos",
"tableLovn": "OS_TECNICO_DETALHE"
},
"Pecas": {
"type": "lovn",
"table": "PECA",
"aliasOrigin": "Peça",
"tableLovn": "OS_PECA"
}
}
}
Sincronismo de LOVN
Nesse exemplo o Sincronismo de OS tem LOVN com Serviço (OS x Serviço), Técnico (OS x Técnico), Agenda de Técnico (OS x Agenda Tecnico), Peças (OS x Peça).
Como é possível observar nos exemplos abaixo na configuração da LOVN somente é necessário:
"NomeChave": {
"type": "lovn",
"aliasOrigin": "AliasDoEntryPointConfiguracao",
"tableLovn": "NOME_TABLE_LOVN"
}
A request de envio será parecida:
"AgendaTecnicos": // Detalhe importante que é sempre um json array
[
{
"AgendaId": 39564,
"CodigoEmpresaTec": "PALM",
"CodigoTecnico": 161,
"DataHoraInicio": "2023-02-02T09:10:00",
"DataHoraTermino": "2023-02-02T11:10:00"
}
],
Exemplo de Request de OS
[
{
"CodigoEmpresa": "PALM",
"FilialOS": 1,
"CodigoOS": "00001",
"CodigoCliente": "0011",
"CodigoLinhaEquip": "0119",
"Linha": "COLHEITADEIRAS ",
"CodigoModeloEquip": "CR5.85 ",
"Modelo": "CR5.85 ",
"Chassi": "JHFY3585JHJF09160 ",
"DescricaoProblema": "CORREIA DO ALTERNADOR",
"DataAbertura": "2023-02-02T08:41:21",
"IdOS": 0,
"NomeContato": "CONTATO FICTICIO",
"TelefoneContato": "(12) 123456789",
"Servicos":
[
{
"SeqServico": "001-0001-0000",
"CodigoEmpresaOper": "PALM",
"CodigoLinhaOper": "0119",
"CodigoOperacao": "9999999 ",
"DescricaoOperacao": "VERIFICAR CORREIA DO ALTERNADOR",
"TempoOperacao": 120,
"Deslocamento": 0
},
{
"SeqServico": "KM",
"CodigoEmpresaOper": "PALM",
"CodigoLinhaOper": "0119",
"CodigoOperacao": "DESLOCAMENTO",
"DescricaoOperacao": "Deslocamento",
"TempoOperacao": 1,
"Deslocamento": 1
}
],
"Tecnicos":
[
{
"CodigoEmpresaTec": "PALM",
"CodigoTecnico": 161
}
],
"AgendaTecnicos":
[
{
"AgendaId": 39564,
"CodigoEmpresaTec": "PALM",
"CodigoTecnico": 161,
"DataHoraInicio": "2023-02-02T09:10:00",
"DataHoraTermino": "2023-02-02T11:10:00"
}
],
"Pecas":
[
{
"CodigoEmpresaPec": "PALM",
"CodigoPeca": "87699094 ",
"Descricao": "CORREIA DE BORR",
"DescricaoCompl": "CORREIA DE BORR",
"Quantidade": 1
}
]
}
]
Configuração de OS
{
"alias": "OrdemServico",
"table": "OS",
"conditions": [
"STATUS_OS_SEQ_DB IN (3)"
],
"msgForCondictions": "OS já integrado ou encerrada!",
"field": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da OS",
"primaryKey": true,
"required": true
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required": true
},
"NomeContato": {
"column": "NOME_CONTATO",
"type": "Varchar",
"size": 60,
"description": "Nome do contato da OS"
},
"TelefoneContato": {
"column": "TELEFONE_CONTATO",
"type": "Varchar",
"size": 20,
"description": "Telefone do contato da OS"
},
"CodigoOS": {
"column": "CODIGO",
"type": "Varchar",
"size": 20,
"description": "Codigo da OS",
"primaryKey": true,
"required": true
},
"CodigoCliente": {
"column": "CLIENTE_SEQ_DB",
"type": "Varchar",
"description": "Cliente da OS",
"fk": true,
"tableOrigin": "CLIENTE",
"columnOrigin": "CODIGO",
"required": true
},
"CodigoModeloEquip": {
"column": "EQUIPAMENTO_SEQ_DB",
"type": "Varchar",
"description": "Codigo",
"fk": true,
"tableOrigin": "EQUIPAMENTO",
"columnOrigin": "MODELO_EQUIPAMENTO_SEQ_DB",
"fkComp": true,
"multipleFK": {
"CodigoModeloEquip": {
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"type": "Varchar",
"description": "Codigo do Modelo",
"fk": true,
"tableOrigin": "MODELO_EQUIPAMENTO",
"columnOrigin": "CODIGO",
"required": true,
"primaryKey": true,
"fieldsComp": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "filial do tipo equipamento",
"primaryKey": true,
"required": true,
"parent" : true
},
"CodigoLinhaEquip": {
"column": "TIPO_EQUIPAMENTO_SEQ_DB",
"type": "Varchar",
"description": "Codigo da Linha",
"fk": true,
"tableOrigin": "TIPO_EQUIPAMENTO",
"columnOrigin": "CODIGO",
"required": true,
"fieldsComp": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "filial do tipo equipamento",
"primaryKey": true,
"required": true,
"parent" : true
}
}
}
}
}
},
"fieldsComp": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "filial do tipo equipamento",
"primaryKey": true,
"required": true,
"parent" : true
},
"Chassi": {
"column": "CHASSI",
"type": "Varchar",
"size": 100,
"description": "Chassi da OS",
"primaryKey": true
}
}
},
"DescricaoProblema": {
"column": "OBSERVACAO",
"type": "Varchar",
"size": 100,
"description": "Descricao Problema da OS",
"required": true
},
"DataAbertura": {
"column": "DATA_ABERTURA",
"type": "Varchar",
"size": 100,
"description": "Descricao Problema da OS",
"required": true
},
"Chassi": {
"column": "CHASSI",
"type": "Varchar",
"size": 100,
"description": "Chassi da OS"
},
"Linha": {
"column": "",
"type": "Varchar",
"size": 100,
"description": "Linha da OS",
"required": true
},
"Modelo": {
"column": "",
"type": "Varchar",
"size": 100,
"description": "Modelo da OS",
"required": true
},
"IdOS": {
"column": "",
"type": "Varchar",
"size": 100,
"description": "SEQ_DB da OS no NFS"
},
"Servicos": {
"type": "lovn",
"aliasOrigin": "Operacao",
"tableLovn": "OS_SERVICO"
},
"Tecnicos": {
"type": "lovn",
"aliasOrigin": "Tecnico",
"tableLovn": "OS_TECNICO"
},
"AgendaTecnicos": {
"type": "lovn",
"aliasOrigin": "AgendaTecnicos",
"tableLovn": "OS_TECNICO_DETALHE"
},
"Pecas": {
"type": "lovn",
"aliasOrigin": "Peça",
"tableLovn": "OS_PECA"
}
}
}
Configuração OS Servico
Como é possível observar também na configuração você vai encontrar uma referência para a tabela de OS_SEQ_DB que é a referência para SERVICO, isso acontece porque primeiro é inserido/atualizado a OS (Com isso temos o seu SEQ_DB), depois é necessário passar isso na configuração para ser relacionado.
Apesar de ser uma FK, vamos deixar como INT porque vai pegar o valor do SEQ_DB que está me memória, também deixaremos o primaryKey para saber que tem que buscar com esse valor para saber se vai atualizar ou inserir um novo registro.
"OS": {
"column": "OS_SEQ_DB",
"type": "int",
"description": "Tempo da da Tecnico com OS",
"primaryKey": true
},
Configuração completa da OS_SERVICO.
{
"alias": "Servicos",
"table": "OS_SERVICO",
"field": {
"CodigoEmpresaOper": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da Operacao",
"primaryKey": true,
"required": true
},
"CodigoLinhaOper": {
"column": "SERVICO_SEQ_DB",
"type": "Varchar",
"description": "Codigo da Linha da Operacao",
"primaryKey": true,
"fk": true,
"tableOrigin": "SERVICO",
"columnOrigin": "CODIGO_LINHA",
"fkComp": true,
"fieldsComp": {
"CodigoOperacao": {
"column": "CODIGO",
"type": "Varchar",
"size": 100,
"description": "CodigoOperacao da Operacao"
},
"SeqServico": {
"column": "SEQ_OPERACAO",
"type": "Varchar",
"size": 100,
"description": "SeqServico da Operacao com OS"
},
"CodigoOS": {
"column": "CODIGO_OS",
"type": "varchar",
"parent": true,
"description": "Codigo da OS do pai"
},
"CodigoEmpresaOper": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da Operacao",
"primaryKey": true,
"required": true,
"parent": true
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required": true,
"parent": true
}
},
"required": true
},
"SeqServico": {
"column": "SEQ_OPERACAO",
"type": "Varchar",
"size": 100,
"description": "SeqServico da Operacao com OS",
"primaryKey": true,
"required": true
},
"DescricaoOperacao": {
"column": "DESCRICAO_OPERACAO",
"type": "Varchar",
"size": 100,
"description": "SeqServico da Operacao com OS",
"required": true
},
"TempoOperacao": {
"column": "TEMPO_OPERACAO",
"type": "int",
"description": "Tempo da da Operacao com OS"
},
"OS": {
"column": "OS_SEQ_DB",
"type": "int",
"description": "Tempo da da Operacao com OS",
"primaryKey": true
},
"CodigoOS": {
"column": "",
"type": "varchar",
"parent": true,
"description": "Codigo da OS do pai"
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required": true,
"parent": true
}
}
}
Configuração OS x Técnico
Como é possível observar também na configuração você vai encontrar uma referência para a tabela de OS_SEQ_DB que é a referência para TECNICO, isso acontece porque primeiro é inserido/atualizado a OS (Com isso temos o seu SEQ_DB), depois é necessário passar isso na configuração para ser relacionado.
Para mais detalhes ver Configuração OS Servico.
{
"alias": "Tecnicos",
"table": "OS_TECNICO",
"field": {
"CodigoEmpresaTec": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial do Tecnico com OS",
"primaryKey": true,
"required" : true
},
"CodigoTecnico": {
"column": "FUNCIONARIO_SEQ_DB",
"type": "Varchar",
"description": "Técnico da OS",
"primaryKey": true,
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columnOrigin": "CRACHA",
"required" : true
},
"OS": {
"column": "OS_SEQ_DB",
"type": "int",
"description": "Tempo da da Tecnico com OS",
"primaryKey": true
},
"DataAgendada": {
"column": "DATA_ABERTURA",
"type": "Varchar",
"size": 100,
"description": "Data de Abertura da OS",
"required" : true
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"required" : true,
"primaryKey" : true,
"parent": true
}
}
}
Configuração Agenda Técnico
Nessa configuração existe "deleteExistData": true
uma opção que deleta o que existe e cria um novo registro.
Nessa configuração já é diferente, usamos a OS_SEQ_DB para encontrar o registro da OS_TECNICO.
Para mais detalhes ver Configuração OS Servico.
{
"alias": "AgendaTecnicos",
"table": "OS_TECNICO_DETALHE",
"deleteExistData": true, // Detalhe importante
"field": {
"CodigoEmpresaTec": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial do Tecnico com OS",
"primaryKey": true,
"required": true
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required" : true,
"parent": true
},
"CodigoTecnico": {
"column": "OS_TECNICO_SEQ_DB",
"type": "Varchar",
"description": "Codigo Tenico OS",
"fk": true,
"tableOrigin": "OS_TECNICO",
"columnOrigin": "FUNCIONARIO_SEQ_DB",
"fkComp": true,
"multipleFK": {
"CodigoTecnico": {
"column": "FUNCIONARIO_SEQ_DB",
"type": "Varchar",
"description": "Codigo do Funcionario da OS x Tecnico",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columnOrigin": "CRACHA",
"required": true,
"fieldsComp": {
"CodigoEmpresaTec": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial do Tecnico com OS"
}
}
}
},
"primaryKey": true,
"fkComp": true,
"required": true,
"fieldsComp": {
"OS": {
"column": "OS_SEQ_DB", // SEQ_DB da OS inserido ou atualizado
"type": "int",
"description": "Tempo da da Tecnico com OS"
},
"CodigoEmpresaTec": {
"column": "FILIAL",
"type": "Varchar",
"description": "Filial do Tecnico com OS",
"parent": true
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"parent": true
}
}
},
"DataHoraInicio": {
"column": "DATA_INICIAL",
"type": "Varchar",
"size": 100,
"description": "Data de Inicia de Agendamento da OS",
"required": true
},
"DataHoraTermino": {
"column": "DATA_FINAL",
"type": "Varchar",
"size": 100,
"description": "Data de Inicia de Agendamento da OS",
"required": true
},
"AgendaId": {
"column": "SEQ_AGENDA",
"type": "Varchar",
"size": 12,
"description": "Id da Agenda",
"required": true
}
}
}
Configuração Peças
Como é possível observar também na configuração você vai encontrar uma referência para a tabela de OS_SEQ_DB que é a referência para PECA, isso acontece porque primeiro é inserido/atualizado a OS (Com isso temos o seu SEQ_DB), depois é necessário passar isso na configuração para ser relacionado.
Para mais detalhes ver Configuração OS Servico.
{
"alias": "Pecas",
"table": "OS_PECA",
"field": {
"CodigoEmpresaPec": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial do Peca com OS",
"primaryKey": true,
"required" : true
},
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial do Peca com OS",
"primaryKey": true,
"required" : true
},
"CodigoPeca": {
"column": "PECA_SEQ_DB",
"type": "Varchar",
"description": "Peca da OS",
"primaryKey": true,
"fk": true,
"tableOrigin": "PECA",
"columnOrigin": "CODIGO",
"required" : true
},
"OS": {
"column": "OS_SEQ_DB",
"type": "int",
"description": "OS_SEQ_DB de Peca com OS",
"primaryKey": true
},
"Quantidade": {
"column": "QTD_REQUISITADA",
"type": "varchar",
"description": "Quantidade da Peca com OS"
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required" : true,
"parent": true
}
}
}
Sincronismo dos dados em uma única chamada
É possível enviar todos os dados da OS na própria OS sem precisar realizar um sincronismo de equipamento, funcionário, cliente antes, basicamente é enviar na chave um array com seus respectivos dados. Então no equipamento ao invés de mandar o código dele, peça poara ser enviado um array com os dados do equipamento, mesma coisa para o funcionário, cliente e etc.
Para isso também é necessário ter as configurações da API do Funcionário, Equipamento e Cliente como se fosse enviar eles separadamente.
Exemplo de json que é enviado para API
Nesse caso a chave para trazer o equipamento é ChassiEquipamento
, porém nesse caso em especial e é um bom caso, o equipamento também precisa do Modelo e ele do Tipo, então criou-se uma dependência mais profunda. Equipamento -> Modelo -> Tipo.
Como comentei na introdução dessa funcionalidade o cliente também é enviado, como um array com todos os seus dados, então o sincronismo vai buscar o cliente, se existir faz a atualização, se não insere.
[
{
"Filial": "Brasília",
"Local": "Brasília",
"CodigoOS": "9991089",
"DataAbertura": "2022-07-08 12:00:00",
"Ativo": "1",
"Observacao": "Teste de OS Dalton",
"ChassiEquipamento": [
{
"ChassiEquipamento": "dasd10X",
"CodigoEquipamento": "123321",
"Ativo": 1,
"Descricao": "Super Ultra Keyboard",
"CodigoModeloEquipamento": [
{
"CodigoModeloEquipamento": "12344321",
"Descricao": "Keyboard S-line",
"CodigoTipoEquipamento": [
{
"CodigoTipoEquipamento": "789987",
"Ativo": 1,
"Descricao": "Split"
}
]
}
],
"SeqCliente": "1234567890"
}
],
"CodigoCliente": [
{
"CodigoCliente": "12131415",
"Nome": "Simovers",
"CpfCnpj": "0987654321",
"Loja": "Simova Grande Arujá",
"NroProprietario": "123456",
"Idenficacao": "Street1",
"NomeEndereco": "Avenue San Juan",
"InscricaoEstadual": "CA",
"Municipio": "San Jose dos Fields",
"Bairro": "Garden of Mounts",
"Telefone": "1234567890",
"Celular": "0987654321",
"CEP": "18878-555",
"Email": "xpto@simova.com.br",
"UF": "SP"
}
],
"SeqStatusOs": "1",
"SeqTipoOs": "1"
}
]
Configuração de OS
{
"alias": "OrdemServico",
"table": "OS",
"field":
{
"CodigoOS":
{
"column": "CODIGO",
"type": "varchar",
"size": 8,
"description": "Codigo da OS",
"primaryKey": true,
"required": true
},
"Filial":
{
"column": "FILIAL",
"type": "int",
"size": 10,
"description": "Filial da OS"
},
"Local":
{
"column": "LOCAL",
"type": "int",
"size": 10,
"description": "Local da OS"
},
"Ativo":
{
"column": "ATIVO",
"type": "int",
"size": 10,
"description": "OS Ativo"
},
"Observacao":
{
"column": "OBSERVACAO",
"type": "text",
"description": "Observacao da OS"
},
"DataAbertura":
{
"column": "DATA_ABERTURA",
"type": "timestamp",
"description": "Data de abertura da OS"
},
"SeqStatusOs":
{
"column": "STATUS_OS_SEQ_DB",
"type": "Bigint",
"size": 20,
"description": "Sequencial do status da OS",
"fk": true,
"tableOrigin": "STATUS_OS",
"columnOrigin": "SEQ_DB"
},
"CodigoCliente":
{
"column": "CLIENTE_SEQ_DB",
"type": "varchar",
"size": 20,
"description": "Código do cliente",
"fk": true,
"tableOrigin": "CLIENTE",
"columnOrigin": "CODIGO",
"fkComp": true,
"fieldsComp":
{
"Loja":
{
"column": "LOJA",
"type": "Varchar",
"size": 100,
"description": "Código da Loja do Cliente"
}
}
},
"ChassiEquipamento":
{
"column": "EQUIPAMENTO_SEQ_DB",
"type": "varchar",
"size": 20,
"description": "Sequencial do equipamento",
"fk": true,
"tableOrigin": "EQUIPAMENTO",
"columnOrigin": "CHASSI"
},
"SeqTipoOs":
{
"column": "TIPO_OS_SEQ_DB",
"type": "Bigint",
"size": 20,
"description": "Sequencial do tipo de OS",
"fk": true,
"tableOrigin": "TIPO_OS",
"columnOrigin": "SEQ_DB"
}
}
}
Configuração de Cliente
{
"alias": "Cliente",
"table": "CLIENTE",
"field": {
"CodigoCliente" : {
"column": "CODIGO",
"type": "Varchar",
"size": 20,
"description": "Código do Cliente/Endereço no DMS 999999EEE (Pessoa/Ender)",
"primaryKey": true
},
"Nome": {
"column": "DESCRICAO",
"type": "Varchar",
"size": 250,
"description": "Nome do Cliente"
},
"CodigoEmpresa": {
"column": "",
"type": "Varchar",
"filial": true,
"description": "Filial NFS"
},
"CpfCnpj": {
"column": "CNPJCPF",
"type": "Varchar",
"size": 100,
"description": "Cpf ou Cnpj do Cliente"
},
"Loja": {
"column": "LOJA",
"type": "Varchar",
"size": 20,
"description": "Loja do Cliente"
},
"NroProprietario": {
"column": "NRO_PROPRIETARIO",
"type": "Varchar",
"size": 50,
"description": "Nro proprietario do Cliente"
},
"Identificacao": {
"column": "IDENTIFICACAO",
"type": "Varchar",
"size": 50,
"description": "Identificacao do Cliente"
},
"NomeEndereco": {
"column": "ENDERECO",
"type": "Varchar",
"size": 100,
"description": "Endereço do Cliente"
},
"InscricaoEstadual": {
"column": "INSCRICAO_ESTADUAL",
"type": "Varchar",
"size": 100,
"description": "Inscricao estadual do Cliente"
},
"Municipio": {
"column": "MUNICIPIO",
"type": "Varchar",
"size": 250,
"description": "Municipio do Cliente"
},
"Bairro": {
"column": "BAIRRO",
"type": "Varchar",
"size": 30,
"description": "Bairro do Cliente"
},
"Telefone": {
"column": "TELEFONE",
"type": "Varchar",
"size": 100,
"description": "Telefone do Cliente"
},
"Celular": {
"column": "CELULAR",
"type": "Varchar",
"size": 100,
"description": "Celular do Cliente"
},
"CEP": {
"column": "CEP",
"type": "Varchar",
"size": 100,
"description": "CEP do Cliente"
},
"Email": {
"column": "E_MAIL",
"type": "Varchar",
"size": 100,
"description": "Email do Cliente"
},
"UF": {
"column": "ESTADO_SEQ_DB",
"type": "Varchar",
"size": 30,
"description": "Numero do Cliente",
"fk": true,
"tableOrigin": "ESTADO",
"columnOrigin": "SIGLA"
}
}
}
Configuração de Equipamento
{
"alias": "Equipamento",
"table": "EQUIPAMENTO",
"field": {
"ChassiEquipamento": {
"column": "CHASSI",
"type": "varchar",
"size": 20,
"description": "Chassi do equipamento",
"primaryKey": true,
"required": true
},
"CodigoEquipamento": {
"column": "CODIGO",
"type": "varchar",
"size": 250,
"description": "Codigo do equipamento"
},
"Ativo": {
"column": "ATIVO",
"type": "int",
"size": 10,
"description": "Modelo de equipamento Ativo"
},
"Descricao": {
"column": "DESCRICAO",
"type": "varchar",
"size": 250,
"description": "Descricao do modelo do equipamento"
},
"CodigoModeloEquipamento": {
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"type": "varchar",
"size": 20,
"description": "Sequencial do modelo do equipamento",
"fk": true,
"tableOrigin": "MODELO_EQUIPAMENTO",
"columnOrigin": "CODIGO"
},
"SeqCliente": {
"column": "CLIENTE_SEQ_DB",
"type": "varchar",
"size": 20,
"description": "Sequencial do cliente",
"fk": true,
"tableOrigin": "CLIENTE",
"columnOrigin": "CODIGO"
}
}
}
Configuração de Modelo do Equipamento
{
"alias": "ModeloEquipamento",
"table": "MODELO_EQUIPAMENTO",
"field": {
"CodigoModeloEquipamento": {
"column": "CODIGO",
"type": "varchar",
"size": 50,
"description": "Codigo do modelo do equipamento",
"primaryKey": true,
"required": true
},
"Ativo": {
"column": "ATIVO",
"type": "int",
"size": 10,
"description": "Modelo de equipamento Ativo"
},
"Descricao": {
"column": "DESCRICAO",
"type": "varchar",
"size": 250,
"description": "Descricao do modelo do equipamento"
},
"CodigoTipoEquipamento": {
"column": "TIPO_EQUIPAMENTO_SEQ_DB",
"type": "Bigint",
"size": 20,
"description": "Sequencial do tipo do equipamento",
"fk": true,
"tableOrigin": "TIPO_EQUIPAMENTO",
"columnOrigin": "CODIGO"
}
}
}
Configuração do Tipo do Modelo do Equipamento
{
"alias": "TipoEquipamento",
"table": "TIPO_EQUIPAMENTO",
"field": {
"CodigoTipoEquipamento": {
"column": "CODIGO",
"type": "varchar",
"size": 50,
"description": "Codigo do tipo de equipamento",
"primaryKey": true,
"required": true
},
"Ativo": {
"column": "ATIVO",
"type": "int",
"size": 10,
"description": "Tipo de equipamento Ativo"
},
"Descricao": {
"column": "DESCRICAO",
"type": "varchar",
"size": 250,
"description": "Descricao do tipo de equipamento"
}
}
}
Exemplo de OS_TENICO_DETALHE MultipleFK [Caso Especial]
Na OS_TECNICO_DETALHE as FK são:
- OS_TENICO, porém o que compõe essa chave é CodigoTecnico (FUNCIONARIO_SEQ_DB) e OS
- OS_SEQ_DB valor da OS que foi inserido, lembrando que quando é lovn primeiro insere os dados sem relacionamento e depois o seu relacionamento.
- FILIAL filial é enviada no json se sincronismo e o LOCAL é obtido a partir do pai.
Então o fluxo é o seguinte, se não existe OS insere um nova e se existe atualiza, daí tem o valor da OS no NFS, depois disso é feito a relação entre OS_TECNICO_DETALHE, onde já existe o valor da OS e primeiro é encontrado o SEQ_DB da OS_TECNICO e no fim insere OS_TECNICO_DETALHE.
Uma particulariedade desse caso é o seguinte, esse exemplo de configuração foi feito para o MDS e eles não possuem um controle de ativo e desativo da Agenda então sempre é excluído todos os dados e enviado, para isso é usada a opção "deleteExistData": true
, deleta e insere novamente.
{
"alias": "AgendaTecnicos",
"table": "OS_TECNICO_DETALHE",
"deleteExistData": true,
"field": {
"CodigoEmpresaTec": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial do Tecnico com OS",
"primaryKey": true,
"required": true
},
"CodigoTecnico": {
"column": "OS_TECNICO_SEQ_DB",
"type": "Varchar",
"description": "Codigo Tenico OS",
"fk": true,
"tableOrigin": "OS_TECNICO",
"columnOrigin": "FUNCIONARIO_SEQ_DB",
"fkComp": true,
"multipleFK": { // Exemplo MultipleFK
"CodigoTecnico": {
"column": "FUNCIONARIO_SEQ_DB",
"type": "Varchar",
"description": "Codigo do Funcionario da OS x Tecnico",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columnOrigin": "CRACHA",
"required": true,
"fieldsComp": {
"OS": {
"column": "OS_SEQ_DB",
"type": "int",
"description": "Tempo da da Tecnico com OS"
}
}
}
},
"primaryKey": true,
"fkComp": true,
"required": true,
"fieldsComp": {
"OS": {
"column": "OS_SEQ_DB",
"type": "int",
"description": "Tempo da da Tecnico com OS"
},
"CodigoEmpresaTec": {
"column": "FILIAL",
"type": "Varchar",
"description": "Filial do Tecnico com OS"
}
}
},
"DataHoraInicio": {
"column": "DATA_INICIAL",
"type": "Varchar",
"size": 100,
"description": "Data de Inicia de Agendamento da OS",
"required": true
},
"DataHoraTermino": {
"column": "DATA_FINAL",
"type": "Varchar",
"size": 100,
"description": "Data de Inicia de Agendamento da OS",
"required": true
},
"AgendaId": {
"column": "SEQ_AGENDA",
"type": "Varchar",
"size": 12,
"description": "Id da Agenda",
"required": true
}
}
}
Exemplo do uso da opção parent
Acontece bastante em estrutura que são interligadas, então é enviado num sincronismo de OS o seu relacionamento com serviço, e ainda mais o serviço se não existe é adicionado ou atualizado e daí criado o relacionamento com OS x Serviço é criado. Para isso foi criada a opção parent.
No caso no Sincronismo de OS tem uma LOVN com Serviço, com isso para o serviço não ficar sem Local o mesmo é obtido a partir da OS então é usado
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required" : true,
"parent" : true
}
Lembrando que se não haver o campo de FilialOS no json o mesmo não será usado.
Exemplo completo:
{
"alias": "OperacaoServico",
"table": "SERVICO",
"field": {
"CodigoEmpresa": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da Operacao",
"primaryKey": true,
"required" : true
},
"CodigoEmpresaOper": {
"column": "FILIAL",
"type": "Varchar",
"size": 100,
"description": "Filial da Operacao",
"primaryKey": true,
"required" : true
},
"CodigoLinhaOper": {
"column": "CODIGO_LINHA",
"type": "Varchar",
"size": 100,
"description": "Codigo Linha da Operacao",
"primaryKey": true,
"required" : true
},
"CodigoOperacao": {
"column": "CODIGO",
"type": "Varchar",
"size": 100,
"description": "CodigoOperacao da Operacao",
"primaryKey": true,
"required" : true
},
"Descricao": {
"column": "DESCRICAO",
"type": "Varchar",
"size": 100,
"description": "Descricao da Operacao",
"required" : true
},
"DescricaoCompl": {
"column": "DESCRICAO_COMPLETA",
"type": "Varchar",
"size": 100,
"description": "Descricao Completa da Operacao"
},
"TipoOperacao": {
"column": "TIPO_OPERCAO",
"type": "Varchar",
"size": 2,
"description": "Tipo da Operacao",
"required" : true
},
"Deslocamento": {
"column": "FLAG_DESLOCAMENTO",
"type": "Varchar",
"size": 2,
"description": "Flag indica Deslocamento"
},
"SeqServico": {
"column": "SEQ_OPERACAO",
"type": "Varchar",
"size": 100,
"description": "SeqServico da Operacao com OS",
"primaryKey": true,
"required" : true
},
"DescricaoOperacao": {
"column": "DESCRICAO",
"type": "Varchar",
"size": 100,
"description": "SeqServico da Operacao com OS",
"required" : true
},
"TempoOperacao": {
"column": "TEMPO_OPERACAO",
"type": "int",
"description": "Tempo da da Operacao com OS"
},
"CodigoOS": {
"column": "CODIGO_OS",
"type": "varchar",
"parent" : true,
"primaryKey": true,
"description": "Codigo da OS do pai"
},
"CodigoOS": {
"column": "CODIGO_OS",
"type": "varchar",
"parent" : true,
"primaryKey": true,
"description": "Codigo da OS do pai"
},
"FilialOS": {
"column": "LOCAL",
"type": "Varchar",
"size": 100,
"description": "Local da OS",
"primaryKey": true,
"required" : true,
"parent" : true
}
}
}
Sincronismo de Cliente com CURL
curl --request POST \
--url http://smartosapi.h.simova.cloud/nfs/api/v1/sync/cliente \
--header 'authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzbWFydG9zYXBpLmguc2ltb3ZhLmNsb3VkIiwibmFtZSI6ImRhbHRvbiIsImVtYWlsIjoiZGFsdG9uQHNpbW92YS5jb20uYnIiLCJmaWxpYWwiOiJGSUxJQUwgMSIsImxvY2FsIjpudWxsLCJleHAiOiIyMDIwLTAxLTAzIDE2OjM4OjI1In0=.5HyjR60die0HkQ6OWDF93os3gwWk60KojwWnlGiw5ds=' \
--header 'content-type: application/json' \
--cookie PHPSESSID=1ss7cakdkkct1714321be413n2 \
--data '[
{
"CodigoEmpresa": "FILIAL 1",
"CodigoCliente": "008432008",
"Nome": "34 GAS LTDA ",
"NomeEndereco": "ROD BR 386 ",
"Bairro": "JD PRIMAVERA ",
"Cidade": "Sao Jose",
"UF": "SP"
}
]'
Retorno
[
{
"type": "success",
"msg": "Cadastro de Cliente inserido com sucesso",
"field": "",
"id": "12693"
}
]
Erros Frequentes de Sincronismo
Este item já existe! Você pode editá-lo ou inserir um novo
Quando aparecer a seguinte mensagem:
[
{
"type": "error",
"msg": "Erro ao inserir dados de NOME_TABELA : Este item já existe! Você pode editá-lo ou inserir um novo",
"field": "",
"id": ""
}
]
Provavelmente foi tentado inserir um novo registro e ocorreu esse erro, a PRIMEIRA coisa a fazer é OLHAR para ver se não tem ERRO no log, filtre pelo DOMAIN que está trabalhando e level igual a ERROR. A maioria dos casos vai ser onde um registro foi marcado como deleted ou ativo igual a 0, porém, existe um CONSTRAINT no banco de dados que impede de inserir um novo registro, então a API tentou inserir um novo registro, mas no caso o MYSQL não permitiu a nova inserção por violar uma constraint definida no banco de dados. Para resolver isso cabe o Dev avaliar se é melhor mudar algo na API ou excluir a constraint do banco de dados.
Os erros no log quando é de constraint geralmente são:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry VALORES_CONSTRAINT for key NOME_CONSTRAINT
Exemplo:
sql = INSERT INTO APP_PLANEJAMENTO_VIAGEM ( SEQ_DB, EMPRESA, FILIAL, LOCAL, SOURCE, UPD_DH, INS_DH, ID, NUMERO_OR, DATA, DATA_ENVIO_INTERFACE, SERIE_OR, CENTRO, MAQUINA, VIAGENS, POSICAO_DEPOSITO, MAQUINA_SOLICITANTE, NUMERO_DEPOSITO, TIPO_MOVIMENTO, TIPO_DEPOSITO, ROTAS, POSICAO_ORIGEM, AGENTE_FRETE, MATERIAL, DEPOSITO, DESC_ENVIO_INTERFACE, FLAG_OR_MANUAL, FLAG_CONTINGENCIA, CODIGO_INTEGRACAO, PEDIDO, PROC_ST, PROC_DH, PROC_DESC, RO, ATIVO, DELETED, INS_USUARIO_SEQ_DB, UPD_USUARIO_SEQ_DB) VALUES (0,1,3,3,NULL,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP, (SELECT (IFNULL(MAX(T.ID), 0) + 1) FROM APP_PLANEJAMENTO_VIAGEM T WHERE T.EMPRESA = 1 AND T.FILIAL IN (3, 9999) AND T.LOCAL IN (3, 9999) ),'0000000','2023-05-16',null,'A','1369','ECM7A87','1','','','MA2','SC','I2A',NULL,'304-11B001','0000710664','000000000019000088','MA2P','',0,'0','06','SN','0',null,'','0',1,0,47,NULL); getMessage = SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2023-05-16 00:00:00-ECM7A87-1369-1' for key 'app_planejamento_viagem_un'