Python 通过Odoo中的销售订单通知采购

Python 通过Odoo中的销售订单通知采购,python,python-3.x,odoo,odoo-11,Python,Python 3.x,Odoo,Odoo 11,我们在一家工业工厂工作,采购负责人必须将采购销售订单产品制造材料的任何采购通知首席执行官 例如,我们有一个销售订单SO00005,产品为[856A3779G02]拉拔器-平台、风扇叶片,它有自己的BoM,也有MTO和制造路线 系统创建一个新的采购订单,负责编辑和处理路线,在确认时,我们必须向首席执行官发送如下消息: SO00005 adlı[856A3779G02]拉拔器-平台,风机叶片projesiçin 托普兰马利耶100.0₺'迪尔 SO00005 adlı[856A3779G02]拉拔器

我们在一家工业工厂工作,采购负责人必须将采购销售订单产品制造材料的任何采购通知首席执行官

例如,我们有一个销售订单
SO00005
,产品为
[856A3779G02]拉拔器-平台、风扇叶片
,它有自己的
BoM
,也有
MTO
制造
路线

系统创建一个新的采购订单,负责编辑和处理路线,在确认时,我们必须向首席执行官发送如下消息:

SO00005 adlı[856A3779G02]拉拔器-平台,风机叶片projesiçin 托普兰马利耶100.0₺'迪尔

SO00005 adlı[856A3779G02]拉拔器-平台,风扇叶片şindiye 卡达基托普兰马里耶1175.0₺.

其中第一个表示当前材料价格,第二个表示每个销售订单的总价格


我们如何处理这个问题?

首先,我们将从通知流程开始。我们可以在这里使用,以使此操作尽可能简单

自动操作 我们进入
Settings>Technical>Automation>Automated Actions
(别忘了安装模块),然后使用以下参数创建一个新操作:

型号
采购订单
,我们希望在单击确认订单按钮时发出通知,将当前的采购订单状态更改为采购。 触发条件:更新时,我们希望在确认采购订单时发送此通知,这意味着当采购订单将其状态更改为
采购
时。 更新域之前:因此,之前的域将是所有当前草稿,以批准或通过电子邮件发送的采购订单,
[“|”、“|”、[“状态”、“=”、“草稿”]、[“状态”、“=”、“发送”]、[“状态”、“=”、“批准”]
申请日期:当采购订单的状态更改为
采购
[[“状态”,“=”,“采购”]
时,我们将发送此邮件。 要执行的操作:最后,我们将应用python代码以获取所需信息并将其发送给boss

Python代码 我们决定使用
python
code,因为在代码中迭代对象更容易;我们的意思是,我们也可以通过操作发送电子邮件,但在这种情况下,我们需要将
采购.order.line
作为小时模型,这可能会更困难

现在,最简单的方法是将消息发送到Odoo内部的通道,在系统中保留尽可能多的过程。因此,在创建此操作之前,我们必须在讨论模块中进行讨论

继续代码,我们将获得此通道以向其发送消息:

channel = env['mail.channel'].search([('name', '=', 'purchases-notify')])
channel.ensure_one()
此外,我们还需要CEO-manager合作伙伴:

boss = env['res.partner'].search([('function', '=', 'CEO')])
现在,我们将迭代采购订单中的每一行处理信息;我们必须在这里选择选项,默认情况下,Odoo中的t使用会计模块和流程,这意味着我们必须在采购订单中的每一行添加分析账户,如果采购订单中有许多不同的产品,这可能会非常烦人。我们将使用其他方法

生产订单和销售订单根据采购规则和采购组生成采购组,这是我们的双重优势;首先,我们可以通过这种关系获得产品的名称;这个PG也有SO名称

默认情况下,Odoo不会按PG组拆分每个采购行,如果产品或产品变量与计量单位相同,它只会合并这些行,而且我们也无法知道哪个是it行的PG来源;要解决这个问题,我们必须从安装模块

我们有下一个代码:

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\u小计
字段获取行的产品成本

但是我们想得到的总成本,所以:我们首先得到与当前行的PG相关的所有采购订单行,然后,我们对它们进行迭代,只求和一行,采购订单也得到确认:

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\u group id.sale\u id.id
字段进行搜索,因为PGid将只与一个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)
每次确认采购订单时,我们都会收到下一份订单:
首先,我们将从通知流程开始。我们可以在这里使用,以使此操作尽可能简单

自动操作 我们进入
Settings>Technical>Automation>Automated Actions
(别忘了安装模块),然后使用以下参数创建一个新操作:

型号
采购订单
,我们希望在单击确认订单按钮时发出通知,将当前的采购订单状态更改为采购。 触发条件:更新时,我们希望在确认采购订单时发送此通知,这意味着当采购订单将其状态更改为
采购
时。 更新域之前:因此,之前的域将是所有当前草稿,以批准或通过电子邮件发送的采购订单,
[“|”、“|”、[“状态”、“=”、“草稿”]、[“状态”、“=”、“发送”]、[“状态”、“=”、“批准”]
申请日期:我们将在采购订单处于
状态时发送此邮件
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)