通过 Odoo 中的销售订单通知购买
Notify purchases by Sale Order in Odoo
我们在一家工业工厂工作,采购负责人必须向 CEO 告知任何采购制造 material 销售订单产品的采购。
例如,我们有一个 销售订单 SO00005
,其中包含产品 [856A3779G02] PULLER – PLATFORM, FAN BLADE
,它有自己的 BoM
并且还有MTO
和 Manufacture
路线。
系统新建了一个PO,负责编辑和处理路线,确认后,我们必须给CEO发这样一条信息:
SO00005 adlı [856A3779G02] PULLER – PLATFORM, FAN BLADE projesi için
toplam maliyet 100.0₺'dir.
SO00005 adlı [856A3779G02] PULLER – PLATFORM, FAN BLADE şindiye
kadarki toplam maliyet 1175.0₺.
第一个表示当前 material 价格,第二个表示每个 销售订单 .
的总价
我们该如何处理?
首先,我们将从通知流程开始。我们可以在这里使用 automated action 以使此操作尽可能简单。
自动操作
我们转到 Settings > Technical > Automation > Automated Actions
(不要忘记安装 base_automation 模块),然后我们使用下一个参数创建一个新操作:
Model: purchase.order
, 我们想在 CONFIRM ORDER 按钮被点击时通知,改变当前 采购订单 状态到采购。
触发条件:更新时,我们希望在确认采购订单时发送此通知,这意味着,当采购Order 将其 state 更改为 purchase
。
更新域之前:因此,之前的域将是所有当前草稿,以批准或通过电子邮件发送采购订单,["|","|",["state","=","draft"],["state","=","sent"],["state","=","to approve"]]
。
申请:我们将在采购订单的状态更改为purchase
、[["state","=","purchase"]]
时发送此邮件。
Action To Do:最后,我们将申请一个python代码,以获取所需信息并将其发送给老板。
Python代码
我们决定使用 python
代码,因为在代码中迭代对象更容易;我们的意思是,我们也可以将电子邮件发送为 待办事项,但在这种情况下,我们需要将 purchase.order.line
作为小时模式,这可能会更难。
现在,最简单的方法是向 Odoo 内部的通道发送消息,尽可能多地在系统中保留过程。因此,在创建此操作之前,我们必须在讨论模块中 create a private or public channel。
继续代码,我们将获取此通道以向其发送消息:
channel = env['mail.channel'].search([('name', '=', 'purchases-notify')])
channel.ensure_one()
此外,我们需要 CEO 经理合伙人:
boss = env['res.partner'].search([('function', '=', 'CEO')])
现在,我们将遍历行中的采购订单处理信息;我们必须在这里选择,默认情况下,Odoo中的tracking purchases and other expenses使用会计模块和流程,这意味着我们必须在[=]中的每一行添加分析账户84=]Purchase Order,而且,如果 PO 有很多不同的产品,那可能会很烦人。我们将使用其他方法。
制造订单和销售订单生成采购组基于采购规则和采购组 has a unique Sale Order origin,对我们来说是双重优势;第一个是我们可以通过这个关系得到product的名字;这个 PG 的名字也是 SO。
默认情况下 Odoo 不会将每个采购行拆分为 PG 组,如果 product 或 product variant 和 uom 是一样的,我们也不知道哪个是 PG 它线的起点;要解决这个问题,我们必须安装 purchase_line_procurement_group module from OCA.
我们有下一个代码:
for line in record.order_line:
procurement_group = line.procurement_group_id
product = env['sale.order'].search([('id', '=', procurement_group.sale_id.id)]).order_line[0].name
sub_total = line.price_subtotal
从 price_subtotal
字段获取该行的产品成本。
但是我们想要获得 SO 的总成本:我们首先获得与当前行的 PG,然后,我们对它们进行迭代,只求和 PO 也被确认的行:
purchase_order_lines_list = env['purchase.order.line'].search([('procurement_group_id','=',procurement_group.id)])
total = 0
for line in purchase_order_lines_list:
if line.order_id.state == 'purchase':
total += line.price_subtotal
第二个优势,正如我们在上面的代码中看到的那样:由于每个 PG 只有一个 SO 来源,我们不需要必须使用 procurement_group_id.sale_id.id
字段进行搜索,因为 PG ID 将仅与一个 SO 关联,而不会与其他关联。
我们已经拥有了所有需要的信息,然后,我们将为 PO 中的每一行发送一条新消息:
post_vars = {
'subject': "Purchase {}".format(record.name),
'body': '''<p>Mr. <strong>{0}</strong>,</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> projesi için toplam maliyet <strong>{3}{4}</strong>'dir.</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> şindiye kadarki toplam maliyet <strong>{5}{4}</strong>.</p>'''.format(boss.name, procurement_group.name, product, sub_total, line.currency_id.symbol, total)
}
channel.message_post(type="notification", subtype="mt_comment", **post_vars)
我们必须添加货币符号,作为行中的一个字段存在,即line.currency_id.symbol
。
最后,我们的完整代码将是:
channel = env['mail.channel'].search([('name', '=', 'purchases-notify')])
channel.ensure_one()
boss = env['res.partner'].search([('function', '=', 'CEO')])
for line in record.order_line:
procurement_group = line.procurement_group_id
product = env['sale.order'].search([('id', '=', procurement_group.sale_id.id)]).order_line[0].name
sub_total = line.price_subtotal
purchase_order_lines_list = env['purchase.order.line'].search([('procurement_group_id','=',procurement_group.id)])
total = 0
for line in purchase_order_lines_list:
if line.order_id.state == 'purchase':
total += line.price_subtotal
post_vars = {
'subject': "Purchase {}".format(record.name),
'body': '''<p>Mr. <strong>{0}</strong>,</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> projesi için toplam maliyet <strong>{3}{4}</strong>'dir.</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> şindiye kadarki toplam maliyet <strong>{5}{4}</strong>.</p>'''.format(boss.name, procurement_group.name, product, sub_total, line.currency_id.symbol, total)
}
channel.message_post(type="notification", subtype="mt_comment", **post_vars)
每确认一个PO,我们就会得到下一个:
我们在一家工业工厂工作,采购负责人必须向 CEO 告知任何采购制造 material 销售订单产品的采购。
例如,我们有一个 销售订单 SO00005
,其中包含产品 [856A3779G02] PULLER – PLATFORM, FAN BLADE
,它有自己的 BoM
并且还有MTO
和 Manufacture
路线。
系统新建了一个PO,负责编辑和处理路线,确认后,我们必须给CEO发这样一条信息:
SO00005 adlı [856A3779G02] PULLER – PLATFORM, FAN BLADE projesi için toplam maliyet 100.0₺'dir.
SO00005 adlı [856A3779G02] PULLER – PLATFORM, FAN BLADE şindiye kadarki toplam maliyet 1175.0₺.
第一个表示当前 material 价格,第二个表示每个 销售订单 .
的总价我们该如何处理?
首先,我们将从通知流程开始。我们可以在这里使用 automated action 以使此操作尽可能简单。
自动操作
我们转到 Settings > Technical > Automation > Automated Actions
(不要忘记安装 base_automation 模块),然后我们使用下一个参数创建一个新操作:
Model: purchase.order
, 我们想在 CONFIRM ORDER 按钮被点击时通知,改变当前 采购订单 状态到采购。
触发条件:更新时,我们希望在确认采购订单时发送此通知,这意味着,当采购Order 将其 state 更改为 purchase
。
更新域之前:因此,之前的域将是所有当前草稿,以批准或通过电子邮件发送采购订单,["|","|",["state","=","draft"],["state","=","sent"],["state","=","to approve"]]
。
申请:我们将在采购订单的状态更改为purchase
、[["state","=","purchase"]]
时发送此邮件。
Action To Do:最后,我们将申请一个python代码,以获取所需信息并将其发送给老板。
Python代码
我们决定使用 python
代码,因为在代码中迭代对象更容易;我们的意思是,我们也可以将电子邮件发送为 待办事项,但在这种情况下,我们需要将 purchase.order.line
作为小时模式,这可能会更难。
现在,最简单的方法是向 Odoo 内部的通道发送消息,尽可能多地在系统中保留过程。因此,在创建此操作之前,我们必须在讨论模块中 create a private or public channel。
继续代码,我们将获取此通道以向其发送消息:
channel = env['mail.channel'].search([('name', '=', 'purchases-notify')])
channel.ensure_one()
此外,我们需要 CEO 经理合伙人:
boss = env['res.partner'].search([('function', '=', 'CEO')])
现在,我们将遍历行中的采购订单处理信息;我们必须在这里选择,默认情况下,Odoo中的tracking purchases and other expenses使用会计模块和流程,这意味着我们必须在[=]中的每一行添加分析账户84=]Purchase Order,而且,如果 PO 有很多不同的产品,那可能会很烦人。我们将使用其他方法。
制造订单和销售订单生成采购组基于采购规则和采购组 has a unique Sale Order origin,对我们来说是双重优势;第一个是我们可以通过这个关系得到product的名字;这个 PG 的名字也是 SO。
默认情况下 Odoo 不会将每个采购行拆分为 PG 组,如果 product 或 product variant 和 uom 是一样的,我们也不知道哪个是 PG 它线的起点;要解决这个问题,我们必须安装 purchase_line_procurement_group module from OCA.
我们有下一个代码:
for line in record.order_line:
procurement_group = line.procurement_group_id
product = env['sale.order'].search([('id', '=', procurement_group.sale_id.id)]).order_line[0].name
sub_total = line.price_subtotal
从 price_subtotal
字段获取该行的产品成本。
但是我们想要获得 SO 的总成本:我们首先获得与当前行的 PG,然后,我们对它们进行迭代,只求和 PO 也被确认的行:
purchase_order_lines_list = env['purchase.order.line'].search([('procurement_group_id','=',procurement_group.id)])
total = 0
for line in purchase_order_lines_list:
if line.order_id.state == 'purchase':
total += line.price_subtotal
第二个优势,正如我们在上面的代码中看到的那样:由于每个 PG 只有一个 SO 来源,我们不需要必须使用 procurement_group_id.sale_id.id
字段进行搜索,因为 PG ID 将仅与一个 SO 关联,而不会与其他关联。
我们已经拥有了所有需要的信息,然后,我们将为 PO 中的每一行发送一条新消息:
post_vars = {
'subject': "Purchase {}".format(record.name),
'body': '''<p>Mr. <strong>{0}</strong>,</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> projesi için toplam maliyet <strong>{3}{4}</strong>'dir.</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> şindiye kadarki toplam maliyet <strong>{5}{4}</strong>.</p>'''.format(boss.name, procurement_group.name, product, sub_total, line.currency_id.symbol, total)
}
channel.message_post(type="notification", subtype="mt_comment", **post_vars)
我们必须添加货币符号,作为行中的一个字段存在,即line.currency_id.symbol
。
最后,我们的完整代码将是:
channel = env['mail.channel'].search([('name', '=', 'purchases-notify')])
channel.ensure_one()
boss = env['res.partner'].search([('function', '=', 'CEO')])
for line in record.order_line:
procurement_group = line.procurement_group_id
product = env['sale.order'].search([('id', '=', procurement_group.sale_id.id)]).order_line[0].name
sub_total = line.price_subtotal
purchase_order_lines_list = env['purchase.order.line'].search([('procurement_group_id','=',procurement_group.id)])
total = 0
for line in purchase_order_lines_list:
if line.order_id.state == 'purchase':
total += line.price_subtotal
post_vars = {
'subject': "Purchase {}".format(record.name),
'body': '''<p>Mr. <strong>{0}</strong>,</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> projesi için toplam maliyet <strong>{3}{4}</strong>'dir.</p>
<p><strong>{1}</strong> adlı <strong>{2}</strong> şindiye kadarki toplam maliyet <strong>{5}{4}</strong>.</p>'''.format(boss.name, procurement_group.name, product, sub_total, line.currency_id.symbol, total)
}
channel.message_post(type="notification", subtype="mt_comment", **post_vars)
每确认一个PO,我们就会得到下一个: