Integração
Integração é quando o dado sai do NFS e vai para o sistema de terceiros.
Ele é feito em duas partes a primeira é a obtenção dos dados no NFS por meio de um id. A outra parte é uma confirmação que de que os dados já enviados estão corretos, com isso é enviado o id novamente por meio de outra URL e os campos necessários são atualizados para não haver mais o sincronismo da mesma informação.
Parâmetros
| Parâmetro | Descrição |
|---|---|
| NFS_API_MAX_PERIOD_IN_DAYS | Define um período em dias para usar o tipo period, padrão é 15 e o máximo 60 |
Rotas
| Método | URL | Descrição |
|---|---|---|
| POST | /nfs/api/v1.1/integration/{table} | Realiza alteração nos dados da tabela |
| POST | /nfs/api/v1/integration/list/{table} | Obtém dados |
Configuração Integração

A estrutura da integração pode ser dividida em 4 partes
Topo

| 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

Composto pelos campos enviados, geramente é um id que no NFS representa o SEQ_DB de um dado da tabela a ser sincronizada.
| 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 |
updateIntegraion

Um array onde ficam os campos que vão ser atualizados depois que o sincronismo for feito com sucesso.
output

Configuração dos dados que vão ser retornados para o sistema do cliente.
| Chave | Obrigatório | Valor | Descrição |
|---|---|---|---|
| alias | Sim | ApelidoTabela | Deve ser um apelido para tabela sem espaço. |
Exemplos
Exemplo de Sincronismo de OS
{
"alias": "OrdemServico",
"table": "OS",
"field": {
"id": {
"column": "SEQ_DB",
"type": "int",
"size": 100,
"description": "SEQ_DB da OS",
"required": true
}
},
"updateIntegration": [
"RO = 1",
"PROC_DH = CURRENT_TIMESTAMP",
"PROC_ST = 1",
"PROC_DESC = 'OS Integrada com sucesso para o DMS'"
],
"output": {
"FILIAL": {
"field": "CodigoEmpresa",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"LOCAL": {
"field": "FilialOS",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"CODIGO": {
"field": "CodigoOS",
"type": "varchar"
},
"LINHA": {
"field": "CodigoLinhaEquip"
},
"MODELO": {
"field": "CodigoModeloEquip",
"type": "varchar"
},
"STATUS_OS_SEQ_DB": {
"field": [
"StatusOS",
"IDStatusOS"
],
"type": "varchar",
"fk": true,
"tableOrigin": "STATUS_OS",
"columns": [
"DESCRICAO",
"ID"
]
},
"Equipamento": {
"table": "APONTAMENTO_EQUIPAMENTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"CHASSI": {
"field": "Chassi"
},
"HORIMETRO": {
"field": "Horimetro"
},
"FOTO_CHASSI": {
"field": "IdImagemChassi",
"type": "image"
},
"FOTO_HORIMETRO": {
"field": "IdImagemHorimetro",
"type": "image"
},
"INI_DH": {
"field": "DataLeitura"
}
}
},
"Dtac": {
"table": "APONTAMENTO_DTAC",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"CODIGO_PECA_CAUSADORA": {
"field": "PecaCausadora"
}
}
},
"Assinaturas": {
"table": "APONTAMENTO_ASSINATURA",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"ASSINATURA_CLIENTE": {
"field": "IdImagemAssinaturaCliente",
"type": "image"
},
"NOME_CLIENTE": {
"field": "Contato"
},
"TELEFONE": {
"field": "Telefone"
}
}
},
"Problemas": {
"table": "APONTAMENTO_FOTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"FOTO": {
"field": "IdImagemProblema",
"type": "image"
},
"OBS": {
"field": "DescFalha"
}
}
},
"AptHorasTrabalhadas": {
"table": "APONTAMENTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"SERVICO_SEQ_DB": {
"field": [
"SeqServico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "SERVICO",
"columns": [
"SEQ_OPERACAO"
]
},
"FILIAL": {
"field": "CodigoEmpresaTec",
"returnColumns": [
"SIGLA"
]
},
"INI_DH": {
"field": "DataInicialApontamento"
},
"FIM_DH": {
"field": "DataFinalApontamento"
},
"INI_FIM_DIFF_SEC": {
"field": "TempoApontado",
"type": "time",
"mask": "minute"
},
"AUXILIAR_SEQ_DB": {
"field": [
"CodigoTecnico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA"
]
}
}
},
"DescFalha": {
"table": "APONTAMENTO_DESCRICAO_SERVICO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"RECLAMACAO_CLIENTE": {
"field": "DescricaoFalha",
"type": "varchar"
},
"CAUSA": {
"field": "DescricaoCausa",
"type": "varchar"
},
"SOLUCAO": {
"field": "DescricaoCorrecao",
"type": "varchar"
}
}
},
"PecasAplicacas": {
"table": "OS_PECA",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"PECA_SEQ_DB": {
"field": [
"CodigoPeca"
],
"type": "varchar",
"fk": true,
"tableOrigin": "PECA",
"columns": [
"CODIGO"
]
},
"QTD_UTILIZADA": {
"field": "QuantidadeAplicada",
"type": "varchar"
}
}
},
"Deslocamentos": {
"table": "APONTAMENTO_DESLOCAMENTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"VEICULO_SEQ_DB": {
"field": [
"VeiculoPlaca"
],
"type": "varchar",
"fk": true,
"tableOrigin": "VEICULO",
"columns": [
"PLACA"
]
},
"FUNCIONARIO_SEQ_DB": {
"field": [
"Tecnico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA"
]
},
"INI_DH": {
"field": "DataHoraInicio"
},
"FIM_DH": {
"field": "DataHoraFim"
},
"KM_INICIAL": {
"field": "KmInicial"
},
"KM_FINAL": {
"field": "KmFinal"
},
"DIFERENCA_KM": {
"field": "KmPercorrido"
}
}
},
"Despesas": {
"table": "APONTAMENTO_DESPESA",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"FUNCIONARIO_SEQ_DB": {
"field": [
"Tecnico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA"
]
},
"DESPESA_SEQ_DB": {
"field": [
"Despesa"
],
"type": "varchar",
"fk": true,
"tableOrigin": "DESPESA",
"columns": [
"DESCRICAO"
]
},
"DESCRICAO_DESPESA": {
"field": "DescricaoDespesa",
"type": "varchar"
},
"INI_DH": {
"field": "DataHora"
},
"QUANTIDADE_DESPESA": {
"field": "Valor",
"type": "varchar"
}
}
}
}
}
DeepFK
A Deep FK permitir você a obter dados de outras tabelas na sua tabela alvo, exemplo de problema:
- Necessário enviar o código do Modelo relacionado ao Equipamento da Tabela OS e o Tipo Equipamento relacionado ao Modelo.
Configuração:
"EQUIPAMENTO_SEQ_DB": {
"type": "deepFK",
"fk": true,
"name": "EQUIPAMENTO",
"tableOrigin": "EQUIPAMENTO",
"fields": {
"codigoModeloEquip": {
"type": "fk",
"tableOrigin": "MODELO_EQUIPAMENTO",
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"fields": {
"CODIGO": {
"type": "varchar"
}
}
},
"codigoLinhaEquip": {
"type": "fk",
"tableOrigin": "MODELO_EQUIPAMENTO",
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"fields": {
"TIPO_EQUIPAMENTO": {
"type": "fk",
"tableOrigin": "TIPO_EQUIPAMENTO",
"column": "TIPO_EQUIPAMENTO_SEQ_DB",
"fields": {
"CODIGO": {
"type": "varchar"
}
}
}
}
}
}
Outra opção é ser possível também obter qualquer outra coluna da própria tabela Equipamento.
"EQUIPAMENTO_SEQ_DB": {
"type": "deepFK",
"fk": true,
"name": "EQUIPAMENTO",
"tableOrigin": "EQUIPAMENTO",
"fields": {
"codigoModeloEquip": {
"type": "fk",
"tableOrigin": "MODELO_EQUIPAMENTO",
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"fields": {
"CODIGO": {
"type": "varchar"
}
}
},
"codigoLinhaEquip": {
"type": "fk",
"tableOrigin": "MODELO_EQUIPAMENTO",
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"fields": {
"TIPO_EQUIPAMENTO": {
"type": "fk",
"tableOrigin": "TIPO_EQUIPAMENTO",
"column": "TIPO_EQUIPAMENTO_SEQ_DB",
"fields": {
"CODIGO": {
"type": "varchar"
}
}
}
}
},
"chassi": {
"type": "varchar",
"column": "CHASSI"
}
}
}
Exemplo completo:
{
"alias": "OrdemServico",
"table": "OS",
"ignore": {
"local": true
},
"field": {
"SeqOs": {
"column": "SEQ_DB",
"type": "int",
"size": 100,
"description": "SEQ_DB da OS",
"required": true
}
},
"conditions": [
"PROC_ST = 1"
],
"updateIntegration": [
"RO = 1",
"PROC_DH = CURRENT_TIMESTAMP",
"PROC_ST = 2",
"PROC_DESC = 'OS Integrada com sucesso para o DMS'"
],
"output": {
"FILIAL": {
"field": "Filial",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"LOCAL": {
"field": "Local",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"OsServico": {
"table": "OS_SERVICO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"SEQ_DB": {
"field": "idOsServico",
"type": "varchar"
}
}
},
"EQUIPAMENTO_SEQ_DB": {
"type": "deepFK",
"fk": true,
"name": "EQUIPAMENTO",
"tableOrigin": "EQUIPAMENTO",
"fields": {
"codigoModeloEquip": {
"type": "fk",
"tableOrigin": "MODELO_EQUIPAMENTO",
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"fields": {
"CODIGO": {
"type": "varchar"
}
}
},
"codigoLinhaEquip": {
"type": "fk",
"tableOrigin": "MODELO_EQUIPAMENTO",
"column": "MODELO_EQUIPAMENTO_SEQ_DB",
"fields": {
"TIPO_EQUIPAMENTO": {
"type": "fk",
"tableOrigin": "TIPO_EQUIPAMENTO",
"column": "TIPO_EQUIPAMENTO_SEQ_DB",
"fields": {
"CODIGO": {
"type": "varchar"
}
}
}
}
},
"chassi": {
"type": "varchar",
"column": "CHASSI"
}
}
},
"CODIGO": {
"field": "CodigoOS",
"type": "varchar"
},
"STATUS_OS_SEQ_DB": {
"field": [
"StatusOS",
"IDStatusOS"
],
"type": "fk",
"fk": true,
"name": "STATUS_OS",
"tableOrigin": "STATUS_OS",
"columns": [
"DESCRICAO",
"ID"
]
},
"ApontamentoEquipamento": {
"table": "APONTAMENTO_EQUIPAMENTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"CHASSI": {
"field": "Chassi",
"type": "varchar"
},
"HORIMETRO": {
"field": "Horimetro",
"type": "varchar"
},
"FOTO_CHASSI": {
"field": "IdImagemChassi",
"type": "image"
},
"FOTO_HORIMETRO": {
"field": "IdImagemHorimetro",
"type": "image"
},
"INI_DH": {
"field": "DataLeitura",
"type": "varchar"
}
}
},
"Dtac": {
"table": "APONTAMENTO_DTAC",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"NUMERO_DTAC": {
"field": "NumeroDtac",
"type": "varchar"
}
}
},
"PecaCausadora": {
"table": "APONTAMENTO_PECA_CAUSADORA",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"CODIGO_PECA_CAUSADORA": {
"field": "PecaCausadora",
"type": "varchar"
},
"DESCRICAO_PECA_CAUSADORA": {
"field": "DescricaoPecaCausadora",
"type": "varchar"
}
}
},
"Assinaturas": {
"table": "APONTAMENTO_ASSINATURA",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"ASSINATURA_CLIENTE": {
"field": "IdImagemAssinaturaCliente",
"type": "image"
},
"NOME_CLIENTE": {
"field": "Contato",
"type": "varchar"
},
"TELEFONE": {
"field": "Telefone",
"type": "varchar"
}
}
},
"Problemas": {
"table": "APONTAMENTO_FOTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"FOTO": {
"field": "IdImagemProblema",
"type": "image"
},
"OBS": {
"field": "DescFalha",
"type": "varchar"
}
}
},
"AptHorasTrabalhadas": {
"table": "APONTAMENTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"SERVICO_SEQ_DB": {
"field": [
"SeqServico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "SERVICO",
"columns": [
"SEQ_DB"
]
},
"GRUPO_SERVICO_SEQ_DB": {
"field": [
"CodigoServico",
"DescServico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "GRUPO_SERVICO",
"columns": [
"CODIGO",
"DESCRICAO"
]
},
"OS_SEQ_DB": {
"field": [
"SeqOs",
"CodigoOs"
],
"type": "varchar",
"fk": true,
"tableOrigin": "OS",
"columns": [
"SEQ_DB",
"CODIGO"
]
},
"PARADA_SEQ_DB": {
"field": [
"CodigoParada",
"DescParada"
],
"type": "varchar",
"fk": true,
"tableOrigin": "PARADA",
"columns": [
"ID",
"DESCRICAO"
]
},
"TIPO_APONTAMENTO": {
"field": "TipoApontamento",
"type": "int"
},
"FILIAL": {
"field": "CodigoEmpresaTec",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"FLAG_OUTROS_SERVICOS": {
"field": "FlagServicoManual",
"type": "varchar"
},
"INI_DH": {
"field": "DataInicialApontamento",
"type": "varchar"
},
"FIM_DH": {
"field": "DataFinalApontamento",
"type": "varchar"
},
"INI_FIM_DIFF_SEC": {
"field": "TempoApontado",
"type": "time",
"mask": "minute"
},
"AUXILIAR_SEQ_DB": {
"field": [
"CodigoTecnico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA"
]
}
}
},
"DescFalha": {
"table": "APONTAMENTO_DESCRICAO_SERVICO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"RECLAMACAO_CLIENTE": {
"field": "DescricaoFalha",
"type": "varchar"
},
"CAUSA": {
"field": "DescricaoCausa",
"type": "varchar"
},
"SOLUCAO": {
"field": "DescricaoCorrecao",
"type": "varchar"
}
}
},
"PecasAplicadas": {
"table": "OS_PECA",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"PECA_SEQ_DB": {
"field": [
"CodigoPeca"
],
"type": "varchar",
"fk": true,
"tableOrigin": "PECA",
"columns": [
"CODIGO"
]
},
"QTD_UTILIZADA": {
"field": "QuantidadeAplicada",
"type": "varchar"
}
}
},
"Deslocamentos": {
"table": "APONTAMENTO_DESLOCAMENTO",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"VEICULO_SEQ_DB": {
"field": [
"VeiculoPlaca"
],
"type": "varchar",
"fk": true,
"tableOrigin": "VEICULO",
"columns": [
"PLACA"
]
},
"FUNCIONARIO_SEQ_DB": {
"field": [
"Tecnico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA"
]
},
"INI_DH": {
"field": "DataHoraInicio",
"type": "varchar"
},
"FIM_DH": {
"field": "DataHoraFim",
"type": "varchar"
},
"KM_INICIAL": {
"field": "KmInicial",
"type": "varchar"
},
"KM_FINAL": {
"field": "KmFinal",
"type": "varchar"
},
"DIFERENCA_KM": {
"field": "KmPercorrido",
"type": "varchar"
}
}
},
"Despesas": {
"table": "APONTAMENTO_DESPESA",
"type": "child",
"description": "Vinculo com OS",
"columns": {
"FUNCIONARIO_SEQ_DB": {
"field": [
"Tecnico"
],
"type": "varchar",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA"
]
},
"DESPESA_SEQ_DB": {
"field": [
"Despesa"
],
"type": "varchar",
"fk": true,
"tableOrigin": "DESPESA",
"columns": [
"DESCRICAO"
]
},
"DESCRICAO_DESPESA": {
"field": "DescricaoDespesa",
"type": "varchar"
},
"INI_DH": {
"field": "DataHora",
"type": "varchar"
},
"QUANTIDADE_DESPESA": {
"field": "Valor",
"type": "varchar"
}
}
}
}
}
Integração - Consulta
É possível também realizar a consulta de dados sem que seja feita qualquer alterção neles.
Para isso é necessário 2 coisas:
1 - O método ser GET ao invés de POST
curl --request GET \
--url http://nfs.local/nfs/api/v1/integration/apontamento \
--header 'authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuZnMubG9jYWwiLCJuYW1lIjoic2ltb3ZhLmFkbWluIiwiZW1haWwiOiJzaW1vdmEuYWRtaW5Ac2ltb3ZhLmNvbS5iciIsImZpbGlhbCI6IkFyYWd1YXJpIiwibG9jYWwiOm51bGwsImV4cCI6IjIwMjAtMDQtMjMgMTE6NDg6NDIifQ==.8Yc6ZupCzQIxhsbH\/V6Rzo456uudnt\/8loPgMqmKQVI=' \
--header 'content-type: application/json' \
--cookie PHPSESSID=bt409rccmaotg830011ja5um15 \
--data '{
"periodo": {
"end": "2020-01-06 17:54:43",
"begin" : "2020-01-01 17:54:40"
}
}'
2 - Na configuração do updateIntegraion o mesmo deve ser vazio.
Type period
Foi criado um novo tipo também para esses casos que é o period, configuração básica é
{
"alias": "Apontamento",
"table": "APONTAMENTO",
"field": {
"periodo": {
"column": "INI_DH",
"type": "period",
"size": 100,
"description": "Periodo Busca de Apontamentos"
}
}
....
}
no Body do request deve ter a data begin (Começo) e end (Fim)
{
"periodo": {
"end": "2020-01-06 17:54:43",
"begin" : "2020-01-01 17:54:40"
}
}
OBS: Pode ser adicionado no período a filial e o local para que possa obter os dados que correspondem apenas a estes, podendo ser inserido os dois ou apenas um ou outro, caso não sejam colocados serão trazidos os dados da filial que o usuario esta autenticado, como no exemplo abaixo:
"periodo": {
"end": "2020-01-06 17:54:43",
"begin" : "2020-01-01 17:54:40",
"filial": "NomeDaFilial",
"local": "NomeDoLocal"
}
Logo no exemplo acima vai pesquisar WHERE INI_DH >= '2020-01-06 17:54:43' and INI_DH <= '2020-01-01 17:54:40', o formato da datas deve ser YYYY-MM-DD hh:mi:ss.
Ao definir um tipo period o mesmo deve ser enviado como um json com duas chaves begin e end, nota que o end nao pode ser maior que o begin se nao é gerada uma mensagem de validaçao
[
{
"type": "validation",
"msg": "Período inválido, data inicial maior que final",
"field": "",
"id": ""
}
]
e nem o periodo maior que sete dias.
[
{
"type": "validation",
"msg": "Período maior que 7 dias",
"field": "",
"id": ""
}
]
FK
Esse tipo é usado para o filtro de um dado e não no retorno, pode ser que seja desejável obter todas as OS de um equipamento, então no integration de OS teria um filtro de EQP, poderia ser um técnico, ou qualquer FK que está na tabela principal de integration, não é contemplado FK da FK.
Exemplo:
{
"field": {
"eqp": {
"column": "EQP_SEQ_DB",
"type": "fk",
"size": 30,
"description": "Código do equipamento",
"tableOrigin": "EQP",
"columnOrigin": "CODIGO_PEGADADO"
}
}
}
Type user
Na integração para retornar informações do usuário como por exemplo e-mail foi criado o tipo user onde busca os dados na tabela nfs_acl_usuario.
"INS_USUARIO_SEQ_DB": {
"field": [
"INS_USUARIO_SEQ_DB"
],
"type": "user",
"columns": [
"EMAIL"
]
}
No field um array com os apelidos que vão retornar no json na columns as colunas de retorno nfs_acl_usuario que deseja obter as informações.
Exemplo de Integração de Apontamentos
Request
curl --request GET \
--url http://nfs.local/nfs/api/v1/integration/apontamento \
--header 'authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuZnMubG9jYWwiLCJuYW1lIjoic2ltb3ZhLmFkbWluIiwiZW1haWwiOiJzaW1vdmEuYWRtaW5Ac2ltb3ZhLmNvbS5iciIsImZpbGlhbCI6IkFyYWd1YXJpIiwibG9jYWwiOm51bGwsImV4cCI6IjIwMjAtMDQtMjMgMTE6NDg6NDIifQ==.8Yc6ZupCzQIxhsbH\/V6Rzo456uudnt\/8loPgMqmKQVI=' \
--header 'content-type: application/json' \
--cookie PHPSESSID=bt409rccmaotg830011ja5um15 \
--data '{
"periodo": {
"end": "2020-01-06 17:54:43",
"begin" : "2020-01-01 17:54:40"
}
}'
SQL
{
"alias": "Apontamento",
"table": "APONTAMENTO",
"field": {
"periodo": {
"column": "INI_DH",
"type": "period",
"size": 100,
"description": "Periodo Busca de Apontamentos"
}
},
"updateIntegration": [],
"output": {
"EMPRESA": {
"field": "NOME_EMPRESA",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"FILIAL": {
"field": "NOME_FILIAL",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"LOCAL": {
"field": "LOCAL",
"type": "sys",
"returnColumns": [
"SIGLA"
]
},
"INS_DH": {
"field": "DT_INS_APONT",
"type": "varchar"
},
"INI_DH": {
"field": "DT_INI_APONT",
"type": "varchar"
},
"FIM_DH": {
"field": "DT_FIM_APONT",
"type": "varchar"
},
"SEQ_DB_DEVICE": {
"field": "SEQ_APONTAMENTO",
"type": "varchar"
},
"ATIVO": {
"field": "STATUS_APONT",
"type": "varchar"
},
"INI_DH_TIPO": {
"field": "TIPO_DT_INI",
"type": "varchar"
},
"INI_DH_ONLINE": {
"field": "INI_ONLINE",
"type": "varchar"
},
"FIM_DH_TIPO": {
"field": "TIPO_DT_FIM",
"type": "varchar"
},
"FIM_DH_ONLINE": {
"field": "FIM_ONLINE",
"type": "varchar"
},
"OS_CRIADA": {
"field": "COD_OS_OFFLINE",
"type": "varchar"
},
"FLAG_DESLOCAMENTO": {
"field": "FLAG_DESLOCAMENTO",
"type": "varchar"
},
"POSICAO_PLAT": {
"field": "POSICAO_LAT_APONT",
"type": "varchar"
},
"POSICAO_PLON": {
"field": "POSICAO_LON_APONT",
"type": "varchar"
},
"PROC_DH": {
"field": "DT_INTEGRACAO",
"type": "varchar"
},
"UPD_DH": {
"field": "DT_ALTERACAO",
"type": "varchar"
},
"FLAG_DIAGNOSTICO": {
"field": "FLAG_DIAGNOSTICO",
"type": "varchar"
},
"INS_USUARIO_SEQ_DB": {
"field": [
"INS_USUARIO_SEQ_DB"
],
"type": "user",
"columns": [
"EMAIL"
]
},
"UPD_USUARIO_SEQ_DB": {
"field": [
"USUARIO_ALT_APONT"
],
"type": "user",
"columns": [
"EMAIL"
]
},
"OBSERVACAO": {
"field": "OBSERVACAO",
"type": "varchar"
},
"TIPO_APONTAMENTO": {
"field": "TIPO_APONTAMENTO",
"type": "varchar"
},
"FUNCIONARIO_SEQ_DB": {
"field": [
"CRACHA_FUNCIONARIO",
"NOME_FUNCIONARIO"
],
"type": "fk",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA",
"NOME"
]
},
"AUXILIAR_SEQ_DB": {
"field": [
"CRACHA_AUXILIAR",
"NOME_AUXILIAR"
],
"type": "fk",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns": [
"CRACHA",
"NOME"
]
},
"OS_SEQ_DB": {
"field": [
"OS_COD"
],
"type": "fk",
"fk": true,
"tableOrigin": "OS",
"columns": [
"CODIGO"
]
},
"CLIENTE_SEQ_DB": {
"field": [
"COD_CLIENTE",
"LOJA_CLIENTE",
"DESC_CLIENTE"
],
"type": "fk",
"fk": true,
"tableOrigin": "CLIENTE",
"columns": [
"CODIGO",
"LOJA",
"DESCRICAO"
]
},
"GRUPO_SERVICO_SEQ_DB": {
"field": [
"COD_GRUPO_SERVICO",
"DESC_GRUPO_SERVICO"
],
"type": "fk",
"fk": true,
"tableOrigin": "GRUPO_SERVICO",
"columns": [
"CODIGO",
"DESCRICAO"
]
},
"SERVICO_SEQ_DB": {
"field": [
"COD_SERVICO",
"DESC_SERVICO"
],
"type": "fk",
"fk": true,
"tableOrigin": "SERVICO",
"columns": [
"CODIGO",
"DESCRICAO"
]
},
"PARADA_SEQ_DB": {
"field": [
"DESC_PARADA"
],
"type": "fk",
"fk": true,
"tableOrigin": "PARADA",
"columns": [
"DESCRICAO"
]
},
"TIPO_SERVICO_SEQ_DB": {
"field": [
"CD_TIPO_SERV",
"DESC_TIPO_SERV"
],
"type": "fk",
"fk": true,
"tableOrigin": "TIPO_SERVICO",
"columns": [
"CODIGO",
"DESCRICAO"
]
},
"TIPO_TEMPO_SEQ_DB": {
"field": [
"CD_TIPO_TEMP",
"DESC_TIPO_TEMP"
],
"type": "fk",
"fk": true,
"tableOrigin": "TIPO_TEMPO",
"columns": [
"CODIGO",
"DESCRICAO"
]
},
"LOCAL_SERVICO_SEQ_DB": {
"field": [
"CD_LOCAL_SERV",
"DESC_LOCAL_SERV"
],
"type": "fk",
"fk": true,
"tableOrigin": "LOCAL_SERVICO",
"columns": [
"CODIGO",
"DESCRICAO"
]
},
"SEQ_DB_DEVICE_MASTER_SEQ_DB": {
"field": [
"DT_INS_BOL",
"DT_INI_BOL",
"DT_FIM_BOL",
"BOL_INTEGRADO"
],
"type": "fk",
"fk": true,
"tableOrigin": "BOLETIM",
"columns": [
"INS_DH",
"INI_DH",
"FIM_DH",
"PROCT_ST"
]
}
}
}
Alteração Pós Integração
Caso seja necessário realizar uma alteração para marcar os dados como integrados e também passar por um entry point, o melhor candidato é a rota de Alteração Pós Integração.
Rota: /nfs/api/v1.1/integration/{table}
Caso seja necessário fixar alguma informação automáticamente, use a configuração after-integration:
"after-integration": {
"update": {
"RO": 1,
"PROC_DH": "CURRENT_TIMESTAMP",
"PROC_ST": 4,
"PROC_DESC": "OS Integrada com Sucesso!!"
}
},
Dentro da chave update, adicione as colunas e seus valores para serem alterados.
curl
curl --request POST \
--url https://nfs.local/nfs/api/v1.1/integration/os \
--header 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuZnMubG9jYWwiLCJuYW1lIjoic2ltb3ZhLmFkbWluQHNpbW92YS5jb20uYnIiLCJlbWFpbCI6InNpbW92YS5hZG1pbkBzaW1vdmEuY29tLmJyIiwiZmlsaWFsIjoiVkVTUFVDSU8iLCJsb2NhbCI6IjEwQVZTUDIwIiwiZXhwIjoiMjAyNS0wOC0yOSAyMDowODozOCJ9.ZQ33N4mwsAEurobAKHDLjL4mXq1C22zuXFLGl9SO7mo=' \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie PHPSESSID=9p3g4gne2d91p72phhu29r8eqq \
--data '{"CodigoOt":"000043201168" }'
No exemplo do CURL a OS com código 000043201168, vai ser ter o campos alterados para:
- RO igual a 1
- PROD_DH igual a data atual da filial
- PROC_ST igual a 4
- PROC_DESC igual ao texto: OS Integrada com Sucesso!!
Exemplo da configuração completa
{
"alias": "OrdemServico",
"table": "OS",
"conditions": [
"PROC_ST IN (1)"
],
"msgForConditions": "Registro já foi lido!",
"field":
{
"Periodo":
{
"column": "INI_DH",
"type": "period",
"size": 100,
"description": "Periodo Busca de Apontamentos"
},
"CodigoOt":
{
"column": "CODIGO",
"type": "varchar",
"size": 100,
"description": "Codigo da OS"
}
},
"updateIntegration":
[
"RO = 1",
"PROC_DH = CURRENT_TIMESTAMP",
"PROC_ST = 4",
"PROC_DESC = 'OS Integrada com sucesso'"
],
"after-integration": {
"update": {
"RO": 1,
"PROC_DH": "CURRENT_TIMESTAMP",
"PROC_ST": 4,
"PROC_DESC": "OS Integrada com Sucesso!!"
}
},
"output":
{
"FILIAL":
{
"field": "Filial",
"type": "sys",
"returnColumns":
[
"SIGLA"
]
},
"LOCAL":
{
"field": "Local",
"type": "sys",
"returnColumns":
[
"SIGLA"
]
},
"CODIGO":
{
"field": "CodigoOs",
"type": "varchar"
},
"EQUIPAMENTO_SEQ_DB":
{
"field":
[
"Chassi"
],
"type": "fk",
"fk": true,
"tableOrigin": "EQUIPAMENTO",
"columns":
[
"CHASSI"
]
},
"Apontamento":
{
"table": "apontamento",
"type": "child",
"description": "Vinculo com OS",
"columns":
{
"SEQ_DB_DEVICE_MASTER_SEQ_DB":
{
"field":
[
"SeqBoletim",
"DataInicialBoletim",
"DataFinalBoletim"
],
"type": "fk",
"fk": true,
"tableOrigin": "BOLETIM",
"columns":
[
"SEQ_DB_DEVICE",
"INI_DH",
"FIM_DH"
]
},
"SEQ_DB_DEVICE":
{
"field": "SequencialApontamento",
"type": "varchar"
},
"INI_DH":
{
"field": "DataInicialApontamento",
"type": "varchar"
},
"FIM_DH":
{
"field": "DataFinalApontamento",
"type": "varchar"
},
"TIPO_APONTAMENTO":
{
"field": "TipoApontamento",
"type": "varchar"
},
"FUNCIONARIO_SEQ_DB":
{
"field":
[
"NomeFuncionario",
"CrachaFuncionario"
],
"type": "fk",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns":
[
"NOME",
"CRACHA"
]
},
"SERVICO_SEQ_DB":
{
"field":
[
"CodigoServico",
"DescricaoServico",
"FlagDeslocamento"
],
"type": "fk",
"fk": true,
"tableOrigin": "SERVICO",
"columns":
[
"CODIGO",
"DESCRICAO",
"FLAG_DESLOCAMENTO"
]
},
"GRUPO_SERVICO_SEQ_DB":
{
"field":
[
"CodigoGrupoServico",
"DescricaoGrupoServico"
],
"type": "fk",
"fk": true,
"tableOrigin": "GRUPO_SERVICO",
"columns":
[
"CODIGO",
"DESCRICAO"
]
},
"CLIENTE_SEQ_DB":
{
"field":
[
"CodigoCliente",
"LojaCliente",
"DescricaoCliente"
],
"type": "fk",
"fk": true,
"tableOrigin": "CLIENTE",
"columns":
[
"CODIGO",
"LOJA",
"DESCRICAO"
]
},
"INI_FIM_DIFF_SEC":
{
"field": "TempoApontado",
"type": "int"
},
"OS_CRIADA":
{
"field": "OsCriada",
"type": "varchar"
},
"POSICAO_PLAT":
{
"field": "Latitude",
"type": "varchar"
},
"POSICAO_PLON":
{
"field": "Longitude",
"type": "varchar"
}
}
},
"aptDescricaoServico":
{
"table": "APONTAMENTO_DESCRICAO_SERVICO",
"type": "child",
"description": "Vinculo com OS",
"columns":
{
"SEQ_DB_DEVICE":
{
"field": "SequencialApontamento",
"type": "varchar"
},
"INI_DH":
{
"field": "DataInicialApontamento",
"type": "varchar"
},
"FIM_DH":
{
"field": "DataFinalApontamento",
"type": "varchar"
},
"SEQ_DB_DEVICE_MASTER_SEQ_DB":
{
"field":
[
"SeqBoletim",
"DataInicialBoletim",
"DataFinalBoletim"
],
"type": "fk",
"fk": true,
"tableOrigin": "BOLETIM",
"columns":
[
"SEQ_DB_DEVICE",
"INI_DH",
"FIM_DH"
]
},
"FUNCIONARIO_SEQ_DB":
{
"field":
[
"NomeFuncionario",
"CrachaFuncionario"
],
"type": "fk",
"fk": true,
"tableOrigin": "FUNCIONARIO",
"columns":
[
"NOME",
"CRACHA"
]
},
"CODIGO_OS":
{
"field": "CodigoOsApontado",
"type": "varchar"
},
"OS_SEQ_DB":
{
"field":
[
"CodigoOs"
],
"type": "fk",
"fk": true,
"tableOrigin": "OS",
"columns":
[
"CODIGO"
]
},
"OS_CRIADA":
{
"field": "OsCriada",
"type": "varchar"
},
"CLIENTE_SEQ_DB":
{
"field":
[
"CodigoCliente",
"DescricaoCliente",
"LojaCliente"
],
"type": "fk",
"fk": true,
"tableOrigin": "CLIENTE",
"columns":
[
"CODIGO",
"DESCRICAO",
"LOJA"
]
},
"RECLAMACAO_CLIENTE":
{
"field": "ReclamacaoCliente",
"type": "varchar"
},
"CAUSA":
{
"field": "Causa",
"type": "varchar"
},
"SOLUCAO":
{
"field": "Solucao",
"type": "varchar"
},
"INI_FIM_DIFF_SEC":
{
"field": "HorasApontamento",
"type": "varchar"
}
}
}
}
}
(NOVO) Integration Por Entry Point
Depois de observar o uso massivo de VIEWs, o NFSCORE julgo interessante adicionar uma opção de ser possível criar um API de Integração para obter dados por entry point.
Nova URL
- https://seu_client/nfs/api/v1/integration/ep/entry-point-name
Entry Point
CAMPOS
FILE_OR_NAME = API action = entry-point-name XMOVA_INSTALLCODE = 9999 XMOVA_INSTALLCODE_VERSION = 9999 EMPRESA = 9999 FILIAL = 9999 LOCAL = 9999 TABELA = null CODE =
$result = [];
$result[NFSApiUtils::NFS_API_TYPE] = NFSApiUtils::NFS_API_SUCCESS;
$result[NFSApiUtils::NFS_API_DATA][] = [
'seq' => 1
];
$this->outputValues = $result;
CODETYPE = PHP
Como fazer o Entry Point
Primeiro como é possível observar acima tem o NFSApiUtils e nela tem o NFS_API_TYPE que pode conter 3 valores
- NFSApiUtils::NFS_API_SUCCESS: Sucesso, quando o desejo é retornar um lista de dados
- NFSApiUtils::NFS_API_VALIDATION: Quando a sua API tem regras que o usuário deve seguir e se violar uma delas é possível retornar um validation
- NFSApiUtils::NFS_API_ERROR: Quando é necessário retornar um tipo error para o usuário
É obrigatório na variável de retorno ter um type, que é onde vai moldar o retorno do fluxo dos dados.
$this->outputValues também obrigatório.
NFSApiUtils::NFS_API_SUCCESS
Exemplo do entrypoint:
$start = $this->inputValues['start'];
$end = $this->inputValues['end'];
$shiftReport = imagine um Dao aqui onde vc obter um boletim;
$result = [];
$result[NFSApiUtils::NFS_API_TYPE] = NFSApiUtils::NFS_API_SUCCESS;
$result[NFSApiUtils::NFS_API_DATA] = $shiftReport ?? [];
$this->outputValues = $result;
Exemplo curl:
curl --request POST \
--url https://nfs.local/nfs/api/v1/integration/ep/entry-point-name \
--header 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuZnMubG9jYWwiLCJuYW1lIjoic2ltb3ZhQHNpbW92YS5jb20uYnIiLCJlbWFpbCI6InNpbW92YUBzaW1vdmEuY29tLmJyIiwiZmlsaWFsIjoiSXJ2aW5nIiwibG9jYWwiOm51bGwsImV4cCI6IjIwMjYtMDItMTMgMTU6MDE6NTIifQ==.kBxy/j49RCK7mJsUAQnKj63GOwGZaSVALRrwYT6Pp1E=' \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie PHPSESSID=qmvi0rc74nr8q8br45g4crc1m7 \
--data '{
"start": "2025-11-03 00:00:00",
"end": "2025-12-03 23:59:59"
}'
NFSApiUtils::NFS_API_VALIDATION
Note que no validation há um mensagem, e ela vai na chave NFSApiUtils::NFS_API_MESSAGE.
Exemplo do entrypoint:
$start = $this->inputValues['start'];
$end = $this->inputValues['end'];
$shiftReport = imagine um Dao aqui onde vc obter um boletim;
// isso é um exemplo, não sei se funciona
if (($end - $start) > 30){
$result = [];
$result[NFSApiUtils::NFS_API_TYPE] = NFSApiUtils::NFS_API_VALIDATION;
$result[NFSApiUtils::NFS_API_MESSAGE] = xDS::translate('Período maior que 30 dias');
$this->outputValues = $result;
return;
}
$result = [];
$result[NFSApiUtils::NFS_API_TYPE] = NFSApiUtils::NFS_API_SUCCESS;
$result[NFSApiUtils::NFS_API_DATA] = $shiftReport ?? [];
$this->outputValues = $result;
Exemplo curl:
curl --request POST \
--url https://nfs.local/nfs/api/v1/integration/ep/entry-point-name \
--header 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuZnMubG9jYWwiLCJuYW1lIjoic2ltb3ZhQHNpbW92YS5jb20uYnIiLCJlbWFpbCI6InNpbW92YUBzaW1vdmEuY29tLmJyIiwiZmlsaWFsIjoiSXJ2aW5nIiwibG9jYWwiOm51bGwsImV4cCI6IjIwMjYtMDItMTMgMTU6MDE6NTIifQ==.kBxy/j49RCK7mJsUAQnKj63GOwGZaSVALRrwYT6Pp1E=' \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie PHPSESSID=qmvi0rc74nr8q8br45g4crc1m7 \
--data '{
"start": "2025-11-03 00:00:00",
"end": "2025-12-03 23:59:59"
}'
NFSApiUtils::NFS_API_ERROR
Note que no error há um mensagem, e ela vai na chave NFSApiUtils::NFS_API_MESSAGE.
Exemplo do entrypoint:
try {
$start = $this->inputValues['start'];
$end = $this->inputValues['end'];
$shiftReport = imagine um Dao aqui onde vc obter um boletim;
// isso é um exemplo, não sei se funciona
if (($end - $start) > 30){
$result = [];
$result[NFSApiUtils::NFS_API_TYPE] = NFSApiUtils::NFS_API_VALIDATION;
$result[NFSApiUtils::NFS_API_MESSAGE] = xDS::translate('Período maior que 30 dias');
$this->outputValues = $result;
return;
}
$result = [];
$result[NFSApiUtils::NFS_API_TYPE] = NFSApiUtils::NFS_API_SUCCESS;
$result[NFSApiUtils::NFS_API_DATA] = $shiftReport ?? [];
$this->outputValues = $result;
return;
} catch(Exception $e){
NfsLogger::error($e->getMessage(), 'entry-point-name');
}
$result[NFSApiUtils::NFS_API_TYPE] = NFSApiUtils::NFS_API_ERROR;
$result[NFSApiUtils::NFS_API_MESSAGE] = xDS::translate('Aconteceu um erro inesperado entrar em contato com o suporte');
Exemplo curl:
curl --request POST \
--url https://nfs.local/nfs/api/v1/integration/ep/entry-point-name \
--header 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuZnMubG9jYWwiLCJuYW1lIjoic2ltb3ZhQHNpbW92YS5jb20uYnIiLCJlbWFpbCI6InNpbW92YUBzaW1vdmEuY29tLmJyIiwiZmlsaWFsIjoiSXJ2aW5nIiwibG9jYWwiOm51bGwsImV4cCI6IjIwMjYtMDItMTMgMTU6MDE6NTIifQ==.kBxy/j49RCK7mJsUAQnKj63GOwGZaSVALRrwYT6Pp1E=' \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie PHPSESSID=qmvi0rc74nr8q8br45g4crc1m7 \
--data '{
"start": "2025-11-03 00:00:00",
"end": "2025-12-03 23:59:59"
}'