Ponto de partida
Como ler o mapa
O domínio de um sistema de compras se organiza em três camadas, e a confusão entre elas é a origem de quase todo retrabalho de modelagem. A camada mestre descreve o mundo — existe antes de qualquer transação e sobrevive a todas elas. A espinha transacional é o ciclo do gasto: cada documento nasce do anterior, carrega um instante congelado dos mestres e nunca mais muda de significado. As camadas transversais não são módulos, são capacidades que todo agregado consome.
Mestre muda; documento não. Preço, fator de conversão, cadeia de aprovação e dados do fornecedor são copiados para a linha no momento em que ela é criada. Sem isso, editar um cadastro reescreve o passado.
Cada documento tem um antecessor rastreável. Requisição → cotação → pedido → recebimento → nota. A linha guarda de onde veio, e é essa corrente que sustenta saldo, três vias e indicador de fornecedor.
O que é transversal não vira campo. Anexo, auditoria, notificação, numeração e motivo aparecem em oito agregados. Modelados um a um, viram oito implementações divergentes.
Visão do todo
Mapa do domínio
Contract, o ItemSupplier e a árvore de categorias precisam ser consultados de novo, e só na criação da linha seguinte.Já fechado
Camada mestre
Nove agregados especificados entre 27 e 30 de agosto de 2026. Nada implementado no domínio de compras — o levantamento de negócio ainda está em curso.
A árvore que responde quem paga. Caminho materializado com profundidade livre, código imutável, duas portas de status com cascata assimétrica e path como token de concorrência — mecânica preservada da v1.0. Novo: escopo por empresa (nó corporativo ou de uma LegalEntity), vigência própria para obra e projeto, e allowsPosting — só folha recebe lançamento.
O responsável pelo nó, com papel (Owner, Deputy, Watcher), vigência e alçada própria. Substitui o campo managerUserId. Resolve: substituto, co-gestão e — o que importa de verdade — a pergunta "quem tinha autoridade nesta data", que um campo único não sabe responder. Ausente no nó, resolve subindo a árvore.
Agregado único que descreve matéria-prima, produto acabado, MRO, serviço, assinatura e ativo. Descrição gerada de basicName + atributos, com attributeSignature como chave de antiduplicidade. Resolve: o que exatamente está sendo comprado, com precisão suficiente para cotar, comparar, aprovar e conferir — e sem o campo-texto livre que transforma catálogo em lixeira.
Entidade de configuração por tenant, não enum. Dirige field selection, classes de unidade permitidas e destinação padrão. Resolve: um único cadastro atender indústria e serviço sem virar formulário com quarenta campos opcionais.
Nó de taxonomia auto-relacionado, com maxDepth configurável (default 2) e classificação só em folha. Resolve: a categoria de sourcing — o eixo do mercado fornecedor, distinto do NCM (natureza física) e da conta contábil (reporte). É também onde a regra de aprovação se amarra, guardando o nó e valendo por rollup.
Catálogo global + camada do tenant, sigla local de até 6 caracteres como chave, conversão em numerador/denominador inteiros e hierarquia ItemSupplier > Item > global > erro. Resolve: que o comparativo de cotações signifique alguma coisa. É o módulo mais curto e o de maior consequência: sem ele, 84 unidades viram 84 caixas.
Raiz de 8 dígitos do CNPJ, com certidão federal, CRF, CNDT, regime tributário e quadro societário. Resolve: grupo econômico derivado, homologação escopada por categoria, estado Prospect que cota sem receber pedido, e a separação entre documento enviado e verificação em fonte oficial.
CNPJ de 14 — filial, com situação cadastral, IE, IM, alvará e licença ambiental próprios. Resolve: a filial baixada com a matriz ativa, que nenhum cadastro de nível único enxerga. É também o nível que emite a nota e recebe o pedido.
A junção entre catálogo e fornecimento: preço, prazo, MOQ, múltiplo, código no fornecedor e unidade de compra. Resolve: tirar do item tudo que é negociado. Precedência na linha: contrato > ItemSupplier > Item — e é justamente o topo dessa precedência que ainda não existe como entidade.
Especificado · 30/08/2026
Motor de aprovação
Não é uma entidade — são nove, em duas camadas. Um motor só, genérico por processo, para requisição, cotação, pedido, contrato, homologação de fornecedor e alteração bancária.
- ApprovalProcess — o que é aprovável, e o que "valor" significa naquele documento
- ApprovalPolicy — a regra, versionada.
Baseconcorre por prioridade;Complementarempilha - ApprovalCriteria — dez critérios; nó de centro de custo e de categoria valem por rollup
- ApprovalLevel — tipo de aprovador, modo dentro do nível, SLA, valor de ativação, escopo
- ApprovalGroup — comitês
- ApprovalDelegation — ausência temporária, com escopo e teto
- ApprovalRequest — a instância, com a cadeia congelada e as versões das políticas que a formaram
- ApprovalStep — o nível resolvido, com escopo: documento, linha ou fatia de rateio
- ApprovalAssignment — a tarefa de uma pessoa. É a entidade que faltava, e sem ela não existe fila endereçável, aprovação por papel, delegação registrada nem paralelo dentro do nível
- ApprovalEvent — append-only. O estado é projeção; a trilha é a fonte
Abrir a especificação completa do Fluxo de Aprovação →
A decisão que reorganiza tudo: a cadeia é congelada na submissão e as pessoas são resolvidas na ativação de cada passo. O que a política decidiu não muda quando alguém edita a configuração; quem aprova é sempre quem responde pelo nó hoje. As cinco decisões que estavam em aberto desde junho caem como consequência disso e do escopo do passo.
A construir · prioridade máxima
Espinha transacional
Sem estes seis, o Nexio é um cadastro. Com eles, é um sistema de compras.
O que é: a demanda interna — quem pediu, para qual centro de custo, qual item, quantidade, data necessária, justificativa. Cabeçalho com N linhas.
O que resolve: dá origem a tudo. É o objeto que entra no fluxo de aprovação, que se agrupa em cotação e que se converte em pedido, mantendo rastreabilidade da linha até a nota.
Decisões que nascem aqui: rateio de centro de custo por linha (padrão no Brasil desde o Protheus v10 — e a alçada deve avaliar a fatia rateada, não o total); linha de catálogo versus free-text para o que não está cadastrado; e agrupamento de requisições de vários solicitantes numa única cotação.
Saiu da lista de pendências. O motor está especificado em nove entidades e independe de qual documento o aciona — a Requisição só precisa submeter um assunto com valor, empresa, requisitante e linhas.
O que a Requisição ainda precisa entregar a ele: o rateio por linha (que o Centro de Custo v2.0 já define como CostAllocation) e o evento de alteração que dispara a reavaliação.
O que é: o evento de sourcing — convite a N fornecedores, com SupplierQuote e QuoteLine como respostas, em rodadas.
O que resolve: o mapa comparativo com frete, impostos e prazo equalizados; a negociação em mais de uma rodada; e a justificativa obrigatória quando o escolhido não é o menor preço, que é o controle que auditoria efetivamente cobra.
Decisões que nascem aqui: o fornecedor responde por portal ou por planilha importada; o comparativo honra o "não comparável" da classe Serviço já decidido em UoM; e o Prospect pode ser convidado, mas o vencedor precisa estar homologado na categoria antes de virar pedido.
O que é: o compromisso legal com o fornecedor. Cabeçalho, linhas e cronograma de entrega (a mesma linha entregue em parcelas com datas distintas).
O que resolve: preço, quantidade, condição de pagamento, local de entrega, moeda e status aberto / parcial / fechado. É onde o priceQty e o snapshot do fator de conversão viram dinheiro de verdade.
Decisões que nascem aqui: alteração de pedido já enviado é versão nova, não update — e alteração acima de tolerância volta para aprovação; envio e aceite pelo fornecedor; e conversão parcial de requisição (uma requisição vira dois pedidos para fornecedores diferentes).
O que é: o recebimento — quantidade recebida, divergência, aceite ou rejeição, devolução, recebimento parcial, quem recebeu e quando.
O que resolve: é o "R" do three-way match e a fonte do desempenho do fornecedor — OTIF, atraso e divergência calculados do fato, não de formulário de avaliação. A spec de Fornecedor já promete esse indicador; ele só existe se o recebimento existir.
Decisões que nascem aqui: serviço precisa de um irmão — medição e aceite de serviço, no espírito do service entry sheet do SAP. Recebimento físico não modela hora trabalhada nem entrega parcial de projeto.
O que é: a nota do fornecedor entrando no sistema — XML da NF-e, chave de acesso, itens, impostos.
O que resolve: a conferência automática pedido × recebimento × nota, com tolerância configurável por tipo de divergência e bloqueio explícito quando estoura. É o que transforma o Nexio de ferramenta de compra em controle de gasto.
Decisões que nascem aqui: a fronteira com o financeiro. A recomendação é conciliar e liberar, não pagar — contas a pagar fica no ERP. Entra também a manifestação do destinatário e o que fazer com nota sem pedido.
A construir · decidir cedo
Estruturais
Baratos agora, caríssimos depois — todos mudam a chave primária ou a dimensionalidade de agregados que já vão existir.
Empresa e filial dentro do tenant. Hoje TenantSettings tem um único CNPJ, o que força grupo econômico a virar N tenants — duplicando catálogo, centro de custo, alçada e usuário. Resolve: no Brasil, empresa e filial são dimensão de regra de aprovação, de numeração de documento e de nota fiscal. É a decisão mais cara de adiar: entra na chave de quase todo agregado transacional.
O eixo contábil ausente. Conta contábil mais o mapping set categoria → conta, amarrável em qualquer nível da árvore, no padrão Oracle. Resolve: cliente vindo do Protheus amarra alçada em entidade contábil — centro de custo, conta, classe de valor. Sem esse eixo, o Nexio não conversa com o razão e a integração com o ERP vira digitação.
Já é o topo da precedência de preço e não existe como entidade. Preço negociado com vigência, volume comprometido, saldo consumido (contrato guarda-chuva com liberação parcial), reajuste por índice, renovação e SLA. Resolve: compra recorrente sem RFQ toda vez — é o que separa um sistema de cotação de um sistema de compras.
Armazém, filial, obra. Resolve: para onde entrega e qual CNPJ recebe — que é dimensão fiscal (ICMS interestadual muda com a UF de destino). Depende de LegalEntity; modelado antes dela, nasce errado.
Verba por centro de custo × conta × período, com empenho na aprovação da requisição ou na emissão do pedido, e política de estouro configurável (avisar ou bloquear). Resolve: a pergunta de primeira reunião comercial no Brasil. Coupa, Oracle e Precoro vendem controle orçamentário como diferencial; sem ele o comprador aprova no escuro.
A construir · capacidades
Transversais
Anexo com escopo, tipo e retenção. Já aparece em item, fornecedor, requisição, cotação, pedido e contrato. Uma implementação, seis consumidores.
Quem mudou o quê, quando e de onde. Não é opcional em compras — é o que sustenta segregação de função e resposta a auditoria interna.
Template, canal e preferência. Fluxo de aprovação sem notificação não funciona: o aprovador não entra no sistema para descobrir que tem fila.
Numeração por tenant, empresa e tipo de documento. Parece detalhe e sempre vira migração dolorosa, porque o número já foi impresso e enviado ao fornecedor.
Referência externa em fornecedor, item, centro de custo e pedido, mais fila de saída para o ERP. O Nexio quase sempre vai conviver com Protheus, SAP ou Omie — não substituí-los.
Motivo configurável para rejeição, cancelamento, devolução e escolha de fornecedor. Campo-texto livre aqui é dado que nunca vira relatório.
Decisões de tamanho
Fronteiras do produto
1. Portal do fornecedor — a decidir, e muda tudo
Sem portal, todo documento de homologação, toda proposta de RFQ e toda confirmação de pedido entram por e-mail e alguém digita — e metade do valor das specs de Fornecedor e Cotação evapora. Com portal, você ganha um segundo tipo de usuário, autenticação externa, superfície de segurança e um roadmap paralelo. Ariba Network, Coupa Supplier Portal, Mercado Eletrônico e Nimbi vivem disso. É a maior decisão de escopo em aberto.
2. Onde o Nexio para no financeiro
Recomendação: parar no match e na liberação para pagamento. Contas a pagar, fluxo de caixa e conciliação bancária são território de ERP, e entrar neles multiplica a superfície fiscal e contábil sem aumentar o diferencial competitivo.
3. Estoque continua fora
Já declarado fora de escopo, com ItemType.controlsStock sempre false como gancho. Vale reconfirmar agora, porque Requisição e Recebimento vão puxar por ele — "requisição contra saldo" e "recebimento que dá entrada" são pedidos que aparecem na primeira demo.
Recomendação
Sequenciamento
| # | Módulo | Depende de | Desbloqueia | Custo de adiar |
|---|---|---|---|---|
| 1 | LegalEntity + GLAccount | Centro de Custo v2.0 feito | numeração, alçada, integração, todo agregado transacional | alto |
| 2 | Requisition | Item, CC, UoM, LegalEntity | o produto começa a existir | — |
| 3 | Motor de aprovação | Requisition especificado | a promessa central do Nexio | — |
| 4 | PurchaseOrder | Requisition, ItemSupplier | Receipt, Invoice, indicador de fornecedor | — |
| 5 | Receipt | PurchaseOrder | OTIF, three-way match | — |
| 6 | QuotationRequest | Requisition, Fornecedor | sourcing e negociação | médio |
| 7 | Contract | ItemSupplier, Quotation | compra recorrente sem RFQ | médio |
| 8 | Invoice + match | PO, Receipt | controle de gasto | — |
| 9 | Budget | GLAccount, CC | bloqueio por verba | baixo |
Por que cotação vem depois do pedido. Parece contraintuitivo — no fluxo real a cotação vem antes. Mas o caminho mais curto até um produto utilizável é requisição → aprovação → pedido: já existe cliente que compra de fornecedor fixo e só precisa de controle de alçada. Cotação é o módulo mais caro (rodadas, equalização, resposta do fornecedor) e o mais dependente da decisão sobre portal. Especificar depois do pedido significa especificá-lo já sabendo como a linha de documento se comporta.
Aferição
Referência de mercado
Nenhuma entidade proposta aqui é invenção — todas existem, com nomes diferentes, nos produtos que o Nexio vai encontrar em concorrência.
| Nexio | SAP Ariba | Coupa | Oracle Procurement | Protheus |
|---|---|---|---|---|
| Requisition | Requisition | Requisition | Requisition | Solicitação de Compra |
| ApprovalPolicy · Request | Approval Flow | Approval Chain | Approval Task (BPM) | Alçadas de aprovação |
| QuotationRequest | Sourcing Event / RFx | Sourcing Event | Negotiation | Cotação |
| PurchaseOrder | Purchase Order | Purchase Order | Purchase Order | Pedido de Compra |
| Receipt | Goods Receipt | Receipt | Receiving | Documento de Entrada |
| Invoice + match | Invoice Reconciliation | Invoice / AP | Invoice Matching | Pré-nota e classificação |
| Contract | Ariba Contracts | Contracts / CLM | Blanket & Contract Purchase Agreement | Contratos de Parceria |
| Budget | Spend control | Budgets | Budgetary Control | Controle Orçamentário |
| LegalEntity | Business Unit | Business Group | Business Unit / Legal Entity | Empresa e Filial |
| Portal do fornecedor | Ariba Network | Coupa Supplier Portal | Supplier Portal | Portal de Compras |
Carregado das specs anteriores
Pendências herdadas
- Esquema de atributos semente por setor versus cada tenant desenhar o seu
- Extração assistida por LLM na importação — MVP ou depois
- Mapeamento categoria → conta contábil — vira o
GLAccount. A forma da relação já está fixada no Centro de Custo v2.0; falta o plano de contas - Multi-empresa / múltiplos CNPJs — vira o
LegalEntity. OlegalEntityIdjá nasce no nó de centro de custo
- Fonte de consulta ao CNPJ: base própria dos dados abertos versus serviço comercial com SLA
- O Nexio guarda dado bancário ou só referencia o ERP
- Base compartilhada de fornecedores entre tenants — decisão jurídica antes de produto
- Embalagem que muda: nova versão do
ItemSupplierou novo código de unidade (CX10)
LegalEntity e GLAccount continuam sendo o bloqueio. Apareceram em quatro specs seguidas como "decidir depois". O Centro de Custo v2.0 já reservou o lugar das duas — legalEntityId no nó e a conta na fatia de rateio — mas nenhuma delas existe. A partir do momento em que a primeira linha de requisição for gravada, as duas entram na chave de todo documento, e "depois" passa a custar migração de dados transacionais em vez de uma tarde de modelagem.