diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/crm/report | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/crm/report')
| -rw-r--r-- | addons/crm/report/__init__.py | 4 | ||||
| -rw-r--r-- | addons/crm/report/crm_activity_report.py | 88 | ||||
| -rw-r--r-- | addons/crm/report/crm_activity_report_views.xml | 125 | ||||
| -rw-r--r-- | addons/crm/report/crm_opportunity_report_views.xml | 149 |
4 files changed, 366 insertions, 0 deletions
diff --git a/addons/crm/report/__init__.py b/addons/crm/report/__init__.py new file mode 100644 index 00000000..4b9eb202 --- /dev/null +++ b/addons/crm/report/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import crm_activity_report diff --git a/addons/crm/report/crm_activity_report.py b/addons/crm/report/crm_activity_report.py new file mode 100644 index 00000000..f9ce5907 --- /dev/null +++ b/addons/crm/report/crm_activity_report.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, tools, api + + +class ActivityReport(models.Model): + """ CRM Lead Analysis """ + + _name = "crm.activity.report" + _auto = False + _description = "CRM Activity Analysis" + _rec_name = 'id' + + date = fields.Datetime('Completion Date', readonly=True) + lead_create_date = fields.Datetime('Creation Date', readonly=True) + date_conversion = fields.Datetime('Conversion Date', readonly=True) + date_deadline = fields.Date('Expected Closing', readonly=True) + date_closed = fields.Datetime('Closed Date', readonly=True) + author_id = fields.Many2one('res.partner', 'Assigned To', readonly=True) + user_id = fields.Many2one('res.users', 'Salesperson', readonly=True) + team_id = fields.Many2one('crm.team', 'Sales Team', readonly=True) + lead_id = fields.Many2one('crm.lead', "Opportunity", readonly=True) + body = fields.Html('Activity Description', readonly=True) + subtype_id = fields.Many2one('mail.message.subtype', 'Subtype', readonly=True) + mail_activity_type_id = fields.Many2one('mail.activity.type', 'Activity Type', readonly=True) + country_id = fields.Many2one('res.country', 'Country', readonly=True) + company_id = fields.Many2one('res.company', 'Company', readonly=True) + stage_id = fields.Many2one('crm.stage', 'Stage', readonly=True) + partner_id = fields.Many2one('res.partner', 'Customer', readonly=True) + lead_type = fields.Selection( + string='Type', + selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')], + help="Type is used to separate Leads and Opportunities") + active = fields.Boolean('Active', readonly=True) + + def _select(self): + return """ + SELECT + m.id, + l.create_date AS lead_create_date, + l.date_conversion, + l.date_deadline, + l.date_closed, + m.subtype_id, + m.mail_activity_type_id, + m.author_id, + m.date, + m.body, + l.id as lead_id, + l.user_id, + l.team_id, + l.country_id, + l.company_id, + l.stage_id, + l.partner_id, + l.type as lead_type, + l.active + """ + + def _from(self): + return """ + FROM mail_message AS m + """ + + def _join(self): + return """ + JOIN crm_lead AS l ON m.res_id = l.id + """ + + def _where(self): + disccusion_subtype = self.env.ref('mail.mt_comment') + return """ + WHERE + m.model = 'crm.lead' AND (m.mail_activity_type_id IS NOT NULL OR m.subtype_id = %s) + """ % (disccusion_subtype.id,) + + def init(self): + tools.drop_view_if_exists(self._cr, self._table) + self._cr.execute(""" + CREATE OR REPLACE VIEW %s AS ( + %s + %s + %s + %s + ) + """ % (self._table, self._select(), self._from(), self._join(), self._where()) + ) diff --git a/addons/crm/report/crm_activity_report_views.xml b/addons/crm/report/crm_activity_report_views.xml new file mode 100644 index 00000000..987b865f --- /dev/null +++ b/addons/crm/report/crm_activity_report_views.xml @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <record id="crm_activity_report_view_graph" model="ir.ui.view"> + <field name="name">crm.activity.report.graph</field> + <field name="model">crm.activity.report</field> + <field name="arch" type="xml"> + <graph string="Activities Analysis" stacked="True" sample="1" disable_linking="1"> + <field name="mail_activity_type_id" type="col"/> + <field name="date" interval="month" type="row"/> + </graph> + </field> + </record> + + <record id="crm_activity_report_view_pivot" model="ir.ui.view"> + <field name="name">crm.activity.report.pivot</field> + <field name="model">crm.activity.report</field> + <field name="arch" type="xml"> + <pivot string="Activities Analysis" disable_linking="True" sample="1"> + <field name="mail_activity_type_id" type="col"/> + <field name="date" interval="month" type="row"/> + </pivot> + </field> + </record> + + <record id="crm_activity_report_view_tree" model="ir.ui.view"> + <field name="name">crm.activity.report.tree</field> + <field name="model">crm.activity.report</field> + <field name="arch" type="xml"> + <tree default_order="date desc"> + <field name="date"/> + <field name="author_id"/> + <field name="mail_activity_type_id"/> + <field name="body"/> + <field name="company_id" groups="base.group_multi_company"/> + </tree> + </field> + </record> + + <record id="crm_activity_report_view_search" model="ir.ui.view"> + <field name="name">crm.activity.report.search</field> + <field name="model">crm.activity.report</field> + <field name="arch" type="xml"> + <search string="Activities Analysis"> + <field name="mail_activity_type_id" string="Activity Type"/> + <field name="lead_id" string="Opportunity"/> + <field name="user_id" string="Salesperson"/> + <field name="team_id" context="{'invisible_team': False}"/> + <field name="author_id" string="Assigned To"/> + <separator groups="crm.group_use_lead"/> + <filter string="Leads" name="lead" domain="[('lead_type', '=', 'lead')]" help="Show only lead" groups="crm.group_use_lead"/> + <filter string="Opportunities" name="opportunity" domain="[('lead_type', '=', 'opportunity')]" help="Show only opportunity" groups="crm.group_use_lead"/> + <separator/> + <filter string="Won" name="won" domain="[('stage_id.is_won', '=', True)]"/> + <separator/> + <filter string="Trailing 12 months" name="completion_date" domain="[ + ('date', '>=', (datetime.datetime.combine(context_today() + relativedelta(days=-365), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S')), + ('date', '>=', (datetime.datetime.combine(context_today(), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))]"/> + <separator/> + <filter name="filter_date" date="date"/> + <separator/> + <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/> + <group expand="1" string="Group By"> + <filter string="Activity" name="group_by_activity_type" context="{'group_by': 'mail_activity_type_id'}"/> + <filter string="Type" name="group_by_subtype" context="{'group_by': 'subtype_id'}"/> + <filter string="Assigned To" name="group_by_author_id" context="{'group_by': 'author_id'}"/> + <filter string="Completion Date" name="group_by_completion_date" context="{'group_by': 'date:month'}"/> + <separator/> + <filter string="Salesperson" name="group_by_user_id" context="{'group_by': 'user_id'}"/> + <filter string="Sales Team" name="saleschannel" context="{'group_by': 'team_id'}"/> + <filter string="Stage" name="stage" context="{'group_by': 'stage_id'}"/> + <filter string="Company" name="company" context="{'group_by': 'company_id'}" groups="base.group_multi_company"/> + <filter string="Creation Date" name="group_by_lead_date_creation" context="{'group_by': 'lead_create_date'}"/> + <filter string="Expected Closing" name="group_by_date_deadline" context="{'group_by': 'date_deadline'}"/> + <filter string="Closed Date" name="group_by_date_closed" context="{'group_by': 'date_closed'}"/> + </group> + </search> + </field> + </record> + + <record id="crm_activity_report_action" model="ir.actions.act_window"> + <field name="name">Pipeline Activities</field> + <field name="res_model">crm.activity.report</field> + <field name="view_mode">graph,pivot,tree</field> + <field name="context">{ + 'search_default_completion_date': 1, + 'pivot_column_groupby': ['subtype_id', 'mail_activity_type_id'], + 'pivot_row_groupby': ['date:month'], + 'graph_mode': 'bar', + 'graph_groupbys': ['date:month', 'subtype_id'], + }</field> + <field name="domain">[]</field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + No data yet! + </p><p> + Start scheduling activities on your opportunities + </p> + </field> + </record> + + <menuitem + id="crm_activity_report_menu" + name="Activities" + groups="sales_team.group_sale_manager" + parent="crm_menu_report" + action="crm_activity_report_action" + sequence="3"/> + + <record id="crm_activity_report_action_team" model="ir.actions.act_window"> + <field name="name">Pipeline Activities</field> + <field name="res_model">crm.activity.report</field> + <field name="view_mode">graph,pivot,tree</field> + <field name="context">{'search_default_team_id': active_id}</field> + <field name="domain">[]</field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + No data yet! + </p><p> + Start scheduling activities on your opportunities + </p> + </field> + </record> + +</odoo> diff --git a/addons/crm/report/crm_opportunity_report_views.xml b/addons/crm/report/crm_opportunity_report_views.xml new file mode 100644 index 00000000..85a4012e --- /dev/null +++ b/addons/crm/report/crm_opportunity_report_views.xml @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <!-- Opportunities by user and team pivot View --> + <record id="crm_opportunity_report_view_pivot" model="ir.ui.view"> + <field name="name">crm.opportunity.report.pivot</field> + <field name="model">crm.lead</field> + <field name="priority">60</field> + <field name="arch" type="xml"> + <pivot string="Pipeline Analysis" sample="1"> + <field name="create_date" interval="month" type="col"/> + <field name="stage_id" type="row"/> + <field name="prorated_revenue" type="measure"/> + </pivot> + </field> + </record> + + <record id="crm_opportunity_report_view_pivot_lead" model="ir.ui.view"> + <field name="name">crm.opportunity.report.view.pivot.lead</field> + <field name="model">crm.lead</field> + <field name="priority">60</field> + <field name="arch" type="xml"> + <pivot string="Leads Analysis" sample="1"> + <field name="create_date" interval="month" type="row"/> + <field name="team_id" type="col"/> + </pivot> + </field> + </record> + + <!-- Opportunities by user and team Graph View --> + <record id="crm_opportunity_report_view_graph" model="ir.ui.view"> + <field name="name">crm.opportunity.report.graph</field> + <field name="model">crm.lead</field> + <field name="arch" type="xml"> + <graph string="Pipeline Analysis" stacked="True" sample="1"> + <field name="stage_id" type="row"/> + <field name="date_deadline" type="row" interval="month"/> + <field name="prorated_revenue" type="measure"/> + <field name="color" invisible="1"/> + </graph> + </field> + </record> + + <record id="crm_opportunity_report_view_graph_lead" model="ir.ui.view"> + <field name="name">crm.opportunity.report.graph.lead</field> + <field name="model">crm.lead</field> + <field name="priority">20</field> + <field name="arch" type="xml"> + <graph string="Leads Analysis" stacked="True" sample="1"> + <field name="create_date" interval="month" type="col"/> + <field name="team_id" type="col"/> + <field name="color" invisible="1"/> + </graph> + </field> + </record> + + <!-- Opportunities by user and team Search View --> + <record id="crm_opportunity_report_view_search" model="ir.ui.view"> + <field name="name">crm.lead.search</field> + <field name="model">crm.lead</field> + <field name="priority">32</field> + <field name="arch" type="xml"> + <search string="Opportunities Analysis"> + <filter string="My Opportunities" name="my" + domain="[('user_id', '=', uid)]"/> + <separator/> + <filter name="lead" string="Lead" domain="[('type','=', 'lead')]" help="Show only lead"/> + <filter name="opportunity" string="Opportunity" domain="[('type','=','opportunity')]" help="Show only opportunity"/> + <separator/> + <filter string="Won" name="won" + domain="[('probability', '=', 100)]"/> + <filter string="Lost" name="lost" + domain="[('probability', '=', 0), ('active', '=', False)]"/> + <field name="team_id" context="{'invisible_team': False}"/> + <field name="user_id" string="Salesperson"/> + <separator/> + <filter string="Creation Date" name="filter_create_date" date="create_date" default_period="this_year"/> + <filter string="Expected Closing" name="filter_date_deadline" date="date_deadline"/> + <filter string="Date Closed" name="date_closed_filter" date="date_closed"/> + <group expand="0" string="Extended Filters"> + <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/> + <field name="stage_id" domain="['|', ('team_id', '=', False), ('team_id', '=', 'team_id')]"/> + <field name="campaign_id"/> + <field name="medium_id"/> + <field name="source_id"/> + <field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/> + <newline/> + <field name="create_date"/> + <field name="date_open"/> + <field name="date_closed"/> + </group> + <group expand="1" string="Group By"> + <filter string="Salesperson" name="salesperson" context="{'group_by':'user_id'}" /> + <filter string="Sales Team" name="saleschannel" context="{'group_by':'team_id'}"/> + <filter string="City" name="city" context="{'group_by':'city'}" /> + <filter string="Country" name="country" context="{'group_by':'country_id'}" /> + <filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <filter string="Stage" name="stage" context="{'group_by':'stage_id'}"/> + <separator orientation="vertical" /> + <filter string="Creation Date" context="{'group_by':'create_date:month'}" name="month"/> + <filter string="Conversion Date" context="{'group_by':'date_conversion:month'}" name="conversion_date" help="Conversion Date from Lead to Opportunity"/> + <filter string="Expected Closing" context="{'group_by':'date_deadline:month'}" name="date_deadline"/> + <filter string="Closed Date" context="{'group_by':'date_closed'}" name="date_closed_groupby"/> + <filter string="Lost Reason" name="lostreason" context="{'group_by':'lost_reason'}"/> + </group> + </search> + </field> + </record> + + <record id="crm_opportunity_report_action" model="ir.actions.act_window"> + <field name="name">Pipeline Analysis</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">pivot,graph,tree,form</field> + <field name="search_view_id" ref="crm.crm_opportunity_report_view_search"/> + <field name="context">{'search_default_opportunity': True, 'search_default_current': True}</field> + <field name="view_ids" + eval="[(5, 0, 0), + (0, 0, {'view_mode': 'graph', 'view_id': ref('crm_opportunity_report_view_graph')}), + (0, 0, {'view_mode': 'pivot', 'view_id': ref('crm_opportunity_report_view_pivot')}), + (0, 0, {'view_mode': 'tree', 'view_id': ref('crm_case_tree_view_oppor')})]"/> + <field name="help">Pipeline Analysis gives you an instant access to + your opportunities with information such as the expected revenue, planned cost, + missed deadlines or the number of interactions per opportunity. This report is + mainly used by the sales manager in order to do the periodic review with the + teams of the sales pipeline.</field> + </record> + + <record id="crm_opportunity_report_menu" model="ir.ui.menu"> + <field name="action" ref="crm.crm_opportunity_report_action"/> + </record> + + <record id="crm_opportunity_report_action_lead" model="ir.actions.act_window"> + <field name="name">Leads Analysis</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">pivot,graph,tree,form</field> + <field name="search_view_id" ref="crm.crm_opportunity_report_view_search"/> + <field name="context">{'search_default_current': True, 'search_default_archived': True}</field> + <field name="view_ids" + eval="[(5, 0, 0), + (0, 0, {'view_mode': 'graph', 'view_id': ref('crm_opportunity_report_view_graph_lead')}), + (0, 0, {'view_mode': 'pivot', 'view_id': ref('crm_opportunity_report_view_pivot_lead')})]"/> + <field name="help">This report analyses the source of your leads.</field> + </record> + + <record id="crm_opportunity_report_menu_lead" model="ir.ui.menu"> + <field name="action" ref="crm.crm_opportunity_report_action_lead"/> + </record> + +</odoo> |
