<?xml version="1.0" encoding="utf-8" ?> <odoo> <record id="hall_contract_overview_form" model="ir.ui.view"> <field name="name">hall.contract.overview</field> <field name="type">qweb</field> <field name="model">hall.contract</field> <field name="arch" type="xml"> <qweb js_class="contract_overview"> <nav class="o_qweb_cp_buttons"> <button type="object" class="btn" id="update_view"> <i class="fa fa-refresh" /> </button> <button type="object" class="btn btn-outline-primary" id="update_cashpad_values" groups="base.group_no_one,hall_sale_cashpad.group_hall_cashpad_manager" > Mettre à jour les données Cashpad </button> </nav> <div class="o_form_view o_form_readonly o_project_plan"> <div class="o_form_sheet_bg"> <div class="o_form_sheet position-relative"> <t t-set="values" t-value="records.get_overview()" /> <t t-set="job_ids" t-value="values['job_ids']" /> <!-- Cashpad datas --> <div class="row" groups="base.group_no_one,hall_sale_cashpad.group_hall_cashpad_manager"> <div class="col-12"> <div t-if="job_ids" class="alert alert-warning" role="alert"> <h3 class="text-uppercase fw-bolder mb-4"> Archives en cours de traitement : </h3> <table class="table table-sm text-center"> <tr> <td>en attente</td> <td>dans la file</td> <td>en cours</td> <td>en échec</td> </tr> <tr> <td><t t-out="len(job_ids.filtered(lambda j: j.state == 'pending'))" /></td> <td><t t-out="len(job_ids.filtered(lambda j: j.state == 'enqueued'))" /></td> <td><t t-out="len(job_ids.filtered(lambda j: j.state == 'started'))" /></td> <td><t t-out="len(job_ids.filtered(lambda j: j.state == 'failed'))" /></td> </tr> </table> </div> <div t-if="not job_ids" class="alert alert-success" role="alert"> Aucune archive en cours de traitement ou en échec </div> </div> </div> <div class="row"> <!-- Global Values --> <div class="col-12"> <div class="row"> <!-- Main KPI --> <div class="col-12"> <h3 class="text-uppercase fw-bolder o_horizontal_separator mb-4"> Chiffre d'affaire <t t-if="len(values['contract_ids']) == 1"> - <t t-out="values['contract_ids'].display_name" /> </t> </h3> <div class="row"> <!-- Yesterday --> <t t-call="festa_dashboard.hall_contract_overview_kpi"> <t t-set="title" t-value="'Hier'" /> <t t-set="date_text" t-value="'le '" /> <t t-set="date" t-value="values['sales']['day']" /> <t t-set="amount" t-value="values['sales']['yesterday']['total_sales']" /> <t t-set="target" t-value="values['sales']['last_year']['total_sales']" /> <t t-set="bottom_text" t-value="'''l'année dernière '''" /> <t t-set="average_sales" t-value="values['sales']['yesterday']['average_sales']" /> <t t-set="currency_id" t-value="values['company_id'].currency_id" /> <!-- Flow --> <t t-set="visitor_ids" t-value="sum(values['flow']['visitor_ids'].filtered(lambda f: f.date >= date.today() - relativedelta(days=1)).mapped('count'))" /> <t t-set="passerby_ids" t-value="sum(values['flow']['passerby_ids'].filtered(lambda f: f.date >= date.today() - relativedelta(days=1)).mapped('count'))" /> </t> <!-- Last month --> <t t-call="festa_dashboard.hall_contract_overview_kpi"> <t t-set="title" t-value="'Ce mois-ci'" /> <t t-set="date_text" t-value="'depuis le '" /> <t t-set="date" t-value="values['sales']['month']" /> <t t-set="amount" t-value="values['sales']['this_month']['total_sales']" /> <t t-set="target" t-value="values['sales']['target_month']" /> <t t-set="bottom_text" t-value="'objectif du mois '" /> <t t-set="average_sales" t-value="values['sales']['this_month']['average_sales']" /> <t t-set="currency_id" t-value="values['company_id'].currency_id" /> <!-- Flow --> <t t-set="visitor_ids" t-value="sum(values['flow']['visitor_ids'].filtered(lambda f: f.date >= date.today().replace(day=1)).mapped('count'))" /> <t t-set="passerby_ids" t-value="sum(values['flow']['passerby_ids'].filtered(lambda f: f.date >= date.today().replace(day=1)).mapped('count'))" /> </t> <!-- Last Year --> <t t-call="festa_dashboard.hall_contract_overview_kpi"> <t t-set="title" t-value="'Cette année'" /> <t t-set="date_text" t-value="'depuis le '" /> <t t-set="date" t-value="values['sales']['year']" /> <t t-set="amount" t-value="values['sales']['this_year']['total_sales']" /> <t t-set="target" t-value="values['sales']['target_year']" /> <t t-set="bottom_text" t-value="'''objectif de l'année '''" /> <t t-set="average_sales" t-value="values['sales']['this_year']['average_sales']" /> <t t-set="currency_id" t-value="values['company_id'].currency_id" /> <!-- Flow --> <t t-set="visitor_ids" t-value="sum(values['flow']['visitor_ids'].mapped('count'))" /> <t t-set="passerby_ids" t-value="sum(values['flow']['passerby_ids'].mapped('count'))" /> </t> </div> </div> <!-- Detail by contract --> <div class="col-12 mt-4" t-if="values['sales']['revenue_detail']"> <h3 class="text-uppercase fw-bolder o_horizontal_separator mb-4"> Objectif des derniers mois </h3> <table class="table table-striped table-hover"> <thead> <tr> <th /> <th t-foreach="values['sales']['revenue_detail']" t-as="revenue"> <t t-out="revenue.day_date" t-options="{'widget': 'date', 'format': 'MMMM yyyy'}" /> </th> </tr> </thead> <tbody> <tr> <th>CA HT</th> <td t-foreach="values['sales']['revenue_detail']" t-as="revenue" class="text-end"> <t t-out="revenue.sales_excl_taxes" t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" /> </td> </tr> <tr> <th>Objectif</th> <td t-foreach="values['sales']['revenue_detail']" t-as="revenue" class="text-end"> <t t-out="revenue.amount_untaxed_target" t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" /> </td> </tr> <tr> <th>% atteint</th> <td t-foreach="values['sales']['revenue_detail']" t-as="revenue" class="text-end"> <t t-out="revenue.sales_excl_taxes / revenue.amount_untaxed_target * 100 if revenue.amount_untaxed_target else 100" t-options="{'widget': 'float', 'precision': 0}" /> % </td> </tr> <tr> <th>Panier moyen</th> <td t-foreach="values['sales']['revenue_detail']" t-as="revenue" class="text-end"> <t t-out="revenue.sales_excl_taxes / revenue.nb_receipts if revenue.nb_receipts else 0" t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" /> </td> </tr> </tbody> </table> </div> <!-- Detail by contract --> <div class="col-12 mt-4" t-if="len(values['contract_ids']) > 1"> <h3 class="text-uppercase fw-bolder o_horizontal_separator mb-4"> Détail par contrat </h3> <!-- table- --> <table class="table table-striped table-borderless table-hover"> <t t-foreach="values['hall_ids']" t-as="hall"> <thead> <tr> <th colspan="11" class="text-uppercase" style="background-color: rgba(113, 99, 158, 0.2);"> <t t-out="hall.name" /> </th> </tr> <tr> <th>Stand</th> <th>Enseigne</th> <th class="td-overview-border-left"> Hier <small class="test-muted"><t t-out="values['sales']['day']" t-options="{'widget': 'date', 'format': 'dd/MM/yyyy'}" /></small> </th> <th colspan="4" class="td-overview-border-left td-overview-border-right"> Ce mois-ci </th> <th colspan="4">Cette année</th> </tr> <tr class="tr-detail-header"> <td /> <td /> <td class="td-overview-border-left" /> <td class="text-muted td-overview-border-left">CA</td> <td class="text-muted">Panier moyen</td> <td class="text-muted">Objectif</td> <td class="td-overview-border-right" /> <td class="text-muted">CA</td> <td class="text-muted">Panier moyen</td> <td class="text-muted">Objectif</td> <td /> </tr> </thead> <tbody> <tr t-foreach="values['contract_ids'].filtered('cashpad_id').sorted('commercial_name')" t-as="contract" t-att-class="'text-muted fst-italic' if not contract.active else ''" > <t t-if="contract in hall.contract_ids"> <t t-set="data" t-value="contract.get_overview_sales()"/> <t t-set="month_delta" t-value="data['this_month']['total_sales'] / data['target_month'] * 100 if data['target_month'] else 100" /> <t t-set="year_delta" t-value="data['this_year']['total_sales'] / data['target_year'] * 100 if data['target_month'] else 100" /> <td t-out="contract.stand_id.name"/> <td t-out="contract.commercial_name"/> <td class="text-end td-overview-border-left" t-out="data['yesterday']['total_sales']" t-options='{"widget": "monetary", "display_currency": values["company_id"].currency_id}'/> <td class="text-end td-overview-border-left" t-out="data['this_month']['total_sales']" t-options='{"widget": "monetary", "display_currency": values["company_id"].currency_id}' /> <td class="text-end" t-out="data['this_month']['average_sales']" t-options='{"widget": "monetary", "display_currency": values["company_id"].currency_id}' /> <td class="text-end text-muted" t-out="data['target_month']" t-options='{"widget": "monetary", "display_currency": values["company_id"].currency_id}' /> <td t-att-class="'text-end text-success td-overview-border-right' if month_delta >= 100 else 'text-end td-overview-border-right text-warning'"> <t t-out="month_delta" t-options='{"widget": "float", "precision": 0}' /> % </td> <td class="text-end" t-out="data['this_year']['total_sales']" t-options='{"widget": "monetary", "display_currency": values["company_id"].currency_id}' /> <td class="text-end" t-out="data['this_year']['average_sales']" t-options='{"widget": "monetary", "display_currency": values["company_id"].currency_id}' /> <td class="text-end text-muted" t-out="data['target_year']" t-options='{"widget": "monetary", "display_currency": values["company_id"].currency_id}' /> <td t-att-class="'text-end text-success' if year_delta >= 100 else 'text-end text-warning'"> <t t-out="year_delta" t-options='{"widget": "float", "precision": 0}'/> % </td> </t> </tr> </tbody> </t> </table> <!-- en table- --> </div> </div> </div> </div> </div> </div> </div> </qweb> </field> </record> <!-- Template main KPI--> <template id="hall_contract_overview_kpi"> <!-- Last month --> <div class="col-12 col-sm-6 col-lg-4 text-center mt-4 mb-4"> <!-- Titre --> <h3><t t-out="title" /></h3> <!-- Date --> <t t-out="date_text" /> <t t-out="date" t-options="{'widget': 'date', 'format': 'dd/MM/yyyy'}" /> <!-- CA --> <p class="display-4"> <t t-out="amount" t-options='{"widget": "monetary", "display_currency": currency_id}' /> </p> <!-- Pourcentage --> <t t-if="target and target > 0"> <t t-set="delta" t-value="amount / target * 100" /> <p t-att-class="'text-success h3' if delta >= 100 else 'text-warning h3'"> <t t-out="delta" t-options='{"widget": "float", "precision": 0}' /> % </p> </t> <t t-else=""> <p class="h3">N/A</p> </t> <!-- Bottom --> <p> <t t-out="bottom_text" /> <t t-out="target" t-options='{"widget": "monetary", "display_currency": currency_id}' /> </p> <hr /> <p /> <span class="h5">Panier moyen</span> <p class="display-6"> <t t-out="average_sales" t-options='{"widget": "monetary", "display_currency": currency_id}' /> </p> <hr /> <table class="table align-middle table-sm"> <tr> <td> <span class="h5">Visiteurs</span> </td> <td> <span class="lead"> <t t-out="visitor_ids" t-options='{"widget": "float", "precision": 0}' /> </span> </td> </tr> <tr> <td> <span class="h5">Passants</span> </td> <td> <span class="lead"> <t t-out="passerby_ids" t-options='{"widget": "float", "precision": 0}' /> </span> </td> </tr> </table> </div> </template> <record id="hall_contract_overview_action" model="ir.actions.act_window"> <field name="name">Overview</field> <field name="res_model">hall.contract</field> <field name="view_mode">qweb</field> <field name="domain" >['|', ('date_end', '=', False), ('date_end', '>=', context_today().strftime('%Y-1-1'))]</field> <field name="context">{'active_test': False}</field> </record> </odoo>