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/views | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/crm/views')
| -rw-r--r-- | addons/crm/views/assets.xml | 22 | ||||
| -rw-r--r-- | addons/crm/views/calendar_views.xml | 15 | ||||
| -rw-r--r-- | addons/crm/views/crm_lead_views.xml | 1060 | ||||
| -rw-r--r-- | addons/crm/views/crm_lost_reason_views.xml | 75 | ||||
| -rw-r--r-- | addons/crm/views/crm_menu_views.xml | 140 | ||||
| -rw-r--r-- | addons/crm/views/crm_recurring_plan_views.xml | 41 | ||||
| -rw-r--r-- | addons/crm/views/crm_stage_views.xml | 79 | ||||
| -rw-r--r-- | addons/crm/views/crm_team_views.xml | 276 | ||||
| -rw-r--r-- | addons/crm/views/digest_views.xml | 16 | ||||
| -rw-r--r-- | addons/crm/views/mail_activity_views.xml | 7 | ||||
| -rw-r--r-- | addons/crm/views/res_config_settings_views.xml | 177 | ||||
| -rw-r--r-- | addons/crm/views/res_partner_views.xml | 52 | ||||
| -rw-r--r-- | addons/crm/views/utm_campaign_views.xml | 43 |
13 files changed, 2003 insertions, 0 deletions
diff --git a/addons/crm/views/assets.xml b/addons/crm/views/assets.xml new file mode 100644 index 00000000..1ffed45b --- /dev/null +++ b/addons/crm/views/assets.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <template id="assets_backend" name="CRM assets backend" inherit_id="web.assets_backend"> + <xpath expr="." position="inside"> + <script type="text/javascript" src="/crm/static/src/js/crm_form.js"/> + <script type="text/javascript" src="/crm/static/src/js/crm_kanban.js"/> + <script type="text/javascript" src="/crm/static/src/js/systray_activity_menu.js"/> + <script type="text/javascript" src="/crm/static/src/js/tours/crm.js"></script> + </xpath> + </template> + <template id="assets_tests" name="CRM Assets Tests" inherit_id="web.assets_tests"> + <xpath expr="." position="inside"> + <script type="text/javascript" src="/crm/static/tests/tours/crm_rainbowman.js"></script> + </xpath> + </template> + <template id="qunit_suite" name="crm tests" inherit_id="web.qunit_suite_tests"> + <xpath expr="." position="inside"> + <script type="text/javascript" src="/crm/static/tests/mock_server.js"></script> + <script type="text/javascript" src="/crm/static/tests/crm_rainbowman_tests.js"></script> + </xpath> + </template> +</odoo> diff --git a/addons/crm/views/calendar_views.xml b/addons/crm/views/calendar_views.xml new file mode 100644 index 00000000..8267a605 --- /dev/null +++ b/addons/crm/views/calendar_views.xml @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<odoo> + + <record id="view_crm_meeting_search" model="ir.ui.view"> + <field name="name">calendar.event.form.inherit</field> + <field name="model">calendar.event</field> + <field name="inherit_id" ref="calendar.view_calendar_event_search"/> + <field name="arch" type="xml"> + <xpath expr="//field[@name='user_id']" position="after"> + <field name="opportunity_id"/> + </xpath> + </field> + </record> + +</odoo> diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml new file mode 100644 index 00000000..7224cc86 --- /dev/null +++ b/addons/crm/views/crm_lead_views.xml @@ -0,0 +1,1060 @@ +<?xml version="1.0"?> +<odoo> + <record id="crm_lead_view_form" model="ir.ui.view"> + <field name="name">crm.lead.form</field> + <field name="model">crm.lead</field> + <field name="arch" type="xml"> + <form class="o_lead_opportunity_form" js_class="crm_form"> + <header> + <button name="action_set_won_rainbowman" string="Mark Won" + type="object" class="oe_highlight" + attrs="{'invisible': ['|','|', ('active','=',False), ('probability', '=', 100), ('type', '=', 'lead')]}"/> + <button name="%(crm.crm_lead_lost_action)d" string="Mark Lost" + type="action" class="oe_highlight" context="{'default_lead_id': active_id}" attrs="{'invisible': ['|', ('type', '=', 'lead'),('active', '=', False),('probability', '<', 100)]}"/> + <button name="%(crm.action_crm_lead2opportunity_partner)d" string="Convert to Opportunity" type="action" help="Convert to Opportunity" + class="oe_highlight" attrs="{'invisible': ['|', ('type', '=', 'opportunity'), ('active', '=', False)]}"/> + <button name="toggle_active" string="Restore" type="object" + attrs="{'invisible': ['|', ('probability', '>', 0), ('active', '=', True)]}"/> + <button name="action_set_lost" string="Mark as Lost" type="object" + attrs="{'invisible': ['|', ('type', '=', 'opportunity'), '&', ('probability', '=', 0), ('active', '=', False)]}"/> + <field name="stage_id" widget="statusbar" + options="{'clickable': '1', 'fold_field': 'fold'}" + domain="['|', ('team_id', '=', team_id), ('team_id', '=', False)]" + attrs="{'invisible': ['|', ('active', '=', False), ('type', '=', 'lead')]}"/> + </header> + <div class="text-center alert alert-primary oe_edit_only" role="alert" attrs="{'invisible': ['|', ('ribbon_message', '=', False), ('ribbon_message', '=', '')]}"> + <field name="ribbon_message"/> + </div> + <sheet> + <field name="active" invisible="1"/> + <div class="oe_button_box" name="button_box"> + <button name="action_schedule_meeting" type="object" + class="oe_stat_button" icon="fa-calendar" + context="{'partner_id': partner_id}" + attrs="{'invisible': [('type', '=', 'lead')]}"> + <div class="o_stat_info"> + <field name="meeting_count" class="o_stat_value"/> + <span class="o_stat_text" attrs="{'invisible': [('meeting_count', '<', 2)]}"> Meetings</span> + <span class="o_stat_text" attrs="{'invisible': [('meeting_count', '>', 1)]}"> Meeting</span> + </div> + </button> + </div> + <widget name="web_ribbon" title="Lost" bg_color="bg-danger" attrs="{'invisible': ['|', ('probability', '>', 0), ('active', '=', True)]}"/> + <widget name="web_ribbon" title="Won" attrs="{'invisible': [('probability', '<', 100)]}" /> + <div class="oe_title"> + <label for="name" class="oe_edit_only" string="Lead" attrs="{'invisible': [('type', '=', 'opportunity')]}"/> + <label for="name" class="oe_edit_only" attrs="{'invisible': [('type', '=', 'lead')]}"/> + <h1><field name="name" placeholder="e.g. Product Pricing"/></h1> + <h2 class="o_row no-gutters align-items-end"> + <div class="col" attrs="{'invisible': [('type', '=', 'lead')]}"> + <label for="expected_revenue" class="oe_edit_only" /> + <div class="o_row"> + <field name="company_currency" invisible="1"/> + <field name="expected_revenue" class="oe_inline" widget='monetary' options="{'currency_field': 'company_currency'}"/> + <span class="oe_grey p-2" groups="crm.group_use_recurring_revenues"> + </span> + <span class="oe_grey p-2" groups="!crm.group_use_recurring_revenues"> at </span> + </div> + </div> + <div class="col" attrs="{'invisible': [('type', '=', 'lead')]}" groups="crm.group_use_recurring_revenues"> + <div class="o_row"> + <field name="recurring_revenue" class="pr-2 oe_inline" widget="monetary" options="{'currency_field': 'company_currency'}"/> + </div> + </div> + <div class="col" attrs="{'invisible': [('type', '=', 'lead')]}" groups="crm.group_use_recurring_revenues"> + <div class="o_row"> + <field name="recurring_plan" class="oe_inline" placeholder="E.g. Monthly" + attrs="{'required': [('recurring_revenue', '!=', 0)]}" options="{'no_create': True, 'no_open': True}"/> + <span class="oe_grey p-2"> at </span> + </div> + </div> + <div class="col"> + <div class="oe_edit_only d-flex align-items-center"> + <label for="probability"/> + <button class="btn btn-link" name="action_set_automated_probability" type="object" + attrs="{'invisible': [('is_automated_probability', '=', True)]}"> + <i class="fa fa-gear" role="img" title="Switch to automatic probability" aria-label="Switch to automatic probability"></i> + </button> + <small class="oe_grey h6 mb0" attrs="{'invisible': [('is_automated_probability', '=', True)]}"> + <field class="mb0" name="automated_probability" force_save="1"/> %% + </small> + </div> + <div id="probability" class="o_row d-flex"> + <field name="is_automated_probability" invisible="1"/> + <field name="probability" widget="float" class="oe_inline"/> + <span class="oe_grey"> %%</span> + </div> + </div> + </h2> + </div> + <group> + <group name="lead_partner" attrs="{'invisible': [('type', '=', 'opportunity')]}"> + <!-- Preload all the partner's information --> + <field name="partner_id" widget="res_partner_many2one" + context="{ + 'default_name': contact_name, + 'default_title': title, + 'default_street': street, + 'default_street2': street2, + 'default_city': city, + 'default_state_id': state_id, + 'default_zip': zip, + 'default_country_id': country_id, + 'default_function': function, + 'default_phone': phone, + 'default_mobile': mobile, + 'default_email': email_from, + 'default_user_id': user_id, + 'default_team_id': team_id, + 'default_website': website, + 'show_vat': True + }" groups="base.group_no_one"/> + <field name="partner_name"/> + <label for="street" string="Address"/> + <div class="o_address_format"> + <field name="street" placeholder="Street..." class="o_address_street"/> + <field name="street2" placeholder="Street 2..." class="o_address_street"/> + <field name="city" placeholder="City" class="o_address_city"/> + <field name="state_id" class="o_address_state" placeholder="State" options='{"no_open": True}'/> + <field name="zip" placeholder="ZIP" class="o_address_zip"/> + <field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/> + </div> + <field name="website" widget="url" placeholder="e.g. https://www.odoo.com"/> + <field name="lang_id"/> + </group> + + <group name="opportunity_partner" attrs="{'invisible': [('type', '=', 'lead')]}"> + <field name="partner_id" + widget="res_partner_many2one" + string="Customer" + context="{'res_partner_search_mode': type == 'opportunity' and 'customer' or False, + 'default_name': contact_name or partner_name, + 'default_street': street, + 'default_is_company': type == 'opportunity' and contact_name == False, + 'default_company_name': type == 'opportunity' and partner_name, + 'default_street2': street2, + 'default_city': city, + 'default_title': title, + 'default_state_id': state_id, + 'default_zip': zip, + 'default_country_id': country_id, + 'default_function': function, + 'default_phone': phone, + 'default_mobile': mobile, + 'default_email': email_from, + 'default_user_id': user_id, + 'default_team_id': team_id, + 'default_website': website, + 'show_vat': True, + }" + /> + <field name="is_blacklisted" invisible="1"/> + <field name="partner_is_blacklisted" invisible="1"/> + <field name="phone_blacklisted" invisible="1"/> + <field name="mobile_blacklisted" invisible="1"/> + <field name="email_state" invisible="1"/> + <field name="phone_state" invisible="1"/> + <label for="email_from" class="oe_inline"/> + <div class="o_row o_row_readonly"> + <button name="mail_action_blacklist_remove" class="fa fa-ban text-danger" + title="This email is blacklisted for mass mailings. Click to unblacklist." + type="object" context="{'default_email': email_from}" groups="base.group_user" + attrs="{'invisible': [('is_blacklisted', '=', False)]}"/> + <field name="email_from" string="Email" widget="email"/> + </div> + <label for="phone" class="oe_inline"/> + <div class="o_row o_row_readonly"> + <button name="phone_action_blacklist_remove" class="fa fa-ban text-danger" + title="This phone number is blacklisted for SMS Marketing. Click to unblacklist." + type="object" context="{'default_phone': phone}" groups="base.group_user" + attrs="{'invisible': [('phone_blacklisted', '=', False)]}"/> + <field name="phone" widget="phone"/> + </div> + </group> + <group name="lead_info" attrs="{'invisible': [('type', '=', 'opportunity')]}"> + <label for="contact_name"/> + <div class="o_row"> + <field name="contact_name"/> + <field name="title" placeholder="Title" domain="[]" options='{"no_open": True}'/> + </div> + <field name="is_blacklisted" invisible="1"/> + <field name="phone_blacklisted" invisible="1"/> + <field name="email_state" invisible="1"/> + <field name="phone_state" invisible="1"/> + <label for="email_from_group_lead_info" class="oe_inline"/> + <div class="o_row o_row_readonly"> + <button name="mail_action_blacklist_remove" class="fa fa-ban text-danger" + title="This email is blacklisted for mass mailings. Click to unblacklist." + type="object" context="{'default_email': email_from}" groups="base.group_user" + attrs="{'invisible': [('is_blacklisted', '=', False)]}"/> + <field name="email_from" id="email_from_group_lead_info" string="Email" widget="email"/> + </div> + <field name="email_cc" groups="base.group_no_one"/> + <field name="function"/> + <label for="phone_group_lead_info" class="oe_inline"/> + <div class="o_row o_row_readonly"> + <button name="phone_action_blacklist_remove" class="fa fa-ban text-danger" + title="This phone number is blacklisted for SMS Marketing. Click to unblacklist." + type="object" context="{'default_phone': phone}" groups="base.group_user" + attrs="{'invisible': [('phone_blacklisted', '=', False)]}"/> + <field name="phone" id="phone_group_lead_info" widget="phone"/> + </div> + <label for="mobile" class="oe_inline"/> + <div class="o_row o_row_readonly"> + <button name="phone_action_blacklist_remove" class="fa fa-ban text-danger" + title="This phone number is blacklisted for SMS Marketing. Click to unblacklist." + type="object" context="{'default_phone': mobile}" groups="base.group_user" + attrs="{'invisible': [('mobile_blacklisted', '=', False)]}"/> + <field name="mobile" widget="phone" string="Mobile"/> + </div> + </group> + <group attrs="{'invisible': [('type', '=', 'lead')]}"> + <field name="date_deadline"/> + <field name="priority" widget="priority"/> + <field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}"/> + </group> + <group> + <field name="user_id" domain="[('share', '=', False)]" + context="{'default_sales_team_id': team_id}" widget="many2one_avatar_user"/> + <field name="team_id" widget="selection" + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"/> + <field name="type" invisible="1"/> + </group> + <group name="lead_priority" attrs="{'invisible': [('type', '=', 'opportunity')]}"> + <field name="priority" widget="priority"/> + <field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}"/> + </group> + <group name="opportunity_info" attrs="{'invisible': [('type', '=', 'lead')]}"> + <field name="lost_reason" attrs="{'invisible': [('active', '=', True)]}"/> + <field name="date_conversion" invisible="1"/> + <field name="company_id" groups="base.group_multi_company"/> + </group> + </group> + + <notebook> + <page string="Internal Notes" name="internal_notes"> + <field name="description" placeholder="Add a description..."/> + </page> + <page name="extra" string="Extra Info" attrs="{'invisible': [('type', '=', 'opportunity')]}"> + <group> + <group string="Email" groups="base.group_no_one"> + <field name="message_bounce" readonly="1"/> + </group> + <group string="Tracking" name="categorization"> + <field name="company_id" + groups="base.group_multi_company" + options="{'no_create': True}"/> + <field name="campaign_id" /> + <field name="medium_id"/> + <field name="source_id"/> + <field name="referred"/> + </group> + <group string="Analysis"> + <field name="date_open"/> + <field name="date_closed"/> + </group> + </group> + </page> + <page name="lead" string="Extra Information" attrs="{'invisible': [('type', '=', 'lead')]}"> + <group> + <group string="Contact Information"> + <field name="partner_name"/> + <label for="street_page_lead" string="Address"/> + <div class="o_address_format"> + <field name="street" id="street_page_lead" placeholder="Street..." class="o_address_street"/> + <field name="street2" placeholder="Street 2..." class="o_address_street"/> + <field name="city" placeholder="City" class="o_address_city"/> + <field name="state_id" class="o_address_state" placeholder="State" options='{"no_open": True}'/> + <field name="zip" placeholder="ZIP" class="o_address_zip"/> + <field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/> + </div> + <field name="website" widget="url" placeholder="e.g. https://www.odoo.com"/> + <field name="lang_id" options="{'no_create': True}"/> + </group> + <group class="mt48"> + <label for="contact_name_page_lead"/> + <div class="o_row"> + <field name="contact_name" id="contact_name_page_lead"/> + <field name="title" placeholder="Title" domain="[]" options='{"no_open": True}'/> + </div> + <field name="function"/> + <label for="mobile_page_lead" class="oe_inline"/> + <div class="o_row o_row_readonly"> + <button name="phone_action_blacklist_remove" class="fa fa-ban text-danger" + title="This phone number is blacklisted for SMS Marketing. Click to unblacklist." + type="object" context="{'default_phone': mobile}" groups="base.group_user" + attrs="{'invisible': [('mobile_blacklisted', '=', False)]}"/> + <field name="mobile" id="mobile_page_lead" widget="phone"/> + </div> + </group> + <group string="Marketing"> + <field name="campaign_id" /> + <field name="medium_id" /> + <field name="source_id" /> + </group> + <group string="Misc" name="Misc"> + <field name="day_open" groups="base.group_no_one"/> + <field name="day_close" groups="base.group_no_one"/> + <field name="referred"/> + <field name="type" invisible="1"/> + </group> + </group> + </page> + </notebook> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids"/> + <field name="activity_ids"/> + <field name="message_ids" options="{'post_refresh': 'recipients'}"/> + </div> + </form> + </field> + </record> + + <!-- + crm.lead (as Lead) views + --> + <record id="act_crm_opportunity_calendar_event_new" model="ir.actions.act_window"> + <field name="name">Meetings</field> + <field name="res_model">calendar.event</field> + <field name="view_mode">tree,form,calendar</field> + <field name="context">{'default_duration': 4.0, 'default_opportunity_id': active_id}</field> + </record> + + <record id="crm_case_tree_view_leads" model="ir.ui.view"> + <field name="name">crm.lead.tree.lead</field> + <field name="model">crm.lead</field> + <field name="priority">10</field> + <field name="arch" type="xml"> + <tree string="Leads" sample="1" multi_edit="1"> + <field name="date_deadline" invisible="1"/> + <field name="create_date" optional="hide"/> + <field name="name" string="Lead" readonly="1"/> + <field name="contact_name" optional="hide"/> + <field name="partner_name" optional="hide"/> + <field name="email_from" optional="show"/> + <field name="phone" optional="show" class="o_force_ltr"/> + <field name="company_id" groups="base.group_multi_company" optional="show"/> + <field name="city" optional="show"/> + <field name="state_id" optional="hide"/> + <field name="country_id" optional="show"/> + <field name="partner_id" invisible="1"/> + <field name="user_id" optional="show" widget="many2one_avatar_user" domain="[('share', '=', False)]"/> + <field name="team_id" optional="show"/> + <field name="active" invisible="1"/> + <field name="probability" invisible="1"/> + <field name="campaign_id" optional="hide"/> + <field name="referred" invisible="1"/> + <field name="medium_id" optional="hide"/> + <field name="source_id" optional="hide"/> + <field name="message_needaction" invisible="1"/> + <field name="tag_ids" optional="hide" widget="many2many_tags" options="{'color_field': 'color'}"/> + <field name="priority" optional="hide"/> + </tree> + </field> + </record> + + <record id="view_crm_lead_kanban" model="ir.ui.view"> + <field name="name">crm.lead.kanban</field> + <field name="model">crm.lead</field> + <field name="priority" eval="100"/> + <field name="arch" type="xml"> + <kanban class="o_kanban_mobile" archivable="false" js_class="crm_kanban" sample="1"> + <field name="name"/> + <field name="contact_name"/> + <field name="priority"/> + <field name="tag_ids"/> + <field name="user_id"/> + <field name="activity_ids"/> + <field name="activity_state"/> + <progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/> + <templates> + <t t-name="kanban-box"> + <div t-attf-class="oe_kanban_content oe_kanban_global_click"> + <div> + <strong class="o_kanban_record_title"><span><field name="name"/></span></strong> + </div> + <div> + <span class="o_kanban_record_subtitle"><field name="contact_name"/></span> + </div> + <div> + <field name="tag_ids"/> + </div> + <div class="o_kanban_record_bottom"> + <div class="oe_kanban_bottom_left"> + <field name="priority" widget="priority"/> + <div class="o_kanban_inline_block"> + <field name="activity_ids" widget="kanban_activity"/> + </div> + </div> + <div class="oe_kanban_bottom_right"> + <field name="user_id" widget="many2one_avatar_user"/> + </div> + </div> + </div> + </t> + </templates> + </kanban> + </field> + </record> + + <record id="crm_case_calendar_view_leads" model="ir.ui.view"> + <field name="name">crm.lead.calendar.lead</field> + <field name="model">crm.lead</field> + <field name="priority" eval="2"/> + <field name="arch" type="xml"> + <calendar string="Leads Generation" create="0" mode="month" date_start="activity_date_deadline" color="user_id" hide_time="true" event_limit="5"> + <field name="expected_revenue"/> + <field name="partner_id" avatar_field="image_128"/> + <field name="user_id" filters="1" invisible="1"/> + </calendar> + </field> + </record> + + <record id="quick_create_opportunity_form" model="ir.ui.view"> + <field name="name">crm.lead.form.quick_create</field> + <field name="model">crm.lead</field> + <field name="priority">1000</field> + <field name="arch" type="xml"> + <form> + <group> + <field name="partner_id" widget="res_partner_many2one" + string='Organization / Contact' + context="{ + 'res_partner_search_mode': type == 'opportunity' and 'customer' or False, + 'default_name': contact_name or partner_name, + 'default_is_company': type == 'opportunity' and contact_name == False, + 'default_company_name': type == 'opportunity' and partner_name, + 'default_phone': phone, + 'default_email': email_from, + 'show_vat': True}"/> + <field name="name" placeholder="e.g. Product Pricing" /> + <field name="email_from" string="Email" /> + <field name="phone" string="Phone" /> + <label for="expected_revenue"/> + <div class="o_row"> + <field name="expected_revenue" class="oe_inline mr-5" widget="monetary" options="{'currency_field': 'company_currency'}"/> + <field name="priority" class="oe_inline" nolabel="1" widget="priority"/> + </div> + <div class="o_row"> + <field name="recurring_revenue" class="oe_inline pr-4" widget="monetary" options="{'currency_field': 'company_currency'}"/> + <field name="recurring_plan" class="oe_inline" placeholder="E.g. Monthly" + attrs="{'required': [('recurring_revenue', '!=', 0)]}" options="{'no_create': True, 'no_open': True}"/> + </div> + <field name="company_currency" invisible="1"/> + <field name="company_id" invisible="1"/> + <field name="user_id" invisible="1"/> + <field name="team_id" invisible="1"/> + <field name="type" invisible="1"/> + <field name="partner_name" invisible="1"/> + <field name="contact_name" invisible="1"/> + <field name="country_id" invisible="1"/> + <field name="state_id" invisible="1"/> + <field name="city" invisible="1"/> + <field name="street" invisible="1"/> + <field name="street2" invisible="1"/> + <field name="zip" invisible="1"/> + <field name="mobile" invisible="1"/> + <field name="website" invisible="1"/> + <field name="function" invisible="1"/> + <field name="title" invisible="1"/> + </group> + </form> + </field> + </record> + + <record id="crm_lead_view_activity" model="ir.ui.view"> + <field name="name">crm.lead.view.activity</field> + <field name="model">crm.lead</field> + <field name="arch" type="xml"> + <activity string="Leads or Opportunities"> + <field name="user_id"/> + <field name="company_currency"/> + <templates> + <div t-name="activity-box"> + <img t-att-src="activity_image('res.users', 'image_128', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value"/> + <div> + <field name="name" display="full"/> + <field name="expected_revenue" widget="monetary" display="full" muted="1"/> + </div> + </div> + </templates> + </activity> + </field> + </record> + + <record id="crm_case_kanban_view_leads" model="ir.ui.view"> + <field name="name">crm.lead.kanban.lead</field> + <field name="model">crm.lead</field> + <field name="priority" eval="1"/> + <field name="arch" type="xml"> + <kanban default_group_by="stage_id" class="o_kanban_small_column o_opportunity_kanban" on_create="quick_create" quick_create_view="crm.quick_create_opportunity_form" + archivable="false" sample="1"> + <field name="stage_id" options='{"group_by_tooltip": {"requirements": "Description"}}'/> + <field name="color"/> + <field name="priority"/> + <field name="expected_revenue"/> + <field name="kanban_state"/> + <field name="activity_date_deadline"/> + <field name="user_email"/> + <field name="user_id"/> + <field name="partner_id"/> + <field name="activity_summary"/> + <field name="active"/> + <field name="company_currency"/> + <field name="activity_state" /> + <field name="activity_ids" /> + <progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}' sum_field="expected_revenue" help="This bar allows to filter the opportunities based on scheduled activities."/> + <templates> + <t t-name="kanban-box"> + <div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''} oe_kanban_global_click"> + <div class="o_dropdown_kanban dropdown"> + + <a class="dropdown-toggle o-no-caret btn" role="button" data-toggle="dropdown" data-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu"> + <span class="fa fa-ellipsis-v"/> + </a> + <div class="dropdown-menu" role="menu"> + <t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit</a></t> + <t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t> + <ul class="oe_kanban_colorpicker" data-field="color"/> + </div> + </div> + <div class="oe_kanban_content"> + <div class="o_kanban_record_title"> + <strong><field name="name"/></strong> + </div> + <div class="o_kanban_record_subtitle"> + <t t-if="record.expected_revenue.raw_value"> + <field name="expected_revenue" widget="monetary" options="{'currency_field': 'company_currency'}"/> + <span t-if="record.recurring_revenue and record.recurring_revenue.raw_value"> + </span> + </t> + <t t-if="record.recurring_revenue and record.recurring_revenue.raw_value"> + <field name="recurring_revenue" widget="monetary" options="{'currency_field': 'company_currency'}"/> + <field name="recurring_plan"/> + </t> + </div> + <div> + <span t-if="record.partner_id.value" t-esc="record.partner_id.value"></span> + </div> + <div> + <field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/> + </div> + <div class="o_kanban_record_bottom"> + <div class="oe_kanban_bottom_left"> + <field name="priority" widget="priority" groups="base.group_user"/> + <field name="activity_ids" widget="kanban_activity"/> + </div> + <div class="oe_kanban_bottom_right"> + <field name="user_id" widget="many2one_avatar_user"/> + </div> + </div> + </div> + <div class="oe_clear"/> + </div> + </t> + </templates> + </kanban> + </field> + </record> + + <record id="view_crm_case_leads_filter" model="ir.ui.view"> + <field name="name">crm.lead.search.lead</field> + <field name="model">crm.lead</field> + <field name="arch" type="xml"> + <search string="Search Leads"> + <field name="name" string="Lead" filter_domain="['|','|','|',('partner_name', 'ilike', self),('email_from', 'ilike', self), ('contact_name', 'ilike', self), ('name', 'ilike', self)]"/> + <field name="tag_ids" string="Tag" filter_domain="[('tag_ids', 'ilike', self)]"/> + <field name="user_id"/> + <field name="team_id"/> + <field name="country_id"/> + <field name="city"/> + <field name="phone_mobile_search"/> + <field name="lang_id"/> + <field name="create_date"/> + <field name="source_id"/> + <field name="medium_id"/> + <field name="campaign_id"/> + <separator /> + <filter string="My Leads" + name="assigned_to_me" + domain="[('user_id', '=', uid)]" + help="Leads that are assigned to me"/> + <filter string="Unassigned" name="unassigned_leads" + domain="[('user_id','=', False), ('type', '=', 'lead')]" + help="Leads that are not assigned"/> + <separator /> + <filter string="Lost" name="lost" + domain="['&', ('probability', '=', 0), ('active', '=', False)]"/> + <separator/> + <filter string="Creation Date" name="filter_creation_date" date="create_date" default_period="this_month"/> + <filter name="filter_date_closed" date="date_closed"/> + <separator/> + <separator/> + <filter invisible="1" string="Late Activities" name="activities_overdue" + domain="[('activity_ids.date_deadline', '<', context_today().strftime('%Y-%m-%d'))]" + help="Show all opportunities for which the next action date is before today"/> + <filter invisible="1" string="Today Activities" name="activities_today" + domain="[('activity_ids.date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/> + <filter invisible="1" string="Future Activities" name="activities_upcoming_all" + domain="[('activity_ids.date_deadline', '>', context_today().strftime('%Y-%m-%d'))]"/> + <separator/> + <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/> + <group expand="0" 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 name="city" string="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="Campaign" name="compaign" domain="[]" context="{'group_by':'campaign_id'}"/> + <filter string="Medium" name="medium" domain="[]" context="{'group_by':'medium_id'}"/> + <filter string="Source" name="source" domain="[]" context="{'group_by':'source_id'}"/> + <separator orientation="vertical" /> + <filter string="Creation Date" context="{'group_by':'create_date:month'}" name="month"/> + <filter string="Closed Date" name="date_closed" context="{'group_by':'date_closed'}"/> + </group> + </search> + </field> + </record> + + <!-- + MASS MAILING + --> + <record id="crm_lead_act_window_compose" model="ir.actions.act_window"> + <field name="name">Send email</field> + <field name="res_model">mail.compose.message</field> + <field name="view_mode">form</field> + <field name="target">new</field> + <field name="context" eval="{ + 'default_composition_mode': 'comment', + 'default_use_template': True, + 'default_template_id': ref('crm.email_template_opportunity_mail'), + }"/> + <field name="binding_model_id" ref="model_crm_lead"/> + <field name="binding_view_types">form</field> + </record> + + <record id="action_lead_mass_mail" model="ir.actions.act_window"> + <field name="name">Send email</field> + <field name="res_model">mail.compose.message</field> + <field name="view_mode">form</field> + <field name="target">new</field> + <field name="context" eval="{ + 'default_composition_mode': 'mass_mail', + 'default_use_template': True, + 'default_template_id': ref('crm.email_template_opportunity_mail'), + }"/> + <field name="binding_model_id" ref="model_crm_lead"/> + <field name="binding_view_types">list</field> + </record> + + <!--Update of email_template defined in crm_lead_data, to add ref_ir_act_window + allowing to have a well formed email template (context action considered as set). --> + <record id="email_template_opportunity_mail" model="mail.template"> + <field name="ref_ir_act_window" ref="crm.action_lead_mass_mail"/> + </record> + + <!-- + crm.lead (as Opportunity) views + --> + + <record id="crm_case_tree_view_oppor" model="ir.ui.view"> + <field name="name">crm.lead.tree.opportunity</field> + <field name="model">crm.lead</field> + <field name="priority">1</field> + <field name="arch" type="xml"> + <tree string="Opportunities" sample="1" multi_edit="1"> + <field name="date_deadline" invisible="1"/> + <field name="create_date" optional="hide"/> + <field name="name" string="Opportunity" readonly="1"/> + <field name="partner_id" optional="hide"/> + <field name="contact_name" optional="show"/> + <field name="email_from"/> + <field name="phone" class="o_force_ltr"/> + <field name="company_id" groups="base.group_multi_company" optional="show"/> + <field name="city" optional="hide"/> + <field name="state_id" optional="hide"/> + <field name="country_id" optional="hide"/> + <field name="user_id" widget="many2one_avatar_user" optional="show" domain="[('share', '=', False)]"/> + <field name="team_id" optional="show"/> + <field name="priority" optional="hide"/> + <field name="activity_ids" widget="list_activity"/> + <field name="activity_user_id" optional="hide" string="Activity by" widget="many2one_avatar_user"/> + <field name="activity_date_deadline_my" string="My Deadline" widget="remaining_days" options="{'allow_order': '1'}"/> + <field name="campaign_id" optional="hide"/> + <field name="medium_id" optional="hide"/> + <field name="source_id" optional="hide"/> + <field name="company_currency" invisible="1"/> + <field name="expected_revenue" sum="Expected Revenues" optional="show" widget="monetary" options="{'currency_field': 'company_currency'}"/> + <field name="recurring_revenue_monthly" sum="Expected MRR" optional="show" widget="monetary" options="{'currency_field': 'company_currency'}"/> + <field name="recurring_revenue" sum="Recurring Revenue" optional="hide" widget="monetary" options="{'currency_field': 'company_currency'}"/> + <field name="recurring_plan" optional="hide"/> + <field name="stage_id" optional="show" decoration-bf="1"/> + <field name="active" invisible="1"/> + <field name="probability" optional="hide"/> + <field name="tag_ids" optional="hide" widget="many2many_tags" options="{'color_field': 'color'}"/> + <field name="referred" invisible="1"/> + <field name="message_needaction" invisible="1"/> + </tree> + </field> + </record> + + <record id="crm_lead_view_list_activities" model="ir.ui.view"> + <field name="name">crm.lead.list.activities</field> + <field name="model">crm.lead</field> + <field name="mode">primary</field> + <field name="priority">20</field> + <field name="inherit_id" ref="crm.crm_case_tree_view_oppor"/> + <field name="arch" type="xml"> + <xpath expr="//tree" position="attributes"> + <attribute name="default_order">activity_date_deadline_my</attribute> + </xpath> + <xpath expr="//tree" position="inside"> + <header> + <button name="%(crm.action_lead_mass_mail)d" type="action" string="Email" /> + </header> + </xpath> + <field name="user_id" position="attributes"> + <attribute name="optional">hide</attribute> + </field> + <field name="team_id" position="attributes"> + <attribute name="optional">hide</attribute> + </field> + <field name="message_needaction" position="after"> + <button name="action_snooze" class="text-warning" type="object" string="Snooze 7d" icon="fa-bell-slash" /> + <button name="%(crm.crm_lead_act_window_compose)d" type="action" string="Email" icon="fa-envelope"/> + </field> + </field> + </record> + + <record id="view_crm_case_my_activities_filter" model="ir.ui.view"> + <field name="name">crm.lead.search.myactivities</field> + <field name="model">crm.lead</field> + <field name="inherit_id" ref="crm.view_crm_case_leads_filter"/> + <field name="arch" type="xml"> + <!-- we should not override the whole field but instead just set invisible attribute + to 0. but this approach is not working. the work around is temporary --> + <xpath expr="//filter[@name='activities_overdue']" position="replace"> + <filter string="Late Activities" name="activities_overdue" + domain="[('my_activity_date_deadline', '<', context_today().strftime('%Y-%m-%d'))]" + help="Show all opportunities for which the next action date is before today"/> + </xpath> + <xpath expr="//filter[@name='activities_today']" position="replace"> + <filter string="Today Activities" name="activities_today" + domain="[('my_activity_date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/> + </xpath> + <xpath expr="//filter[@name='activities_upcoming_all']" position="replace"> + <filter string="Future Activities" name="activities_upcoming_all" + domain="[('my_activity_date_deadline', '>', context_today().strftime('%Y-%m-%d'))]"/> + </xpath> + <xpath expr="//filter[@name='assigned_to_me']" position="replace"> + <filter string="My Activities" name="assigned_to_me" + domain="[('activity_user_id','=',uid)]" + help="Opportunities that are assigned to me"/> + </xpath> + </field> + </record> + + <record id="crm_lead_view_graph" model="ir.ui.view"> + <field name="name">crm.lead.view.graph</field> + <field name="model">crm.lead</field> + <field name="arch" type="xml"> + <graph string="Opportunities" sample="1"> + <field name="stage_id" type="col"/> + <field name="user_id" type="row"/> + <field name="color" invisible="1"/> + </graph> + </field> + </record> + + <record id="crm_lead_view_pivot" model="ir.ui.view"> + <field name="name">crm.lead.view.pivot</field> + <field name="model">crm.lead</field> + <field name="arch" type="xml"> + <pivot string="Pipeline Analysis" sample="1"> + <field name="create_date" interval="month" type="row"/> + <field name="stage_id" type="col"/> + <field name="expected_revenue" type="measure"/> + <field name="recurring_revenue_monthly" type="measure"/> + <field name="color" invisible="1"/> + </pivot> + </field> + </record> + + <record id="view_crm_case_opportunities_filter" model="ir.ui.view"> + <field name="name">crm.lead.search.opportunity</field> + <field name="model">crm.lead</field> + <field name="priority">15</field> + <field name="arch" type="xml"> + <search string="Search Opportunities"> + <field name="name" string="Opportunity" filter_domain="[ + '|', '|', '|', '|', + ('partner_id', 'ilike', self), + ('partner_name', 'ilike', self), + ('email_from', 'ilike', self), + ('name', 'ilike', self), + ('contact_name', 'ilike', self)]"/> + <field name="partner_id" operator="child_of" string="Customer" filter_domain="[ + '|', '|', '|', + ('partner_id', 'ilike', self), + ('partner_name', 'ilike', self), + ('email_from', 'ilike', self), + ('contact_name', 'ilike', self)]"/> + <field name="tag_ids" string="Tag" filter_domain="[('tag_ids', 'ilike', self)]"/> + <field name="user_id"/> + <field name="team_id"/> + <field name="stage_id" domain="[]"/> + <field name="country_id"/> + <field name="city"/> + <field name="phone_mobile_search"/> + <separator/> + <filter string="My Pipeline" name="assigned_to_me" + domain="[('user_id', '=', uid)]" + help="Opportunities that are assigned to me"/> + <filter string="Unassigned" name="unassigned" + domain="[('user_id', '=', False)]" help="No salesperson"/> + <filter string="Open Opportunities" name="open_opportunities" + domain="[('probability', '<', 100), ('type', '=', 'opportunity')]" + help="Open Opportunities"/> + <separator/> + <filter string="Unread Messages" name="message_needaction" domain="[('message_needaction', '=', True)]"/> + <separator/> + <filter string="Creation Date" name="creation_date" date="create_date"/> + <filter string="Closed Date" name="close_date" date="date_closed"/> + <separator/> + <filter string="Won" name="won" domain="['&', ('active', '=', True), ('stage_id.is_won', '=', True)]"/> + <filter string="Lost" name="lost" domain="['&', ('active', '=', False), ('probability', '=', 0)]"/> + <separator/> + <filter invisible="1" string="Overdue Opportunities" name="overdue_opp" domain="[('date_deadline', '<', context_today().strftime('%Y-%m-%d'))]"/> + <filter invisible="1" string="Late Activities" name="activities_overdue" + domain="[('activity_ids.date_deadline', '<', context_today().strftime('%Y-%m-%d'))]" + help="Show all opportunities for which the next action date is before today"/> + <filter invisible="1" string="Today Activities" name="activities_today" + domain="[('activity_ids.date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/> + <filter invisible="1" string="Future Activities" name="activities_upcoming_all" + domain="[('activity_ids.date_deadline', '>', context_today().strftime('%Y-%m-%d'))]"/> + <separator/> + <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/> + <group expand="0" string="Group By" colspan="16"> + <filter string="Salesperson" name="salesperson" context="{'group_by':'user_id'}"/> + <filter string="Sales Team" name="saleschannel" context="{'group_by':'team_id'}"/> + <filter name="stage" string="Stage" context="{'group_by':'stage_id'}"/> + <filter name="city" string="City" context="{'group_by': 'city'}"/> + <filter string="Country" name="country" context="{'group_by':'country_id'}" /> + <filter string="Lost Reason" name="lostreason" context="{'group_by':'lost_reason'}"/> + <filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> + <filter string="Campaign" name="compaign" domain="[]" context="{'group_by':'campaign_id'}"/> + <filter string="Medium" name="medium" domain="[]" context="{'group_by':'medium_id'}"/> + <filter string="Source" name="source" domain="[]" context="{'group_by':'source_id'}"/> + <separator orientation="vertical" /> + <filter string="Creation Date" context="{'group_by':'create_date:month'}" name="month"/> + <filter string="Conversion Date" name="date_conversion" context="{'group_by': 'date_conversion'}" groups="crm.group_use_lead"/> + <filter string="Expected Closing" name="date_deadline" context="{'group_by':'date_deadline'}"/> + <filter string="Closed Date" name="date_closed" context="{'group_by':'date_closed'}"/> + </group> + </search> + </field> + </record> + + <!-- + 'Mark as Lost' in action dropdown + --> + <record id="action_mark_as_lost" model="ir.actions.server"> + <field name="name">Mark as lost</field> + <field name="model_id" ref="model_crm_lead"/> + <field name="binding_model_id" ref="crm.model_crm_lead"/> + <field name="binding_view_types">list</field> + <field name="state">code</field> + <field name="code"> +if record: + action_values = env.ref('crm.crm_lead_lost_action').sudo().read()[0] + action_values.update({'context': env.context}) + action = action_values + </field> + </record> + + <!-- Lead Menu --> + <record model="ir.actions.act_window" id="crm_lead_all_leads"> + <field name="name">Leads</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">tree,kanban,graph,pivot,calendar,form,activity</field> + <field name="domain">['|', ('type','=','lead'), ('type','=',False)]</field> + <field name="search_view_id" ref="crm.view_crm_case_leads_filter"/> + <field name="context">{ + 'default_type':'lead', + 'search_default_type': 'lead', + 'search_default_to_process':1, + } + </field> + </record> + + <record id="crm_lead_all_leads_view_tree" model="ir.actions.act_window.view"> + <field name="sequence" eval="1"/> + <field name="view_mode">tree</field> + <field name="view_id" ref="crm_case_tree_view_leads"/> + <field name="act_window_id" ref="crm_lead_all_leads"/> + </record> + + <record id="crm_lead_all_leads_view_kanban" model="ir.actions.act_window.view"> + <field name="sequence" eval="2"/> + <field name="view_mode">kanban</field> + <field name="view_id" ref="view_crm_lead_kanban"/> + <field name="act_window_id" ref="crm_lead_all_leads"/> + </record> + + <record id="crm_lead_all_leads_view_calendar" model="ir.actions.act_window.view"> + <field name="sequence" eval="3"/> + <field name="view_mode">calendar</field> + <field name="view_id" ref="crm_case_calendar_view_leads"/> + <field name="act_window_id" ref="crm_lead_all_leads"/> + </record> + + <record id="crm_lead_all_leads_view_pivot" model="ir.actions.act_window.view"> + <field name="sequence" eval="4"/> + <field name="view_mode">pivot</field> + <field name="view_id" ref="crm_lead_view_pivot"/> + <field name="act_window_id" ref="crm_lead_all_leads"/> + </record> + + <record id="crm_lead_all_leads_view_graph" model="ir.actions.act_window.view"> + <field name="sequence" eval="5"/> + <field name="view_mode">graph</field> + <field name="view_id" ref="crm_lead_view_graph"/> + <field name="act_window_id" ref="crm_lead_all_leads"/> + </record> + + <record id="crm_menu_leads" model="ir.ui.menu"> + <field name="action" ref="crm.crm_lead_all_leads"/> + </record> + + <!-- My Activities Menu --> + <record id="crm_lead_action_my_activities" model="ir.actions.act_window"> + <field name="name">My Activities</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">tree,kanban,graph,pivot,calendar,form,activity</field> + <field name="view_id" ref="crm_lead_view_list_activities"/> + <field name="domain">[('activity_ids','!=',False)]</field> + <field name="search_view_id" ref="crm.view_crm_case_my_activities_filter"/> + <field name="context">{'default_type': 'opportunity', + 'search_default_assigned_to_me': 1} + </field> + </record> + + <record id="crm_lead_action_my_activities_view_tree" model="ir.actions.act_window.view"> + <field name="sequence">1</field> + <field name="view_mode">tree</field> + <field name="view_id" ref="crm.crm_lead_view_list_activities"/> + <field name="act_window_id" ref="crm_lead_action_my_activities"/> + </record> + + <!-- 'My Pipeline' menu : Server action, act_window_views and act_windows --> + <record model="ir.actions.act_window" id="crm_lead_opportunities"> + <field name="name">Opportunities</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">kanban,tree,graph,pivot,form,calendar,activity</field> + <field name="domain">[('type','=','opportunity')]</field> + <field name="context">{ + 'default_type': 'opportunity', + } + </field> + <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/> + </record> + + <record id="crm_lead_opportunities_view_kanban" model="ir.actions.act_window.view"> + <field name="sequence" eval="0"/> + <field name="view_mode">kanban</field> + <field name="view_id" ref="crm_case_kanban_view_leads"/> + <field name="act_window_id" ref="crm_lead_opportunities"/> + </record> + + <record id="crm_lead_opportunities_view_tree" model="ir.actions.act_window.view"> + <field name="sequence" eval="1"/> + <field name="view_mode">tree</field> + <field name="view_id" ref="crm.crm_case_tree_view_oppor"/> + <field name="act_window_id" ref="crm_lead_opportunities"/> + </record> + + <record id="crm_lead_opportunities_view_graph" model="ir.actions.act_window.view"> + <field name="sequence" eval="3"/> + <field name="view_mode">graph</field> + <field name="view_id" ref="crm_lead_view_graph"/> + <field name="act_window_id" ref="crm_lead_opportunities"/> + </record> + + <record id="crm_lead_opportunities_view_pivot" model="ir.actions.act_window.view"> + <field name="sequence" eval="4"/> + <field name="view_mode">pivot</field> + <field name="view_id" ref="crm_lead_view_pivot"/> + <field name="act_window_id" ref="crm_lead_opportunities"/> + </record> + + <record id="crm_lead_opportunities_view_calendar" model="ir.actions.act_window.view"> + <field name="sequence" eval="5"/> + <field name="view_mode">calendar</field> + <field name="view_id" ref="crm_case_calendar_view_leads"/> + <field name="act_window_id" ref="crm_lead_opportunities"/> + </record> + + <record id="action_your_pipeline" model="ir.actions.server"> + <field name="name">Crm: My Pipeline</field> + <field name="model_id" ref="crm.model_crm_team"/> + <field name="state">code</field> + <field name="groups_id" eval="[(4, ref('base.group_user'))]"/> + <field name="code">action = model.action_your_pipeline()</field> + </record> + + <record model="ir.actions.act_window" id="crm_lead_action_pipeline"> + <field name="name">Pipeline</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">kanban,tree,graph,pivot,form,calendar,activity</field> + <field name="domain">[('type','=','opportunity')]</field> + <field name="context">{ + 'default_type': 'opportunity', + 'search_default_assigned_to_me': 1 + }</field> + <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/> + </record> + + <record id="crm_lead_action_pipeline_view_kanban" model="ir.actions.act_window.view"> + <field name="sequence" eval="0"/> + <field name="view_mode">kanban</field> + <field name="view_id" ref="crm_case_kanban_view_leads"/> + <field name="act_window_id" ref="crm_lead_action_pipeline"/> + </record> + + <record id="crm_lead_action_pipeline_view_tree" model="ir.actions.act_window.view"> + <field name="sequence" eval="1"/> + <field name="view_mode">tree</field> + <field name="view_id" ref="crm.crm_case_tree_view_oppor"/> + <field name="act_window_id" ref="crm_lead_action_pipeline"/> + </record> + + <record id="crm_lead_action_pipeline_view_calendar" model="ir.actions.act_window.view"> + <field name="sequence" eval="2"/> + <field name="view_mode">calendar</field> + <field name="view_id" ref="crm_case_calendar_view_leads"/> + <field name="act_window_id" ref="crm_lead_action_pipeline"/> + </record> + + <record id="crm_lead_action_pipeline_view_pivot" model="ir.actions.act_window.view"> + <field name="sequence" eval="3"/> + <field name="view_mode">pivot</field> + <field name="view_id" ref="crm_lead_view_pivot"/> + <field name="act_window_id" ref="crm_lead_action_pipeline"/> + </record> + + <record id="crm_lead_action_pipeline_view_graph" model="ir.actions.act_window.view"> + <field name="sequence" eval="5"/> + <field name="view_mode">graph</field> + <field name="view_id" ref="crm_lead_view_graph"/> + <field name="act_window_id" ref="crm_lead_action_pipeline"/> + </record> + + <record id="menu_crm_opportunities" model="ir.ui.menu"> + <field name="action" ref="crm.action_your_pipeline"/> + </record> + <record id="crm_menu_root" model="ir.ui.menu"> + <field name="action" ref="crm.action_your_pipeline"/> + </record> + <record id="crm_lead_menu_my_activities" model="ir.ui.menu"> + <field name="action" ref="crm.crm_lead_action_my_activities"/> + </record> +</odoo> diff --git a/addons/crm/views/crm_lost_reason_views.xml b/addons/crm/views/crm_lost_reason_views.xml new file mode 100644 index 00000000..33986e14 --- /dev/null +++ b/addons/crm/views/crm_lost_reason_views.xml @@ -0,0 +1,75 @@ +<?xml version="1.0"?> +<odoo> + <record id="crm_lost_reason_view_search" model="ir.ui.view"> + <field name="name">crm.lost.reason.view.search</field> + <field name="model">crm.lost.reason</field> + <field name="arch" type="xml"> + <search string="Search Opportunities"> + <field name="name"/> + <filter string="Include archived" name="archived" domain="['|', ('active', '=', True), ('active', '=', False)]"/> + <separator/> + <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/> + </search> + </field> + </record> + + <record id="crm_lost_reason_view_form" model="ir.ui.view"> + <field name="name">crm.lost.reason.form</field> + <field name="model">crm.lost.reason</field> + <field name="arch" type="xml"> + <form string="Lost Reason"> + <sheet> + <div class="oe_button_box" name="button_box"> + <button name="action_lost_leads" type="object" + class="oe_stat_button" icon="fa-star"> + <div class="o_stat_info"> + <field name="leads_count" class="o_stat_value"/> + <span class="o_stat_text"> Leads</span> + </div> + </button> + </div> + <widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/> + <div class="oe_title"> + <div class="oe_edit_only"> + <label for="name"/> + </div> + <h1 class="mb32"> + <field name="name" class="mb16"/> + </h1> + <field name="active" invisible="1"/> + </div> + </sheet> + </form> + </field> + </record> + + <record id="crm_lost_reason_view_tree" model="ir.ui.view"> + <field name="name">crm.lost.reason.tree</field> + <field name="model">crm.lost.reason</field> + <field name="arch" type="xml"> + <tree string="Channel" editable="bottom"> + <field name="name"/> + </tree> + </field> + </record> + + <!-- Configuration/Lead & Opportunities/Lost Reasons Menu --> + <record id="crm_lost_reason_action" model="ir.actions.act_window"> + <field name="name">Lost Reasons</field> + <field name="res_model">crm.lost.reason</field> + <field name="view_mode">tree,form</field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Define a new lost reason + </p><p> + Use lost reasons to explain why an opportunity is lost. + </p><p> + Some examples of lost reasons: "We don't have people/skill", "Price too high" + </p> + </field> + </record> + + <record id="menu_crm_lost_reason" model="ir.ui.menu"> + <field name="action" ref="crm.crm_lost_reason_action"/> + </record> +</odoo> diff --git a/addons/crm/views/crm_menu_views.xml b/addons/crm/views/crm_menu_views.xml new file mode 100644 index 00000000..9db695e5 --- /dev/null +++ b/addons/crm/views/crm_menu_views.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <!-- Top menu item --> + <!-- + This menu item's purpose is to overwrite another one defined in + the base module in order to set new groups. + --> + <menuitem + id="crm_menu_root" + name="CRM" + web_icon="crm,static/description/icon.png" + groups="sales_team.group_sale_salesman,sales_team.group_sale_manager" + sequence="6"/> + + <!-- SALES (MAIN USER MENU) --> + <menuitem + id="crm_menu_sales" + name="Sales" + parent="crm_menu_root" + sequence="1"/> + <menuitem + id="menu_crm_opportunities" + name="My Pipeline" + parent="crm_menu_sales" + sequence="1"/> + <menuitem + id="crm_lead_menu_my_activities" + name="My Activities" + parent="crm_menu_sales" + groups="sales_team.group_sale_manager" + sequence="2"/> + + <menuitem + id="sales_team_menu_team_pipeline" + name="Teams" + parent="crm_menu_sales" + action="sales_team.crm_team_salesteams_pipelines_act" + groups="sales_team.group_sale_manager" + sequence="4"/> + <menuitem + id="res_partner_menu_customer" + name="Customers" + parent="crm_menu_sales" + action="base.action_partner_form" + sequence="5"/> + + <!-- LEADS (MAIN USER MENU) --> + <menuitem + id="crm_menu_leads" + name="Leads" + parent="crm_menu_root" + groups="crm.group_use_lead" + sequence="5"/> + + <!-- REPORTING --> + <menuitem + id="crm_menu_report" + name="Reporting" + parent="crm_menu_root" + sequence="20" + groups="sales_team.group_sale_manager"/> + <menuitem + id="crm_opportunity_report_menu_lead" + name="Leads" + parent="crm_menu_report" + groups="crm.group_use_lead" + sequence="1"/> + <menuitem + id="crm_opportunity_report_menu" + name="Pipeline" + parent="crm_menu_report" + sequence="2"/> + + <!-- CONFIGURATION --> + <menuitem + id="crm_menu_config" + name="Configuration" + parent="crm_menu_root" + sequence="25" groups="sales_team.group_sale_manager"/> + <menuitem + id="crm_config_settings_menu" + name="Settings" + parent="crm_menu_config" + groups="base.group_system" + sequence="0"/> + <menuitem + id="menu_crm_config_opportunity" + name="Opportunities" + parent="crm_menu_config" + sequence="1" + groups="sales_team.group_sale_manager"/> + <menuitem + id="crm_team_config" + name="Sales Teams" + parent="crm_menu_config" + action="sales_team.sales_team_config_action" + sequence="5"/> + <menuitem + id="crm_team_menu_config_activity_types" + name="Activity Types" + parent="crm_menu_config" + action="sales_team.mail_activity_type_action_config_sales" + sequence="10"/> + <menuitem + id="crm_recurring_plan_menu_config" + name="Recurring Plans" + parent="crm_menu_config" + action="crm.crm_recurring_plan_action" + sequence="12" + groups="crm.group_use_recurring_revenues"/> + <menuitem + id="menu_crm_config_lead" + name="Pipeline" + parent="crm_menu_config" + sequence="15" + groups="sales_team.group_sale_manager"/> + <menuitem + id="menu_crm_lead_stage_act" + name="Stages" + sequence="0" + parent="menu_crm_config_lead" + groups="base.group_no_one"/> + <menuitem + id="menu_crm_lead_categ" + name="Tags" + action="sales_team.sales_team_crm_tag_action" + parent="menu_crm_config_lead" + sequence="1"/> + <menuitem + id="menu_crm_lost_reason" + name="Lost Reasons" + parent="menu_crm_config_lead" + sequence="6"/> + + <menuitem + id="menu_import_crm" + name="Import & Synchronize" + parent="crm_menu_root"/> +</odoo> diff --git a/addons/crm/views/crm_recurring_plan_views.xml b/addons/crm/views/crm_recurring_plan_views.xml new file mode 100644 index 00000000..a1492f1c --- /dev/null +++ b/addons/crm/views/crm_recurring_plan_views.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<odoo><data> + + <record id="crm_recurring_plan_view_tree" model="ir.ui.view"> + <field name="name">crm.recurring.plan.view.tree</field> + <field name="model">crm.recurring.plan</field> + <field name="arch" type="xml"> + <tree editable="bottom"> + <field name="sequence" widget="handle"/> + <field name="name"/> + <field name="number_of_months"/> + </tree> + </field> + </record> + + <record id="crm_recurring_plan_view_search" model="ir.ui.view"> + <field name="name">crm.recurring.plan.view.search</field> + <field name="model">crm.recurring.plan</field> + <field name="arch" type="xml"> + <search> + <field name="name"/> + <filter name="active" string="Archived" domain="[('active', '=', False)]"/> + </search> + </field> + </record> + + <record id="crm_recurring_plan_action" model="ir.actions.act_window"> + <field name="name">Recurring Plans</field> + <field name="res_model">crm.recurring.plan</field> + <field name="view_mode">tree</field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Create a Recurring Plan + </p> + <p> + Set Recurring Plans on Opportunities to display the contracts' renewal periodicity<br/>(e.g: Monthly, Yearly). + </p> + </field> + </record> + +</data></odoo> diff --git a/addons/crm/views/crm_stage_views.xml b/addons/crm/views/crm_stage_views.xml new file mode 100644 index 00000000..b23f5908 --- /dev/null +++ b/addons/crm/views/crm_stage_views.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <record id="crm_lead_stage_search" model="ir.ui.view"> + <field name="name">Stage - Search</field> + <field name="model">crm.stage</field> + <field name="arch" type="xml"> + <search string="Stage Search"> + <field name="name"/> + <field name="sequence"/> + <field name="is_won"/> + <field name="team_id"/> + </search> + </field> + </record> + + <!-- STAGES TREE VIEW + MUTI_EDIT --> + <record id="crm_stage_tree" model="ir.ui.view"> + <field name="name">crm.stage.tree</field> + <field name="model">crm.stage</field> + <field name="arch" type="xml"> + <tree string="Stages" multi_edit="1"> + <field name="sequence" widget="handle"/> + <field name="name" readonly="1"/> + <field name="is_won"/> + <field name="team_id"/> + </tree> + </field> + </record> + + <record id="crm_stage_form" model="ir.ui.view"> + <field name="name">crm.stage.form</field> + <field name="model">crm.stage</field> + <field name="priority" eval="1"/> + <field name="arch" type="xml"> + <form string="Stage"> + <sheet> + <div class="oe_title"> + <div class="oe_edit_only"> + <label for="name"/> + </div> + <h1> + <field name="name"/> + </h1> + </div> + <group> + <group> + <field name="is_won"/> + <field name="fold"/> + <field name="team_id" options='{"no_open": True, "no_create": True}' attrs="{'invisible': [('team_count', '<=', 1)]}" kanban_view_ref="%(sales_team.crm_team_view_kanban)s"/> + </group> + <field name="team_count" invisible="1"/> + </group> + <separator string="Requirements"/> + <field name="requirements" nolabel="1" placeholder="Give your team the requirements to move an opportunity to this stage."/> + </sheet> + </form> + </field> + </record> + + <record id="crm_stage_action" model="ir.actions.act_window"> + <field name="name">Stages</field> + <field name="res_model">crm.stage</field> + <field name="view_id" ref="crm.crm_stage_tree"/> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Set a new stage in your opportunity pipeline + </p><p> + Stages allow salespersons to easily track how a specific opportunity + is positioned in the sales cycle. + </p> + </field> + </record> + + <record id="menu_crm_lead_stage_act" model="ir.ui.menu"> + <field name="action" ref="crm.crm_stage_action"/> + </record> + +</odoo> diff --git a/addons/crm/views/crm_team_views.xml b/addons/crm/views/crm_team_views.xml new file mode 100644 index 00000000..7eb900bc --- /dev/null +++ b/addons/crm/views/crm_team_views.xml @@ -0,0 +1,276 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <!-- CRM lead search by Salesteams --> + <record id="crm_case_form_view_salesteams_lead" model="ir.actions.act_window"> + <field name="name">Leads</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">tree,kanban,form</field> + <field name="domain">['|', ('type','=','lead'), ('type','=',False)]</field> + <field name="view_ids" + eval="[(5, 0, 0), + (0, 0, {'view_mode': 'tree', 'view_id': ref('crm_case_tree_view_leads')}), + (0, 0, {'view_mode': 'kanban', 'view_id': ref('view_crm_lead_kanban')})]"/> + <field name="search_view_id" ref="crm.view_crm_case_leads_filter"/> + <field name="context">{ + 'search_default_team_id': [active_id], + 'default_team_id': active_id, + 'default_type': 'lead', + } + </field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Create a new lead + </p><p> + Use leads if you need a qualification step before creating an + opportunity or a customer. It can be a business card you received, + a contact form filled in your website, or a file of unqualified + prospects you import, etc. + </p> + </field> + </record> + + <!-- CRM opportunity search by Salesteams --> + <record id="crm_case_form_view_salesteams_opportunity" model="ir.actions.act_window"> + <field name="name">Opportunities</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">kanban,tree,graph,form,calendar,pivot</field> + <field name="domain">[('type','=','opportunity')]</field> + <field name="view_id" ref="crm.crm_case_kanban_view_leads"/> + <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/> + <field name="context">{ + 'search_default_team_id': [active_id], + 'default_team_id': active_id, + 'default_type': 'opportunity', + 'default_user_id': uid, + } + </field> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Create a new lead + </p><p> + Odoo helps you keep track of your sales pipeline to follow + up potential sales and better forecast your future revenues. + </p><p> + You will be able to plan meetings and phone calls from + opportunities, convert them into quotations, attach related + documents, track all discussions, and much more. + </p> + </field> + </record> + + <record id="crm_lead_action_team_overdue_opportunity" model="ir.actions.act_window"> + <field name="name">Overdue Opportunities</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">kanban,tree,graph,form,calendar,pivot</field> + <field name="domain">[('type','=','opportunity')]</field> + <field name="view_id" ref="crm.crm_case_kanban_view_leads"/> + <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/> + <field name="context">{ + 'search_default_team_id': [active_id], + 'search_default_overdue_opp': 1, + 'default_team_id': active_id, + 'default_type': 'opportunity', + 'default_user_id': uid, + } + </field> + </record> + + <record id="action_report_crm_lead_salesteam" model="ir.actions.act_window"> + <field name="name">Leads Analysis</field> + <field name="res_model">crm.lead</field> + <field name="context">{'search_default_team_id': [active_id], 'search_default_filter_create_date': 1}}</field> + <field name="domain">[]</field> + <field name="view_mode">graph,pivot,tree,form</field> + <field name="search_view_id" ref="crm.crm_opportunity_report_view_search"/> + <field name="help">Leads Analysis allows you to check different CRM related information like the treatment delays or number of leads per state. You can sort out your leads analysis by different groups to get accurate grained analysis.</field> + </record> + + <record id="action_report_crm_opportunity_salesteam" model="ir.actions.act_window"> + <field name="name">Pipeline Analysis</field> + <field name="res_model">crm.lead</field> + <field name="view_mode">graph,pivot,tree,form</field> + <field name="search_view_id" ref="crm.crm_opportunity_report_view_search"/> + <field name="context">{ + 'search_default_team_id': [active_id], + 'tree_view_ref': 'crm.crm_case_tree_view_oppor', + 'search_default_opportunity': True, + 'search_default_filter_create_date': 1}</field> + <field name="domain">[]</field> + <field name="help">Opportunities 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 channels of the sales pipeline.</field> + </record> + + <record id="sales_team_form_view_in_crm" model="ir.ui.view"> + <field name="name">crm.team.form.inherit</field> + <field name="model">crm.team</field> + <field name="inherit_id" ref="sales_team.crm_team_view_form"/> + <field name="priority">12</field> + <field name="arch" type="xml"> + <xpath expr="//div[@name='options_active']" position="inside"> + <div class="o_row"> + <span name="opportunities"> + <field name="use_opportunities"/> + <label for="use_opportunities"/> + </span> + <span class="o_row" groups="crm.group_use_lead"> + <field name="use_leads"/> + <label for="use_leads" string="Leads"/> + </span> + </div> + </xpath> + <xpath expr="//field[@name='user_id']" position="after"> + <label for="alias_name" string="Email Alias" + attrs="{'invisible': [('use_leads', '=', False),('use_opportunities', '=', False)]}"/> + <div class="oe_inline" name="alias_def" + attrs="{'invisible': [('use_leads', '=', False),('use_opportunities', '=', False)]}"> + <field name="alias_id" class="oe_read_only oe_inline" + string="Email Alias" required="0"/> + <div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;" > + <div attrs="{'invisible': [('alias_domain', '=', False)]}"> + <field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/> + </div> + <button icon="fa-arrow-right" type="action" name="%(base_setup.action_general_configuration)d" string="Configure a custom domain" class="p-0 btn-link" attrs="{'invisible': [('alias_domain', '!=', False)]}"/> + </div> + </div> + <field name="alias_contact" + string="Accept Emails From" + attrs="{'invisible': [('use_leads', '=', False), ('use_opportunities', '=', False)]}"/> + </xpath> + </field> + </record> + + <!-- Case Teams Action --> + <record id="action_crm_tag_kanban_view_salesteams_oppor11" model="ir.actions.act_window.view"> + <field name="sequence" eval="0"/> + <field name="view_mode">kanban</field> + <field name="view_id" ref="crm_case_kanban_view_leads"/> + <field name="act_window_id" ref="crm_case_form_view_salesteams_opportunity"/> + </record> + + <record id="action_crm_tag_tree_view_salesteams_oppor11" model="ir.actions.act_window.view"> + <field name="sequence" eval="1"/> + <field name="view_mode">tree</field> + <field name="view_id" ref="crm_case_tree_view_oppor"/> + <field name="act_window_id" ref="crm_case_form_view_salesteams_opportunity"/> + </record> + + <record id="action_opportunity_form" model="ir.actions.act_window"> + <field name="name">New Opportunity</field> + <field name="res_model">crm.lead</field> + <field name="type">ir.actions.act_window</field> + <field name="view_mode">form</field> + <field name="view_id" ref="crm_lead_view_form"/> + <field name="domain">[('type','=','opportunity')]</field> + <field name="context">{ + 'search_default_team_id': [active_id], + 'default_team_id': active_id, + 'default_type': 'opportunity', + 'default_user_id': uid, + } + </field> + <field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/> + </record> + + <record id="sales_team.crm_team_salesteams_pipelines_act" model="ir.actions.act_window"> + <field name="domain">[('use_opportunities', '=', True)]</field> + </record> + + <record id="crm_team_salesteams_view_kanban" model="ir.ui.view"> + <field name="name">crm.team.kanban</field> + <field name="model">crm.team</field> + <field name="inherit_id" ref="sales_team.crm_team_salesteams_view_kanban"/> + <field name="arch" type="xml"> + <data> + <xpath expr="//templates" position="before"> + <field name="alias_id"/> + <field name="alias_name"/> + <field name="alias_domain"/> + <field name="use_opportunities"/> + <field name="use_leads"/> + </xpath> + + <xpath expr="//div[hasclass('o_primary')]" position="after"> + <div t-if="record.use_leads.raw_value and record.alias_name.value and record.alias_domain.value"> + <small t-translation="off"><i class="fa fa-envelope-o" aria-label="Leads" title="Leads" role="img"></i>&nbsp; <field name="alias_id"/></small> + </div> + </xpath> + + <xpath expr="//t[@name='first_options']" position="after"> + <div class="row" t-if="record.lead_unassigned_count.raw_value"> + <div class="col-8"> + <a name="%(crm_case_form_view_salesteams_lead)d" type="action" context="{'search_default_unassigned_leads': 1}"> + <field name="lead_unassigned_count"/> + <t t-if="record.lead_unassigned_count.raw_value == 1">Unassigned Lead</t> + <t t-else="">Unassigned Leads</t> + </a> + </div> + </div> + <div class="row" t-if="record.opportunities_count.raw_value"> + <div class="col-8"> + <a name="%(crm_case_form_view_salesteams_opportunity)d" type="action" context="{'search_default_open_opportunities': True}"> <!-- context="{'search_default_probability': NOT or < 100}" --> + <field name="opportunities_count"/> + <t t-if="record.opportunities_count.raw_value == 1">Open Opportunity</t> + <t t-else="">Open Opportunities</t> + </a> + </div> + <div class="col-4 text-right text-truncate"> + <field name="opportunities_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/> + </div> + </div> + <div class="row" t-if="record.opportunities_overdue_count.raw_value"> + <div class="col-8"> + <a name="%(crm_lead_action_team_overdue_opportunity)d" type="action"> + <field name="opportunities_overdue_count"/> + <t t-if="record.opportunities_overdue_count.raw_value == 1">Overdue Opportunity</t> + <t t-else="">Overdue Opportunities</t> + </a> + </div> + <div class="col-4 text-right text-truncate"> + <field name="opportunities_overdue_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/> + </div> + </div> + </xpath> + + <xpath expr="//div[hasclass('o_kanban_manage_view')]" position="inside"> + <div t-if="record.use_leads.raw_value" groups="crm.group_use_lead"> + <a name="%(crm_case_form_view_salesteams_lead)d" type="action"> + Leads + </a> + </div> + <div t-if="record.use_opportunities.raw_value"> + <a name="%(crm_case_form_view_salesteams_opportunity)d" type="action"> + Opportunities + </a> + </div> + </xpath> + + <xpath expr="//div[hasclass('o_kanban_manage_new')]" position="inside"> + <div t-if="record.use_opportunities.raw_value"> + <a name="%(action_opportunity_form)d" type="action"> + Opportunity + </a> + </div> + </xpath> + + <xpath expr="//div[hasclass('o_kanban_manage_reports')]" position="inside"> + <div t-if="record.use_leads.raw_value" groups="crm.group_use_lead"> + <a name="%(action_report_crm_lead_salesteam)d" type="action"> + Leads + </a> + </div> + <div t-if="record.use_opportunities.raw_value"> + <a name="%(action_report_crm_opportunity_salesteam)d" type="action"> + Opportunities + </a> + </div> + <div t-if="record.use_opportunities.raw_value"> + <a name="%(crm.crm_activity_report_action_team)d" type="action"> + Activities + </a> + </div> + </xpath> + </data> + </field> + </record> + +</odoo> diff --git a/addons/crm/views/digest_views.xml b/addons/crm/views/digest_views.xml new file mode 100644 index 00000000..262cfed5 --- /dev/null +++ b/addons/crm/views/digest_views.xml @@ -0,0 +1,16 @@ +<?xml version='1.0' encoding='utf-8'?> +<odoo> + <record id="digest_digest_view_form" model="ir.ui.view"> + <field name="name">digest.digest.view.form.inherit.crm.lead</field> + <field name="model">digest.digest</field> + <field name="inherit_id" ref="digest.digest_digest_view_form"/> + <field name="arch" type="xml"> + <xpath expr="//group[@name='kpi_general']" position="after"> + <group name="kpi_crm" string="CRM" groups="sales_team.group_sale_salesman_all_leads"> + <field name="kpi_crm_lead_created"/> + <field name="kpi_crm_opportunities_won"/> + </group> + </xpath> + </field> + </record> +</odoo> diff --git a/addons/crm/views/mail_activity_views.xml b/addons/crm/views/mail_activity_views.xml new file mode 100644 index 00000000..6b489ee8 --- /dev/null +++ b/addons/crm/views/mail_activity_views.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <record id="sales_team.mail_activity_type_action_config_sales" model="ir.actions.act_window"> + <field name="domain">['|', ('res_model_id', '=', False), ('res_model_id.model', 'in', ['crm.lead', 'res.partner'])]</field> + <field name="context">{'default_res_model': 'crm.lead'}</field> + </record> +</odoo> diff --git a/addons/crm/views/res_config_settings_views.xml b/addons/crm/views/res_config_settings_views.xml new file mode 100644 index 00000000..85871c3f --- /dev/null +++ b/addons/crm/views/res_config_settings_views.xml @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <record id="res_config_settings_view_form" model="ir.ui.view"> + <field name="name">res.config.settings.view.form.inherit.crm</field> + <field name="model">res.config.settings</field> + <field name="priority" eval="5"/> + <field name="inherit_id" ref="base.res_config_settings_view_form"/> + <field name="arch" type="xml"> + <xpath expr="//div[hasclass('settings')]" position="inside"> + <div class="app_settings_block" data-string="CRM" string="CRM" data-key="crm" groups="sales_team.group_sale_manager"> + <h2>CRM</h2> + <div class="row mt16 o_settings_container" name="qualification_setting_container"> + <div class="col-12 col-lg-6 o_setting_box" id="crm_lead" + title="Use leads if you need a qualification step before creating an opportunity or a customer. It can be a business card you received, a contact form filled in your website, or a file of unqualified prospects you import, etc. Once qualified, the lead can be converted into a business opportunity and/or a new customer in your address book."> + <div class="o_setting_left_pane"> + <field name="group_use_lead"/> + </div> + <div class="o_setting_right_pane"> + <label for="group_use_lead"/> + <div class="text-muted"> + Add a qualification step before the creation of an opportunity + </div> + </div> + </div> + <div class="col-12 col-lg-6 o_setting_box" id="crm_lead" + attrs="{'invisible': [('group_use_lead','=',False)]}" + title="Emails received to that address generate new leads not assigned to any Sales Team yet. This can be made when converting them into opportunities. Incoming emails can be automatically assigned to specific Sales Teams. To do so, set an email alias on the Sales Team."> + <div class="o_setting_left_pane"> + <field name="generate_lead_from_alias"/> + </div> + <div class="o_setting_right_pane"> + <label for="generate_lead_from_alias" string="Incoming Emails"/> + <div class="text-muted"> + Create leads from incoming emails + </div> + <div class="content-group" attrs="{'invisible': [('generate_lead_from_alias','=',False)]}"> + <div class="mt16"> + <field name="crm_alias_prefix" class="oe_inline" + attrs="{'required': [('generate_lead_from_alias', '=', True)]}"/> + <label class="mr-0" for="alias_domain" string="@"/> + <field name="alias_domain" readonly="1" force_save="1" class="oe_inline"/> + </div> + <div attrs="{'invisible': [('alias_domain', 'not in', ['localhost', '', False])]}"> + <button type="action" + name="base_setup.action_general_configuration" + string="Use an External Email Server" icon="fa-arrow-right" class="oe_link"/> + </div> + </div> + </div> + </div> + </div> + <div class="row mt16 o_settings_container"> + <div class="col-12 col-lg-6 o_setting_box"> + <div class="o_setting_left_pane"> + <field name="group_use_recurring_revenues"/> + </div> + <div class="o_setting_right_pane"> + <label for="group_use_recurring_revenues"/> + <div class="text-muted"> + Define recurring plans and revenues on Opportunities + </div> + <div attrs="{'invisible': [('group_use_recurring_revenues', '=', False)]}"> + <button type="action" name="crm.crm_recurring_plan_action" + string="Manage Recurring Plans" icon="fa-arrow-right" class="oe_link"/> + </div> + </div> + </div> + </div> + <div class="row mt16 o_settings_container"> + <div class="col-12 col-lg-6 o_setting_box" + title="This can be used to compute statistical probability to close a lead" + name="predictive_lead_setting_container"> + <div class="o_setting_left_pane"></div> + <div class="o_setting_right_pane"> + <b>Predictive Lead Scoring</b> + <div class="text-muted"> + The success rate is computed based on the stage, but you can add more fields in the statistical analysis. + </div> + <div class="mt16"> + <field name="predictive_lead_scoring_fields" class="oe_inline" widget="many2many_tags" placeholder="Extra fields..."/> + <field name="predictive_lead_scoring_fields_str" invisible="1"/> + </div> + <div class="mt16"> + Consider leads created as of the + <field name="predictive_lead_scoring_start_date_str" invisible="1"/> + <field name="predictive_lead_scoring_start_date" class="oe_inline" required="1"/> + </div> + <div class="mt16" groups="base.group_erp_manager"> + <div class="text-muted"> + Use this button to update the probabilities of all leads. This can take up to several minutes depending on how many there are. + </div> + <button name="action_reset_lead_probabilities" type="object" string="Update Probabilities" class="btn-primary"/> + </div> + </div> + </div> + </div> + <h2>Lead Generation</h2> + <div class="row mt16 o_settings_container" name="convert_visitor_setting_container"> + <div class="col-lg-6 o_setting_box"> + <div class="o_setting_left_pane"> + <field name="module_crm_iap_lead_website"/> + </div> + + <div class="o_setting_right_pane" id="crm_iap_lead_website_settings"> + <label string="Visits to Leads" for="module_crm_iap_lead_website"/> + <div class="text-muted"> + Convert visitors of your website into leads and perform data enrichment based on their IP address + </div> + </div> + </div> + <div class="col-lg-6 o_setting_box"> + <div class="o_setting_left_pane"> + <field name="module_crm_iap_lead_enrich"/> + </div> + + <div class="o_setting_right_pane" id="crm_iap_lead_enrich"> + <label string="Lead Enrichment" for="module_crm_iap_lead_enrich"/> + <div class="text-muted"> + Enrich your leads automatically with company data based on their email address + </div> + <div id="crm_iap_lead_enrich"> + <div class="mt8" attrs="{'invisible': [('module_crm_iap_lead_enrich','=',False)]}"> + <field name="lead_enrich_auto" class="o_light_label" widget="radio" required="True"/> + </div> + </div> + </div> + </div> + </div> + <div class="row mt16 o_settings_container" name="generate_lead_setting_container"> + <div class="col-lg-6 o_setting_box"> + <div class="o_setting_left_pane"> + <field name="module_crm_iap_lead"/> + </div> + + <div class="o_setting_right_pane" id="crm_iap_lead_settings"> + <label string="Lead Mining" for="module_crm_iap_lead"/> + <a href="https://www.odoo.com/documentation/14.0/applications/sales/crm/acquire_leads/lead_mining.html" title="Documentation" class="o_doc_link" target="_blank"></a> + <div class="text-muted"> + Generate new leads based on their country, industry, size, etc. + </div> + </div> + </div> + <div class="col-lg-6 o_setting_box"> + <div class="o_setting_left_pane"> + <field name="module_mail_client_extension"/> + </div> + + <div class="o_setting_right_pane" id="mail_client_extension"> + <label string="Outlook CRM Extension" for="module_mail_client_extension"/> + <a href="https://www.odoo.com/documentation/14.0/applications/sales/crm/optimize/outlook_extension.html" title="Documentation" class="o_doc_link" target="_blank"></a> + <div class="text-muted"> + Turn emails received in your Outlook mailbox into leads and log their content as internal notes. + </div> + </div> + </div> + </div> + </div> + </xpath> + </field> + </record> + + <record id="crm_config_settings_action" model="ir.actions.act_window"> + <field name="name">Settings</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">res.config.settings</field> + <field name="view_id" ref="res_config_settings_view_form"/> + <field name="view_mode">form</field> + <field name="target">inline</field> + <field name="context">{'module' : 'crm', 'bin_size': False}</field> + </record> + + <record id="crm_config_settings_menu" model="ir.ui.menu"> + <field name="action" ref="crm.crm_config_settings_action"/> + </record> + +</odoo> diff --git a/addons/crm/views/res_partner_views.xml b/addons/crm/views/res_partner_views.xml new file mode 100644 index 00000000..009f7d6f --- /dev/null +++ b/addons/crm/views/res_partner_views.xml @@ -0,0 +1,52 @@ +<?xml version="1.0"?> +<odoo> + + <!-- Partner kanban view inherit --> + <record id="crm_lead_partner_kanban_view" model="ir.ui.view"> + <field name="name">res.partner.kanban.inherit</field> + <field name="model">res.partner</field> + <field name="inherit_id" ref="base.res_partner_kanban_view"/> + <field name="priority" eval="10"/> + <field name="groups_id" eval="[(4, ref('sales_team.group_sale_salesman'))]"/> + <field name="arch" type="xml"> + <field name="mobile" position="after"> + <field name="opportunity_count"/> + <field name="meeting_count"/> + </field> + <xpath expr="//span[hasclass('oe_kanban_partner_links')]" position="inside"> + <span class="badge badge-pill" t-if="record.opportunity_count.value>0"><i class="fa fa-fw fa-star" aria-label="Favorites" role="img" title="Favorites"/><t t-esc="record.opportunity_count.value"/></span> + <span class="badge badge-pill" t-if="record.meeting_count.value>0"><i class="fa fa-fw fa-calendar" aria-label="Meetings" role="img" title="Meetings"/><t t-esc="record.meeting_count.value"/></span> + </xpath> + </field> + </record> + + <!-- Add contextual button on partner form view --> + <record id="view_partners_form_crm1" model="ir.ui.view"> + <field name="name">view.res.partner.form.crm.inherited1</field> + <field name="model">res.partner</field> + <field name="inherit_id" ref="base.view_partner_form"/> + <field eval="1" name="priority"/> + <field name="groups_id" eval="[(4, ref('sales_team.group_sale_salesman'))]"/> + <field name="arch" type="xml"> + <data> + <div name="button_box" position="inside"> + <button class="oe_stat_button o_res_partner_tip_opp" type="object" + name="action_view_opportunity" + icon="fa-star" + groups="sales_team.group_sale_salesman" + context="{'default_partner_id': active_id}"> + <field string="Opportunities" name="opportunity_count" widget="statinfo"/> + </button> + <button class="oe_stat_button" type="object" + name="schedule_meeting" + icon="fa-calendar" + groups="sales_team.group_sale_salesman" + context="{'partner_id': active_id, 'partner_name': name}"> + <field string="Meetings" name="meeting_count" widget="statinfo"/> + </button> + </div> + </data> + </field> + </record> + +</odoo> diff --git a/addons/crm/views/utm_campaign_views.xml b/addons/crm/views/utm_campaign_views.xml new file mode 100644 index 00000000..4bdec4a1 --- /dev/null +++ b/addons/crm/views/utm_campaign_views.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <record model="ir.ui.view" id="utm_campaign_view_kanban"> + <field name="name">utm.campaign.view.kanban</field> + <field name="model">utm.campaign</field> + <field name="inherit_id" ref="utm.utm_campaign_view_kanban"/> + <field name="arch" type="xml"> + <xpath expr="//field[@name='user_id']" position="after"> + <field name="use_leads"/> + </xpath> + <xpath expr="//div[@id='utm_statistics']" position="inside"> + <div class="mr-3" + groups="sales_team.group_sale_salesman" + t-att-title="record.use_leads.raw_value ? 'Leads' : 'Opportunities'"> + <i class="fa fa-star text-muted"></i> + <small class="font-weight-bold"><field name="crm_lead_count"/></small> + </div> + </xpath> + </field> + </record> + + <record model="ir.ui.view" id="utm_campaign_view_form"> + <field name="name">utm.campaign.view.form</field> + <field name="model">utm.campaign</field> + <field name="inherit_id" ref="utm.utm_campaign_view_form"/> + <field name="arch" type="xml"> + <xpath expr="//div[hasclass('oe_button_box')]" position="inside"> + <button name="action_redirect_to_leads_opportunities" + type="object" + class="oe_stat_button order-3" + icon="fa-star" + groups="sales_team.group_sale_salesman"> + <div class="o_field_widget o_stat_info"> + <field name="use_leads" invisible="1"/> + <span class="o_stat_value"><field nolabel="1" name="crm_lead_count"/></span> + <span class="o_stat_text" attrs="{'invisible': [('use_leads', '=', False)]}">Leads</span> + <span class="o_stat_text" attrs="{'invisible': [('use_leads', '=', True)]}">Opportunities</span> + </div> + </button> + </xpath> + </field> + </record> +</odoo> |
