ProtheusNotaFiscalOmni (STATUS: PARCIAL)
Documentação Técnica
| Nome do cliente | OSKLEN |
| Nome do projeto | Integração LINX → Protheus |
| Biblioteca | wosk_protheus_nota_fiscal_omni |
| Data | 03/03/2026 |
Histórico de Versões
| Data | Versão | Modificado por | Descrição da Mudança |
| 03/03/2026 | 1.0 | Maykon | Criação da documentação técnica do processo ProtheusNotaFiscalOmni. |
Descrição
Esta biblioteca organiza o envio de Notas Fiscais Omni do LINX para o Protheus, garantindo captura por chave ou por data, montagem dos itens e registro do resultado da integração.
Capturador
Descrição Conceitual
Permite a captura manual de uma ou mais Notas Fiscais Omni por chave no padrão cfilial-cdoc-cserie-ccliente-cloja, com validação obrigatória do formato; quando a chave estiver fora do padrão, o processo é interrompido com erro de chave inválida para evitar registros inconsistentes.
A captura por data consulta a origem filtrando e ordenando por DATA_PARA_TRANSFERENCIA, com paginação por OFFSET/FETCH, caracterizando processamento cronológico (ordenação/paginação por data); link conceitual: Processamento cronológico. A execução periódica pode ser acionada por agendador de tarefas.
Fonte
Origem consultada: view WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA e view WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA_ITEM.
Consulta utilizada na captura por data (WHERE e paginação construídos dinamicamente conforme posição e limite configurado):
SELECT
cfilial,
cdoc,
cserie,
ccliente,
cloja,
cest,
cemissao,
cespecie,
ctipo,
ctpfrete,
csdoc,
cchvnfe,
cdautnfe,
chautnfe,
cxnatope,
cxcanal,
cpedsite,
cpedlinx,
cender,
cbairro,
codibge,
cmun,
ccep,
cnome,
cinscri,
cemail,
cddd,
ctel,
cpessoa,
creprocessa,
cufdest,
cuforig,
cespeci1,
nvolume1,
npliqui,
npbruto,
ctransp,
nvalmerc,
nvalbrut,
nfrete,
nseguro,
ndespesa,
ndescont,
nvalfat,
nvalicm,
nbaseicm,
nicmfret,
nvalipi,
nbaseipi,
nicmsret,
nbricms,
nbasimp6,
nbasimp5,
nvalimp6,
nvalimp5,
nbasfecp,
nbsfccmp,
nbsfcpst,
nbaseps3,
nvalps3,
nbasecf3,
nvalcf3,
F2_XCBSIBS,
DATA_PARA_TRANSFERENCIA
FROM
WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA (NOLOCK)
WHERE
DATA_PARA_TRANSFERENCIA >= '<DATA_PARA_TRANSFERENCIA>'
ORDER BY
DATA_PARA_TRANSFERENCIA ASC
OFFSET
<OFFSET> ROWS FETCH NEXT <LIMITE> ROWS ONLY
Consulta utilizada na captura manual (chave informada e WHERE construído dinamicamente):
SELECT
cfilial,
cdoc,
cserie,
ccliente,
cloja,
cest,
cemissao,
cespecie,
ctipo,
ctpfrete,
csdoc,
cchvnfe,
cdautnfe,
chautnfe,
cxnatope,
cxcanal,
cpedsite,
cpedlinx,
cender,
cbairro,
codibge,
cmun,
ccep,
cnome,
cinscri,
cemail,
cddd,
ctel,
cpessoa,
creprocessa,
cufdest,
cuforig,
cespeci1,
nvolume1,
npliqui,
npbruto,
ctransp,
nvalmerc,
nvalbrut,
nfrete,
nseguro,
ndespesa,
ndescont,
nvalfat,
nvalicm,
nbaseicm,
nicmfret,
nvalipi,
nbaseipi,
nicmsret,
nbricms,
nbasimp6,
nbasimp5,
nvalimp6,
nvalimp5,
nbasfecp,
nbsfccmp,
nbsfcpst,
nbaseps3,
nvalps3,
nbasecf3,
nvalcf3,
F2_XCBSIBS,
DATA_PARA_TRANSFERENCIA
FROM
WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA (NOLOCK)
WHERE
cfilial = '<CFILIAL>'
AND cdoc = '<CDOC>'
AND cserie = '<CSERIE>'
AND ccliente = '<CCLIENTE>'
AND cloja = '<CLOJA>'
Consulta utilizada para carregar itens da nota (WHERE construído dinamicamente a partir da chave):
SELECT
cfilial,
cdoc,
cserie,
ccliente,
cloja,
citem,
ccod,
ctp,
cum,
clocal,
nquant,
nprcven,
nprunit,
ntotal,
ndescon,
nseguro,
nvalfre,
ndespesa,
nvalbrut,
cclasfis,
ctes,
ccf,
nbaseipi,
nipi,
nvalipi,
nbaseicm,
npicm,
nvalicm,
nbasfecp,
nalqfecp,
nvalfecp,
nbricms,
naliqsol,
nmargem,
nicmsret,
nbsfcpsr,
nalfcpst,
nbasimp5,
nalqimp5,
nvalimp5,
nbasimp6,
nalqimp6,
nvalimp6,
nbaseps3,
naliqps3,
nvalps3,
nbasecf3,
naliqcf3,
nvalcf3,
ndesczfp,
nvfecpst,
ndesczfc,
nbasedes,
naliqcmp,
nxprmdpr,
nxaliqba,
npdori,
npddes,
nalqdifal,
ndifal,
nbsfccmp,
nalfccmp,
cccusto,
cconta,
npeso,
cestoque,
D2_XCBSBS,
D2_XCBSAL,
D2_XCBSVL,
D2_XIBSBS,
D2_XIBSAL,
D2_XIBSVL,
DATA_PARA_TRANSFERENCIA
FROM
WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA_ITEM (NOLOCK)
WHERE
cfilial = '<CFILIAL>'
AND cdoc = '<CDOC>'
AND cserie = '<CSERIE>'
AND ccliente = '<CCLIENTE>'
AND cloja = '<CLOJA>'
Operações com Dados
- Leitura: consulta a view WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA para obter o registro atual da Nota Fiscal Omni e construir o identificador de processamento no padrão cfilial-cdoc-cserie-ccliente-cloja.
- Carregamento de itens: para cada registro atual da nota, consulta a view WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA_ITEM e agrega os itens retornados no campo itens, formando o conjunto completo (cabeçalho + itens) para integração.
- Controle de limite de captura: obtém o limite de itens por ciclo via configuração woskLimiteCaptura::ProtheusNotaFiscalOmni, aplicado na paginação da consulta (FETCH NEXT <LIMITE>).
- Registro para processamento: cada Nota Fiscal Omni capturada é persistida como pendência na tabela wosk_queue sob o serviço ProtheusNotaFiscalOmni, com o conteúdo vindo da origem (incluindo itens) para processamento assíncrono.
Fila de Processamento
A fila recupera um registro pendente e utiliza o conteúdo do registro como base do payload de integração. Em seguida, aplica transformações obrigatórias de padronização e realiza a chamada ao Protheus.
Estruturação de Dados
| Campo no payload | Campo de origem |
cfilial |
cfilial |
cdoc |
cdoc |
cserie |
cserie |
ccliente |
ccliente |
cloja |
cloja |
cest |
cest |
cemissao |
cemissao |
cespecie |
cespecie |
ctipo |
ctipo |
ctpfrete |
ctpfrete |
nvalmerc |
nvalmerc |
nvalbrut |
nvalbrut |
nfrete |
nfrete |
nseguro |
nseguro |
ndespesa |
ndespesa |
ndescont |
ndescont |
nvalfat |
nvalfat |
nvalicm |
nvalicm |
nbaseicm |
nbaseicm |
nicmfret |
nicmfret |
nvalipi |
nvalipi |
nbaseipi |
nbaseipi |
nicmsret |
nicmsret |
nbricms |
nbricms |
nbasimp6 |
nbasimp6 |
nbasimp5 |
nbasimp5 |
nvalimp6 |
nvalimp6 |
nvalimp5 |
nvalimp5 |
nbasfecp |
nbasfecp |
nbsfccmp |
nbsfccmp |
nbsfcpst |
nbsfcpst |
nbaseps3 |
nbaseps3 |
nvalps3 |
nvalps3 |
nbasecf3 |
nbasecf3 |
nvalcf3 |
nvalcf3 |
cufdest |
cufdest |
cuforig |
cuforig |
cespeci1 |
cespeci1 |
nvolume1 |
nvolume1 |
npliqui |
npliqui |
npbruto |
npbruto |
ctransp |
ctransp |
csdoc |
csdoc |
cchvnfe |
cchvnfe |
cdautnfe |
cdautnfe |
chautnfe |
chautnfe |
cxnatope |
cxnatope |
cxcanal |
cxcanal |
cpedsite |
cpedsite |
cpedlinx |
cpedlinx |
cender |
cender |
cbairro |
cbairro |
codibge |
codibge |
cmun |
cmun |
ccep |
ccep |
cnome |
cnome |
cinscri |
cinscri |
cemail |
cemail |
cddd |
cddd |
ctel |
ctel |
cpessoa |
cpessoa |
creprocessa |
creprocessa |
F2_XCBSIBS |
F2_XCBSIBS |
Campos do payload (itens[])
| Campo no payload | Campo de origem |
itens[].citem |
itens[].citem |
itens[].ccod |
itens[].ccod |
itens[].ctp |
itens[].ctp |
itens[].cum |
itens[].cum |
itens[].clocal |
itens[].clocal |
itens[].nquant |
itens[].nquant |
itens[].nprcven |
itens[].nprcven |
itens[].nprunit |
itens[].nprunit |
itens[].ntotal |
itens[].ntotal |
itens[].ndescon |
itens[].ndescon |
itens[].nseguro |
itens[].nseguro |
itens[].nvalfre |
itens[].nvalfre |
itens[].ndespesa |
itens[].ndespesa |
itens[].nvalbrut |
itens[].nvalbrut |
itens[].cclasfis |
itens[].cclasfis |
itens[].ctes |
itens[].ctes |
itens[].ccf |
itens[].ccf |
itens[].nbaseipi |
itens[].nbaseipi |
itens[].nipi |
itens[].nipi |
itens[].nvalipi |
itens[].nvalipi |
itens[].nbaseicm |
itens[].nbaseicm |
itens[].npicm |
itens[].npicm |
itens[].nvalicm |
itens[].nvalicm |
itens[].nbasfecp |
itens[].nbasfecp |
itens[].nalqfecp |
itens[].nalqfecp |
itens[].nvalfecp |
itens[].nvalfecp |
itens[].nbricms |
itens[].nbricms |
itens[].naliqsol |
itens[].naliqsol |
itens[].nmargem |
itens[].nmargem |
itens[].nicmsret |
itens[].nicmsret |
itens[].nbsfcpsr |
itens[].nbsfcpsr |
itens[].nalfcpst |
itens[].nalfcpst |
itens[].nvfecpst |
itens[].nvfecpst |
itens[].nbasimp5 |
itens[].nbasimp5 |
itens[].nalqimp5 |
itens[].nalqimp5 |
itens[].nvalimp5 |
itens[].nvalimp5 |
itens[].nbasimp6 |
itens[].nbasimp6 |
itens[].nalqimp6 |
itens[].nalqimp6 |
itens[].nvalimp6 |
itens[].nvalimp6 |
itens[].nbaseps3 |
itens[].nbaseps3 |
itens[].naliqps3 |
itens[].naliqps3 |
itens[].nvalps3 |
itens[].nvalps3 |
itens[].nbasecf3 |
itens[].nbasecf3 |
itens[].naliqcf3 |
itens[].naliqcf3 |
itens[].nvalcf3 |
itens[].nvalcf3 |
itens[].ndesczfp |
itens[].ndesczfp |
itens[].ndesczfc |
itens[].ndesczfc |
itens[].nbasedes |
itens[].nbasedes |
itens[].naliqcmp |
itens[].naliqcmp |
itens[].nxprmdpr |
itens[].nxprmdpr |
itens[].nxaliqba |
itens[].nxaliqba |
itens[].npdori |
itens[].npdori |
itens[].npddes |
itens[].npddes |
itens[].nalqdifal |
itens[].nalqdifal |
itens[].ndifal |
itens[].ndifal |
itens[].nbsfccmp |
itens[].nbsfccmp |
itens[].nalfccmp |
itens[].nalfccmp |
itens[].cccusto |
itens[].cccusto |
itens[].cconta |
itens[].cconta |
itens[].npeso |
itens[].npeso |
itens[].cestoque |
itens[].cestoque |
itens[].D2_XCBSBS |
itens[].D2_XCBSBS |
itens[].D2_XCBSAL |
itens[].D2_XCBSAL |
itens[].D2_XCBSVL |
itens[].D2_XCBSVL |
itens[].D2_XIBSBS |
itens[].D2_XIBSBS |
itens[].D2_XIBSAL |
itens[].D2_XIBSAL |
itens[].D2_XIBSVL |
itens[].D2_XIBSVL |
Exemplo de payload:
{
"cfilial": "",
"cdoc": "",
"cserie": "",
"ccliente": "",
"cloja": "",
"cest": "",
"cemissao": "",
"cespecie": "",
"ctipo": "",
"ctpfrete": "",
"nvalmerc": 0,
"nvalbrut": 0,
"nfrete": 0,
"nseguro": 0,
"ndespesa": 0,
"ndescont": 0,
"nvalfat": 0,
"nvalicm": 0,
"nbaseicm": 0,
"nicmfret": 0,
"nvalipi": 0,
"nbaseipi": 0,
"nicmsret": 0,
"nbricms": 0,
"nbasimp6": 0,
"nbasimp5": 0,
"nvalimp6": 0,
"nvalimp5": 0,
"nbasfecp": 0,
"nbsfccmp": 0,
"nbsfcpst": 0,
"nbaseps3": 0,
"nvalps3": 0,
"nbasecf3": 0,
"nvalcf3": 0,
"cufdest": "",
"cuforig": "",
"cespeci1": "",
"nvolume1": 0,
"npliqui": 0,
"npbruto": 0,
"ctransp": "",
"csdoc": "",
"cchvnfe": "",
"cdautnfe": "",
"chautnfe": "",
"cxnatope": "",
"cxcanal": "",
"cpedsite": "",
"cpedlinx": "",
"cender": "",
"cbairro": "",
"codibge": "",
"cmun": "",
"ccep": "",
"cnome": "",
"cinscri": "",
"cemail": "",
"cddd": "",
"ctel": "",
"cpessoa": "",
"creprocessa": "",
"F2_XCBSIBS": "",
"itens": [
{
"citem": "",
"ccod": "",
"ctp": "",
"cum": "",
"clocal": "",
"nquant": 0,
"nprcven": 0,
"nprunit": 0,
"ntotal": 0,
"ndescon": 0,
"nseguro": 0,
"nvalfre": 0,
"ndespesa": 0,
"nvalbrut": 0,
"cclasfis": "",
"ctes": "",
"ccf": "",
"nbaseipi": 0,
"nipi": 0,
"nvalipi": 0,
"nbaseicm": 0,
"npicm": 0,
"nvalicm": 0,
"nbasfecp": 0,
"nalqfecp": 0,
"nvalfecp": 0,
"nbricms": 0,
"naliqsol": 0,
"nmargem": 0,
"nicmsret": 0,
"nbsfcpsr": 0,
"nalfcpst": 0,
"nvfecpst": 0,
"nbasimp5": 0,
"nalqimp5": 0,
"nvalimp5": 0,
"nbasimp6": 0,
"nalqimp6": 0,
"nvalimp6": 0,
"nbaseps3": 0,
"naliqps3": 0,
"nvalps3": 0,
"nbasecf3": 0,
"naliqcf3": 0,
"nvalcf3": 0,
"ndesczfp": 0,
"ndesczfc": 0,
"nbasedes": 0,
"naliqcmp": 0,
"nxprmdpr": 0,
"nxaliqba": 0,
"npdori": 0,
"npddes": 0,
"nalqdifal": 0,
"ndifal": 0,
"nbsfccmp": 0,
"nalfccmp": 0,
"cccusto": "",
"cconta": "",
"npeso": 0,
"cestoque": "",
"D2_XCBSBS": 0,
"D2_XCBSAL": 0,
"D2_XCBSVL": 0,
"D2_XIBSBS": 0,
"D2_XIBSAL": 0,
"D2_XIBSVL": 0
}
]
}
Tratamento de Dados
- Pré-validação de dependências: antes de enviar a Nota Fiscal Omni, valida se o cliente (cloja + ccliente) e o pedido (cpedsite) estão integrados. Quando uma dependência não estiver integrada, o item é finalizado como suspenso (situacao = 3) e registra suspensaoTipo e suspensaoChave para rastreio do bloqueio.
- Normalização numérica (cabeçalho): D2_XCBSBS, D2_XCBSAL, D2_XCBSVL, D2_XIBSBS, D2_XIBSAL, D2_XIBSVL, nvolume1, npliqui, npbruto, nvalmerc, nvalbrut, nfrete, nseguro, ndespesa, ndescont, nvalfat, nvalicm, nbaseicm, nicmfret, nvalipi, nbaseipi, nicmsret, nbricms, nbasimp6, nbasimp5, nvalimp6, nvalimp5, nbasfecp, nbsfccmp, nbsfcpst, nbaseps3, nvalps3, nbasecf3, nvalcf3.
- Normalização numérica (itens): nquant, nprcven, nprunit, ntotal, ndescon, nseguro, nvalfre, ndespesa, nvalbrut, nbaseipi, nipi, nvalipi, nbaseicm, npicm, nvalicm, nbasfecp, nalqfecp, nvalfecp, nbricms, naliqsol, nmargem, nicmsret, nbsfcpsr, nalfcpst, nvfecpst, nbasimp5, nalqimp5, nvalimp5, nbasimp6, nalqimp6, nvalimp6, nbaseps3, naliqps3, nvalps3, nbasecf3, naliqcf3, nvalcf3, ndesczfp, ndesczfc, nbasedes, naliqcmp, nxprmdpr, nxaliqba, npdori, npddes, nalqdifal, ndifal, nbsfccmp, nalfccmp, npeso.
- Mapeamento de retorno: quando o Protheus retornar COD e MSG, esses campos são reinterpretados como code e message para padronizar o tratamento do resultado.
- Consolidação de mensagem: quando existir detailedMessage, ele é concatenado à mensagem final para detalhar a causa do sucesso/erro.
- Resalva de duplicidade: quando o retorno indicar erro e a mensagem (ou Log) contiver nota fiscal já cadastrada, o item é reclassificado como sucesso (situacao = 2) e a mensagem é substituída por uma resalva autorizada.
Rotinas Inteligentes
- Cliente Integrado: Evita envio da nota quando o cadastro do cliente ainda não está disponível no Protheus.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/cliente-integrado
- Pedido Omni: Garante a consistência do encadeamento entre pedido e nota no Protheus.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/pedido-omni
- Nota Fiscal Omni Integrado: Registra o status de integração para evitar reenvios indevidos.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/nota-fiscal-omni-integrado
Integração com o Protheus
Chamada de integração com o Protheus
- Chamada: Requisição HTTP
- Recurso: rtbomni/notas
- Método HTTP: POST
- Cabeçalhos:
- Accept: application/json
- Content-Type: application/json
- Connection: close
- Authorization: Basic <credenciais>
Tratamento de retorno
Ausência de resposta: registra falha com mensagem JSON: NÃO HOUVE RESPOSTA. e finaliza o item como erro.
Resposta inválida/inesperada: quando não for possível obter code (direto ou via COD), registra falha com mensagem JSON: NÃO FOI POSSÍVEL DECODIFICAR A RESPOSTA..
Indicadores de sucesso/erro: considera sucesso quando code for N200. Em retorno diferente, finaliza como erro, exceto quando aplicável a resalva de duplicidade.
Ao final do processamento, o item é atualizado na tabela wosk_queue com o retorno do Protheus (quando existir), a mensagem consolidada, a situação final (situacao = 2 em sucesso, situacao = 4 em erro, situacao = 3 quando suspenso por dependência) e o tempo de processamento.
Encaminhamento em cenário de erro
Quando houver falha por ausência de resposta, retorno inválido, code diferente de N200 (sem resalva) ou erro não previsto, o item permanece registrado em wosk_queue com detalhes do retorno e mensagem para acompanhamento e eventual reprocessamento. Quando a falha estiver ligada à integração pendente de cliente ou pedido, o item é suspenso com suspensaoTipo e suspensaoChave para indicar o bloqueio.
Notificação
wosk_queue (serviço ProtheusNotaFiscalOmni e situação de erro), ordenando pela data de processamento para priorizar ocorrências mais antigas.Fluxo do Processo
Critérios de Aceitação
| Processo | Subprocesso | Descrição | Situação esperada |
| Capturador | Captura cronológica e controle de posição | Ao consultar a view WOSK_SERVICO_ENVIA_PROTHEUS_OMNI_NOTA com filtro por DATA_PARA_TRANSFERENCIA, ordenação ascendente e paginação por OFFSET/FETCH, deve manter a continuidade por posição persistida em wosk_monitor (evento, offset, chave_posicao, data_posicao, filtro). |
Posição atualizada em wosk_monitor e itens pendentes registrados para processamento assíncrono. |
| Capturador | Captura manual por chave | Ao informar uma chave no padrão cfilial-cdoc-cserie-ccliente-cloja, deve consultar a origem filtrando pelos cinco campos e montar itens a partir da view de itens antes de registrar o item para processamento; quando a chave estiver fora do padrão, deve finalizar com erro de chave inválida. |
Item pendente registrado com itens carregados quando a chave for válida; erro quando a chave estiver fora do padrão. |
| Fila de Processamento | Suspensão por dependência | Quando o cliente (cloja + ccliente) ou o pedido (cpedsite) não estiver integrado, deve finalizar o item como suspenso e registrar suspensaoTipo e suspensaoChave. |
Item atualizado em wosk_queue com situacao = 3 e informações de suspensão preenchidas. |
| Fila de Processamento | Integração com Protheus | Ao processar um item pendente em wosk_queue (serviço ProtheusNotaFiscalOmni), deve enviar requisição POST para o recurso rtbomni/notas com o payload completo (cabeçalho + itens) e registrar retorno, mensagem e situação final. |
Item atualizado em wosk_queue com retorno/mensagem e situação final coerente (sucesso quando code = N200 ou quando aplicar a resalva de duplicidade; erro quando não houver resposta, não houver code ou code for diferente sem resalva). |

Nenhum comentário