[IMP] event: add payment status in barcode / attendee kanban view

PURPOSE

Introduce a clearer way of handling registrations for multiple events occurring
at the same time and place by

  * improve attendess kanban view;
  * introducing a Registration Desk menu item;

SPECIFICATIONS

Introduce a computed "payment_status" selection field, allowing to display
status of a registration, based on its SO and ``is_paid```field. It is better
fro UX and display. It is not stored as currently stored fields are sufficient
for current requirement.

Add it to the kanban view.

Prepare barcode improvements by improving _get_registration_summary returned
data dict, adding some information to display in event_barcode. Reorganize
registrations actions, and prepare a generic one leading to attendees kanban
view for registration desk.

LINKS

Task ID #2214290
Community PR odoo/odoo#47511
Enterprise PR odoo/enterprise#9190
This commit is contained in:
Nasreddin Boulif
2020-06-10 14:55:48 +00:00
committed by Thibault Delavallée
parent d169b5b509
commit 885437ee21
6 changed files with 61 additions and 21 deletions
+4 -2
View File
@@ -268,8 +268,10 @@ class EventRegistration(models.Model):
self.ensure_one()
return {
'id': self.id,
'name': self.name,
'partner_id': self.partner_id.id,
'ticket_name': self.event_ticket_id.name or _('None'),
'name': self.name,
'event_name': self.event_id.name,
'event_id': self.event_id.id,
'event_display_name': self.event_id.display_name,
'company_name': self.event_id.company_id and self.event_id.company_id.name or False,
}
+17 -6
View File
@@ -161,6 +161,17 @@
</field>
</record>
<record id="event_registration_action" model="ir.actions.act_window">
<field name="res_model">event.registration</field>
<field name="name">Attendees</field>
<field name="view_mode">kanban,tree,form,calendar,graph</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create an Attendee
</p>
</field>
</record>
<record id="event_registration_action_tree" model="ir.actions.act_window">
<field name="name">Event registrations</field>
<field name="type">ir.actions.act_window</field>
@@ -702,12 +713,12 @@
</record>
<record model="ir.actions.act_window" id="action_registration">
<field name="name">Attendees</field>
<field name="res_model">event.registration</field>
<field name="domain"></field>
<field name="view_mode">pivot,graph,kanban,tree,form</field>
<field name="context">{}</field>
<field name="search_view_id" ref="view_registration_search"/>
<field name="name">Attendees</field>
<field name="res_model">event.registration</field>
<field name="domain"></field>
<field name="view_mode">pivot,graph,kanban,tree,form</field>
<field name="context">{}</field>
<field name="search_view_id" ref="view_registration_search"/>
</record>
<menuitem name="Attendees"
+20 -12
View File
@@ -12,10 +12,27 @@ class EventRegistration(models.Model):
# TDE FIXME: maybe add an onchange on sale_order_id
sale_order_id = fields.Many2one('sale.order', string='Source Sales Order', ondelete='cascade')
sale_order_line_id = fields.Many2one('sale.order.line', string='Sales Order Line', ondelete='cascade')
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:
@@ -102,18 +119,9 @@ class EventRegistration(models.Model):
def _get_registration_summary(self):
res = super(EventRegistration, self)._get_registration_summary()
order = self.sale_order_id.sudo()
order_line = self.sale_order_line_id.sudo()
has_to_pay = False
if not order or float_is_zero(order_line.price_total, precision_digits=order.currency_id.rounding):
payment_status = _('Free')
elif not order.invoice_ids or any(invoice.payment_state != 'paid' for invoice in order.invoice_ids):
payment_status = _('To pay')
has_to_pay = True
else:
payment_status = _('Paid')
res.update({
'payment_status': payment_status,
'has_to_pay': has_to_pay
'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
@@ -12,6 +12,24 @@
</field>
</record>
<record id="event_registration_view_kanban" model="ir.ui.view">
<field name="name">event.registration.kanban.inherit.event.sale</field>
<field name="model">event.registration</field>
<field name="inherit_id" ref="event.event_registration_view_kanban"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='event_attendees_kanban_icons_desktop']" position="inside">
<div class="mt-auto pt-2">
<field name="payment_status"/>
</div>
</xpath>
<xpath expr="//div[@id='event_ticket_id']" position="before">
<div class="d-md-none" >
<field name="payment_status"/>
</div>
</xpath>
</field>
</record>
<record id="view_event_registration_ticket_form" model="ir.ui.view">
<field name="name">event.registration.form.inherit</field>
<field name="model">event.registration</field>
+1 -1
View File
@@ -5,7 +5,7 @@
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<xpath expr="//button[@name='preview_sale_order']" position="before">
<button name="action_view_attendee_list" type="object"
class="oe_stat_button" icon="fa-users" attrs="{'invisible': [('attendee_count', '=', 0)]}">
<field name="attendee_count" widget="statinfo" string="Attendees"/>
@@ -225,6 +225,7 @@
<menuitem
id="menu_event_track"
name="Tracks"
sequence="40"
action="action_event_track"
parent="event.event_main_menu"
groups="base.group_no_one"/>