diff --git a/__manifest__.py b/__manifest__.py index 7d33905cdef0bfba262ae1ef7301474a510430f0..7176cfb699989c4116dabe2fff9d3723646f343b 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -19,6 +19,9 @@ "auto_install": False, "assets": { "web.assets_frontend": [ + "/web/static/lib/Chart/Chart.js", + "/oacc_portal_overview_cdc/static/src/js/lib/chartjs-plugin-datalabels.min.js", + "/oacc_portal_overview_cdc/static/lib/daterangepicker/daterangepicker.js", "oacc_portal_overview_cdc/static/src/css/style.css", "oacc_portal_overview_cdc/static/src/js/operation_chart.js", "oacc_portal_overview_cdc/static/src/js/select2_fr.js", diff --git a/controllers/main.py b/controllers/main.py index 92888b551b96abbaac48b9dd51e1d70d941e28a4..d39f43b0b451c9b0b31953c6feb5e4bbf8e6e851 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -7,12 +7,12 @@ from odoo.addons.oacc_portal.controllers.main import CustomerPortal as CustomerP class CustomerPortal(CustomerPortal): - def _get_data_date(self, is_data_cdc, operation=None): + def _get_data_date(self, is_data_cdc, operation=None, partner_id=None): vals = {} # Si des données existent, récupérer les dates min/max/début/fin # de l'opération if is_data_cdc: - vals["data_values"] = operation.get_values_init_graph() + vals["data_values"] = operation.get_values_init_graph(partner_id) else: vals["data_values"] = { @@ -26,7 +26,7 @@ class CustomerPortal(CustomerPortal): "date_year_end": False, } - vals["data_values"].update(operation.get_date_min_max()) + vals["data_values"].update(operation.get_date_min_max(partner_id)) return vals @@ -63,13 +63,27 @@ class CustomerPortal(CustomerPortal): render_values = {} render_values.update(self._get_role(operation)) - render_values.update( - self._get_data_date(render_values.get("isDataCdc"), operation) - ) + if ( + render_values.get("isAdmin") + or render_values.get("isSuperAdmin") + or render_values.get("isPmo") + ): + render_values.update( + self._get_data_date(render_values.get("isDataCdc"), operation) + ) + partner_ids = operation.acc_delivery_period_ids.mapped("partner_id").sorted( + key=lambda p: p.name + ) + elif render_values.get("isConsumer"): + render_values.update( + self._get_data_date( + render_values.get("isDataCdc"), + operation, + request.env.user.commercial_partner_id, + ) + ) + partner_ids = request.env.user.commercial_partner_id - partner_ids = operation.acc_delivery_period_ids.mapped("partner_id").sorted( - key=lambda p: p.name - ) render_values.update( { "partners": partner_ids, @@ -95,13 +109,27 @@ class CustomerPortal(CustomerPortal): render_values = {} render_values.update(self._get_role(operation)) - render_values.update( - self._get_data_date(render_values.get("isDataCdc"), operation) - ) + if ( + render_values.get("isAdmin") + or render_values.get("isSuperAdmin") + or render_values.get("isPmo") + ): + render_values.update( + self._get_data_date(render_values.get("isDataCdc"), operation) + ) + partner_ids = operation.acc_injection_period_ids.mapped( + "partner_id" + ).sorted(key=lambda p: p.name) + elif render_values.get("isProd"): + render_values.update( + self._get_data_date( + render_values.get("isDataCdc"), + operation, + request.env.user.commercial_partner_id, + ) + ) + partner_ids = request.env.user.commercial_partner_id - partner_ids = operation.acc_injection_period_ids.mapped("partner_id").sorted( - key=lambda p: p.name - ) render_values.update( { "partners": partner_ids, diff --git a/models/acc_operation.py b/models/acc_operation.py index 82faeb742c82a316e8c94a842db518350d6bb45a..daa382ff2b40732087773dd4f781b5a558b1cffc 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -37,11 +37,11 @@ class AccOperation(models.Model): # ------------------------------------------------------ # Business methods # ------------------------------------------------------ - def get_values_init_graph(self): + def get_values_init_graph(self, partner_id=None): self.ensure_one() values = {} - last_record = self.get_last_cdc_record() + last_record = self.get_last_cdc_record(partner_id) date_day_start, date_day_end = self.get_interval("day", last_record) date_day_start = date_day_start.strftime("%d/%m/%Y") diff --git a/static/src/js/operation_chart.js b/static/src/js/operation_chart.js index 872623e7c0fe1263c1c4787e4857ffe13160fe82..158bf5b6d918a39bc5511f885e959bf929f38203 100644 --- a/static/src/js/operation_chart.js +++ b/static/src/js/operation_chart.js @@ -5,7 +5,6 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { "use strict"; - const { loadJS } = require("@web/core/assets"); var publicWidget = require("web.public.widget"); publicWidget.registry.OaccOperationChart = publicWidget.Widget.extend({ @@ -47,14 +46,10 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { this.chartData = null; }, - willStart: async function () { - await loadJS("/web/static/lib/Chart/Chart.js"); - await loadJS( - "/oacc_portal_overview_cdc/static/src/js/lib/chartjs-plugin-datalabels.min.js" - ); - await loadJS( - "/oacc_portal_overview_cdc/static/lib/daterangepicker/daterangepicker.js" - ); + /** + * @override + */ + willStart: function () { var self = this; var def = this._rpc({ model: "acc.operation", @@ -64,6 +59,7 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { self.minDate = data.date_min; self.maxDate = data.date_max; }); + return Promise.all([this._super.apply(this, arguments), def]); }, /** @@ -85,10 +81,10 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { self.last_day = obj.last_day; self.data_type = self.$el.data("name"); - if (self.data_type == "cons") { + if (self.data_type === "cons") { self.title_name = "Consommation globale"; } - if (self.data_type == "prod") { + if (self.data_type === "prod") { self.title_name = "Production globale"; } self.render_daterangepicker(); @@ -187,7 +183,7 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { autoUpdateInput: true, linkedCalendars: true, }, - function (start, end, label) { + function (start, end) { self.first_day = start.format("DD/MM/YYYY"); self.last_day = end.format("DD/MM/YYYY"); self._rpc({ @@ -213,7 +209,11 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { * @private */ _getBarChartData: function (typeData) { - var data, data_autocons, data_allocons, data_label, data_surplus; + var data = {}; + var data_autocons = []; + var data_allocons = []; + var data_label = []; + var data_surplus = []; if (typeData === "cons") { if (this.scale === "day") { @@ -282,9 +282,6 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { type: "bar", data: data, options: { - legend: { - onHover: (event, chartElement) => {}, - }, interaction: { intersect: false, }, @@ -328,9 +325,9 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { .locale("fr-FR") .format("DD/MM/YYYY HH:ss"); }, - label: function (context, data) { + label: function (context, chart) { return ( - data.datasets[context.datasetIndex].label + + chart.datasets[context.datasetIndex].label + " : " + context.yLabel.toLocaleString("fr", { maximumFractionDigits: 1, @@ -350,7 +347,8 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { * @private */ _getPieChartData: function (typeData) { - var data, res; + var data = {}; + var res = []; var sum_res1 = 0; var sum_res2 = 0; if (typeData === "cons") { @@ -442,9 +440,9 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { size: 18, weight: "bold", }, - formatter: (value, data) => { + formatter: (value, chart) => { var total = 0; - data.dataset.data.forEach((num) => { + chart.dataset.data.forEach((num) => { total += num; }); var labelPercentage = Math.round( @@ -458,12 +456,12 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { }, tooltips: { callbacks: { - label: function (tooltipItem, data) { + label: function (tooltipItem, chart) { var allData = - data.datasets[tooltipItem.datasetIndex] + chart.datasets[tooltipItem.datasetIndex] .data; var tooltipLabel = - data.labels[tooltipItem.index]; + chart.labels[tooltipItem.index]; var tooltipData = allData[tooltipItem.index]; var total = 0; for (var i in allData) { @@ -493,7 +491,7 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { * @private */ _getLineChartData: function (typeData) { - var data; + var data = {}; if (typeData === "cons") { data = { labels: this.chartData.label, @@ -560,11 +558,9 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { _getLineChartConfig: function (typeData) { var data = this._getLineChartData(typeData); - var stacked; + var stacked = true; if (typeData === "cons") { stacked = false; - } else { - stacked = true; } return { type: "line", @@ -611,9 +607,9 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { .locale("fr-FR") .format("DD/MM/YYYY HH:ss"); }, - label: function (context, data) { + label: function (context, chart) { return ( - data.datasets[context.datasetIndex].label + + chart.datasets[context.datasetIndex].label + " : " + context.yLabel.toLocaleString("fr", { maximumFractionDigits: 1, @@ -661,12 +657,20 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { }, _updateDataTemplate: function (data) { - self = this; + var self = this; self.chartData = data.chart_data; - self.scale = data.scale; - + self.minDate = data.date_min; + self.maxDate = data.date_max; + self.date_range_picker.data("daterangepicker").minDate = moment( + data.date_min, + "DD/MM/YYYY" + ); + self.date_range_picker.data("daterangepicker").maxDate = moment( + data.date_max, + "DD/MM/YYYY" + ); if (data.is_curve_line) { $(".js_curv_line").removeClass("d-none"); } else { @@ -675,16 +679,16 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { // Disable buttons if first or last date if ( - moment(this.last_day, "DD/MM/YYYY") >= - moment(this.maxDate, "DD/MM/YYYY") + moment(self.last_day, "DD/MM/YYYY") >= + moment(self.maxDate, "DD/MM/YYYY") ) { $('button[id="next-period"]').prop("disabled", true); } else { $('button[id="next-period"]').prop("disabled", false); } if ( - moment(this.first_day, "DD/MM/YYYY") <= - moment(this.minDate, "DD/MM/YYYY") + moment(self.first_day, "DD/MM/YYYY") <= + moment(self.minDate, "DD/MM/YYYY") ) { $('button[id="previous-period"]').prop("disabled", true); } else { @@ -752,10 +756,10 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { this._updateChartData(this.title_name); }, - _onPreviousPeriod: function (ev) { + _onPreviousPeriod: function () { this._onChangePeriod("previous"); }, - _onNextPeriod: function (ev) { + _onNextPeriod: function () { this._onChangePeriod("next"); }, _onChangePeriod: function (type) { @@ -771,7 +775,7 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { delta_month = last_day.month() - first_day.month() + 1; } - if (type == "previous") { + if (type === "previous") { // Compare for first day let next_first = first_day .clone() @@ -792,7 +796,7 @@ odoo.define("oacc_portal_overview_cdc.operation_chart", function (require) { .max([next_first, moment_min]) .format("DD/MM/YYYY"); } - if (type == "next") { + if (type === "next") { // Compare for last day let next_last = last_day.clone().add(delta_days).add(1, "d"); const moment_max = moment(this.maxDate, "DD/MM/YYYY");