diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/event_sale/models/event_registration.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/event_sale/models/event_registration.py')
| -rw-r--r-- | addons/event_sale/models/event_registration.py | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/addons/event_sale/models/event_registration.py b/addons/event_sale/models/event_registration.py new file mode 100644 index 00000000..1acb6126 --- /dev/null +++ b/addons/event_sale/models/event_registration.py @@ -0,0 +1,133 @@ +# -*- 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) + utm_source_id = fields.Many2one(compute='_compute_utm_source_id', readonly=False, store=True) + utm_medium_id = fields.Many2one(compute='_compute_utm_medium_id', readonly=False, store=True) + + @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': 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': not self.is_paid, + }) + return res |
