1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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
|