Odoo 15中如何为report.pos.order添加margin_percent度量字段
在Odoo 15中为report.pos.order添加margin_percent度量
实现步骤
因为report.pos.order通过拆分_select/_from/_group_by方法构建视图,而非使用_query(),所以你需要通过继承模型并重写对应方法来添加新度量:
继承模型并添加字段
首先继承report.pos.order模型,新增margin_percent字段:from odoo import models, fields, tools class PosOrderReport(models.Model): _inherit = "report.pos.order" margin_percent = fields.Float(string='Margin Percentage', readonly=True, group_operator="avg")重写
_select方法,添加计算逻辑
追加margin_percent的SQL计算语句到原有SELECT部分,注意处理除数为0的情况避免报错:def _select(self): # 获取父类原有SELECT语句 base_select = super()._select() # 构造margin_percent的SQL计算逻辑 margin_percent_sql = """ , CASE WHEN SUM(l.qty * l.price_unit / CASE COALESCE(s.currency_rate, 0) WHEN 0 THEN 1.0 ELSE s.currency_rate END) = 0 THEN 0.0 ELSE (SUM(l.price_subtotal - l.total_cost / CASE COALESCE(s.currency_rate, 0) WHEN 0 THEN 1.0 ELSE s.currency_rate END) / SUM(l.qty * l.price_unit / CASE COALESCE(s.currency_rate, 0) WHEN 0 THEN 1.0 ELSE s.currency_rate END)) * 100 END AS margin_percent """ # 拼接并返回完整SELECT语句 return base_select.rstrip() + margin_percent_sql重写
init方法触发视图重建
调用父类的init方法,确保模块升级时重新创建包含新字段的视图:def init(self): super().init()
注意事项
- 确保你的模块在
__manifest__.py中添加依赖:'depends': ['point_of_sale'] - 升级模块后,Odoo会自动重新执行视图创建逻辑,新字段将被包含到报表视图中
- 若要在POS报表的前端界面显示该字段,需要修改对应的看板或列表视图,添加
margin_percent字段
内容的提问来源于stack exchange,提问作者odoo newbie
相关产品推荐
相关产品推荐

