# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models from odoo.tools import float_is_zero class EventRegistration(models.Model): _inherit = 'event.registration' is_paid = fields.Boolean('Is Paid') # TDE FIXME: maybe add an onchange on sale_order_id sale_order_id = fields.Many2one('sale.order', string='Sales Order', ondelete='cascade', copy=False) sale_order_line_id = fields.Many2one('sale.order.line', string='Sales Order Line', ondelete='cascade', copy=False) payment_status = fields.Selection(string="Payment Status", selection=[ ('to_pay', 'Not Paid'), ('paid', 'Paid'), ('free', 'Free'), ], compute="_compute_payment_status", compute_sudo=True) utm_campaign_id = fields.Many2one(compute='_compute_utm_campaign_id', readonly=False, store=True, ondelete="set null") utm_source_id = fields.Many2one(compute='_compute_utm_source_id', readonly=False, store=True, ondelete="set null") utm_medium_id = fields.Many2one(compute='_compute_utm_medium_id', readonly=False, store=True, ondelete="set null") @api.depends('is_paid', 'sale_order_id.currency_id', 'sale_order_line_id.price_total') def _compute_payment_status(self): for record in self: so = record.sale_order_id so_line = record.sale_order_line_id if not so or float_is_zero(so_line.price_total, precision_digits=so.currency_id.rounding): record.payment_status = 'free' elif record.is_paid: record.payment_status = 'paid' else: record.payment_status = 'to_pay' @api.depends('sale_order_id') def _compute_utm_campaign_id(self): for registration in self: if registration.sale_order_id.campaign_id: registration.utm_campaign_id = registration.sale_order_id.campaign_id elif not registration.utm_campaign_id: registration.utm_campaign_id = False @api.depends('sale_order_id') def _compute_utm_source_id(self): for registration in self: if registration.sale_order_id.source_id: registration.utm_source_id = registration.sale_order_id.source_id elif not registration.utm_source_id: registration.utm_source_id = False @api.depends('sale_order_id') def _compute_utm_medium_id(self): for registration in self: if registration.sale_order_id.medium_id: registration.utm_medium_id = registration.sale_order_id.medium_id elif not registration.utm_medium_id: registration.utm_medium_id = False def action_view_sale_order(self): action = self.env["ir.actions.actions"]._for_xml_id("sale.action_orders") action['views'] = [(False, 'form')] action['res_id'] = self.sale_order_id.id return action @api.model_create_multi def create(self, vals_list): for vals in vals_list: if vals.get('sale_order_line_id'): so_line_vals = self._synchronize_so_line_values( self.env['sale.order.line'].browse(vals['sale_order_line_id']) ) vals.update(so_line_vals) registrations = super(EventRegistration, self).create(vals_list) for registration in registrations: if registration.sale_order_id: registration.message_post_with_view( 'mail.message_origin_link', values={'self': registration, 'origin': registration.sale_order_id}, subtype_id=self.env.ref('mail.mt_note').id) return registrations def write(self, vals): if vals.get('sale_order_line_id'): so_line_vals = self._synchronize_so_line_values( self.env['sale.order.line'].browse(vals['sale_order_line_id']) ) vals.update(so_line_vals) if vals.get('event_ticket_id'): self.filtered( lambda registration: registration.event_ticket_id and registration.event_ticket_id.id != vals['event_ticket_id'] )._sale_order_ticket_type_change_notify(self.env['event.event.ticket'].browse(vals['event_ticket_id'])) return super(EventRegistration, self).write(vals) def _synchronize_so_line_values(self, so_line): if so_line: return { 'partner_id': False if self.env.user._is_public() else so_line.order_id.partner_id.id, 'event_id': so_line.event_id.id, 'event_ticket_id': so_line.event_ticket_id.id, 'sale_order_id': so_line.order_id.id, 'sale_order_line_id': so_line.id, } return {} def _sale_order_ticket_type_change_notify(self, new_event_ticket): fallback_user_id = self.env.user.id if not self.env.user._is_public() else self.env.ref("base.user_admin").id for registration in self: render_context = { 'registration': registration, 'old_ticket_name': registration.event_ticket_id.name, 'new_ticket_name': new_event_ticket.name } user_id = registration.event_id.user_id.id or registration.sale_order_id.user_id.id or fallback_user_id registration.sale_order_id._activity_schedule_with_view( 'mail.mail_activity_data_warning', user_id=user_id, views_or_xmlid='event_sale.event_ticket_id_change_exception', render_context=render_context) def _action_set_paid(self): self.write({'is_paid': True}) def _get_registration_summary(self): res = super(EventRegistration, self)._get_registration_summary() res.update({ 'payment_status': self.payment_status, 'payment_status_value': dict(self._fields['payment_status']._description_selection(self.env))[self.payment_status], 'has_to_pay': self.payment_status == 'to_pay', }) return res