5 changed files with 99 additions and 2 deletions
@ -0,0 +1 @@ |
|||||
|
from . import sale_order |
||||
@ -0,0 +1,73 @@ |
|||||
|
from odoo import models, api, _ |
||||
|
from odoo.exceptions import UserError |
||||
|
|
||||
|
class SaleOrder(models.Model): |
||||
|
_inherit = 'sale.order' |
||||
|
|
||||
|
def action_confirm(self): |
||||
|
""" Confirm the given quotation(s) and set their confirmation date. |
||||
|
|
||||
|
If the corresponding setting is enabled, also locks the Sale Order. |
||||
|
|
||||
|
:return: True |
||||
|
:rtype: bool |
||||
|
:raise: UserError if trying to confirm cancelled SO's |
||||
|
""" |
||||
|
|
||||
|
# Filter out orders that are already confirmed or don't need confirmation |
||||
|
orders_to_confirm = self.env['sale.order'] |
||||
|
for order in self: |
||||
|
error_msg = order._confirmation_error_message() |
||||
|
if error_msg: |
||||
|
if order.state in ('sale', 'done', 'cancel'): |
||||
|
continue |
||||
|
raise UserError(error_msg) |
||||
|
orders_to_confirm |= order |
||||
|
|
||||
|
# If no orders to confirm, return early |
||||
|
if not orders_to_confirm: |
||||
|
return True |
||||
|
|
||||
|
orders_to_confirm.order_line._validate_analytic_distribution() |
||||
|
|
||||
|
for order in orders_to_confirm: |
||||
|
# ensure the record exists in DB before checking followers |
||||
|
if not order.id: |
||||
|
order.flush() |
||||
|
|
||||
|
# Refresh follower cache |
||||
|
order.invalidate_recordset(['message_partner_ids']) |
||||
|
|
||||
|
# Check if already followed directly in DB |
||||
|
self.env.cr.execute(""" |
||||
|
SELECT 1 FROM mail_followers |
||||
|
WHERE res_model = %s AND res_id = %s AND partner_id = %s |
||||
|
LIMIT 1 |
||||
|
""", ('sale.order', order.id, order.partner_id.id)) |
||||
|
already_follower = self.env.cr.fetchone() |
||||
|
|
||||
|
if not already_follower: |
||||
|
try: |
||||
|
with self.env.cr.savepoint(): |
||||
|
order.message_subscribe([order.partner_id.id]) |
||||
|
except Exception: |
||||
|
pass # partner already subscribed (race condition, etc.) |
||||
|
|
||||
|
orders_to_confirm.write( |
||||
|
orders_to_confirm._prepare_confirmation_values() |
||||
|
) |
||||
|
|
||||
|
# Remove unwanted context |
||||
|
context = self._context.copy() |
||||
|
context.pop('default_name', None) |
||||
|
|
||||
|
orders_to_confirm.with_context(context)._action_confirm() |
||||
|
|
||||
|
user = orders_to_confirm[:1].create_uid |
||||
|
if user and user.sudo().has_group('sale.group_auto_done_setting'): |
||||
|
orders_to_confirm.action_lock() |
||||
|
|
||||
|
if self.env.context.get('send_email'): |
||||
|
orders_to_confirm._send_order_confirmation_mail() |
||||
|
|
||||
|
return True |
||||
Loading…
Reference in new issue