介绍
在 Odoo 中,模型定义了数据在数据库中的结构和存储方式。您处理的每一条业务数据,从销售订单到发票再到联系人,都存在于一个模型中。
理解 Odoo 模型对开发人员和功能顾问都至关重要。模型是 Odoo 数据架构的基础。它们定义了字段、关系和业务逻辑。
本文重点介绍销售模块中最重要的模型之一:sale.order.line。无论您是在构建自定义模块、集成外部系统,还是配置定价工作流程,您都将与该模型打交道。
什么是 sale.order.line 模型
sale.order.line模型表示Odoo中报价或销售订单上的单个行项目。每个行项通常对应一个产品,包含数量、价格和税务信息。
Odoo中的此模型由销售模块(sale)使用。它继承自analytic.mixin,用于项目成本跟踪和时间表集成。当您将产品添加到报价中时,您正在创建一个sale.order.line记录。
该模型在销售模块中定义。其他模块通过Odoo模型继承扩展它。例如,sale_stock添加与交付相关的字段。sale_margin添加利润计算。每个模块根据需要添加内容,而不重复核心结构。
模型中的关键字段
以下是sale.order.line模型中最重要的Odoo字段。理解这些将帮助您有效处理报价和销售订单。
1. order_id
类型:Many2one(sale.order)。必填。引用父销售订单。此字段将每个行项链接到其父项。当订单被删除时,行项也会被删除(级联)。
2. sequence
类型:整数。默认值10。控制订单上行项的显示顺序。用于对部分、备注和产品行进行排序。
3. company_id
类型:Many2one(res.company)。从order_id相关。用于多公司规则和访问控制。
4. currency_id
类型:Many2one(res.currency)。从order_id相关。用于行上的所有货币字段。确保定价的正确货币。
5. order_partner_id
类型:Many2one (res.partner)。从 order_id 相关。客户。用于价格表和税务规则。
6. salesman_id
类型:Many2one (res.users)。从 order_id 相关。销售人员。用于佣金和报告。
7. state
类型:选择。 从 order_id 相关。订单状态(草稿、已发送、销售、完成、取消)。决定哪些字段是可编辑的。
8. display_type
类型:选择。值:line_section 或 line_note。当设置时,该行是一个部分标题或备注,而不是产品行。产品字段为空。
9. is_downpayment
类型:布尔值。指示该行是否为预付款。预付款单独开票。
10. is_expense
类型:布尔值。当该行来自费用或供应商账单时为真。用于项目成本跟踪。
11. product_id
类型:Many2one (product.product)。正在销售的产品。域限制为可销售产品。产品行必需。
12. product_template_id
类型:Many2one (product.template)。从 product_id 计算得出。由产品配置器用于变体选择。
13. name
类型:文本。行描述。从产品和自定义属性计算得出。包括变体详细信息(如适用)。
14. product_uom_qty
类型:浮动。必需。订购数量。默认值为 1.0。可以由包装驱动。
15. product_uom
类型:Many2one (uom.uom)。计量单位。默认值来自产品。用于数量和定价。
16. tax_id
类型:Many2many (account.tax)。应用于该行的税费。从产品和财政位置计算得出。
17. 价格单位
类型:浮动。必填。每个产品单位的单价。根据价格表或产品计算。可以手动覆盖。
18. 折扣
类型:浮动。折扣百分比。在税前应用于价格单位。
19. 小计价格
类型:货币。税前小计。根据数量、单价和折扣计算。
20. 税额
类型:浮动。总税额。根据小计价格和税务ID计算。
21. 总价格
类型:货币。包含税的总金额。开票的主要金额。
22. 产品包装ID
类型:多对一(product.packaging)。可选包装(例如,12个装的盒子)。设置后,数量可以由包装驱动。
23. customer_lead
类型:浮动。交货时间(天)。从订单确认到发货之间的天数。用于交货日期计算。
24. qty_delivered
类型:浮动。交付数量。通过库存移动或手动更新。用于部分开票。
25. qty_invoiced
类型:浮动。已开票数量。从发票行计算得出。
26. qty_to_invoice
类型:浮动。剩余待开票数量。从已交付数量和已开票数量计算得出。
27. invoice_status
类型:选择。值:追加销售、已开票、待开票、无。指示该行的开票状态。
28. invoice_lines
类型:多对多(account.move.line)。链接到从此销售行创建的发票行。用于可追溯性。
29. 创建日期
类型:日期时间。记录创建的时间。由Odoo自动管理。
30. 修改日期
类型:日期时间。记录最后修改的时间。用于审计。
该模型在业务工作流程中的使用
1. 报价单和销售订单
当销售人员创建报价单时,他们会添加产品。每个产品成为一个 sale.order.line。行显示数量、价格、折扣和总计。当客户接受时,订单被确认。
2. 价格表和折扣
价格表按行应用。price_unit 和 discount 字段根据价格表规则计算。这里处理批量折扣或客户特定定价。
3. 交付和开票
当库存交付时,qty_delivered 会更新。可以按交付或一次性开票。invoice_status 字段指导用户剩余的开票内容。
4. 项目和服务
对于服务产品,行链接到项目任务和工时表。analytic.mixin 继承使得每个项目的成本跟踪成为可能。
5. 电子商务和门户
网站访问者将产品添加到购物车。每个购物车行在订单创建时变成 sale.order.line。产品配置器使用 product_template_id 和自定义属性。
开发人员如何扩展该模型
开发者使用多种模式扩展 sale.order.line。Odoo 模型继承是主要机制。
模型继承
使用 _inherit = 'sale.order.line' 来扩展模型。添加新字段,重写方法或添加约束。Odoo 中的继承模型将您的更改保存在单独的模块中,以便于升级。
添加字段
在您继承的模型中定义新的 Odoo 字段。使用正确的字段类型:Char、Many2one、Boolean、Integer、Text、Selection。考虑多公司的公司依赖字段。
Python 扩展
重写 _compute_price_unit、_compute_price_subtotal,或创建/写入以添加逻辑。使用 super() 调用原始方法。对计算字段及其依赖关系要小心。
Odoo Studio
Odoo Studio 让您无需代码即可添加字段。适合快速自定义。对于复杂逻辑或升级,自定义模块更易于维护。
最佳实践
- 使用 display_type 来处理部分和注释,而不是虚假的产品行。这可以保持报告的整洁。
- 在构建 API 集成时,通过 order_id 创建行。使用 sale.order 上的 order_line_ids 字段,并采用正确的命令格式。
- 遵守 SQL 约束。产品行必须具有 product_id 和 product_uom。部分或备注必须具有 display_type。
- 对于自定义定价,尽可能使用价格表规则。仅在需要价格表不支持的逻辑时覆盖计算方法。
- 对于自定义字段,使用
x_前缀或模块前缀,以避免与未来的 Odoo 版本发生冲突。
常见错误
- 创建没有 order_id 的行。该字段是必需的。始终在订单的上下文中创建行。
- 混淆 product_id 和 product_template_id。对于产品行,设置 product_id。对于配置器流程,使用 product_template_id 选择变体。
- 在开票后修改 price_unit 或 discount。一旦 qty_invoiced 大于零,价格变更可能会导致不一致。
- 覆盖核心方法而不调用 super()。这可能会破坏其他模块或未来的升级。
- 忘记为部分或备注行设置 display_type。没有它,该行将被视为产品行并将失败验证。
结论
sale.order.line 模型是 Odoo 销售的核心。它存储报价和订单中的每个产品行。理解其字段以及模块如何扩展它将帮助您有效配置、定制和集成 Odoo。
无论您是映射业务流程的功能顾问,还是构建自定义模块的开发人员,深入了解 sale.order.line 将节省时间并防止错误。
需要帮助进行 Odoo 实施吗?
Dasolo 帮助公司实施、定制和优化 Odoo。我们专注于 API 集成和 Odoo 开发。我们的团队在 Odoo 数据架构和像 sale.order.line 这样的模型方面具有深厚的经验。
如果您需要帮助进行 Odoo 实施、自定义模块或集成,我们随时为您提供帮助。 预约演示 以讨论您的项目。