我们在工业工厂工作,采购负责人必须将购买采购订单产品制造材料的任何采购告知首席执行官。
例如,我们有一个带有产品SO00005
的销售订单 [856A3779G02] PULLER – PLATFORM, FAN BLADE
,它有自己的BoM
,也有{{1} }和MTO
路线。
系统创建一个新的 PO ,负责的编辑并处理路线,并且在确认后,我们必须向首席执行官发送如下消息:
SO00005adlı[856A3779G02]拉杆–平台,风扇叶片projesiiçin toplam maliyet100.0₺'dir。
SO00005adlı[856A3779G02]拉杆–平台,风扇叶片辛迪耶 kadarki toplam maliyet1175.0₺。
第一个表示当前物料价格,第二个表示每个销售订单的总数。
我们如何处理呢?
答案 0 :(得分:1)
首先,我们将从通知过程开始。我们可以在此处使用automated action,以使此操作最简单。
我们转到Settings > Technical > Automation > Automated Actions
(不要忘记安装base_automation模块),然后使用以下参数创建一个新动作:
型号:purchase.order
,我们希望在单击 CONFIRM ORDER 按钮时通知您,以更改当前的购买订单 < em>状态以购买。
触发条件:更新时,我们要在确认购买订单时发送此通知,这意味着购买订单更改其< em>状态设置为purchase
。
更新域之前:因此,先前的域将是所有当前草稿,以批准或通过电子邮件发送已发送的采购订单["|","|",["state","=","draft"],["state","=","sent"],["state","=","to approve"]]
。
申请:当购买订单的状态更改为purchase
,[["state","=","purchase"]]
时,我们将发送此邮件。
要做的事情:最后,我们将应用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 中的t racking purchases and other expenses使用会计模块和流程,这意味着我们必须向购买订单中的每一行添加分析帐户,如果 PO 有很多不同的产品,那可能会很烦人。我们将使用其他方法。
制造订单和销售订单根据采购规则和采购组 has a unique Sale Order origin生成采购组。对我们来说是双重优势;首先,我们可以通过这种关系获得产品的名称;此 PG 也具有 SO 名称。
默认情况下, Odoo 不会将每个购买行按 PG 组进行拆分,如果 product 或 product,则仅合并行变体和 uom 是相同的,而且我们也不知道该行的 PG 起源是什么;为了解决这个问题,我们必须从purchase_line_procurement_group安装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 来源,因此我们不必使用由于{strong> PG ,procurement_group_id.sale_id.id
字段的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)