Уведомить о покупках по заказу на продажу в Odoo - PullRequest
0 голосов
/ 05 ноября 2018

Мы работаем на промышленной фабрике, ответственный за закупку должен информировать генерального директора о любой покупке для закупки производственных материалов для продукта заказа на продажу.

Например, у нас есть Заказ на продажу SO00005 с продуктом [856A3779G02] PULLER – PLATFORM, FAN BLADE, у него есть собственный BoM, а также маршрут MTO и Manufacture.

Система создает новое PO , ответственное редактирование и обрабатывает маршрут, и при подтверждении мы должны отправить генеральному директору сообщение, подобное этому:

SO00005 adlı [856A3779G02] ПУЛЛЕР - ПЛАТФОРМА, ВЕНТИЛЯТОР ЛЕЗВИЯ projesi için toplam maliyet 100.0₺'dir.

SO00005 adlı [856A3779G02] PULLER - PLATFORM, FAN BLADE şindiye кадарки топлам малиет 1175.0 11.

Где первый говорит текущую цену материала, а второй - общую сумму за Заказ на продажу .

Как мы можем справиться с этим?

1 Ответ

0 голосов
/ 05 ноября 2018

Сначала мы начнем с процесса уведомления. Здесь мы можем использовать автоматизированное действие , чтобы сделать это действие максимально простым.

Автоматизированное действие

Переходим к Settings > Technical > Automation > Automated Actions (не забудьте установить модуль base_automation ), и мы создаем новое действие со следующими параметрами:

Модель : purchase.order, мы хотим уведомить, когда нажата кнопка ПОДТВЕРДИТЬ ЗАКАЗ , изменяя текущий Заказ на поставку состояние до покупка . Условие триггера : При обновлении мы хотим отправить это уведомление, когда Заказ на покупку подтвержден, это означает, что когда Заказ на покупку изменит свое состояние до purchase. Перед обновлением домена : Таким образом, предыдущий домен будет иметь весь текущий черновик для утверждения или отправки по электронной почте заказов на покупку, ["|","|",["state","=","draft"],["state","=","sent"],["state","=","to approve"]]. Подать заявку на : Мы отправим это письмо, когда состояние Заказа на покупку изменится на purchase, [["state","=","purchase"]]. Action To Do : наконец, мы применим код Python, чтобы получить необходимую информацию и отправить ее боссу.

Код Python

Мы решили использовать код python, потому что легче перебирать объекты в коде; мы имеем в виду, что мы также можем отправлять электронные письма как Action To Do , но в этом случае нам потребуется purchase.order.line как часовая модель, и это может быть сложнее.

Теперь самый простой способ - отправить сообщение на канал внутри Odoo, оставив в системе столько процедур, сколько мы можем. Итак, прежде чем создавать это действие, мы должны создать частный или публичный канал в модуле обсуждения.

Продолжая код, мы получим этот канал для отправки ему сообщений:

channel = env['mail.channel'].search([('name', '=', 'purchases-notify')])
channel.ensure_one()

Кроме того, нам нужен генеральный директор менеджер-партнер:

boss = env['res.partner'].search([('function', '=', 'CEO')])

Теперь, мы будем перебирать каждую строку в Заказе на покупку , обрабатывающем информацию; У нас есть варианты здесь, по умолчанию, t стеллажи покупки и другие расходы в Odoo использует модуль учета и обработки, это означает, что мы должны добавить аналитические счета к каждой строке в Заказ на покупку , и, если PO имеет много разных продуктов, это может быть очень раздражающим. Мы будем использовать другие подходы.

Заказы на производство и заказы на продажу генерируют Группа закупок с на основе Правил закупок , а Группа закупок имеет уникальную Продажа Заказ происхождение , для нас это двойное преимущество; во-первых, мы можем получить имя product через эти отношения; это PG также имеет имя SO в качестве имени.

По умолчанию Odoo не разбивает каждую строку покупки по группам PG , а просто объединяет строки, если 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 источник, нам не нужно обязательно искать с procurement_group_id.sale_id.id field, поскольку 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 : enter image description here

...