event_sale_report.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # -*- coding: utf-8 -*-
  2. # Part of Odoo. See LICENSE file for full copyright and licensing details.
  3. from odoo import fields, models, tools
  4. class EventSaleReport(models.Model):
  5. """Event Registrations-based sales report, allowing to analyze sales and number of seats
  6. by event (type), ticket, etc. Each opened record will also give access to all this information."""
  7. _name = 'event.sale.report'
  8. _description = 'Event Sales Report'
  9. _auto = False
  10. _rec_name = 'sale_order_line_id'
  11. event_type_id = fields.Many2one('event.type', string='Event Type', readonly=True)
  12. event_id = fields.Many2one('event.event', string='Event', readonly=True)
  13. event_date_begin = fields.Date(string='Event Start Date', readonly=True)
  14. event_date_end = fields.Date(string='Event End Date', readonly=True)
  15. event_ticket_id = fields.Many2one('event.event.ticket', string='Event Ticket', readonly=True)
  16. event_ticket_price = fields.Float(string='Ticket price', readonly=True)
  17. event_registration_create_date = fields.Date(string='Registration Date', readonly=True)
  18. event_registration_state = fields.Selection([
  19. ('draft', 'Unconfirmed'), ('cancel', 'Cancelled'),
  20. ('open', 'Confirmed'), ('done', 'Attended')],
  21. string='Registration Status', readonly=True)
  22. active = fields.Boolean('Is registration active (not archived)?')
  23. event_registration_id = fields.Many2one('event.registration', readonly=True)
  24. event_registration_name = fields.Char('Attendee Name', readonly=True)
  25. product_id = fields.Many2one('product.product', string='Product', readonly=True)
  26. sale_order_id = fields.Many2one('sale.order', readonly=True)
  27. sale_order_date = fields.Datetime('Order Date', readonly=True)
  28. sale_order_partner_id = fields.Many2one('res.partner', string='Customer', readonly=True)
  29. sale_order_state = fields.Selection([
  30. ('draft', 'Quotation'),
  31. ('sent', 'Quotation Sent'),
  32. ('sale', 'Sales Order'),
  33. ('done', 'Locked'),
  34. ('cancel', 'Cancelled'),
  35. ], string='Sale Order Status', readonly=True)
  36. sale_order_user_id = fields.Many2one('res.users', string='Salesperson', readonly=True)
  37. sale_order_line_id = fields.Many2one('sale.order.line', readonly=True)
  38. sale_price = fields.Float('Revenues', readonly=True)
  39. sale_price_untaxed = fields.Float('Untaxed Revenues', readonly=True)
  40. invoice_partner_id = fields.Many2one('res.partner', string='Invoice Address', readonly=True)
  41. is_paid = fields.Boolean('Is Paid', readonly=True)
  42. payment_status = fields.Selection(string="Payment Status", selection=[
  43. ('to_pay', 'Not Paid'),
  44. ('paid', 'Paid'),
  45. ('free', 'Free'),
  46. ])
  47. company_id = fields.Many2one('res.company', string='Company', readonly=True)
  48. def init(self):
  49. tools.drop_view_if_exists(self._cr, self._table)
  50. self._cr.execute('CREATE OR REPLACE VIEW %s AS (%s);' % (self._table, self._query()))
  51. def _query(self, with_=None, select=None, join=None, group_by=None):
  52. return "\n".join([
  53. self._with_clause(*(with_ or [])),
  54. self._select_clause(*(select or [])),
  55. self._from_clause(*(join or [])),
  56. self._group_by_clause(*(group_by or []))
  57. ])
  58. def _with_clause(self, *with_):
  59. # Extra clauses formatted as `cte1 AS (SELECT ...)`, `cte2 AS (SELECT ...)`...
  60. return """
  61. WITH
  62. """ + ',\n '.join(with_) if with_ else ''
  63. def _select_clause(self, *select):
  64. # Extra clauses formatted as `cte1.column1 AS new_column1`, `table1.column2 AS new_column2`...
  65. return """
  66. SELECT
  67. ROW_NUMBER() OVER (ORDER BY event_registration.id) AS id,
  68. event_registration.id AS event_registration_id,
  69. event_registration.company_id AS company_id,
  70. event_registration.event_id AS event_id,
  71. event_registration.event_ticket_id AS event_ticket_id,
  72. event_registration.create_date AS event_registration_create_date,
  73. event_registration.name AS event_registration_name,
  74. event_registration.state AS event_registration_state,
  75. event_registration.active AS active,
  76. event_registration.sale_order_id AS sale_order_id,
  77. event_registration.sale_order_line_id AS sale_order_line_id,
  78. event_registration.is_paid AS is_paid,
  79. event_event.event_type_id AS event_type_id,
  80. event_event.date_begin AS event_date_begin,
  81. event_event.date_end AS event_date_end,
  82. event_event_ticket.price AS event_ticket_price,
  83. sale_order.date_order AS sale_order_date,
  84. sale_order.partner_invoice_id AS invoice_partner_id,
  85. sale_order.partner_id AS sale_order_partner_id,
  86. sale_order.state AS sale_order_state,
  87. sale_order.user_id AS sale_order_user_id,
  88. sale_order_line.product_id AS product_id,
  89. CASE
  90. WHEN sale_order_line.product_uom_qty = 0 THEN 0
  91. ELSE
  92. sale_order_line.price_total
  93. / CASE COALESCE(sale_order.currency_rate, 0) WHEN 0 THEN 1.0 ELSE sale_order.currency_rate END
  94. / sale_order_line.product_uom_qty
  95. END AS sale_price,
  96. CASE
  97. WHEN sale_order_line.product_uom_qty = 0 THEN 0
  98. ELSE
  99. sale_order_line.price_subtotal
  100. / CASE COALESCE(sale_order.currency_rate, 0) WHEN 0 THEN 1.0 ELSE sale_order.currency_rate END
  101. / sale_order_line.product_uom_qty
  102. END AS sale_price_untaxed,
  103. CASE
  104. WHEN sale_order_line.price_total = 0 THEN 'free'
  105. WHEN event_registration.is_paid THEN 'paid'
  106. ELSE 'to_pay'
  107. END payment_status""" + (',\n ' + ',\n '.join(select) if select else '')
  108. def _from_clause(self, *join_):
  109. # Extra clauses formatted as `column1`, `column2`...
  110. return """
  111. FROM event_registration
  112. LEFT JOIN event_event ON event_event.id = event_registration.event_id
  113. LEFT JOIN event_event_ticket ON event_event_ticket.id = event_registration.event_ticket_id
  114. LEFT JOIN sale_order ON sale_order.id = event_registration.sale_order_id
  115. LEFT JOIN sale_order_line ON sale_order_line.id = event_registration.sale_order_line_id
  116. """ + ('\n'.join(join_) + '\n' if join_ else '')
  117. def _group_by_clause(self, *group_by):
  118. # Extra clauses formatted like `column1`, `column2`...
  119. return """
  120. GROUP BY
  121. """ + ',\n '.join(group_by) if group_by else ''