summaryrefslogtreecommitdiff
path: root/addons/event_sale/models/event_registration.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/event_sale/models/event_registration.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/event_sale/models/event_registration.py')
-rw-r--r--addons/event_sale/models/event_registration.py133
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