Сначала мы начнем с процесса уведомления. Здесь мы можем использовать автоматизированное действие , чтобы сделать это действие максимально простым.
Автоматизированное действие
Переходим к 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 :