From ee10b19f67827f9e05382ee25cd6021f68ddf10d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= <jeh@odoo.com>
Date: Mon, 22 Jul 2019 13:08:55 +0000
Subject: [PATCH] [REF] website_sale_slides: improve integration into eLeaning
 application
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

PURPOSE

eLearning should have its own application in manager. Indeed this is becoming
a big application and having it embedded inside Website application is not
enough anymore. It should also hold updated and easy-to-use menus,
navigation, actions and views in backend.

SPECIFICATIONS

Improve course form view: add a revenue stat button displaying the total
of sale order linked to the course's product.

Add in slide.channel kanban card
  * Add "Sales       150.00$" below "Watch Time" if type "on payment". Same
    info than the smart/stat button on the course itself. Click on the amount
    sends to Reporting Revenues (same than on the stat btn)

Add menu entry inside Reporting
    * Revenues: graph view on sale.report model showing revenues of eLearning
      courses.
        Area chart, X: month Y: €, Color: course

LINKS

Task 1978729
PR #35061

Co-Authored-By: Thibault Delavallée <tde@odoo.com>
Co-Authored-By: Jérémy Hennecart <jeh@odoo.com>
---
 addons/website_sale_slides/__manifest__.py    |  2 +
 addons/website_sale_slides/models/__init__.py |  1 +
 .../models/product_product.py                 | 10 ++++
 .../models/slide_channel.py                   | 23 +++++++-
 .../report/sale_report_views.xml              | 23 ++++++++
 .../views/slide_channel_views.xml             | 57 ++++++++++++++-----
 .../views/website_slides_menu_views.xml       |  8 +++
 .../views/slide_channel_views.xml             |  2 +-
 8 files changed, 109 insertions(+), 17 deletions(-)
 create mode 100644 addons/website_sale_slides/models/product_product.py
 create mode 100644 addons/website_sale_slides/report/sale_report_views.xml
 create mode 100644 addons/website_sale_slides/views/website_slides_menu_views.xml

diff --git a/addons/website_sale_slides/__manifest__.py b/addons/website_sale_slides/__manifest__.py
index 91fcb574d36f..caafbefba607 100644
--- a/addons/website_sale_slides/__manifest__.py
+++ b/addons/website_sale_slides/__manifest__.py
@@ -10,7 +10,9 @@
     'depends': ['website_slides', 'website_sale'],
     'installable': True,
     'data': [
+        'report/sale_report_views.xml',
         'views/assets.xml',
+        'views/website_slides_menu_views.xml',
         'views/slide_channel_views.xml',
         'views/website_slides_templates.xml',
     ],
diff --git a/addons/website_sale_slides/models/__init__.py b/addons/website_sale_slides/models/__init__.py
index 715f352d1479..a7ae607df420 100644
--- a/addons/website_sale_slides/models/__init__.py
+++ b/addons/website_sale_slides/models/__init__.py
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
 
+from . import product_product
 from . import slide_channel
 from . import sale_order
diff --git a/addons/website_sale_slides/models/product_product.py b/addons/website_sale_slides/models/product_product.py
new file mode 100644
index 000000000000..94fc0c6e82b4
--- /dev/null
+++ b/addons/website_sale_slides/models/product_product.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class Product(models.Model):
+    _inherit = "product.product"
+
+    channel_ids = fields.One2many('slide.channel', 'product_id', string='Courses')
diff --git a/addons/website_sale_slides/models/slide_channel.py b/addons/website_sale_slides/models/slide_channel.py
index 4acdb2e1ba63..88920f58e556 100644
--- a/addons/website_sale_slides/models/slide_channel.py
+++ b/addons/website_sale_slides/models/slide_channel.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo import models, fields
+from odoo import api, fields, models
 
 
 class Channel(models.Model):
@@ -9,11 +9,32 @@ class Channel(models.Model):
 
     enroll = fields.Selection(selection_add=[('payment', 'On payment')])
     product_id = fields.Many2one('product.product', 'Product', index=True)
+    product_sale_revenues = fields.Float(
+        string='Total revenues', compute='_compute_product_sale_revenues',
+        groups="sales_team.group_sale_salesman")
 
     _sql_constraints = [
         ('product_id_check', "CHECK( enroll!='payment' OR product_id IS NOT NULL )", "Product is required for on payment channels.")
     ]
 
+    @api.depends('product_id')
+    def _compute_product_sale_revenues(self):
+        domain = [
+            ('state', 'in', self.env['sale.report']._get_done_states()),
+            ('product_id', 'in', self.product_id.ids),
+        ]
+        rg_data = dict(
+            (item['product_id'][0], item['price_total'])
+            for item in self.env['sale.report'].read_group(domain, ['product_id', 'price_total'], ['product_id'])
+        )
+        for channel in self:
+            channel.product_sale_revenues = rg_data.get(channel.product_id.id, 0)
+
+    def action_view_sales(self):
+        action = self.env.ref('website_sale_slides.sale_report_action_slides').read()[0]
+        action['domain'] = [('product_id', 'in', self.product_id.ids)]
+        return action
+
     def _filter_add_members(self, target_partners, **member_values):
         """ Overridden to add 'payment' channels to the filtered channels. People
         that can write on payment-based channels can add members. """
diff --git a/addons/website_sale_slides/report/sale_report_views.xml b/addons/website_sale_slides/report/sale_report_views.xml
new file mode 100644
index 000000000000..14d3bebd3c8f
--- /dev/null
+++ b/addons/website_sale_slides/report/sale_report_views.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <record id="sale_report_view_graph_slides" model="ir.ui.view">
+         <field name="name">sale.report.view.graph.slides</field>
+         <field name="model">sale.report</field>
+         <field name="arch" type="xml">
+             <graph string="eLearning Sales Analysis" type="line">
+                 <field name="confirmation_date" type="row" interval="day"/>
+                 <field name="price_subtotal" type="measure"/>
+             </graph>
+         </field>
+    </record>
+
+	<record id="sale_report_action_slides" model="ir.actions.act_window">
+        <field name="name">eLearning Revenues</field>
+        <field name="res_model">sale.report</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="view_mode">graph,pivot</field>
+        <field name="domain">[("product_id.channel_ids", "!=", False)]</field>
+        <field name="context">{'group_by': ['confirmation_date', 'product_id']}</field>
+        <field name="view_id" ref="sale_report_view_graph_slides"/>
+    </record>
+</odoo>
diff --git a/addons/website_sale_slides/views/slide_channel_views.xml b/addons/website_sale_slides/views/slide_channel_views.xml
index f620e6e14fd9..cc6945147b02 100644
--- a/addons/website_sale_slides/views/slide_channel_views.xml
+++ b/addons/website_sale_slides/views/slide_channel_views.xml
@@ -1,16 +1,43 @@
 <?xml version="1.0" encoding="utf-8"?>
-<odoo>
-    <data>
-        <record id="slide_channel_view_form" model="ir.ui.view">
-            <field name="name">slide.channel.view.form.inherit.sale</field>
-            <field name="model">slide.channel</field>
-            <field name="inherit_id" ref="website_slides.view_slide_channel_form"/>
-            <field name="arch" type="xml">
-                <xpath expr="//field[@name='enroll']" position="after">
-                    <field name="product_id"
-                        attrs="{'invisible': [('enroll', '!=', 'payment')], 'required': [('enroll', '=', 'payment')]}" />
-                </xpath>
-            </field>
-        </record>
-    </data>
-</odoo>
+<odoo><data>
+    <record id="slide_channel_view_form" model="ir.ui.view">
+        <field name="name">slide.channel.view.form.inherit.sale</field>
+        <field name="model">slide.channel</field>
+        <field name="inherit_id" ref="website_slides.view_slide_channel_form"/>
+        <field name="arch" type="xml">
+            <xpath expr="//field[@name='enroll']" position="after">
+                <field name="product_id"
+                    attrs="{'invisible': [('enroll', '!=', 'payment')], 'required': [('enroll', '=', 'payment')]}" />
+            </xpath>
+            <xpath expr="//button[@name='action_redirect_to_members']" position="after">
+                <button name="action_view_sales"
+                    type="object"
+                    icon="fa-signal"
+                    class="oe_stat_button"
+                    groups="sales_team.group_sale_salesman">
+                    <field name="product_sale_revenues" string="Sales" widget="statinfo"/>
+                </button>
+            </xpath>
+        </field>
+    </record>
+
+    <record id="slide_channel_view_kanban" model="ir.ui.view">
+        <field name="name">slide.channel.view.kanban.inherit.sale</field>
+        <field name="model">slide.channel</field>
+        <field name="inherit_id" ref="website_slides.slide_channel_view_kanban"/>
+        <field name="arch" type="xml">
+            <xpath expr="//field[@name='website_published']" position="before">
+                <field name="enroll"/>
+            </xpath>
+            <xpath expr="//div[@name='info_total_time']" position="after">
+                <div class="d-flex" attrs="{'invisible': [('enroll', '!=', 'payment')]}">
+                    <span class="mr-auto"><label for="product_sale_revenues" class="mb0">Sales</label></span>
+                    <field name="product_sale_revenues"/>
+                </div>
+            </xpath>
+            <xpath expr="//a[@name='action_channel_invite']" position="attributes">
+                <attribute name="attrs">{'invisible': [('enroll', '=', 'payment')]}</attribute>
+            </xpath>
+        </field>
+    </record>
+</data></odoo>
diff --git a/addons/website_sale_slides/views/website_slides_menu_views.xml b/addons/website_sale_slides/views/website_slides_menu_views.xml
new file mode 100644
index 000000000000..cb11ed28fd0b
--- /dev/null
+++ b/addons/website_sale_slides/views/website_slides_menu_views.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <menuitem name="Revenues"
+        id="website_slides_menu_report_revenues"
+        parent="website_slides.website_slides_menu_report"
+        sequence="3"
+        action="sale_report_action_slides"/>
+</odoo>
diff --git a/addons/website_slides/views/slide_channel_views.xml b/addons/website_slides/views/slide_channel_views.xml
index 898599ede254..698dd59f0c2c 100644
--- a/addons/website_slides/views/slide_channel_views.xml
+++ b/addons/website_slides/views/slide_channel_views.xml
@@ -276,7 +276,7 @@
                                                 <span class="mr-auto"><label for="total_views" class="mb0">Views</label></span>
                                                 <field name="total_views"/>
                                             </div>
-                                            <div class="d-flex">
+                                            <div class="d-flex" name="info_total_time">
                                                 <span class="mr-auto"><label for="total_time" class="mb0">Watch Time</label></span>
                                                 <field name="total_time" widget="float_time"/>
                                             </div>
-- 
GitLab