You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.5 KiB
73 lines
2.5 KiB
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
|
|
|