# Copyright 2023 Le Filament (https://le-filament.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) from odoo import fields, models, tools, api class HallContractSaleReport(models.Model): _name = "hall.contract.sale.report" _description = "Sales Statistics" _auto = False _order = "day_date desc" # ==== Sale fields ==== contract_id = fields.Many2one( comodel_name="hall.contract", string="Contrat", readonly=True ) day_date = fields.Date("Date statistique", required=True) slot_id = fields.Many2one( comodel_name="hall.day.slot", string="Créneau Horaire", readonly=True ) tag_ids = fields.Many2many( comodel_name="hall.contract.tag", string="Etiquette", compute="_compute_tags", search="_search_tags", ) nb_receipts = fields.Integer("Nombre de tickets") nb_seats = fields.Integer("Nombre de couverts") sales_excl_taxes = fields.Monetary("Total HT") sales_incl_taxes = fields.Monetary("Total TTC") currency_id = fields.Many2one(comodel_name="res.currency", readonly=True) location = fields.Char("Lieu") # ==== Contract fields ==== stand_id = fields.Many2one(comodel_name="hall.stand", string="Stand", readonly=True) hall_id = fields.Many2one(comodel_name="hall.hall", string="Site", readonly=True) partner_id = fields.Many2one( comodel_name="res.partner", string="Client", readonly=True ) average_ticket = fields.Monetary("Ticket moyen") commercial_name = fields.Char("Enseigne", readonly=True) type_job = fields.Selection( selection=[ ("food", "Restauration"), ("hybrid", "Hybride"), ("food_scholl", "Food school"), ("pop_up", "Pop up"), ], string="Type", readonly=True, ) # ==== Other fields ==== day_name = fields.Selection( selection=[ ("1", "Lundi"), ("2", "Mardi"), ("3", "Mercredi"), ("4", "Jeudi"), ("5", "Vendredi"), ("6", "Samedi"), ("7", "Dimanche"), ], string="Jour de la semaine", readonly=True, ) amount_untaxed_five = fields.Monetary("TVA 5,5% HT", readonly=True) amount_total_five = fields.Monetary("TVA 5,5% TTC", readonly=True) amount_untaxed_ten = fields.Monetary("TVA 10% HT", readonly=True) amount_total_ten = fields.Monetary("TVA 10% TTC", readonly=True) amount_untaxed_twenty = fields.Monetary("TVA 20% HT", readonly=True) amount_total_twenty = fields.Monetary("TVA 20% TTC", readonly=True) _depends = { "hall.contract.sale": [ "contract_id", "day_date", "slot_id", "nb_receipts", "sales_excl_taxes", "sales_incl_taxes", ], "hall.contract": [ "hall_id", "partner_id", "manager_id", "commercial_name", "tag_ids", ], } @api.depends('contract_id') def _compute_tags(self): for s in self: s.tag_ids = s.contract_id.tag_ids def _search_tags(self, operator, value): return [('contract_id.tag_ids', operator, value)] def _select(self): return """ SELECT s.id, s.contract_id, s.day_date, s.slot_id, s.nb_receipts, s.nb_seats, s.average_ticket, s.sales_excl_taxes, s.sales_incl_taxes, s.currency_id, s.location, c.stand_id, c.hall_id, c.partner_id, c.commercial_name, c.type_job, extract(isodow from s.day_date)::varchar as day_name, tva5.total_without_taxes as amount_untaxed_five, tva5.total_with_taxes as amount_total_five, tva10.total_without_taxes as amount_untaxed_ten, tva10.total_with_taxes as amount_total_ten, tva20.total_without_taxes as amount_untaxed_twenty, tva20.total_with_taxes as amount_total_twenty """ def _from(self): return """ FROM hall_contract_sale s LEFT JOIN hall_contract c ON c.id = s.contract_id LEFT JOIN hall_contract_sale_tax tva5 ON tva5.sale_id = s.id and tva5.tax_rate = 0.055 LEFT JOIN hall_contract_sale_tax tva10 ON tva10.sale_id = s.id and tva10.tax_rate = 0.1 LEFT JOIN hall_contract_sale_tax tva20 ON tva20.sale_id = s.id and tva20.tax_rate = 0.2 WHERE s.is_test_datas is false """ def init(self): tools.drop_view_if_exists(self._cr, self._table) self._cr.execute( "CREATE view %s as %s %s" % (self._table, self._select(), self._from()) )