AgentSkillsCN

conciliando-odoo-po

在Odoo中执行采购订单(PO)与DFe的对账操作:拆分、合并、创建对账PO、调整余额。 适用场景: - 执行PO合并:“合并NF 12345的PO”、“执行订单拆分” - 创建对账PO:“创建对账PO”、“复制采购订单” - 调整PO余额:“减少PO数量”、“调整余额” - 撤销合并:“撤销合并”、“取消拆分” - 排查合并错误:“合并时出错”、“PO未创建” - 理解拆分/合并流程:“拆分是如何运作的?”、“什么是对账PO?” 不适用场景: - 仅需查询/追踪单据 → 可使用“追踪Odoo”技能 - 发现模型字段 → 可使用“发现Odoo结构”技能 - 创建付款或对账流水 → 可使用“执行Odoo财务”技能 - 排查NF与PO的匹配问题(验证阶段)→ 可使用“NF-PO验证”技能

SKILL.md
--- frontmatter
name: conciliando-odoo-po
description: |
  EXECUTA operacoes de conciliacao de Pedidos de Compra (PO) com DFe no Odoo: split, consolidacao, criacao de PO Conciliador, ajuste de saldos.

  USAR QUANDO:
  - Executar consolidacao de POs: "consolide os POs da NF 12345", "execute split do pedido"
  - Criar PO Conciliador: "crie PO conciliador", "duplique pedido de compra"
  - Ajustar saldo de PO: "reduza quantidade do PO", "ajuste saldo"
  - Reverter consolidacao: "reverta consolidacao", "desfaca split"
  - Depurar erro em consolidacao: "erro ao consolidar", "PO nao criado"
  - Entender fluxo split/consolidacao: "como funciona o split?", "o que e PO Conciliador?"

  NAO USAR QUANDO:
  - Apenas consultar/rastrear documentos -> usar rastreando-odoo
  - Descobrir campos de modelo -> usar descobrindo-odoo-estrutura
  - Criar pagamentos ou reconciliar extratos -> usar executando-odoo-financeiro
  - Depurar match NF x PO (fase de validacao) -> usar validacao-nf-po

Conciliando Odoo PO

Skill para EXECUTAR operacoes de Split e Consolidacao de Pedidos de Compra no Odoo.

Contexto

Quando uma NF-e (DFe) chega com quantidades diferentes dos POs existentes, o sistema precisa:

  1. Criar um PO Conciliador que casa 100% com a NF
  2. Ajustar os POs originais para ficarem com o saldo restante
  3. Vincular o DFe ao PO Conciliador

Operacoes Suportadas

OperacaoMetodoResultado
Simular consolidacaosimular_consolidacao()Preview sem executar no Odoo
Executar consolidacaoconsolidar_pos()PO Conciliador criado + POs ajustados
Reverter consolidacaoreverter_consolidacao()Desfaz acoes (best-effort)
Criar PO Conciliador_criar_po_conciliador()Duplica PO via copy()
Criar linha conciliador_criar_linha_po_conciliador()Duplica linha via copy()
Ajustar quantidade_ajustar_quantidade_linha()Reduz qtd no PO original
Vincular DFe ao PO_vincular_dfe_ao_po()Escreve dfe_id no PO
Cancelar PO vazio_cancelar_po()Cancela PO sem saldo

Arquivo Principal

app/recebimento/services/odoo_po_service.py (1281 linhas)

Classe Principal

python
from app.recebimento.services.odoo_po_service import OdooPoService

service = OdooPoService()

Fluxo Completo de Consolidacao

code
ENTRADA:
  - validacao_id (ValidacaoNfPoDfe com status='aprovado')
  - pos_para_consolidar: [{'po_id': 123, 'po_name': 'PO00123'}, ...]

PASSO 1: Buscar fornecedor_id pelo CNPJ
  → odoo.search('res.partner', [('l10n_br_cnpj', '=', cnpj_formatado)])

PASSO 2: Criar PO Conciliador VAZIO
  → copy(PO de referencia) com overrides: partner_id, date_order, origin, state=draft, order_line=False
  → Fallback: se copy() copiar linhas, remove-las via unlink

PASSO 3: Para CADA item da NF com match:
  → Para cada MatchAlocacao (suporte multi-PO):
    a) copy(linha de referencia) → nova linha no PO Conciliador com qtd_nf e preco_nf
    b) write(linha original) → reduzir product_qty no PO original

PASSO 4: Confirmar PO Conciliador
  → execute_kw('purchase.order', 'button_confirm', [po_id])

PASSO 5: Vincular DFe ao PO Conciliador
  → write('purchase.order', po_id, {'dfe_id': dfe_id})

Modelos Locais Envolvidos

ModeloTabelaUso
ValidacaoNfPoDfevalidacao_nf_po_dfeValidacao principal (status, resultado)
MatchNfPoItemmatch_nf_po_itemCada item da NF com match de PO
MatchAlocacaomatch_alocacaoAlocacao multi-PO (1 item NF → N POs)

Modelos Odoo Envolvidos

ModeloCampos PrincipaisOperacoes
purchase.ordername, partner_id, date_order, origin, state, order_line, dfe_idcopy, write, button_confirm, button_cancel
purchase.order.lineorder_id, product_id, product_qty, price_unit, qty_receivedcopy, write, unlink
res.partnerl10n_br_cnpjsearch

Metodo de Conexao Odoo

python
from app.odoo.utils.connection import get_odoo_connection

odoo = get_odoo_connection()
odoo.authenticate()

# UNICO metodo generico disponivel:
resultado = odoo.execute_kw(modelo, metodo, args, kwargs)

# Helpers especificos (wrapper de execute_kw):
odoo.search(modelo, domain, limit=None)
odoo.read(modelo, ids, fields)
odoo.write(modelo, id_ou_ids, values)
odoo.create(modelo, values)

IMPORTANTE: NAO existe odoo.execute()

A classe OdooConnection (app/odoo/utils/connection.py) possui APENAS:

  • execute_kw(model, method, args, kwargs) - generico
  • search(), read(), write(), create() - helpers

NUNCA usar odoo.execute() — nao existe e causara AttributeError.

Cenarios de Uso

SPLIT (1 NF parcial de 1 PO)

code
PO Original: 500 un produto X
NF chegou: 400 un produto X

Resultado:
  PO Original: 100 un (saldo)
  PO Conciliador (NOVO): 400 un → vinculado a NF

CONSOLIDACAO (1 NF com itens de N POs)

code
PO-A: 500 un produto X
PO-B: 500 un produto Y
NF chegou: 400 X + 400 Y

Resultado:
  PO-A: 100 un X (saldo)
  PO-B: 100 un Y (saldo)
  PO Conciliador (NOVO): 400 X + 400 Y → vinculado a NF

MULTI-PO SPLIT (1 item NF → N POs)

code
PO-A: 200 un produto X
PO-B: 300 un produto X
NF chegou: 450 un produto X

Resultado (via MatchAlocacao):
  PO-A: 0 un (consumido total, pode ser cancelado)
  PO-B: 50 un (saldo)
  PO Conciliador: 200 X (do PO-A) + 250 X (do PO-B) = 450 X

Pre-requisitos para Consolidacao

  1. Validacao com status='aprovado'
  2. MatchNfPoItem com status_match='match' para cada item
  3. MatchAlocacao com odoo_po_line_id preenchido para multi-PO
  4. Conexao Odoo funcional

Referencia Cruzada com Outras Skills

SkillQuando usar em vez desta
validacao-nf-poANTES da consolidacao (match, de-para, divergencias)
rastreando-odooCONSULTAR documentos (nao executar)
descobrindo-odoo-estruturaExplorar campos nao documentados
executando-odoo-financeiroOperacoes financeiras (pagamentos, extratos)