Skip to content
Snippets Groups Projects
hall_contract_sale_report.py 4.52 KiB
Newer Older
# 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


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
    )
    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",
        ],
    }

    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.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())
        )