From 5a65465dde152787da766aa565e5ad9b644f33ea Mon Sep 17 00:00:00 2001 From: miad-odoo Date: Mon, 3 Oct 2022 09:27:34 +0000 Subject: [PATCH] [IMP] crm: add prorated recurring revenue in forecast view MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Purpose: In the Forecast view of the CRM module, when recurring revenues are activated, they are not shown in the progress bar of each stage of the kanban view. Only the prorated expected revenue (non-recurring) are shown. In the regular kanban view, they are shown. To display them, we extended the CrmKanban view, which already possesses this behavior, since behaviors relevant to the CrmKanban view are also relevant to the ForecastKanban view. As for the forecast kanban cards, when recurring revenues are activated, they show "regular" recurring revenues instead of "prorated" recurring revenues. Expected revenues are prorated. This is misleading for users. The goal is to show prorated recurring revenues instead of just recurring revenues. Task-2994146 Task-3006404 closes odoo/odoo#102037 Signed-off-by: Warnon Aurélien (awa) --- addons/crm/models/crm_lead.py | 7 +++++++ .../src/views/forecast_kanban/forecast_kanban_model.js | 7 ++++--- .../views/forecast_kanban/forecast_kanban_renderer.js | 6 +++--- .../views/forecast_kanban/forecast_kanban_renderer.xml | 2 +- .../src/views/forecast_kanban/forecast_kanban_view.js | 2 ++ addons/crm/views/crm_lead_views.xml | 9 +++++++-- 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 2b547af83ca..fdb7961e094 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -154,6 +154,8 @@ class Lead(models.Model): compute="_compute_recurring_revenue_monthly") recurring_revenue_monthly_prorated = fields.Monetary('Prorated MRR', currency_field='company_currency', store=True, compute="_compute_recurring_revenue_monthly_prorated") + recurring_revenue_prorated = fields.Monetary('Prorated Recurring Revenues', currency_field='company_currency', + compute="_compute_recurring_revenue_prorated", store=True) company_currency = fields.Many2one("res.currency", string='Currency', compute="_compute_company_currency", compute_sudo=True) # Dates date_closed = fields.Datetime('Closed Date', readonly=True, copy=False) @@ -511,6 +513,11 @@ class Lead(models.Model): for lead in self: lead.recurring_revenue_monthly_prorated = (lead.recurring_revenue_monthly or 0.0) * (lead.probability or 0) / 100.0 + @api.depends('recurring_revenue', 'probability') + def _compute_recurring_revenue_prorated(self): + for lead in self: + lead.recurring_revenue_prorated = (lead.recurring_revenue or 0.0) * (lead.probability or 0) / 100.0 + def _compute_calendar_event_count(self): if self.ids: meeting_data = self.env['calendar.event'].sudo()._read_group([ diff --git a/addons/crm/static/src/views/forecast_kanban/forecast_kanban_model.js b/addons/crm/static/src/views/forecast_kanban/forecast_kanban_model.js index 99e84849cd0..338e84f35cc 100644 --- a/addons/crm/static/src/views/forecast_kanban/forecast_kanban_model.js +++ b/addons/crm/static/src/views/forecast_kanban/forecast_kanban_model.js @@ -1,8 +1,8 @@ /** @odoo-module **/ -import { KanbanModel } from "@web/views/kanban/kanban_model"; +import { CrmKanbanModel, CrmKanbanGroup } from "@crm/views/crm_kanban/crm_kanban_model"; -export class ForecastKanbanModel extends KanbanModel { +export class ForecastKanbanModel extends CrmKanbanModel { setup(params, { fillTemporalService }) { super.setup(...arguments); this.fillTemporalService = fillTemporalService; @@ -100,5 +100,6 @@ export class ForecastKanbanDynamicGroupList extends ForecastKanbanModel.DynamicG } } -ForecastKanbanModel.services = [...KanbanModel.services, "fillTemporalService"]; +ForecastKanbanModel.services = [...CrmKanbanModel.services, "fillTemporalService"]; ForecastKanbanModel.DynamicGroupList = ForecastKanbanDynamicGroupList; +ForecastKanbanModel.group = CrmKanbanGroup; diff --git a/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.js b/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.js index 08bd3b11f8b..9a710e3f02f 100644 --- a/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.js +++ b/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.js @@ -1,12 +1,12 @@ /** @odoo-module **/ +import { CrmKanbanRenderer } from "@crm/views/crm_kanban/crm_kanban_renderer"; import { sprintf } from "@web/core/utils/strings"; import { useService } from "@web/core/utils/hooks"; -import { KanbanRenderer } from "@web/views/kanban/kanban_renderer"; import { ForecastKanbanColumnQuickCreate } from "@crm/views/forecast_kanban/forecast_kanban_column_quick_create"; import { INTERVAL_OPTIONS } from "@web/search/utils/dates"; -export class ForecastKanbanRenderer extends KanbanRenderer { +export class ForecastKanbanRenderer extends CrmKanbanRenderer { setup() { super.setup(...arguments); this.fillTemporalService = useService("fillTemporalService"); @@ -51,6 +51,6 @@ export class ForecastKanbanRenderer extends KanbanRenderer { ForecastKanbanRenderer.template = "crm.ForecastKanbanRenderer"; ForecastKanbanRenderer.components = { - ...KanbanRenderer.components, + ...CrmKanbanRenderer.components, ForecastKanbanColumnQuickCreate, }; diff --git a/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.xml b/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.xml index 9403445ae9e..a5864f599ac 100644 --- a/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.xml +++ b/addons/crm/static/src/views/forecast_kanban/forecast_kanban_renderer.xml @@ -1,6 +1,6 @@ - + + - + @@ -625,9 +625,14 @@ + + + + prorated_revenue + recurring_revenue_monthly_prorated @@ -654,7 +659,7 @@ + - +