Referência técnica — Pedido de Compra Omie
Atualizado: 2026-07-07 · por: sessão manual · exceção de alumínio no conflito de descrição · rev: 2
Empresas e app keys (multi-tenant Omie)
| Empresa |
empresa.nome (BPEX) |
Omie app_key |
app_secret |
Particularidades |
| Onix |
contém "onix" |
${OMIE_APP_KEY_ONIX} |
${OMIE_APP_SECRET_ONIX} |
Cadastro de Projeto OK |
| ATARES Revestimentos |
contém "atares" |
${OMIE_APP_KEY_ATARES} |
${OMIE_APP_SECRET_ATARES} |
Exige codigo_produto_integracao no IncluirProduto |
| LGR |
contém "lgr" |
${OMIE_APP_KEY_LGR} |
${OMIE_APP_SECRET_LGR} |
Cadastro de Projeto OK |
| BPX |
contém "bpx" |
${OMIE_APP_KEY_BPX} |
${OMIE_APP_SECRET_BPX} |
Cadastro de Projeto OK |
| Dale |
contém "dale" |
${OMIE_APP_KEY_DALE} |
${OMIE_APP_SECRET_DALE} |
Sem permissão "Cadastro de Projetos / Inclusão" — pendente liberar no painel Omie |
⚠️ O Code node identifica a empresa por body.pedido_compra.empresa.nome (lowercase, includes-match), NÃO por empresa_id. Os app_keys e app_secrets vivem hardcoded no nó Code dos workflows MP e MO. Para puxar valores atualizados: GET /rest/workflows/WwDzIseoYVxbzJZK e ler nodes['Code'].parameters.jsCode.
Mapping de campos BPEX → Omie
Cabeçalho do PC (IncluirPedCompra)
| Omie |
BPEX origem |
Notas |
cCodIntPed |
pedido_compra.id |
identificador único do PC no BPEX |
dDtPrevisao |
$today (formato dd/MM/yyyy) |
data de previsão = hoje |
cCodParc |
derivado de pedido_compra.prazo_pagamento |
"3 parcelas" → "003", "2 parcelas" → "002", senão "001" |
nCodFor |
clientes_cadastro_resumido[0].codigo_cliente |
resultado do Acha código do cliente |
cCodCateg |
hardcoded "2.11.99" |
categoria fiscal padrão Bepex |
nCodCompr |
Code.json.comprador |
id de comprador no Omie, varia por empresa |
cObs |
Pedido incluido via API ${now} |
timestamp |
cObsInt |
pedido_compra.id |
observação interna = id BPEX |
frete_incluir.cTpFrete |
hardcoded "9" |
"Sem frete" |
Item do PC (produtos_incluir)
| Omie |
BPEX origem (MP) |
Notas |
nCodProd |
_codigo_produto_resolvido (Distribuir) |
int gerado pelo Omie, descoberto via lookup ou auto-criação |
nQtde |
$json.quantidade (do Split Out) |
obrigatório |
nValUnit |
$json.valor (do Split Out) |
obrigatório |
cObs |
=PVJ-${pedido_venda.id}-PCJ-${pedido_compra.id}-ITJ-${id} |
rastreabilidade BPEX |
Cadastro de produto novo (IncluirProduto, MP)
| Omie |
BPEX origem |
Obrigatório? |
codigo |
omie.mp.codigo (BPXxxxxxxx) |
sempre |
codigo_produto_integracao |
omie.mp.codigo (mesmo valor) |
sim, na ATARES (sempre passar nas demais não dói) |
descricao |
omie.mp.descricao |
sempre |
unidade |
item.unidade_medida |
sempre |
ncm |
item.ncm (formatado XXXX.XX.XX) |
sempre |
valor_unitario |
item.preco_peca |
sempre |
peso_liq |
item.peso_peca |
sempre |
peso_bruto |
item.peso_peca (= liq) |
sempre |
modelo |
item.nome |
sempre |
tipoItem |
hardcoded "01" |
sempre |
inativo |
hardcoded "N" |
sempre |
recomendacoes_fiscais.origem_mercadoria |
hardcoded "0" |
sempre |
recomendacoes_fiscais.market_place |
hardcoded "S" |
sempre |
Cadastro de projeto novo (IncluirProjeto, MO)
| Omie |
BPEX origem |
Notas |
codigo |
pedido_venda.id |
identificador único do orçamento no BPEX |
nome |
pedido_venda.id |
nome = mesmo do código (padrão Bepex) |
inativo |
hardcoded "N" |
sempre |
Erros Omie conhecidos e tratamento
| faultstring / mensagem |
faultcode |
Humanizado pelo Code1 |
tag [cProduto] ausente |
— |
"Produto(s) não cadastrado(s) no Omie: " |
Pedido de compra j(á cadastrado) |
— |
"Pedido já cadastrado no omie anteriormente" |
Cannot read properties of undefined (reading 'toLowerCase') [line 6] |
— |
"empresa emissora não definida" |
tag [nValUnit] ausente |
Client-105 |
"Existe campo valor unitário não preenchido" |
tag [nQtde] ausente |
Client-105 |
(não humanizado — bug do paired-item, fixar upstream) |
tag [codigo_produto_integracao] |
Client-103 |
(não humanizado — fixar adicionando o campo) |
existem registros para a |
— |
"Cliente provavelmente não cadastrado no Omie" |
Consumo redundante |
Client-6 |
"Omie bloqueou por consumo redundante (aguarde alguns minutos e reenvie)" |
já existe no Omie com descrição diferente |
(interno, Stop and Error) |
pass-through |
Exceção alumínio (MP, desde 2026-07-07): quando é produto de alumínio e a descrição do Omie difere da do BEPEX só pela posição do token "ALUMINIO"/espaços (ex.: Omie "ALUMINIO 6000 x 1000 x 1.2" vs BEPEX "6000 x 1000 x 1.2 ALUMINIO"), o nó Alum equivalente? trata como o mesmo produto e o Set Reaproveitado reusa o codigo_produto do Omie — não cai no Stop and Error. Detalhe do fluxo em arquitetura.md (§ MP, pegadinha 11); cronologia em bugs-fix-log.md (2026-07-07). Medida temporária até a base de alumínio no Omie ser normalizada.
Endpoints Omie utilizados
| Endpoint |
call |
Onde |
/api/v1/geral/produtos/ |
ListarProdutosResumido |
nó "Acha código do produto" (MP) |
/api/v1/geral/produtos/ |
ConsultarProduto |
nó "ConsultarProduto por codigo" (MP, ramo do código) |
/api/v1/geral/produtos/ |
IncluirProduto |
nó "IncluirProduto" (MP, auto-criar) |
/api/v1/geral/clientes/ |
ListarClientesResumido |
nó "Acha código do cliente" |
/api/v1/geral/projetos/ |
ListarProjetos / IncluirProjeto |
apenas MO |
/api/v1/produtos/pedidocompra/ |
IncluirPedCompra |
nó "adiciona pedido de compra" |
Limites Omie
- Consumo redundante — chamadas idênticas em < ~60s caem com "REDUNDANT". Por isso o batching
batchSize: 1, batchInterval: 1500 no "Acha código do produto".
- Códigos de campos —
codigo aceita até 60 chars, codigo_produto_integracao até 60 chars, codInt até 20 chars (atenção em probes de teste).
Body do webhook BPEX (POST do orçamento → n8n)
Estrutura aproximada (capturada de execuções reais):
{
"body": {
"id": <id da requisição>,
"data": <timestamp>,
"pedido_compra": {
"id": <PC id BPEX>,
"prazo_pagamento": "<string>",
"empresa_id": <int>,
"categoria_compra": "MP" | "MO"
},
"itens": [
{
"id": <id do item no PC>,
"quantidade": <number>,
"valor": <number/string>,
"valor_total": <number/string>,
"cliente": { "id": <>, "cnpj": "...", ... },
"pedido_venda": { "id": <PV id BPEX>, "empresa_id": <int>, ... },
"item": { "id": <item base id>, "nome": "...", "ncm": "...", "unidade_medida": "PCS", "preco_peca": <>, "peso_peca": <>, ... },
"pedido_venda_item": { "id": <>, "quantidade_mp": <>, ... },
"omie": {
"base": { "codigo": "BPXxxxxxxx-O", "descricao": "..." },
"mp": { "codigo": "BPX007175", "descricao": "2000 x 1200 x 1.25 GALVANIZADA" },
"mo": { "codigo": "BPXxxxxxxx-MO", "descricao": "..." },
"dobra":{ "codigo": "BPXxxxxxxx-PIN", "descricao": "..." }
}
}
]
}
}
Mesmo PC pode ter N items (vários PVs ou várias dimensões de chapa diferentes). Items com mesmo omie.mp.descricao aparecem duplicados intencionalmente — o dedupe acontece só pra busca do produto Omie, mas o produtos_incluir final preserva as duplicatas.
Credentials e tokens (resumo)
- n8n: sessão cookie + headers
browser-id / push-ref (ver skill n8n-bepex)
- Omie: app_key + app_secret no payload da chamada HTTP (sem header de auth)
- BPEX: o callback usa URL fixa configurada no nó "status de sucesso" (verificar parameters do nó pra detalhes)
- Chatwoot Bepex: account 3, inbox 26, via MCP (
mcp__46639869-4bfb-4c51-894b-388b0b3dc06a__*)