
关于
在 Odoo 中实现 EDI(电子数据交换)的指南:X12、EDIFACT 文档映射、合作伙伴接入和自动化订单处理。
name: odoo-edi-connector description: "Odoo EDI(电子数据交换)实施指南:X12、EDIFACT文档映射、贸易伙伴接入和自动化订单处理。" risk: unknown source: community
Odoo EDI 连接器
概述
电子数据交换(EDI)是自动化B2B文档交换的标准——采购订单、发票、ASN(预先发货通知)。此技能指导你将EDI事务(ANSI X12或EDIFACT)映射到Odoo业务对象、设置贸易伙伴配置以及自动化入站/出站文档流。
何时使用此技能
- 零售合作伙伴要求EDI 850(采购订单)才能与你做生意。
- 你需要在货物发运时发送EDI 856(ASN)。
- 从Odoo确认的交付自动生成EDI 810(发票)。
- 为新贸易伙伴映射EDI字段到Odoo字段。
工作原理
- 激活:提及
@odoo-edi-connector并指定EDI事务集和贸易伙伴。 - 映射:获取EDI段和Odoo字段之间的完整字段映射表。
- 自动化:获取Python代码来解析传入的EDI文件并创建Odoo记录。
EDI ↔ Odoo 对象映射
| EDI事务 | Odoo对象 |
|---|---|
| 850 采购订单 | sale.order(入站客户PO) |
| 855 PO确认 | 确认邮件 / SO确认 |
| 856 ASN(预先发货通知) | stock.picking(交付订单) |
| 810 发票 | account.move(客户发票) |
| 846 库存查询 | product.product 库存水平 |
| 997 功能确认 | 自动接收确认 |
示例
示例1:解析EDI 850并创建Odoo销售订单(Python)
from pyx12 import x12file # pip install pyx12
from datetime import datetime
import xmlrpc.client
import os
odoo_url = os.getenv("ODOO_URL")
db = os.getenv("ODOO_DB")
pwd = os.getenv("ODOO_API_KEY")
uid = int(os.getenv("ODOO_UID", "2"))
models = xmlrpc.client.ServerProxy(f"{odoo_url}/xmlrpc/2/object")
def process_850(edi_file_path):
"""Parse X12 850 Purchase Order and create Odoo Sale Order"""
with x12file.X12File(edi_file_path) as f:
for transaction in f.get_transaction_sets():
# Extract header info (BEG segment)
po_number = transaction['BEG'][3] # Purchase Order Number
po_date = transaction['BEG'][5] # Purchase Order Date
# IDEMPOTENCY CHECK: Verify PO doesn't already exist in Odoo
existing = models.execute_kw(db, uid, pwd, 'sale.order', 'search', [
[['client_order_ref', '=', po_number]]
])
if existing:
print(f"Skipping: PO {po_number} already exists.")
continue
# Extract partner (N1 segment — Buyer)
# Extract partner (N1 segment — Buyer)
partner_name = transaction.get_segment('N1')[2] if transaction.get_segment('N1') else "Unknown"
# Find partner in Odoo
partner = models.execute_kw(db, uid, pwd, 'res.partner', 'search',
[[['name', 'ilike', partner_name]]])
if not partner:
print(f"Error: Partner '{partner_name}' not found. Skipping transaction.")
continue
partner_id = partner[0]
# Extract line items (PO1 segments)
order_lines = []
for po1 in transaction.get_segments('PO1'):
sku = po1[7] # Product ID
qty = float(po1[2])
price = float(po1[4])
product = models.execute_kw(db, uid, pwd, 'product.product', 'search',
[[['default_code', '=', sku]]])
if product:
order_lines.append((0, 0, {
'product_id': product[0],
'product_uom_qty': qty,
'price_unit': price,
}))
# Create Sale Order
if partner_id and order_lines:
models.execute_kw(db, uid, pwd, 'sale.order', 'create', [{
'partner_id': partner_id,
'client_order_ref': po_number,
'order_line': order_lines,
}])
示例2:发送EDI 997确认
def generate_997(isa_control, gs_control, transaction_control):
"""Generate a functional acknowledgment for received EDI"""
today = datetime.now().strftime('%y%m%d')
return f"""ISA*00* *00* *ZZ*YOURISAID *ZZ*PARTNERISAID *{today}*1200*^*00501*{isa_control}*0*
兼容工具
Claude CodeCursor
标签
AI与机器学习