Initial commit: Crm packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:49 +02:00
commit 21a345b5b9
654 changed files with 418312 additions and 0 deletions

View file

@ -0,0 +1,23 @@
<?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>
<script type="text/javascript" src="/crm/static/tests/tours/crm_email_and_phone_propagation.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>

View file

@ -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='description']" position="after">
<field name="opportunity_id"/>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="crm_action_helper" name="crm action helper">
<t t-if="team.alias_name and team.alias_domain">
<p class="o_view_nocontent_smiling_face">
Create an opportunity to start playing with your pipeline.
</p><p>Use the <i>New</i> button, or send an email to
<a t-attf-href="mailto:#{team.alias_id.display_name}"><t t-esc="team.alias_id.display_name"/></a>
to test the email gateway.</p>
</t>
<t t-else="">
<p class='o_view_nocontent_smiling_face'>Create an opportunity to start playing with your pipeline.</p>
<p>Use the New button, or configure an email alias to test the email gateway.</p>
</t>
</template>
</odoo>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,69 @@
<?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>
<label for="name"/>
</div>
<h1 class="mb32">
<field name="name" placeholder="e.g. Too expensive" 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">
Create a Lost Reason
</p><p>
Use Lost Reasons to report on why opportunities are lost (e.g."Undercut by competitors").
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,167 @@
<?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.svg"
groups="sales_team.group_sale_salesman,sales_team.group_sale_manager"
sequence="25"/>
<!-- 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"
action="crm.action_your_pipeline"
sequence="1"/>
<menuitem
id="crm_lead_menu_my_activities"
name="My Activities"
parent="crm_menu_sales"
groups="sales_team.group_sale_salesman"
action="crm.crm_lead_action_my_activities"
sequence="2"/>
<menuitem
id="sales_team_menu_team_pipeline"
name="Teams"
parent="crm_menu_sales"
action="sales_team.crm_team_action_pipeline"
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"
action="crm.crm_lead_all_leads"
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_salesman"/>
<menuitem
id="crm_menu_forecast"
name="Forecast"
parent="crm_menu_report"
action="crm.action_opportunity_forecast"
sequence="1"/>
<menuitem
id="crm_opportunity_report_menu"
name="Pipeline"
parent="crm_menu_report"
action="crm.crm_opportunity_report_action"
sequence="2"/>
<menuitem
id="crm_opportunity_report_menu_lead"
name="Leads"
parent="crm_menu_report"
action="crm.crm_opportunity_report_action_lead"
sequence="3"/>
<menuitem
id="crm_activity_report_menu"
name="Activities"
parent="crm_menu_report"
action="crm_activity_report_action"
sequence="4"/>
<!-- CONFIGURATION -->
<menuitem
id="crm_menu_config"
name="Configuration"
parent="crm_menu_root"
action="crm.action_your_pipeline"
sequence="25" groups="sales_team.group_sale_manager"/>
<menuitem
id="crm_config_settings_menu"
name="Settings"
parent="crm_menu_config"
action="crm.crm_config_settings_action"
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.crm_team_action_config"
sequence="5"/>
<menuitem
id="crm_team_member_config"
name="Teams Members"
parent="crm_menu_config"
action="sales_team.crm_team_member_action"
sequence="6"
groups="base.group_no_one"/>
<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"
action="crm.crm_stage_action"
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"
action="crm.crm_lost_reason_action"
sequence="6"/>
<menuitem
id="menu_import_crm"
name="Import &amp; Synchronize"
parent="crm_menu_root"/>
</odoo>

View file

@ -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>

View file

@ -0,0 +1,73 @@
<?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">
<label for="name"/>
<h1>
<field name="name" placeholder="e.g. Negotiation"/>
</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', '&lt;=', 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>
</odoo>

View file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo><data>
<record id="crm_team_member_view_tree" model="ir.ui.view">
<field name="name">crm.team.member.view.tree</field>
<field name="model">crm.team.member</field>
<field name="inherit_id" ref="sales_team.crm_team_member_view_tree"/>
<field name="arch" type="xml">
<field name="user_id" position="after">
<field name="assignment_enabled" invisible="1"/>
<field name="assignment_optout"/>
<field name="assignment_max"/>
<field name="lead_month_count"/>
</field>
</field>
</record>
<record id="crm_team_member_view_kanban" model="ir.ui.view">
<field name="name">crm.team.member.view.kanban.inherit.crm</field>
<field name="model">crm.team.member</field>
<field name="inherit_id" ref="sales_team.crm_team_member_view_kanban"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_kanban_details')]" position="after">
<field name="assignment_enabled" invisible="1"/>
<field name="assignment_optout" invisible="1"/>
<div class="o_member_assignment"
attrs="{'invisible': ['|', ('assignment_enabled', '=', False), ('assignment_optout', '=', True)]}">
<field name="assignment_max" invisible="1"/>
<field name="lead_month_count" widget="gauge"
options="{'max_field': 'assignment_max'}"
attrs="{'invisible': [('assignment_max', '=', 0)]}"/>
</div>
</xpath>
</field>
</record>
<record id="crm_team_member_view_form" model="ir.ui.view">
<field name="name">crm.team.member.view.form.inherit.crm</field>
<field name="model">crm.team.member</field>
<field name="inherit_id" ref="sales_team.crm_team_member_view_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='member_partner_info']" position="after">
<group name="group_assign" attrs="{'invisible': [('assignment_enabled', '=', False)]}">
<field name="assignment_enabled" invisible="1"/>
<field name="assignment_optout"/>
<label for="lead_month_count" attrs="{'invisible': [('assignment_optout', '=', True)]}"/>
<div attrs="{'invisible': [('assignment_optout', '=', True)]}">
<field name="lead_month_count" class="oe_inline"/>
<span class="oe_inline"> / </span>
<field name="assignment_max" class="oe_inline"/>
<span class="oe_inline"> (max) </span>
</div>
<field name="assignment_domain" string="Domain" widget="domain"
options="{'model': 'crm.lead'}"
attrs="{'invisible': ['|', ('assignment_max', '=', 0), ('assignment_optout', '=', True)]}"/>
</group>
</xpath>
</field>
</record>
<record id="sales_team.crm_team_member_action" model="ir.actions.act_window">
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a Team Member
</p><p>
Team Members are salespersons assigned to specific teams.
</p>
</field>
</record>
</data></odoo>

View file

@ -0,0 +1,351 @@
<?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="view_id" ref="crm_lead_view_graph"/>
<field name="search_view_id" ref="crm.view_crm_case_leads_filter"/>
<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_lead_salesteam_view_graph" model="ir.actions.act_window.view">
<field name="sequence">2</field>
<field name="view_mode">graph</field>
<field name="view_id" ref="crm_lead_view_graph"/>
<field name="act_window_id" ref="action_report_crm_lead_salesteam"/>
</record>
<record id="action_report_crm_lead_salesteam_view_pivot" model="ir.actions.act_window.view">
<field name="sequence">3</field>
<field name="view_mode">pivot</field>
<field name="view_id" ref="crm_lead_view_pivot"/>
<field name="act_window_id" ref="action_report_crm_lead_salesteam"/>
</record>
<record id="action_report_crm_lead_salesteam_view_tree" model="ir.actions.act_window.view">
<field name="sequence">4</field>
<field name="view_mode">tree</field>
<field name="view_id" ref="crm_lead_view_tree_reporting"/>
<field name="act_window_id" ref="action_report_crm_lead_salesteam"/>
</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_filter_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="crm_team_view_tree" model="ir.ui.view">
<field name="name">crm.team.tree.inherit.crm</field>
<field name="model">crm.team</field>
<field name="inherit_id" ref="sales_team.crm_team_view_tree"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field string="Alias" name="alias_id"/>
</field>
</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="//sheet" position="before">
<field name="use_leads" invisible="1"/>
<header>
<button name="action_assign_leads" type="object"
string="Assign Leads"
class="oe_highlight"
confirm="This will assign leads to all members. Do you want to proceed?"
attrs="{'invisible': ['|', '&amp;', ('use_leads', '=', False), ('use_opportunities', '=', False), ('assignment_enabled', '=', False)]}"/>
</header>
</xpath>
<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"
attrs="{'invisible': [('alias_domain', '=', False)]}"/>
<div class="oe_inline" name="edit_alias" style="display: inline;" >
<div class="oe_edit_only" attrs="{'invisible': [('alias_domain', '=', False)]}" dir="ltr">
<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>
<xpath expr="//group[@name='right']" position="attributes">
<attribute name="string">Assignment Rules</attribute>
<attribute name="attrs">{'invisible': [('assignment_enabled', '=', False)]}</attribute>
</xpath>
<xpath expr="//group[@name='right']" position="inside">
<field name="assignment_enabled" invisible="1"/>
<field name="assignment_auto_enabled" invisible="1"/>
<field name="assignment_domain" widget="domain" string="Domain"
options="{'model': 'crm.lead', 'in_dialog': True}"
attrs="{'invisible': [('assignment_enabled', '=', False)]}"/>
<label for="lead_all_assigned_month_count" string="Assigned Leads Count"
attrs="{'invisible': [('assignment_enabled', '=', False)]}"/>
<div attrs="{'invisible': [('assignment_enabled', '=', False)]}">
<field name="lead_all_assigned_month_count" class="oe_inline"/> /
<field name="assignment_max" class="oe_inline"/>
</div>
<field name="assignment_optout" attrs="{'invisible': [('assignment_auto_enabled', '=', False)]}"/>
</xpath>
<xpath expr="//field[@name='member_ids']" position="attributes">
<attribute name="attrs">{'invisible': [('assignment_enabled', '=', True)]}</attribute>
</xpath>
<xpath expr="//field[@name='crm_team_member_ids']" position="attributes">
<attribute name="attrs">{'invisible': [('assignment_enabled', '=', False)]}</attribute>
</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_action_pipeline" model="ir.actions.act_window">
<field name="domain">[('use_opportunities', '=', True)]</field>
</record>
<record id="crm_team_view_kanban_dashboard" model="ir.ui.view">
<field name="name">crm.team.view.kanban.dashboard.inherit.crm</field>
<field name="model">crm.team</field>
<field name="inherit_id" ref="sales_team.crm_team_view_kanban_dashboard"/>
<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.alias_name.value and record.alias_domain.value">
<span t-translation="off"><i class="fa fa-envelope-o" aria-label="Leads" title="Leads" role="img"></i>&amp;nbsp; <field name="alias_id"/></span>
</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" class="me-1"/>
<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" class="me-1"/>
<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-end 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" class="me-1"/>
<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-end 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')]/div[hasclass('o_kanban_card_manage_title')]" position="after">
<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')]/div[hasclass('o_kanban_card_manage_title')]" position="after">
<div t-if="record.use_leads.raw_value" groups="crm.group_use_lead">
<a name="%(crm_lead_action_open_lead_form)d" type="action">
Leads
</a>
</div>
<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')]/div[hasclass('o_kanban_card_manage_title')]" position="after">
<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>
</xpath>
<xpath expr="//div[hasclass('o_kanban_manage_reports')]/div[@name='o_team_kanban_report_separator']" position="after">
<div name="activity_report">
<div t-if="record.use_opportunities.raw_value">
<a name="%(crm.crm_activity_report_action_team)d" type="action" style="color: #444B5A;">
Activities
</a>
</div>
</div>
</xpath>
</data>
</field>
</record>
</odoo>

View file

@ -0,0 +1,17 @@
<?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="priority">20</field>
<field name="inherit_id" ref="digest.digest_digest_view_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='kpis']/group[last()]" position="before">
<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>

View file

@ -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', '=', False), ('res_model', 'in', ['crm.lead', 'res.partner'])]</field>
<field name="context">{'default_res_model': 'crm.lead'}</field>
</record>
</odoo>

View file

@ -0,0 +1,182 @@
<?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">
<div class="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 class="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>
<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="is_membership_multi"/>
</div>
<div class="o_setting_right_pane">
<label for="is_membership_multi"/>
<div class="text-muted">
Assign salespersons into multiple Sales Teams.
</div>
</div>
</div>
</div>
<div class="row mt16 o_settings_container">
<div class="col-lg-6 o_setting_box"
title="This can be used to compute statistical probability to close a lead"
name="predictive_lead_setting_container">
<field name="predictive_lead_scoring_fields_str" invisible="1"/>
<field name="predictive_lead_scoring_start_date_str" invisible="1"/>
<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 <b>
<field name="predictive_lead_scoring_field_labels" class="d-inline"/>
</b>
for the leads created as of the
<b><field name="predictive_lead_scoring_start_date" class="oe_inline" readonly="1"/></b>.
</div>
<div class="mt16" groups="base.group_erp_manager">
<button name="%(crm_lead_pls_update_action)d" type="action"
string="Update Probabilities"
class="btn-primary"/>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box"
title="This can be used to automatically assign leads to sales persons based on rules">
<div class="o_setting_left_pane">
<field name="crm_use_auto_assignment"/>
</div>
<div class="o_setting_right_pane">
<label for="crm_use_auto_assignment"/>
<a href="https://www.odoo.com/documentation/16.0/applications/sales/crm/track_leads/lead_scoring.html#assign-leads"
title="Assign Documentation" class="o_doc_link" target="_blank"></a>
<div class="text-muted">
<span>Periodically assign leads based on rules</span><br />
<span attrs="{'invisible': [('crm_use_auto_assignment', '=', False)]}">
All sales teams will use this setting by default unless
specified otherwise.
</span>
</div>
<div class="row flex-row flex-nowrap mt16" attrs="{'invisible': [('crm_use_auto_assignment', '=', False)]}">
<label string="Running" for="crm_auto_assignment_action" class="col-lg-3 o_light_label"/>
<field name="crm_auto_assignment_action"
attrs="{'required': [('crm_use_auto_assignment', '=', True)]}"/>
<button name="action_crm_assign_leads" type="object" class="btn-link w-auto">
<i title="Update now" role="img" aria-label="Update now" class="fa fa-fw fa-refresh"></i>
</button>
</div>
<div class="row mt16" attrs="{'invisible': ['|', ('crm_use_auto_assignment', '=', False), ('crm_auto_assignment_action', '=', 'manual')]}">
<label string="Repeat every" for="crm_auto_assignment_interval_type" class="col-lg-3 o_light_label"/>
<field name="crm_auto_assignment_interval_number"
class="oe_inline me-2"
attrs="{'required': [('crm_use_auto_assignment', '=', True), ('crm_auto_assignment_action', '=', 'auto')]}"/>
<field name="crm_auto_assignment_interval_type"
class="oe_inline"
attrs="{'required': [('crm_use_auto_assignment', '=', True), ('crm_auto_assignment_action', '=', 'auto')]}"/>
</div>
<div class="row" attrs="{'invisible': ['|', ('crm_use_auto_assignment', '=', False), ('crm_auto_assignment_action', '=', 'manual')]}">
<label string="Next Run" for="crm_auto_assignment_run_datetime" class="col-lg-3 o_light_label"/>
<field name="crm_auto_assignment_run_datetime"/>
</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_enrich"/>
</div>
<div class="o_setting_right_pane" id="crm_iap_enrich_settings">
<label string="Lead Enrichment" for="module_crm_iap_enrich"/>
<div class="text-muted">
Enrich your leads with company data based on their email addresses
</div>
<div class="mt8" attrs="{'invisible': [('module_crm_iap_enrich','=',False)]}">
<field name="lead_enrich_auto" class="o_light_label" widget="radio" required="True"/>
</div>
</div>
</div>
<div class="col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_crm_iap_mine"/>
</div>
<div class="o_setting_right_pane" id="crm_iap_mine_settings">
<label string="Lead Mining" for="module_crm_iap_mine"/>
<a href="https://www.odoo.com/documentation/16.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>
<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_website_crm_iap_reveal"/>
</div>
<div class="o_setting_right_pane" id="website_crm_iap_reveal_settings">
<label string="Visits to Leads" for="module_website_crm_iap_reveal"/>
<div class="text-muted">
Convert visitors of your website into leads and perform data enrichment based on their IP address
</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>
</odoo>

View file

@ -0,0 +1,50 @@
<?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="arch" type="xml">
<field name="mobile" position="after">
<field name="opportunity_count" groups="sales_team.group_sale_salesman"/>
</field>
<xpath expr="//div[hasclass('oe_kanban_bottom_left')]" position="inside">
<a t-if="record.opportunity_count.value>0" href="#"
groups="sales_team.group_sale_salesman"
data-type="object" data-name="action_view_opportunity"
class="oe_kanban_action oe_kanban_action_a me-1">
<span class="badge rounded-pill">
<i class="fa fa-fw fa-star" aria-label="Opportunities"
role="img" title="Opportunities"/>
<t t-out="record.opportunity_count.value"/>
</span>
</a>
</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="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, 'default_type':'opportunity'}">
<field string="Opportunities" name="opportunity_count" widget="statinfo"/>
</button>
</div>
</data>
</field>
</record>
</odoo>

View file

@ -0,0 +1,42 @@
<?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="me-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="fw-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>