[REF] crm,sale: Split the applications into 2 separate apps

Purpose
=======

You install CRM but you don't see CRM icon (except in English, as long as sales is not installed) -> confusing
The dashboard with salesteam is not obvious & not useful for simple users: what are those channel boxes about? why don't I see all my activities?, etc.

Specifications
==============

Split CRM & Sales + land in business views straight away

Default Entry Views
~~~~~~~~~~~~~~~~~~~

- New default view for CRM: Pipeline kanban
- New default view for Sales: Quotation list

Dashboards
~~~~~~~~~~

- Move sales teams dashboard to Reporting: Sales Channels.
- Remove the upper part of the sales team dashboard

Menuitems Structure
~~~~~~~~~~~~~~~~~~~

- CRM menu

Pipeline:
	- Leads (optional)
	- Pipeline (default menu, default filter "My Pipeline")
	- Next Activities -> to remove (now there is an icon in top bar for next activities)
	- Quotations (If sale_management installed)
Customers
Phone Calls (if voip, if not yet removed because there is a BE task to use next activities instead)
Leads Management:
	- Scoring Rules
	- Leads Assignation
	- Team Assignation
Reporting:
	- Leads
	- Scoring page views
	- Opp. Assignement
	- Patnerships
	- Pipeline
	- Activities
	- Phonecalls
	- Sales Channels
Configuration:
	- Settings
	- Sales Channels
	- Activity Types
	- Leads & Opportunities:
		- Lead Tags
		- Lost Reasons
	- Resellers
		- Partner Level
		- Partner Activations
- Sales menu:

Orders:
	- Quotations
	- Orders
	- Customers
Invoicing:
	- Orders to Invoice
	- Orders to Upsell
Catalog:
	- Products
	- Promotion Programs
	- Coupon Programs
Reporting:
	- Sales
	- Sales Channels
	- All channels sales orders
Configuration:
	- Settings
	- Sales Channels
	- Sales Orders:
		- Quotation templates
		- Payment acquirers
		- Delivery Methods

Settings
~~~~~~~~

- Split settings form
- Remove recommended apps section
- Remove Timesheets section
- Remove Inventory Management and move shipping connectors to Shipping section
- Remove Integrations section
	- Move Docsaway option to "Quotations & Orders", right after proforma
	- Autocomplete and asterix: move to CRM section
- Restructure and rename sections this way:
	- Product Catalog
	- Pricing
	- Quotations & Orders
	- Shipping
	- Invoicing
	- eBay (if installed)
- Remove all the "Save this page and come back here" when checking a box that installs a new module

- restructure a bit the CRM settings, with 3 sections:

Pipeline
	- Leads
Contacts
	- Phone Validation
	- Customer Autocomplete
Integrations
	- Google Calendar / Synchronize your calendar with Google Calendar (copy from general settings but don't show message "Save this page and come back here...".
	- Asterisk (VOIP)
This commit is contained in:
Haresh Shyara
2017-08-09 10:03:08 +02:00
committed by Yannick Tivisse
parent a2ca8b98d8
commit ea66192276
56 changed files with 703 additions and 1575 deletions
+4 -5
View File
@@ -28,7 +28,6 @@
'data/crm_data.xml',
'data/crm_stage_data.xml',
'data/crm_lead_data.xml',
'data/web_planner_data.xml',
'data/mail_template_data.xml',
'wizard/base_partner_merge_views.xml',
@@ -37,16 +36,16 @@
'wizard/crm_merge_opportunities_views.xml',
'wizard/base_partner_merge_views.xml',
'report/crm_activity_report_views.xml',
'report/crm_opportunity_report_views.xml',
'views/crm_templates.xml',
'views/crm_config_settings_views.xml',
'views/crm_views.xml',
'views/crm_stage_views.xml',
'views/crm_lead_views.xml',
'views/calendar_views.xml',
'views/res_partner_views.xml',
'views/sale_config_settings_views.xml',
'data/web_planner_data.xml',
'report/crm_activity_report_views.xml',
'report/crm_opportunity_report_views.xml',
'views/crm_team_views.xml',
],
'demo': [
+1 -1
View File
@@ -935,7 +935,7 @@
<record id="planner_crm" model="web.planner">
<field name="name">Sales strategy planner</field>
<field name="view_id" ref="crm_planner"/>
<field name="menu_id" ref="sales_team.menu_base_partner"/>
<field name="menu_id" ref="crm_menu_root"/>
<field name="planner_application">planner_crm</field>
<field name="tooltip_planner"><![CDATA[
Plan your sales strategy: objectives, leads, KPIs, and much more!
+1 -1
View File
@@ -6,6 +6,6 @@ from . import calendar
from . import crm_lead
from . import crm_stage
from . import crm_team
from . import sale_config_settings
from . import crm_config_settings
from . import res_partner
from . import web_planner
@@ -4,15 +4,19 @@
from odoo import api, fields, models
class SaleConfigSettings(models.TransientModel):
_inherit = 'sale.config.settings'
class CrmConfigSettings(models.TransientModel):
_name = 'crm.config.settings'
_inherit = 'res.config.settings'
company_id = fields.Many2one('res.company', string='Company', required=True,
default=lambda self: self.env.user.company_id)
alias_prefix = fields.Char('Default Alias Name for Leads')
alias_domain = fields.Char('Alias Domain', default=lambda self: self.env["ir.config_parameter"].sudo().get_param("mail.catchall.domain"))
generate_lead_from_alias = fields.Boolean('Manual Assignation of Emails')
group_use_lead = fields.Boolean(string="Leads", implied_group='crm.group_use_lead')
module_crm_phone_validation = fields.Boolean("Phone Validation")
module_crm_voip = fields.Boolean("Asterisk (VoIP)")
module_web_clearbit = fields.Boolean("Customer Autocomplete")
def _find_default_lead_alias_id(self):
alias = self.env.ref('crm.mail_alias_lead_info', False)
@@ -38,7 +42,7 @@ class SaleConfigSettings(models.TransientModel):
@api.model
def get_values(self):
res = super(SaleConfigSettings, self).get_values()
res = super(CrmConfigSettings, self).get_values()
alias = self._find_default_lead_alias_id()
res.update(
alias_prefix=alias.alias_name if alias else False,
@@ -48,7 +52,7 @@ class SaleConfigSettings(models.TransientModel):
@api.multi
def set_values(self):
super(SaleConfigSettings, self).set_values()
super(CrmConfigSettings, self).set_values()
self.env['ir.config_parameter'].sudo().set_param('crm.generate_lead_from_alias', self.generate_lead_from_alias)
alias = self._find_default_lead_alias_id()
if alias:
@@ -66,7 +66,7 @@
id="crm_activity_report_menu"
name="Activities"
groups="sales_team.group_sale_manager"
parent="sales_team.menu_sale_report"
parent="crm_menu_report"
action="crm_activity_report_action"
sequence="6"/>
@@ -167,7 +167,7 @@ mainly used by the sales manager in order to do the periodic review with the
teams of the sales pipeline.</field>
</record>
<menuitem id="crm_opportunity_report_menu" name="Pipeline"
parent="sales_team.menu_sale_report" action="crm_opportunity_report_action" sequence="5"/>
parent="crm_menu_report" action="crm_opportunity_report_action" sequence="5"/>
<record id="crm_opportunity_report_action_graph" model="ir.actions.act_window">
<field name="name">Pipeline Analysis</field>
@@ -202,7 +202,7 @@ with the the sales channel.</field>
<menuitem
id="crm_opportunity_report_menu_lead"
name="Leads"
parent="sales_team.menu_sale_report"
parent="crm_menu_report"
action="crm_opportunity_report_action_lead"
groups="crm.group_use_lead"
sequence="1"/>
+3 -6
View File
@@ -12,12 +12,9 @@
<field eval="[(4,ref('base.group_partner_manager'))]" name="groups_id"/>
</record>
<record model='ir.ui.menu' id='sales_team.menu_base_partner'>
<field name="groups_id" eval="[(4,ref('sales_team.group_sale_manager')),(4,ref('sales_team.group_sale_salesman'))]"/>
</record>
<record model="ir.ui.menu" id="sales_team.menu_sale_config">
<field eval="[(4, ref('sales_team.group_sale_manager'))]" name="groups_id"/>
<record id="contacts.res_partner_menu_config" model="ir.ui.menu">
<field name="name">Configuration</field>
<field name="groups_id" eval="[(4, ref('sales_team.group_sale_manager'))]"/>
</record>
</data>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

@@ -1,12 +0,0 @@
odoo.define('crm.sales_team_dashboard', function (require) {
"use strict";
var SalesTeamDashboard = require('sales_team.dashboard');
SalesTeamDashboard.Model.include({
_fetchDashboardData: function() {
return this._rpc({model: 'crm.lead', method: 'retrieve_sales_dashboard'});
},
});
});
+3 -8
View File
@@ -9,14 +9,9 @@ var _t = core._t;
tour.register('crm_tour', {
url: "/web",
}, [tour.STEPS.MENU_MORE, {
trigger: '.o_app[data-menu-xmlid="sales_team.menu_base_partner"], .oe_menu_toggler[data-menu-xmlid="sales_team.menu_base_partner"]',
content: _t("Ready to boost your sales? Your <b>sales pipeline</b> can be found here, under this app."),
trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"], .oe_menu_toggler[data-menu-xmlid="crm.crm_menu_root"]',
content: _t("Ready to boost your sales? Your <b>Pipeline</b> can be found here, under <b>CRM</b> app."),
position: 'bottom',
}, {
trigger: ".o_sales_dashboard .o_dashboard_action[name=\"crm.action_your_pipeline\"]:last",
extra_trigger: '.o_sales_dashboard',
content: _t("Let\'s have a look at your opportunities pipeline."),
position: "bottom"
}, {
trigger: ".o-kanban-button-new",
extra_trigger: '.o_opportunity_kanban',
@@ -80,7 +75,7 @@ tour.STEPS.MENU_MORE, {
position: "right"
}, tour.STEPS.TOGGLE_APPSWITCHER,
tour.STEPS.MENU_MORE, {
trigger: '.o_app[data-menu-xmlid="sales_team.menu_base_partner"], .oe_menu_toggler[data-menu-xmlid="sales_team.menu_base_partner"]',
trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"], .oe_menu_toggler[data-menu-xmlid="crm.crm_menu_root"]',
content: _t("Good job! Your completed the tour of the CRM. You can continue with the <b>implementation guide</b> to help you setup the CRM in your company."),
position: 'bottom',
}, {
+1 -1
View File
@@ -4,7 +4,7 @@
<menuitem
id="menu_import_crm"
name="Import &amp; Synchronize"
parent="sales_team.menu_base_partner"/>
parent="crm_menu_root"/>
<record id="view_crm_meeting_search" model="ir.ui.view">
<field name="name">calendar.event.form.inherit</field>
@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="crm_config_settings_view_form" model="ir.ui.view">
<field name="name">crm.config.settings.view.form</field>
<field name="model">crm.config.settings</field>
<field name="arch" type="xml">
<form string="Configure CRM" class="oe_form_configuration" name="crm_config_form">
<header>
<button string="Save" type="object" name="execute" class="oe_highlight"/>
<button string="Cancel" type="object" name="cancel" class="oe_link"/>
</header>
<sheet>
<h2>CRM</h2>
<field name="company_id" invisible="1"/>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" id="crm_lead">
<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 creating an opportunity
</div>
</div>
</div>
<div class="col-xs-12 col-md-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 channel yet. This can be made when converting them into opportunities. Incoming emails can be automatically assigned to specific sales channels. To do so, set an email alias on the sales channel."
groups="base.group_no_one">
<div class="o_setting_left_pane">
<field name="generate_lead_from_alias"/>
</div>
<div class="o_setting_right_pane">
<label string="Manually Assignation of Incoming Emails"/>
<div class="text-muted">
Generate unassigned leads from incoming emails. Leads coming from
that email will be assigned manually.
</div>
<div class="content-group" attrs="{'invisible': [('generate_lead_from_alias','=',False)]}">
<div class="mt16">
<label string="Alias" class="o_light_label"/>
<field name="alias_prefix" class="oe_inline"
attrs="{'required': [('generate_lead_from_alias', '=', True)]}"/>
<span>@</span>
<field name="alias_domain" readonly="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 class="col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_crm_phone_validation"/>
</div>
<div class="o_setting_right_pane">
<label for="module_crm_phone_validation"/>
<div class="text-muted" id="module_crm_phone_validation">
Validate and normalize phone numbers.
</div>
</div>
</div>
<div class="col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_crm_voip" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_crm_voip"/>
<div class="text-muted" id="crm_voip">
Schedule &amp; make calls from CRM app
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="When populating your address book, Odoo relies on Clearbit’s API to provide you with a list of matching contacts or companies.When selecting one item, the partner name, logo and website get automatically set.">
<div class="o_setting_left_pane">
<field name="module_web_clearbit" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_web_clearbit"/>
<div class="text-muted">
Look up company information (name, logo, etc.)
</div>
</div>
</div>
</div>
</sheet>
</form>
</field>
</record>
<record id="crm_config_settings_action" model="ir.actions.act_window">
<field name="name">Configure CRM</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">crm.config.settings</field>
<field name="view_id" ref="crm_config_settings_view_form"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
</odoo>
+20 -17
View File
@@ -613,7 +613,7 @@
<separator/>
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
<separator/>
<filter string="My Opportunities" name="assigned_to_me"
<filter string="My Pipeline" name="assigned_to_me"
domain="[('user_id', '=', uid)]"
help="Opportunities that are assigned to me"/>
<filter string="Unassigned" name="unassigned"
@@ -736,10 +736,15 @@ if record:
Menu Actions
-->
<menuitem
id="sales_team.menu_sales"
name="Sales"
parent="sales_team.menu_base_partner"
sequence="5"/>
id="crm_menu_pipeline"
name="Pipeline"
parent="crm_menu_root"
sequence="1"/>
<menuitem id="res_partner_menu_crm"
parent="crm_menu_root"
action="base.action_partner_form"
sequence="2"/>
<!-- Lead Menu -->
<record model="ir.actions.act_window" id="crm_lead_all_leads">
@@ -772,7 +777,7 @@ if record:
<menuitem
id="menu_crm_leads"
name="Leads"
parent="sales_team.menu_sales"
parent="crm_menu_pipeline"
sequence="1"
action="crm_lead_all_leads"
groups="crm.group_use_lead"/>
@@ -830,7 +835,7 @@ if record:
</record>
<record model="ir.actions.act_window" id="crm_lead_opportunities_tree_view">
<field name="name">Your Pipeline</field>
<field name="name">Pipeline</field>
<field name="res_model">crm.lead</field>
<field name="view_mode">kanban,tree,graph,pivot,form,calendar</field>
<field name="domain">[('type','=','opportunity')]</field>
@@ -863,9 +868,14 @@ if record:
<menuitem
id="menu_crm_opportunities"
action="action_your_pipeline"
name="My Pipeline"
parent="sales_team.menu_sales"
sequence="4"/>
name="Pipeline"
parent="crm_menu_pipeline"
sequence="5"/>
<menuitem
id="crm.crm_menu_root"
name="CRM"
action="action_your_pipeline"/>
<!-- Next Activities Menu -->
<record id="crm_lead_action_activities" model="ir.actions.act_window">
@@ -893,13 +903,6 @@ if record:
</field>
</record>
<menuitem
id="crm_lead_menu_activities"
name="Next Activities"
parent="sales_team.menu_sales"
sequence="5"
action="crm_lead_action_activities" />
<!-- Configuration/Lead & Opporotunities/Lead Tags Menu -->
<record id="crm_lead_tag_action" model="ir.actions.act_window">
<field name="name">Lead Tags</field>
-8
View File
@@ -5,15 +5,7 @@
<link rel="stylesheet" href="/crm/static/src/css/crm.css"/>
<!-- Planner assets -->
<script type="text/javascript" src="/crm/static/src/js/web_planner_crm.js"></script>
<!-- Salesteam dashboard asset -->
<script type="text/javascript" src="/crm/static/src/js/sales_team_dashboard.js"></script>
<script type="text/javascript" src="/crm/static/src/js/tour.js"></script>
</xpath>
</template>
<template id="qunit_suite" name="crm_tests" inherit_id="web.qunit_suite">
<xpath expr="//t[@t-set='head']" position="inside">
<script type="text/javascript" src="/crm/static/tests/sales_team_dashboard_tests.js"></script>
</xpath>
</template>
</odoo>
+43 -5
View File
@@ -7,24 +7,62 @@
the base module in order to set new groups.
-->
<menuitem
id="sales_team.menu_base_partner"
id="crm_menu_root"
name="CRM"
groups="sales_team.group_sale_manager,sales_team.group_sale_salesman"
web_icon="crm,static/description/icon.png"
groups="sales_team.group_sale_salesman,sales_team.group_sale_manager"
sequence="6"/>
<menuitem
id="crm_menu_config"
name="Configuration"
parent="crm_menu_root"
sequence="25" groups="sales_team.group_sale_manager"/>
<menuitem
id="menu_crm_config_lead"
name="Leads &amp; Opportunities"
parent="sales_team.menu_sale_config"
sequence="2"
parent="crm_menu_config"
sequence="15"
groups="sales_team.group_sale_manager"/>
<menuitem
id="menu_crm_config_opportunity"
name="Opportunities"
parent="sales_team.menu_sale_config"
parent="crm_menu_config"
sequence="1"
groups="sales_team.group_sale_manager"/>
<menuitem id="crm_config_settings_menu"
name="Settings"
parent="crm_menu_config"
action="crm_config_settings_action"
groups="base.group_system"
sequence="0"/>
<menuitem id="crm_menu_report"
name="Reporting"
parent="crm_menu_root"
sequence="20"
groups="sales_team.group_sale_manager"/>
<menuitem id="crm_team_config"
name="Sales Channels"
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="sales_team_menu_report_crm"
name="Sales Channels"
parent="crm_menu_report"
action="sales_team.crm_team_salesteams_act"
sequence="10"/>
</odoo>
@@ -1,97 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sale_config_settings_view_form_inherit_crm" model="ir.ui.view">
<field name="name">sale.config.settings.inherit.crm</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sales_team.sale_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//h2[@id='integration_h2']" position="before">
<h2>CRM</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" id="crm_lead">
<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 creating an opportunity
</div>
</div>
</div>
<div class="col-xs-12 col-md-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 channel yet. This can be made when converting them into opportunities. Incoming emails can be automatically assigned to specific sales channels. To do so, set an email alias on the sales channel."
groups="base.group_no_one">
<div class="o_setting_left_pane">
<field name="generate_lead_from_alias"/>
</div>
<div class="o_setting_right_pane">
<label string="Manually Assignation of Incoming Emails"/>
<div class="text-muted">
Generate unassigned leads from incoming emails. Leads coming from
that email will be assigned manually.
</div>
<div class="content-group" attrs="{'invisible': [('generate_lead_from_alias','=',False)]}">
<div class="mt16">
<label string="Alias" class="o_light_label"/>
<field name="alias_prefix" class="oe_inline"
attrs="{'required': [('generate_lead_from_alias', '=', True)]}"/>
<span>@</span>
<field name="alias_domain" readonly="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 class="col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_crm_phone_validation"/>
</div>
<div class="o_setting_right_pane">
<label for="module_crm_phone_validation"/>
<div class="text-muted">
Validate and normalize phone numbers.
</div>
<div class="content-group">
<div class="text-warning mt16" id="module_crm_phone_validation" attrs="{'invisible': [('module_crm_phone_validation','=',False)]}">
<p>
Save this page and come back here to set up the feature.
</p>
</div>
</div>
</div>
</div>
</div>
</xpath>
<xpath expr="//h2[@id='integration_h2']" position="attributes">
<attribute name="invisible">0</attribute>
</xpath>
<xpath expr="//div[@id='integration']" position="inside">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_crm_voip" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_crm_voip"/>
<div class="text-muted">
Schedule &amp; make calls from CRM app
</div>
<div class="content-group">
<div class="text-warning mt16" id="crm_voip" attrs="{'invisible': [('module_crm_voip','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
</xpath>
<xpath expr="//div[@id='module_crm']" position="replace"/>
</field>
</record>
</odoo>
+1 -1
View File
@@ -12,7 +12,7 @@ CRM Phone Numbers Validation
This module allows for validate and format phone numbers for leads and contacts.""",
'data': [
'views/sale_config_settings_views.xml',
'views/crm_config_settings_views.xml',
],
'depends': [
'phone_validation',
@@ -3,4 +3,4 @@
from . import res_partner
from . import crm_lead
from . import sale_config_settings
from . import crm_config_settings
@@ -4,7 +4,7 @@
from odoo import fields, models
class SaleConfigSettings(models.TransientModel):
_inherit = 'sale.config.settings'
class CrmConfigSettings(models.TransientModel):
_inherit = 'crm.config.settings'
crm_phone_valid_method = fields.Boolean(related="company_id.phone_international_format", required=True)
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="crm_config_settings_view_form_inherit_phone_validatation" model="ir.ui.view">
<field name="name">crm.config.settings.view.form.inherit.phone.validatation</field>
<field name="model">crm.config.settings</field>
<field name="inherit_id" ref="crm.crm_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@id='module_crm_phone_validation']" position="after">
<div class="content-group">
<div class="text-warning mt16" attrs="{'invisible': [('module_crm_phone_validation','=',False)]}">
<label for="crm_phone_valid_method"/>
<field name="crm_phone_valid_method"/>
</div>
</div>
</xpath>
</field>
</record>
</odoo>
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="sale_config_settings_view_form_inherit_phone_validatation" model="ir.ui.view">
<field name="name">sale.config.settings.view.form.inherit.phone.validatation</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="crm.sale_config_settings_view_form_inherit_crm" />
<field name="arch" type="xml">
<xpath expr="//div[@id='module_crm_phone_validation']/p" position="replace">
<label for="crm_phone_valid_method"/>
<field name="crm_phone_valid_method"/>
</xpath>
</field>
</record>
</odoo>
@@ -4,13 +4,15 @@
<record id="sale_config_settings_view_form_inherit_delivery" model="ir.ui.view">
<field name="name">sale.config.settings.inherit.delivery</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sale.sale_config_settings_view_form_inherit_sale"/>
<field name="inherit_id" ref="sale.sale_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='delivery_carrier']" position="replace">
<div class="mt16" attrs="{'invisible': [('module_delivery','=',False)]}">
<button name="%(delivery.action_delivery_carrier_form)d" icon="fa-arrow-right" type="action" string="Delivery Methods" class="btn-link"/>
</div>
</xpath>
<xpath expr="//div[@id='delivery_carrier']" position="after">
<div class="content-group">
<div class="mt16" attrs="{'invisible': [('module_delivery','=',False)]}">
<button name="%(delivery.action_delivery_carrier_form)d" icon="fa-arrow-right" type="action" string="Delivery Methods" class="btn-link"/>
</div>
</div>
</xpath>
</field>
</record>
@@ -67,7 +67,7 @@
</record>
<menuitem action="action_report_intrastat_code_tree" id="menu_report_intrastat_code"
parent="sales_team.menu_config_address_book" sequence="2" groups="base.group_no_one"/>
parent="account.product_configuration_menu" sequence="10" groups="account.group_account_manager"/>
<record id="view_report_intrastat_tree" model="ir.ui.view">
+5 -7
View File
@@ -5,8 +5,11 @@ from odoo import api, fields, models
class SaleConfigSettings(models.TransientModel):
_inherit = 'sale.config.settings'
_name = 'sale.config.settings'
_inherit = 'res.config.settings'
company_id = fields.Many2one('res.company', string='Company', required=True,
default=lambda self: self.env.user.company_id)
sale_note = fields.Text(related='company_id.sale_note', string="Terms & Conditions")
use_sale_note = fields.Boolean(
string='Default Terms & Conditions',
@@ -69,7 +72,6 @@ class SaleConfigSettings(models.TransientModel):
oldname='deposit_product_id_setting',
help='Default product used for payment advances')
auto_done_setting = fields.Boolean("Lock Confirmed Orders")
module_sale_subscription = fields.Boolean("Subscriptions")
module_website_sale_digital = fields.Boolean("Sell digital products - provide downloadable content on your customer portal")
auth_signup_uninvited = fields.Selection([
@@ -78,7 +80,6 @@ class SaleConfigSettings(models.TransientModel):
], string='Customer Account')
group_multi_currency = fields.Boolean("Multi-Currencies", implied_group='base.group_multi_currency')
module_sale_stock = fields.Boolean("Inventory Management")
module_delivery = fields.Boolean("Shipping Costs")
module_delivery_dhl = fields.Boolean("DHL")
module_delivery_fedex = fields.Boolean("FedEx")
@@ -86,10 +87,7 @@ class SaleConfigSettings(models.TransientModel):
module_delivery_usps = fields.Boolean("USPS")
module_delivery_bpost = fields.Boolean("bpost")
module_sale_timesheet = fields.Boolean("Timesheets")
module_sale_ebay = fields.Boolean("eBay")
module_print_docsaway = fields.Boolean("Docsaway")
module_web_clearbit = fields.Boolean("Customer Autocomplete")
module_product_email_template = fields.Boolean("Specific Email")
module_sale_coupon = fields.Boolean("Coupons & Promotions")
@@ -144,7 +142,7 @@ class SaleConfigSettings(models.TransientModel):
auth_signup_uninvited='b2c' if ICPSudo.get_param('auth_signup.allow_uninvited', 'False').lower() == 'true' else 'b2b',
use_sale_note=ICPSudo.get_param('sale.use_sale_note', default=False),
auto_done_setting=ICPSudo.get_param('sale.auto_done_setting'),
default_deposit_product_id=ICPSudo.get_param('sale.default_deposit_product_id'),
default_deposit_product_id=int(ICPSudo.get_param('sale.default_deposit_product_id')),
sale_show_tax=ICPSudo.get_param('sale.sale_show_tax', default='subtotal'),
multi_sales_price=sale_pricelist_setting in ['percentage', 'formula'],
multi_sales_price_method=sale_pricelist_setting in ['percentage', 'formula'] and sale_pricelist_setting or False,
@@ -33,6 +33,4 @@
<field name="search_view_id" ref="report_all_channels_sales_view_search"/>
<field name="context">{'search_default_team_id': 1, 'search_default_current_year': 1}</field>
</record>
<menuitem action="report_all_channels_sales_action" id="report_all_channels_sales" name="All Channels Sales Orders" parent="sales_team.menu_sale_report"/>
</odoo>
-3
View File
@@ -93,7 +93,4 @@
<field name="context">{'search_default_Sales':1, 'group_by_no_leaf':1,'group_by':[]}</field>
<field name="help">This report performs analysis on your quotations and sales orders. Analysis check your sales revenues and sort it by different group criteria (salesman, partner, product, etc.) Use this report to perform analysis on sales not having invoiced yet. If you want to analyse your turnover, you should use the Invoice Analysis report in the Accounting application.</field>
</record>
<menuitem name="Sales" action="action_order_report_all" id="menu_report_product_all" parent="sales_team.menu_sale_report" sequence="8" active="False"/>
</odoo>
-6
View File
@@ -59,12 +59,6 @@
<record model="res.users" id="base.user_root">
<field eval="[(4,ref('base.group_partner_manager'))]" name="groups_id"/>
</record>
<record model="ir.ui.menu" id="sales_team.menu_base_partner">
<field eval="[(4, ref('sales_team.group_sale_salesman'))]" name="groups_id"/>
</record>
<record model="ir.ui.menu" id="sales_team.menu_sale_config">
<field eval="[(4, ref('sales_team.group_sale_manager'))]" name="groups_id"/>
</record>
<data noupdate="1">
<!-- Multi - Company Rules -->
+357 -463
View File
@@ -1,501 +1,395 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sale_config_settings_view_form_inherit_sale" model="ir.ui.view">
<field name="name">sale.config.settings.inherit.sale</field>
<record id="sale_config_settings_view_form" model="ir.ui.view">
<field name="name">sale.config.settings.view.form</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sales_team.sale_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//h2[@id='integration_h2']" position="before">
<field name="company_id" invisible="1"/>
<h2>Pricing</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_discount_per_so_line"/>
</div>
<div class="o_setting_right_pane">
<label for="group_discount_per_so_line"/>
<div class="text-muted">
Allow manual discounts on order lines
<form string="Configure Sales" class="oe_form_configuration" name="sale_config_form">
<header>
<button string="Save" type="object" name="execute" class="oe_highlight"/>
<button string="Cancel" type="object" name="cancel" class="oe_link"/>
</header>
<sheet>
<field name="company_id" invisible="1"/>
<h2>Product Catalog</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_product_variant"/>
</div>
<div class="o_setting_right_pane">
<label for="group_product_variant"/>
<div class="text-muted">
Set product attributes (e.g. color, size) to sell variants
</div>
<div class="content-group" attrs="{'invisible': [('group_product_variant','=',False)]}">
<div class="mt16">
<button name="%(product.attribute_action)d" icon="fa-arrow-right" type="action" string="Attributes" class="btn-link"/>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="Boost your sales with two kinds of discount programs: promotions and coupon codes. Specific conditions can be set (products, customers, minimum purchase amount, period). Rewards can be discounts (% or amount) or free products.">
<div class="o_setting_left_pane">
<field name="module_sale_coupon" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_coupon"/>
<div class="text-muted">
Manage promotion &amp; coupon programs
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_uom"/>
</div>
<div class="content-group">
<div class="text-warning mt16" id="sale_coupon" attrs="{'invisible': [('module_sale_coupon','=',False)]}">
Save this page and come back here to set up the feature.
<div class="o_setting_right_pane">
<label for="group_uom"/>
<div class="text-muted">
Sell and purchase products in different units of measure
</div>
<div class="content-group" attrs="{'invisible': [('group_uom','=',False)]}">
<div class="mt16">
<button name="%(product.product_uom_form_action)d" icon="fa-arrow-right" type="action" string="Units of Measure" class="btn-link"/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="Sending an email is useful if you need to share specific information or content about a product (instructions, rules, links, media, etc.). Create and set the email template from the product detail form (in Sales tab).">
<div class="o_setting_left_pane">
<field name="module_product_email_template"/>
</div>
<div class="o_setting_right_pane">
<label for="module_product_email_template"/>
<div class="text-muted">
Send a product-specific email once the invoice is paid
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="Ability to select a package type in sales orders and to force a quantity that is a multiple of the number of units per package.">
<div class="o_setting_left_pane">
<field name="group_stock_packaging"/>
</div>
<div class="o_setting_right_pane">
<label for="group_stock_packaging"/>
<div class="text-muted">
Sell products by multiple of unit # per package
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="There are two ways to manage pricelists: 1) Multiple prices per product: must be set in the Sales tab of the product detail form. 2) Price computed from formulas: must be set in the pricelist form.">
<div class="o_setting_left_pane">
<field name="multi_sales_price"/>
</div>
<div class="o_setting_right_pane">
<label for="multi_sales_price" string="Multiple Prices per Product"/>
<div class="text-muted">
Set multiple prices per product, automated discounts, etc.
<h2>Pricing</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_discount_per_so_line"/>
</div>
<div class="content-group" attrs="{'invisible': [('multi_sales_price' ,'=', False)]}">
<div class="o_setting_right_pane">
<label for="group_discount_per_so_line"/>
<div class="text-muted">
Allow manual discounts on order lines
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="Boost your sales with two kinds of discount programs: promotions and coupon codes. Specific conditions can be set (products, customers, minimum purchase amount, period). Rewards can be discounts (% or amount) or free products.">
<div class="o_setting_left_pane">
<field name="module_sale_coupon" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_coupon"/>
<div class="text-muted" id="sale_coupon">
Manage promotion &amp; coupon programs
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="There are two ways to manage pricelists: 1) Multiple prices per product: must be set in the Sales tab of the product detail form. 2) Price computed from formulas: must be set in the pricelist form.">
<div class="o_setting_left_pane">
<field name="multi_sales_price"/>
</div>
<div class="o_setting_right_pane">
<label for="multi_sales_price" string="Multiple Prices per Product"/>
<div class="text-muted">
Set multiple prices per product, automated discounts, etc.
</div>
<div class="content-group" attrs="{'invisible': [('multi_sales_price' ,'=', False)]}">
<div class="mt16">
<field name="group_product_pricelist" invisible="1"/>
<field name="group_sale_pricelist" invisible="1"/>
<field name="group_pricelist_item" invisible="1"/>
<field name="multi_sales_price_method" widget="radio" class="o_light_label"/>
<field name="sale_pricelist_setting" invisible="1" widget="radio"/>
</div>
<button name="%(product.product_pricelist_action2)d" icon="fa-arrow-right" type="action" string="Pricelists"
attrs="{'invisible': [('sale_pricelist_setting', '=', False)]}" class="btn-link"/>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="This adds the choice of a currency on pricelists.">
<div class="o_setting_left_pane">
<field name="group_multi_currency"/>
</div>
<div class="o_setting_right_pane">
<label for="group_multi_currency"/>
<div class="text-muted">
Sell in foreign currencies
</div>
<div class="content-group" attrs="{'invisible': [('group_multi_currency','=',False)]}">
<div class="mt16">
<button name="%(base.action_currency_all_form)d" icon="fa-arrow-right" type="action" string="Activate Other Currencies" class="btn-link"/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
</div>
<div class="o_setting_right_pane">
<label for="auth_signup_uninvited"/>
<div class="text-muted">
Let your customers log in to see their documents
</div>
<div class="mt8">
<field name="auth_signup_uninvited" widget="radio" required="True"/>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="The margin is computed as the sum of product sales prices minus the cost set in their detail form.">
<div class="o_setting_left_pane">
<field name="module_sale_margin"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_margin"/>
<div class="text-muted">
Show margins on orders
</div>
</div>
</div>
</div>
<h2>Quotations &amp; Orders</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
</div>
<div class="o_setting_right_pane">
<label for="sale_show_tax"/>
<div class="text-muted">
Line subtotals in sales orders
</div>
<div class="mt16">
<field name="group_product_pricelist" invisible="1"/>
<field name="group_sale_pricelist" invisible="1"/>
<field name="group_pricelist_item" invisible="1"/>
<field name="multi_sales_price_method" widget="radio" class="o_light_label"/>
<field name="sale_pricelist_setting" invisible="1" widget="radio"/>
<field name="sale_show_tax" class="o_light_label" widget="radio"/>
<field name="group_show_price_subtotal" invisible="1"/>
<field name="group_show_price_total" invisible="1"/>
</div>
<button name="%(product.product_pricelist_action2)d" icon="fa-arrow-right" type="action" string="Pricelists"
attrs="{'invisible': [('sale_pricelist_setting', '=', False)]}" class="btn-link"/>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="This adds the choice of a currency on pricelists.">
<div class="o_setting_left_pane">
<field name="group_multi_currency"/>
</div>
<div class="o_setting_right_pane">
<label for="group_multi_currency"/>
<div class="text-muted">
Sell in foreign currencies
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_website_quote"/>
</div>
<div class="content-group" attrs="{'invisible': [('group_multi_currency','=',False)]}">
<div class="mt16">
<button name="%(base.action_currency_all_form)d" icon="fa-arrow-right" type="action" string="Activate Other Currencies" class="btn-link"/>
<div class="o_setting_right_pane">
<label for="module_website_quote"/>
<div class="text-muted" id="website_quote">
Let your customers sign &amp; pay online
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_sale_delivery_address"/>
</div>
<div class="o_setting_right_pane">
<label for="group_sale_delivery_address"/>
<div class="text-muted">
Set specific billing and shipping addresses
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="use_sale_note"/>
</div>
<div class="o_setting_right_pane">
<label for="use_sale_note"/>
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
<div class="text-muted">
Show standard terms &amp; conditions on orders
</div>
<div class="content-group" attrs="{'invisible': [('use_sale_note','=',False)]}">
<div class="mt16">
<field name="sale_note" placeholder="Insert your terms &amp; conditions here..."/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_warning_sale"/>
</div>
<div class="o_setting_right_pane">
<label for="group_warning_sale"/>
<div class="text-muted">
Get warnings in orders for products or customers
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_sale_layout"/>
</div>
<div class="o_setting_right_pane">
<label for="group_sale_layout"/>
<div class="text-muted">
Sort products in sections with subtotals and page-breaks
</div>
<div class="content-group" attrs="{'invisible': [('group_sale_layout','=',False)]}">
<div class="mt16">
<button name="%(sale.report_configuration_action)d" icon="fa-arrow-right" type="action" string="Order Line Sections" class="btn-link"/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="auto_done_setting"/>
</div>
<div class="o_setting_right_pane">
<label for="auto_done_setting"/>
<div class="text-muted">
No longer edit orders once confirmed
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_print_docsaway" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_print_docsaway"/>
<div class="text-muted" id="print_docsaway">
Mail your quotations &amp; invoices in one-click using <a href="https://www.docsaway.com/" target="_blank">Docsaway</a>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_proforma_sales"/>
</div>
<div class="o_setting_right_pane">
<label for="group_proforma_sales"/>
<div class="text-muted">
Allows you to send Pro-Forma Invoice to your customers
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="The margin is computed as the sum of product sales prices minus the cost set in their detail form.">
<div class="o_setting_left_pane">
<field name="module_sale_margin"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_margin"/>
<div class="text-muted">
Show margins on orders
<h2 class="mt32">Shipping</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" id="delivery">
<div class="o_setting_left_pane">
<field name="module_delivery"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery"/>
<div class="text-muted" id="delivery_carrier">
Compute shipping costs
</div>
</div>
</div>
</div>
</div>
<h2>Product Catalog</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_product_variant"/>
</div>
<div class="o_setting_right_pane">
<label for="group_product_variant"/>
<div class="text-muted">
Set product attributes (e.g. color, size) to sell variants
<div class="col-xs-12 col-md-6 o_setting_box" id="ups">
<div class="o_setting_left_pane">
<field name="module_delivery_ups" widget="upgrade_boolean"/>
</div>
<div class="content-group" attrs="{'invisible': [('group_product_variant','=',False)]}">
<div class="mt16">
<button name="%(product.attribute_action)d" icon="fa-arrow-right" type="action" string="Attributes" class="btn-link"/>
<div class="o_setting_right_pane">
<label for="module_delivery_ups"/>
<div class="text-muted" id="delivery_ups">
Ship with UPS
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_dhl" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_dhl"/>
<div class="text-muted" id="delivery_dhl">
Ship with DHL
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_fedex" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_fedex"/>
<div class="text-muted" id="delivery_fedex">
Ship with FedEx
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_usps" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_usps"/>
<div class="text-muted" id="delivery_usps">
Ship with USPS
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_bpost" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_bpost"/>
<div class="text-muted" id="delivery_bpost">
Ship with bpost
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_uom"/>
</div>
<div class="o_setting_right_pane">
<label for="group_uom"/>
<div class="text-muted">
Sell and purchase products in different units of measure
<h2>Invoicing</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" title="This default value is applied to any new product created. This can be changed in the product detail form.">
<div class="o_setting_right_pane">
<label for="default_invoice_policy"/>
<div class="text-muted">
Quantities to invoice from sales orders
</div>
<div class="content-group">
<div class="mt16">
<field name="default_invoice_policy" class="o_light_label" widget="radio"/>
</div>
</div>
</div>
<div class="content-group" attrs="{'invisible': [('group_uom','=',False)]}">
<div class="mt16">
<button name="%(product.product_uom_form_action)d" icon="fa-arrow-right" type="action" string="Units of Measure" class="btn-link"/>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" groups="base.group_no_one">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<label string="Down Payments"/>
<div class="text-muted">
Product used for down payments
</div>
<div class="text-muted">
<field name="default_deposit_product_id"/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="Sending an email is useful if you need to share specific information or content about a product (instructions, rules, links, media, etc.). Create and set the email template from the product detail form (in Sales tab).">
<div class="o_setting_left_pane">
<field name="module_product_email_template"/>
</div>
<div class="o_setting_right_pane">
<label for="module_product_email_template"/>
<div class="text-muted">
Send a product-specific email once the invoice is paid
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="Ability to select a package type in sales orders and to force a quantity that is a multiple of the number of units per package.">
<div class="o_setting_left_pane">
<field name="group_stock_packaging"/>
</div>
<div class="o_setting_right_pane">
<label for="group_stock_packaging"/>
<div class="text-muted">
Sell products by multiple of unit # per package
</div>
</div>
</div>
</div>
<h2>Quotations &amp; Orders</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_website_quote"/>
</div>
<div class="o_setting_right_pane">
<label for="module_website_quote"/>
<div class="text-muted">
Let your customers sign &amp; pay online
</div>
<div class="content-group">
<div class="text-warning mt16" id="website_quote" attrs="{'invisible': [('module_website_quote','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
</div>
<div class="o_setting_right_pane">
<label for="auth_signup_uninvited"/>
<div class="text-muted">
Let your customers log in to see their documents
</div>
<div class="mt8">
<field name="auth_signup_uninvited" widget="radio" required="True"/>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_sale_delivery_address"/>
</div>
<div class="o_setting_right_pane">
<label for="group_sale_delivery_address"/>
<div class="text-muted">
Set specific billing and shipping addresses
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="use_sale_note"/>
</div>
<div class="o_setting_right_pane">
<label for="use_sale_note"/>
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
<div class="text-muted">
Show standard terms &amp; conditions on orders
</div>
<div class="content-group" attrs="{'invisible': [('use_sale_note','=',False)]}">
<div class="mt16">
<field name="sale_note" placeholder="Insert your terms &amp; conditions here..."/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_warning_sale"/>
</div>
<div class="o_setting_right_pane">
<label for="group_warning_sale"/>
<div class="text-muted">
Get warnings in orders for products or customers
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_sale_layout"/>
</div>
<div class="o_setting_right_pane">
<label for="group_sale_layout"/>
<div class="text-muted">
Sort products in sections with subtotals and page-breaks
</div>
<div class="content-group" attrs="{'invisible': [('group_sale_layout','=',False)]}">
<div class="mt16">
<button name="%(sale.report_configuration_action)d" icon="fa-arrow-right" type="action" string="Order Line Sections" class="btn-link"/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="auto_done_setting"/>
</div>
<div class="o_setting_right_pane">
<label for="auto_done_setting"/>
<div class="text-muted">
No longer edit orders once confirmed
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
</div>
<div class="o_setting_right_pane">
<label for="sale_show_tax"/>
<div class="text-muted">
Line subtotals in sales orders
</div>
<div class="mt16">
<field name="sale_show_tax" class="o_light_label" widget="radio"/>
<field name="group_show_price_subtotal" invisible="1"/>
<field name="group_show_price_total" invisible="1"/>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_proforma_sales"/>
</div>
<div class="o_setting_right_pane">
<label for="group_proforma_sales"/>
<div class="text-muted">
Allows you to send Pro-Forma Invoice to your customers
</div>
</div>
</div>
</div>
<h2>Invoicing</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" title="This default value is applied to any new product created. This can be changed in the product detail form.">
<div class="o_setting_right_pane">
<label for="default_invoice_policy"/>
<div class="text-muted">
Quantities to invoice from sales orders
</div>
<div class="content-group">
<div class="mt16">
<field name="default_invoice_policy" class="o_light_label" widget="radio"/>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" groups="base.group_no_one">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<label string="Down Payments"/>
<div class="text-muted">
Product used for down payments
</div>
<div class="text-muted">
<field name="default_deposit_product_id"/>
</div>
</div>
</div>
</div>
<h2>Timesheets</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" title="Sell services (e.g. project, maintenance), record time spent using Timesheets app and invoice them based on a fixed price (ordered quantity) or on the time spent (delivered quantity)" name="sale_timesheet_box">
<div class="o_setting_left_pane">
<field name="module_sale_timesheet" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_timesheet"/>
<div class="text-muted">
Record time spent on services and invoice it
</div>
<div class="content-group" name="msg_module_sale_timesheet">
<div class="text-warning mt16" attrs="{'invisible': [('module_sale_timesheet','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
</div>
<h2 class="mt32">Shipping</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" id="shipping" title="Send delivery orders to your warehouse and get delivered quantities updated in sales orders accordingly.">
<div class="o_setting_left_pane">
<field name="module_sale_stock"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_stock"/>
<div class="text-muted">
Manage picking and deliveries
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="delivery">
<div class="o_setting_left_pane">
<field name="module_delivery"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery"/>
<div class="text-muted">
Compute shipping costs
</div>
<div class="content-group">
<div class="text-warning mt16" id="delivery_carrier" attrs="{'invisible': [('module_delivery','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
</div>
<h2>Shipping Connectors</h2>
<div class="row mt16 o_settings_container" title="Shipping connectors allow to compute accurate shipping costs, print shipping labels and request carrier picking at your warehouse to ship to the customer. Apply shipping connector from delivery methods.">
<div class="col-xs-12 col-md-6 o_setting_box" id="ups">
<div class="o_setting_left_pane">
<field name="module_delivery_ups" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_ups"/>
<div class="text-muted">
Ship with UPS
</div>
<div class="content-group">
<div class="text-warning mt16" id="delivery_ups" attrs="{'invisible': [('module_delivery_ups','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_dhl" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_dhl"/>
<div class="text-muted">
Ship with DHL
</div>
<div class="content-group">
<div class="text-warning mt16" id="delivery_dhl" attrs="{'invisible': [('module_delivery_dhl','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_fedex" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_fedex"/>
<div class="text-muted">
Ship with FedEx
</div>
<div class="content-group">
<div class="text-warning mt16" id="delivery_fedex" attrs="{'invisible': [('module_delivery_fedex','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_usps" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_usps"/>
<div class="text-muted">
Ship with USPS
</div>
<div class="content-group">
<div class="text-warning mt16" id="delivery_usps" attrs="{'invisible': [('module_delivery_usps','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_delivery_bpost" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_delivery_bpost"/>
<div class="text-muted">
Ship with bpost
</div>
<div class="content-group">
<div class="text-warning mt16" id="delivery_bpost" attrs="{'invisible': [('module_delivery_bpost','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
</div>
</xpath>
<xpath expr="//h2[@id='integration_h2']" position="attributes">
<attribute name="invisible">0</attribute>
</xpath>
<xpath expr="//div[@id='integration']" position="inside">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_sale_ebay" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_ebay"/>
<div class="text-muted">
Sell your products on eBay
</div>
<div class="content-group" id="sale_ebay">
<div class="text-warning mt16" attrs="{'invisible': [('module_sale_ebay','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
</xpath>
<xpath expr="//div[@id='integration']" position="inside">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_print_docsaway" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_print_docsaway"/>
<div class="text-muted">
Mail your quotations &amp; invoices in one-click using <a href="https://www.docsaway.com/" target="_blank">Docsaway</a>
</div>
<div class="content-group">
<div class="text-warning mt16" id="print_docsaway" attrs="{'invisible': [('module_print_docsaway','=',False)]}">
Save this page and come back here to set up the feature.
</div>
</div>
</div>
</div>
</xpath>
<xpath expr="//div[@id='integration']" position="inside">
<div class="col-xs-12 col-md-6 o_setting_box" title="When populating your address book, Odoo relies on Clearbit’s API to provide you with a list of matching contacts or companies.When selecting one item, the partner name, logo and website get automatically set.">
<div class="o_setting_left_pane">
<field name="module_web_clearbit" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_web_clearbit"/>
<div class="text-muted">
Look up company information (name, logo, etc.)
</div>
</div>
</div>
</xpath>
<xpath expr="//div[@id='sale_subscription']" position="after">
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_account_accountant"/>
</div>
<div class="o_setting_right_pane">
<label for="module_account_accountant"/>
<div class="text-muted">
Add all accounting features: journal entries, legal statements, etc.
</div>
</div>
</div>
</xpath>
<xpath expr="//div[@id='module_sale']" position="replace"/>
<div id="sale_ebay"/>
</sheet>
</form>
</field>
</record>
<record id="action_sale_config_settings" model="ir.actions.act_window">
<field name="name">Configure Sales</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.config.settings</field>
<field name="view_id" ref="sale_config_settings_view_form"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
<menuitem id="menu_sale_general_settings"
name="Settings"
parent="menu_sale_config"
sequence="0"
action="action_sale_config_settings"
groups="base.group_system"/>
</odoo>
+75 -27
View File
@@ -2,29 +2,70 @@
<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 name="Sales"
id="sales_team.menu_base_partner"
<menuitem id="sale_menu_root"
name="Sales"
web_icon="sale,static/description/icon.png"
active="False"/>
active="False"
sequence="7"/>
<menuitem
id= "menu_sales_config"
parent= "sales_team.menu_sale_config"
<menuitem id="sale_order_menu"
name="Orders"
parent="sale_menu_root"
sequence="2"/>
<menuitem id="res_partner_menu"
parent="sale_order_menu"
action="base.action_partner_form"
sequence="3"/>
<menuitem id="menu_sale_config"
name="Configuration"
parent="sale_menu_root"
sequence="6"
groups="sales_team.group_sale_manager"/>
<menuitem id= "menu_sales_config"
parent= "menu_sale_config"
sequence= "3"
name= "Sales"
groups= "sales_team.group_sale_manager,sales_team.group_sale_salesman,account.group_account_manager,account.group_account_user"
active="False"/>
name= "Sales Orders"
groups= "sales_team.group_sale_manager,sales_team.group_sale_salesman,account.group_account_manager,account.group_account_user"/>
<menuitem id="product_menu_catalog" name="Catalog" action="product.product_template_action" parent="sales_team.menu_base_partner" sequence="7" active="False"/>
<menuitem id="sales_team_config"
name="Sales Channels"
parent="sale.menu_sale_config"
action="sales_team.sales_team_config_action"
sequence="2"/>
<menuitem id="menu_sale_report"
name="Reporting"
parent="sale_menu_root"
sequence="5"
groups="sales_team.group_sale_manager"/>
<menuitem id="menu_report_product_all"
name="Sales"
action="action_order_report_all"
parent="menu_sale_report"
sequence="1"/>
<menuitem id="report_sales_team"
name="Sales Channels"
parent="menu_sale_report"
action="sales_team.crm_team_salesteams_act"
sequence="2"/>
<menuitem id="report_all_channels_sales"
action="report_all_channels_sales_action"
name="All Channels Sales Orders"
parent="menu_sale_report"
sequence="3"/>
<menuitem id="product_menu_catalog" name="Catalog" action="product.product_template_action" parent="sale_menu_root" sequence="4"/>
<menuitem id="menu_product" name="Product Variants" parent="product_menu_catalog" sequence="2" groups="product.group_product_variant" active="False"/>
<menuitem id="sales_team.menu_sales" name="Sales" parent="sales_team.menu_base_partner" sequence="4"/>
<menuitem action="product.product_template_action" id="menu_product_template_action" parent="product_menu_catalog" sequence="1" active="False"/>
<menuitem id="sale.prod_config_main" name="Products" parent="sales_team.menu_sale_config" sequence="5" active="False"/>
<menuitem action="product.attribute_action" id="menu_attribute_action" parent="sale.prod_config_main" sequence="1" groups="product.group_product_variant" active="False"/>
<menuitem id="prod_config_main" name="Products" parent="menu_sale_config" sequence="5"/>
<menuitem id="menu_attribute_action" action="product.attribute_action" parent="prod_config_main" sequence="1" groups="product.group_product_variant" active="False"/>
<menuitem action="product.variants_action" id="menu_variants_action" parent="sale.prod_config_main" sequence="2" groups="product.group_product_variant" active="False"/>
<menuitem id="menu_products" action="product.product_normal_action_sell" parent="product_menu_catalog" groups="product.group_product_variant" sequence="2" active="False"/>
<menuitem id="next_id_16" name="Units of Measure" parent="sale.prod_config_main" sequence="6" groups="product.group_uom" active="False"/>
@@ -472,9 +513,11 @@
</field>
</record>
<menuitem action="action_orders"
id="menu_sale_order" parent="sales_team.menu_sales"
sequence="12" groups="sales_team.group_sale_salesman,sales_team.group_sale_manager" active="False"/>
<menuitem id="menu_sale_order"
name="Orders"
action="action_orders"
parent="sale_order_menu"
sequence="2" groups="sales_team.group_sale_salesman,sales_team.group_sale_manager"/>
<record id="action_orders_to_invoice" model="ir.actions.act_window">
<field name="name">Orders to Invoice</field>
@@ -494,11 +537,15 @@
</p>
</field>
</record>
<menuitem name="Invoicing"
id="menu_sale_invoicing" parent="sales_team.menu_base_partner"
sequence="5" active="False"/>
<menuitem action="action_orders_to_invoice"
id="menu_sale_order_invoice" parent="sale.menu_sale_invoicing"
<menuitem id="menu_sale_invoicing"
name="Invoicing"
parent="sale_menu_root"
sequence="3"/>
<menuitem id="menu_sale_order_invoice"
action="action_orders_to_invoice"
parent="sale.menu_sale_invoicing"
sequence="2" active="False"/>
<record id="action_orders_upselling" model="ir.actions.act_window">
@@ -550,8 +597,9 @@
</record>
<menuitem id="menu_sale_quotations"
action="action_quotations" parent="sales_team.menu_sales"
sequence="11" active="False"/>
action="action_quotations"
parent="sale_order_menu"
sequence="1"/>
<record id="view_order_line_tree" model="ir.ui.view">
<field name="name">sale.order.line.tree</field>
+1 -2
View File
@@ -17,13 +17,12 @@ We suggest you to install this module, if you installed both the sale and the cr
modules.
""",
'website': 'https://www.odoo.com/page/crm',
'depends': ['sale', 'crm'],
'depends': ['sale_management', 'crm'],
'data': [
'security/ir.model.access.csv',
'views/partner_views.xml',
'views/sale_order_views.xml',
'views/crm_lead_views.xml',
'views/sale_crm_template.xml',
],
'auto_install': True,
}
-23
View File
@@ -1,23 +0,0 @@
odoo.define('sale_crm.tour', function(require) {
"use strict";
var core = require('web.core');
var tour = require('web_tour.tour');
require('sale.tour');
var _t = core._t;
var quotation_button_step_index = _.findIndex(tour.tours.sale_tour.steps, function (step) {
return (step.id === "quotation_button_on_dashboard");
});
tour.tours.sale_tour.steps.splice(quotation_button_step_index, 1, {
trigger: ".o_kanban_manage_button_section > a",
content: _t("Click here to see more options."),
position: "right"
}, {
trigger: ".o_quotation_view_button",
content: _t("Let's have a look at the quotations of this sales channel."),
position: "right"
});
});
-11
View File
@@ -1,17 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Top menu item -->
<!--
This menu item's purpose is to rename it into 'Sales' in the
case that CRM was installed after Sales
-->
<record id="sales_team.menu_base_partner" model="ir.ui.menu">
<field name="name">Sales</field>
<field name="active" eval="True"/>
</record>
<record id="crm_case_form_view_oppor" model="ir.ui.view">
<field name="name">crm.lead.oppor.inherited.crm</field>
<field name="model">crm.lead</field>
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="assets_backend" name="project assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/sale_crm/static/src/js/tour.js"></script>
</xpath>
</template>
</data>
</odoo>
@@ -40,4 +40,11 @@
</field>
</record>
<!-- This menu is display in CRM app when sale is installed-->
<menuitem
id="sale_order_menu_quotations_crm"
action="sale.action_quotations"
parent="crm.crm_menu_pipeline"
sequence="10"/>
</odoo>
+3 -9
View File
@@ -9,16 +9,10 @@ var _t = core._t;
tour.register('sale_tour', {
url: "/web",
}, [tour.STEPS.MENU_MORE, {
trigger: '.o_app[data-menu-xmlid="sales_team.menu_base_partner"], .oe_menu_toggler[data-menu-xmlid="sales_team.menu_base_partner"]',
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"], .oe_menu_toggler[data-menu-xmlid="sale.sale_menu_root"]',
content: _t('Organize your sales activities with the <b>Sales Management app</b>.'),
position: 'bottom',
}, {
trigger: ".oe_kanban_action_button",
extra_trigger: '.o_salesteam_kanban',
content: _t("Let\'s have a look at the quotations of this sales channel."),
position: "bottom",
id: "quotation_button_on_dashboard",
}, {
}, {
trigger: ".o_list_button_add",
extra_trigger: ".o_sale_order",
content: _t("Let's create a new quotation.<br/><i>Note that colored buttons usually point to the next logical actions.</i>"),
@@ -71,7 +65,7 @@ tour.register('sale_tour', {
content: _t("Use the breadcrumbs to <b>go back to preceeding screens</b>."),
position: "bottom"
}, {
trigger: 'li a[data-menu-xmlid="sales_team.menu_sales"], .oe_secondary_menu_section[data-menu-xmlid="sales_team.menu_sales"]',
trigger: 'li a[data-menu-xmlid="sale.sale_order_menu"], .oe_secondary_menu_section[data-menu-xmlid="sale.sale_order_menu"]',
content: _t("Use this menu to access quotations, sales orders and customers."),
edition: "enterprise",
position: "bottom"
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sales_team.menu_base_partner" model="ir.ui.menu">
<record id="sale.sale_menu_root" model="ir.ui.menu">
<field name="active" eval="True"/>
</record>
<record id="sale.menu_report_product_all" model="ir.ui.menu">
<field name="active" eval="True"/>
</record>
@@ -4,7 +4,7 @@
<record id="sale_config_settings_view_form_inherit_sale_stock" model="ir.ui.view">
<field name="name">sale.config.settings.inherit.sale_stock</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sale.sale_config_settings_view_form_inherit_sale"/>
<field name="inherit_id" ref="sale.sale_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='delivery']" position="after">
<div class="col-xs-12 col-md-6 o_setting_box" title="By default Odoo computes the expected delivery date this way: order date + highest customer lead time of products. With this option, you can set a specific delivery date on orders rather than setting lead times on products.">
+1 -1
View File
@@ -9,7 +9,7 @@
<menuitem id="menu_aftersale" name="After-Sale"
groups="sales_team.group_sale_salesman"
parent="sales_team.menu_base_partner" sequence="5" />
parent="sale.sale_menu_root" sequence="5" />
<menuitem id="menu_invoiced" name="Invoicing" parent="menu_aftersale" sequence="1"/>
<record id="stock_location_route_view_form_inherit_sale_stock" model="ir.ui.view">
@@ -21,26 +21,6 @@
</field>
</record>
<record id="sale_config_settings_view_form_inherit_sale_timesheet" model="ir.ui.view">
<field name="name">sale.config.settings.view.form</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sale.sale_config_settings_view_form_inherit_sale"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='msg_module_sale_timesheet']" position="replace">
<div class="content-group" name="msg_module_sale_timesheet" attrs="{'invisible': [('module_sale_timesheet', '=', False)]}">
<div class="mt16">
<div>
<button name="%(sale_timesheet.product_template_action_time_based)d" string="Setup your time-based services" type="action" class="btn-link" icon="fa-arrow-right"/>
</div>
<div>
<button name="%(sale_timesheet.product_template_action_fixed)d" string="Setup your fixed price services" type="action" class="btn-link" icon="fa-arrow-right"/>
</div>
</div>
</div>
</xpath>
</field>
</record>
<record id="project_config_settings_view_form" model="ir.ui.view">
<field name="name">project.config.settings.view.form</field>
<field name="model">project.config.settings</field>
-5
View File
@@ -14,15 +14,10 @@ Using this application you can manage Sales Channels with CRM and/or Sales
'data': ['security/sales_team_security.xml',
'security/ir.model.access.csv',
'data/sales_team_data.xml',
'views/sale_config_settings_views.xml',
'views/crm_team_views.xml',
'views/sales_team_dashboard.xml',
],
'qweb': [
"static/src/xml/sales_team_dashboard.xml",
],
'demo': ['data/sales_team_demo.xml'],
'css': ['static/src/css/sales_team.css'],
'installable': True,
'auto_install': False,
}
-1
View File
@@ -4,4 +4,3 @@
from . import crm_team
from . import res_partner
from . import res_users
from . import sale_config_settings
@@ -1,18 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class SaleConfigSettings(models.TransientModel):
_name = 'sale.config.settings'
_inherit = 'res.config.settings'
company_id = fields.Many2one('res.company', string='Company', required=True,
default=lambda self: self.env.user.company_id)
module_crm = fields.Boolean("CRM")
module_sale = fields.Boolean("Sales")
module_website_sign = fields.Boolean("eSign")
module_helpdesk = fields.Boolean("Helpdesk")
module_sale_subscription = fields.Boolean("Subscriptions")
module_account_accountant = fields.Boolean("Accounting")
@@ -40,11 +40,6 @@
<field eval="[(6,0,[ref('base.group_system')])]" name="groups_id"/>
</record>
<record model="ir.ui.menu" id="menu_config_address_book">
<field name="name">Contacts</field>
<field eval="[(6,0,[ref('base.group_system'), ref('base.group_partner_manager')])]" name="groups_id"/>
</record>
<data noupdate="1">
<record id="base.default_user" model="res.users">
<field name="groups_id" eval="[(4,ref('sales_team.group_sale_manager'))]"/>
@@ -1,19 +0,0 @@
@charset "utf-8";
.openerp .oe_kanban_view .oe_kanban_crm_salesteams {
/* Customize width and height of kanban according bootstrap3 */
width: 357px;
min-height: 80px !important;
}
.openerp .oe_kanban_view .oe_kanban_crm_salesteams .oe_kanban_content div:first-child {
margin-right: 0px;
}
.openerp .oe_kanban_view .oe_deadline {
padding-left: 0.5em;
}
.openerp .oe_salesteam_kanban_view {
margin-left: 0px;
margin-right: -2px;
}
.openerp .oe_margin_top_16 {
margin-top: 16px;
}
@@ -1,259 +0,0 @@
odoo.define('sales_team.dashboard', function (require) {
"use strict";
/**
* This file defines the Sales Team Dashboard view (alongside its renderer,
* model and controller), extending the Kanban view.
* The Sales Team Dashboard view is registered to the view registry.
* A large part of this code should be extracted in an AbstractDashboard
* widget in web, to avoid code duplication (see HelpdeskDashboard).
*/
var core = require('web.core');
var field_utils = require('web.field_utils');
var KanbanView = require('web.KanbanView');
var KanbanModel = require('web.KanbanModel');
var KanbanRenderer = require('web.KanbanRenderer');
var KanbanController = require('web.KanbanController');
var session = require('web.session');
var view_registry = require('web.view_registry');
var QWeb = core.qweb;
var _t = core._t;
var _lt = core._lt;
var SalesTeamDashboardRenderer = KanbanRenderer.extend({
events: _.extend({}, KanbanRenderer.prototype.events, {
'click .o_dashboard_action': '_onDashboardActionClicked',
'click .o_target_to_set': '_onDashboardTargetClicked',
}),
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* Notifies the controller that the target has changed.
*
* @private
* @param {string} target_name the name of the changed target
* @param {string} value the new value
*/
_notifyTargetChange: function (target_name, value) {
this.trigger_up('dashboard_edit_target', {
target_name: target_name,
target_value: value,
});
},
/**
* @override
* @private
* @returns {Deferred}
*/
_render: function () {
var self = this;
return this._super.apply(this, arguments).then(function () {
var values = self.state.dashboardValues;
var sales_team_dashboard = QWeb.render('sales_team.SalesDashboard', {
widget: self,
show_demo: values && values.nb_opportunities === 0,
values: values,
});
self.$el.prepend(sales_team_dashboard);
});
},
/**
* Called from the template to format the monetary value.
*
* @todo: use field_utils.format.monetary
* @private
* @returns {string} formatted value
*/
_renderMonetaryField: function (value, currency_id) {
var currency = session.get_currency(currency_id);
var digits_precision = currency && currency.digits;
value = field_utils.format.float(value || 0, {digits: digits_precision});
if (currency) {
if (currency.position === "after") {
value += currency.symbol;
} else {
value = currency.symbol + value;
}
}
return value;
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {MouseEvent}
*/
_onDashboardActionClicked: function (e) {
e.preventDefault();
var $action = $(e.currentTarget);
this.trigger_up('dashboard_open_action', {
action_name: $action.attr('name'),
action_context: $action.data('context'),
});
},
/**
* @private
* @param {MouseEvent}
*/
_onDashboardTargetClicked: function (e) {
if (!this.show_demo) {
// The user is not allowed to modify the targets in demo mode
var self = this;
var $target = $(e.currentTarget);
var target_name = $target.attr('name');
var target_value = $target.attr('value');
var $input = $('<input/>', {type: "text", name: target_name});
if (target_value) {
$input.attr('value', target_value);
}
$input.on('keyup input', function (e) {
if(e.which === $.ui.keyCode.ENTER) {
self._notifyTargetChange(target_name, $input.val());
}
});
$input.on('blur', function () {
self._notifyTargetChange(target_name, $input.val());
});
$input.replaceAll($target)
.focus()
.select();
}
},
});
var SalesTeamDashboardModel = KanbanModel.extend({
/**
* @override
*/
init: function () {
this.dashboardValues = {};
this._super.apply(this, arguments);
},
//--------------------------------------------------------------------------
// Public
//--------------------------------------------------------------------------
/**
* @override
*/
get: function (localID) {
var result = this._super.apply(this, arguments);
if (this.dashboardValues[localID]) {
result.dashboardValues = this.dashboardValues[localID];
}
return result;
},
/**
* @override
* @returns {Deferred}
*/
load: function () {
return this._loadDashboard(this._super.apply(this, arguments));
},
/**
* @override
* @returns {Deferred}
*/
reload: function () {
return this._loadDashboard(this._super.apply(this, arguments));
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* @abstract
* @private
* @returns {Deferred -> Object} resolves to the required dashboard data
*/
_fetchDashboardData: function () {
return $.when();
},
/**
* @private
* @param {Deferred} super_def a deferred that resolves with a dataPoint id
* @returns {Deferred -> string} resolves to the dataPoint id
*/
_loadDashboard: function (super_def) {
var self = this;
var dashboard_def = this._fetchDashboardData();
return $.when(super_def, dashboard_def).then(function (id, dashboardValues) {
self.dashboardValues[id] = dashboardValues;
return id;
});
},
});
var SalesTeamDashboardController = KanbanController.extend({
custom_events: _.extend({}, KanbanController.prototype.custom_events, {
dashboard_open_action: '_onDashboardOpenAction',
dashboard_edit_target: '_onDashboardEditTarget',
}),
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {OdooEvent} e
*/
_onDashboardEditTarget: function (e) {
var targetName = e.data.target_name;
var targetValue = e.data.target_value;
if(isNaN(targetValue)) {
this.do_warn(_t("Wrong value entered!"), _t("Only Integer Value should be valid."));
} else {
this._rpc({
model: 'crm.lead',
method: 'modify_target_sales_dashboard',
args: [targetName, parseInt(targetValue)],
})
.then(this.reload.bind(this));
}
},
/**
* @private
* @param {OdooEvent} e
*/
_onDashboardOpenAction: function (e) {
var action_name = e.data.action_name;
var action_context = e.data.action_context;
this.do_action(action_name, {
additional_context: action_context,
});
},
});
var SalesTeamDashboardView = KanbanView.extend({
config: _.extend({}, KanbanView.prototype.config, {
Model: SalesTeamDashboardModel,
Renderer: SalesTeamDashboardRenderer,
Controller: SalesTeamDashboardController,
}),
display_name: _lt('Dashboard'),
icon: 'fa-dashboard',
searchview_hidden: false,
});
view_registry.add('sales_team_dashboard', SalesTeamDashboardView);
return {
Model: SalesTeamDashboardModel,
Renderer: SalesTeamDashboardRenderer,
Controller: SalesTeamDashboardController,
};
});
@@ -109,105 +109,6 @@
}
}
.o_sales_dashboard {
margin: (0 - @o-kanban-record-margin) (@o-kanban-record-margin - @odoo-horizontal-padding) @o-kanban-record-margin;
.o-flex(1, 0, 100%);
padding: 10px (@odoo-horizontal-padding - @sale-table-spacing);
background-color: @dashboard-bg-color;
position: relative;
.o_welcome_message {
width: 100%;
.o-position-absolute(@left: 0, @top: 0);
.o-flex-display();
.o-justify-content(center);
.o_welcome_image {
padding: 20px;
}
.o_welcome_content > a {
color: white;
display: inline-block;
}
}
> .o_demo {
opacity: 0.07;
}
> div {
display: inline-block;
vertical-align: top;
@media (min-width: @screen-sm-min) {
width: 50%;
}
> table {
margin-bottom: 0;
table-layout: fixed;
border-spacing: @sale-table-spacing 0px;
border-collapse: separate;
> tbody > tr > td {
vertical-align: middle;
text-align: center;
border-top: 1px solid @dashboard-bg-color;
width: 25%;
height: 33px;
span {
display: inline;
}
a:hover {
text-decoration: none;
}
&.o_main {
background-color: @odoo-brand-optional;
&:hover {
background-color: darken(@odoo-brand-optional, 10%);
}
a {
color: white;
}
}
&.o_warning {
background-color: orange;
&:hover {
background-color: darken(orange, 10%);
}
a {
color: white;
}
}
&.o_secondary {
background-color: @odoo-brand-lightsecondary;
&:hover {
background-color: darken(@odoo-brand-lightsecondary, 10%);
}
a {
color: black;
}
}
&.o_highlight, .o_highlight {
font-size: 20px;
}
&.o_text {
text-align: left;
}
}
}
}
}
&.o_kanban_nocontent .o_sales_dashboard {
margin: 0;
}
&.o_kanban_grouped {
.o-flex-flow(row, wrap);
.o_kanban_record {
@@ -1,225 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<!--
This template is the ribbon at the top of the salesteam dashboard that adds
some figures to it. We call this rubbon the "SalesDashboard".
-->
<t t-name="sales_team.SalesDashboard">
<div t-if="show_demo or values" class="o_sales_dashboard">
<div t-attf-class="#{show_demo ? 'o_demo' : ''}">
<table class="table table-condensed">
<tr>
<td class="o_text">
<div class="o_highlight">To do</div>
Today
</td>
<td class="o_main" title="To Calendar">
<a href="#" class="o_dashboard_action" name="calendar.action_calendar_event" data-context="{'search_default_mymeetings':'1'}">
<span class="o_highlight">
<t t-if="!show_demo">
<t t-esc="values['meeting']['today']"/>
</t>
<t t-if="show_demo">
0
</t>
</span><br/>
Meetings
</a>
</td>
<td class="o_main" title="To Activities">
<a href="#" class="o_dashboard_action" name="crm.crm_lead_action_activities" data-context="{'search_default_activities_today':'1'}">
<span class="o_highlight">
<t t-if="!show_demo">
<t t-esc="values['activity']['today']"/>
</t>
<t t-if="show_demo">
7
</t>
</span> <br/>
Next Activities
</a>
</td>
<td class="o_main" title="My Pipeline" rowspan="2">
<a href="#" class="o_dashboard_action" name="crm.action_your_pipeline">
<span class="fa fa-th-large fa-3x"/><br/>
My Pipeline
</a>
</td>
</tr>
<tr>
<td class="o_text">Next 7 days</td>
<td class="o_main" title="To Calendar">
<a href="#" class="o_dashboard_action" name="calendar.action_calendar_event" data-context="{'search_default_mymeetings':'1'}">
<t t-if="!show_demo">
<t t-esc="values['meeting']['next_7_days']"/>
</t>
<t t-if="show_demo">
9
</t>
</a>
</td>
<td class="o_main" title="To Activities">
<a href="#" class="o_dashboard_action" name="crm.crm_lead_action_activities" data-context="{'search_default_activities_week':'1'}">
<t t-if="!show_demo">
<t t-esc="values['activity']['next_7_days']"/>
</t>
<t t-if="show_demo">
28
</t>
</a>
</td>
</tr>
<tr>
<td></td>
<td></td>
<!-- Hide overdue when there is none -->
<td t-if="show_demo or (values and values['activity']['overdue'] != 0)" class="o_warning" title="To Activities">
<a href="#" class="o_dashboard_action" name="crm.crm_lead_action_activities" data-context="{'search_default_activities_overdue':'1'}">
<t t-if="!show_demo">
<t t-esc="values['activity']['overdue']"/> overdue
</t>
<t t-if="show_demo">
2
</t>
</a>
</td>
<td t-if="show_demo or (values and values['closing']['overdue'] != 0)" class="o_warning" title="To Opportunities">
<a href="#" class="o_dashboard_action" name="crm.crm_lead_action_activities" data-context="{'search_default_overdue_opp':'1'}">
<t t-if="!show_demo">
<t t-esc="values['closing']['overdue']"/> exp. closing
</t>
<t t-if="show_demo">
3 exp. closing
</t>
</a>
</td>
</tr>
</table>
</div><div t-attf-class="#{show_demo ? 'o_demo' : ''}">
<table class="hidden-xs table table-condensed">
<tr>
<td class="o_text">
<div class="o_highlight">Performance</div>
This Month
</td>
<td t-attf-class="#{values and values['done']['target'] and values['done']['this_month'] >= values['done']['target'] ? 'o_main' : 'o_secondary'}" title="To Activity Report">
<a href="#" class="o_dashboard_action" name="crm.crm_activity_report_action" data-context="{'search_default_this_month':'1'}">
<span class="o_highlight">
<t t-if="!show_demo">
<t t-esc="values['done']['this_month']"/>
</t>
<t t-if="show_demo">
94
</t>
</span> <br/>
Activities Done
</a>
</td>
<td t-attf-class="#{values and values['won']['target'] and values['won']['this_month'] >= values['won']['target'] ? 'o_main' : 'o_secondary'}" title="To Opportunity Report">
<a href="#" class="o_dashboard_action" name="crm.crm_opportunity_report_action_graph"
data-context="{'search_default_won':'1', 'search_default_this_month': '1'}">
<span class="o_highlight">
<t t-if="!show_demo">
<t t-esc="widget._renderMonetaryField(values['won']['this_month'], values)"/>
</t>
<t t-if="show_demo">
78,140.03€
</t>
</span> <br/>
Won in Opportunities
</a>
</td>
<td t-if="values['invoiced']" t-attf-class="#{values and values['invoiced']['target'] and values['invoiced']['this_month'] >= values['invoiced']['target'] ? 'o_main' : 'o_secondary'}" title="To Invoice Report">
<a href="#" class="o_dashboard_action" name="account.action_account_invoice_report_all"
data-context="{'search_default_my_invoice':'1', 'search_default_this_month': '1'}">
<span class="o_highlight">
<t t-if="!show_demo">
<t t-esc="widget._renderMonetaryField(values['invoiced']['this_month'], values)"/>
</t>
<t t-if="show_demo">
35,029.39€
</t>
</span> <br/>
Invoiced
</a>
</td>
</tr>
<tr>
<td class="o_text">Target</td>
<td class="o_secondary">
<span t-if="!show_demo" class="o_target_to_set" name='done' t-att-value="values['done']['target'] ? values['done']['target'] : undefined" title="Click to set">
<t t-if="values['done']['target']">
<t t-esc="values['done']['target']"/>
</t>
<t t-if="!values['done']['target']">
Click to set
</t>
</span>
<span t-if="show_demo">
100
</span>
</td>
<td class="o_secondary">
<span t-if="!show_demo" class="o_target_to_set" name='won' t-att-value="values['won']['target'] ? values['won']['target'] : undefined" title="Click to set">
<t t-if="values['won']['target']">
<t t-esc="values['won']['target']"/>
</t>
<t t-if="!values['won']['target']">
Click to set
</t>
</span>
<span t-if="show_demo">
80.000€
</span>
</td>
<td t-if="show_demo or values['invoiced']" class="o_secondary">
<span t-if="!show_demo" class="o_target_to_set" name='invoiced' t-att-value="values['invoiced']['target'] ? values['invoiced']['target'] : undefined" title="Click to set">
<t t-if="values['invoiced']['target']">
<t t-esc="values['invoiced']['target']"/>
</t>
<t t-if="!values['invoiced']['target']">
Click to set
</t>
</span>
<span t-if="show_demo">
Click to set
</span>
</td>
</tr>
<tr>
<td class="o_text">Last Month</td>
<td class="o_secondary" title="To Activity Report">
<a href="#" class="o_dashboard_action" name="crm.crm_activity_report_action" data-context="{'search_default_last_month':'1'}">
<t t-esc="values['done']['last_month']"/>
</a>
</td>
<td class="o_secondary" title="To Opportunity Report">
<a href="#" class="o_dashboard_action" name="crm.crm_opportunity_report_action_graph"
data-context="{'search_default_won':'1', 'search_default_last_month':'1'}">
<t t-esc="widget._renderMonetaryField(values['won']['last_month'], values)"/>
</a>
</td>
<td t-if="values['invoiced']" class="o_secondary" title="To Invoice Report">
<a href="#" class="o_dashboard_action" name="account.action_account_invoice_report_all"
data-context="{'search_default_my_invoice':'1', 'search_default_last_month': '1'}">
<t t-esc="widget._renderMonetaryField(values['invoiced']['last_month'], values)"/>
</a>
</td>
</tr>
</table>
</div>
<div t-if="show_demo" class="o_welcome_message">
<div class="o_welcome_image">
<i class="fa fa-smile-o fa-5x"></i>
</div>
<div class="o_welcome_content">
<h2>Hi there!</h2>
<h4>Great sales journeys start with a clean pipeline.</h4>
<h4>Create a few opportunities in it.</h4>
<a class="btn btn-primary o_dashboard_action" name="crm.action_your_pipeline">My Pipeline</a>
</div>
</div>
</div>
</t>
</templates>
+1 -46
View File
@@ -2,33 +2,6 @@
<odoo>
<data>
<menuitem name="Sales"
id="menu_base_partner"
groups="group_sale_salesman,group_sale_manager" sequence="6"/>
<menuitem id="menu_sales" name="Sales" parent="menu_base_partner" sequence="5"/>
<menuitem id="menu_partner_form" parent="menu_sales" action="base.action_partner_form" sequence="3"/>
<menuitem id="menu_sale_config" name="Configuration" parent="menu_base_partner"
sequence="100" groups="group_sale_manager"/>
<menuitem id="menu_sale_general_settings" name="Settings" parent="menu_sale_config"
sequence="0" action="action_sale_config" groups="base.group_system"/>
<menuitem id="menu_config_address_book" parent="menu_sale_config" name="Contacts" sequence="4" groups="base.group_system"/>
<menuitem action="base.action_partner_category_form" id="menu_partner_category_form" name="Contact Tags" sequence="1" parent="menu_config_address_book" groups="base.group_no_one"/>
<menuitem action="base.action_partner_title_contact" id="menu_partner_title_contact" name="Contact Titles" parent="menu_config_address_book" sequence="3" groups="base.group_no_one"/>
<menuitem id="res_partner_industry_menu" name="Sectors of Activity" action="base.res_partner_industry_action" parent="sales_team.menu_config_address_book" sequence="4" groups="base.group_no_one"/>
<menuitem id="menu_localisation" name="Localization" parent="menu_config_address_book" sequence="5" groups="base.group_no_one"/>
<menuitem action="base.action_country" id="menu_country_partner" parent="menu_localisation" sequence="1" groups="base.group_no_one"/>
<menuitem action="base.action_country_group" id="menu_country_group" name="Country Group" parent="menu_localisation" sequence="3" groups="base.group_no_one"/>
<menuitem action="base.action_country_state" id="menu_country_state_partner" parent="menu_localisation" sequence="2" groups="base.group_no_one"/>
<menuitem action="base.action_currency_form" id="menu_action_currency_form" parent="menu_localisation" sequence="3" groups="base.group_multi_currency"/>
<menuitem id="menu_config_bank_accounts" name="Bank Accounts" parent="menu_config_address_book" sequence="6" groups="base.group_no_one"/>
<menuitem action="base.action_res_bank_form" id="menu_action_res_bank_form" parent="menu_config_bank_accounts" sequence="1" groups="base.group_no_one"/>
<menuitem action="base.action_res_partner_bank_account_form" id="menu_action_res_partner_bank_form" parent="menu_config_bank_accounts" groups="base.group_no_one" sequence="2"/>
<!-- Cateamions Search view -->
<record id="crm_team_salesteams_search" model="ir.ui.view">
<field name="name">Case Teams - Search</field>
@@ -49,7 +22,7 @@
<!-- Case Teams Action -->
<record id="crm_team_salesteams_act" model="ir.actions.act_window">
<field name="name">Dashboard</field>
<field name="name">Sales Channels</field>
<field name="res_model">crm.team</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,form</field>
@@ -162,20 +135,14 @@
</field>
</record>
<menuitem id="sales_team.menu_sales_team_act" action="crm_team_salesteams_act" sequence="1" parent="sales_team.menu_base_partner" name="Dashboard"/>
<!-- add css / js -->
<template id="assets_backend" name="sales_team assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/sales_team/static/src/css/sales_team.css"/>
<link rel="stylesheet" href="/sales_team/static/src/less/sales_team_dashboard.less"/>
<script type="text/javascript" src="/sales_team/static/src/js/sales_team.js"></script>
<script type="text/javascript" src="/sales_team/static/src/js/sales_team_dashboard.js"></script>
</xpath>
</template>
<menuitem id="menu_sale_report" name="Reporting" parent="sales_team.menu_base_partner" sequence="99" groups="sales_team.group_sale_manager"/>
<record id="sales_team_config_action" model="ir.actions.act_window">
<field name="name">Sales Channels</field>
<field name="res_model">crm.team</field>
@@ -193,12 +160,6 @@
</field>
</record>
<menuitem name="Sales Channels"
id="sales_team_config"
parent="sales_team.menu_sale_config"
action="sales_team_config_action"
sequence="2"/>
<record id="mail_activity_type_action_config_sales" model="ir.actions.act_window">
<field name="name">Activity Types</field>
<field name="res_model">mail.activity.type</field>
@@ -206,11 +167,5 @@
<field name="view_mode">tree,form</field>
<field name="domain">['|', ('res_model_id', '=', False), ('res_model_id.model', '=', 'res.partner')]</field>
</record>
<menuitem name="Activity Types"
id="sales_team_menu_config_activity_types"
sequence="2"
action="mail_activity_type_action_config_sales"
parent="sales_team.menu_sale_config"/>
</data>
</odoo>
@@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Sale config wizard -->
<record id="sale_config_settings_view_form" model="ir.ui.view">
<field name="name">sale.config.settings.form</field>
<field name="model">sale.config.settings</field>
<field name="arch" type="xml">
<form string="Configure Sales" class="oe_form_configuration" name="sale_config_form">
<header>
<button string="Save" type="object" name="execute" class="oe_highlight"/>
<button string="Cancel" type="object" name="cancel" class="oe_link"/>
</header>
<sheet>
<h2 id="integration_h2" invisible="1">Integrations</h2>
<div class="row mt16 o_settings_container" id="integration"/>
<h2 id="recommended_apps">Recommended Apps</h2>
<div class="row mt16 o_settings_container">
<div class="col-xs-12 col-md-6 o_setting_box" id="module_crm">
<div class="o_setting_left_pane">
<field name="module_crm"/>
</div>
<div class="o_setting_right_pane">
<label for="module_crm"/>
<div class="text-muted">
Manage leads, opportunities, meetings and activities
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="module_sale">
<div class="o_setting_left_pane">
<field name="module_sale"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale"/>
<div class="text-muted">
Send quotations and manage invoicing
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_helpdesk" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_helpdesk"/>
<div class="text-muted">
Track after-sales tickets
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_website_sign" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_website_sign"/>
<div class="text-muted">
Send, sign and approve documents online
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="sale_subscription">
<div class="o_setting_left_pane">
<field name="module_sale_subscription" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane">
<label for="module_sale_subscription"/>
<div class="text-muted">
Sell recurring services with automated billing
</div>
</div>
</div>
</div>
</sheet>
</form>
</field>
</record>
<record id="action_sale_config" model="ir.actions.act_window">
<field name="name">Configure Sales</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.config.settings</field>
<field name="view_id" ref="sale_config_settings_view_form"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
</odoo>
@@ -4,7 +4,7 @@
<field name="name">crm.team.dashboard</field>
<field name="model">crm.team</field>
<field name="arch" type="xml">
<kanban class="oe_background_grey o_kanban_dashboard o_salesteam_kanban" create="0" js_class="sales_team_dashboard">
<kanban class="oe_background_grey o_kanban_dashboard o_salesteam_kanban" create="0">
<field name="name"/>
<field name="user_id"/>
<field name="member_ids"/>
@@ -70,6 +70,6 @@
</record>
<menuitem id="menu_report_crm_opportunities_assign_tree"
parent="sales_team.menu_sale_report" name="Opp. Assignment" action="action_report_crm_opportunity_assign" sequence="3"/>
parent="crm.crm_menu_report" name="Opp. Assignment" action="action_report_crm_opportunity_assign" sequence="3"/>
</odoo>
@@ -51,6 +51,6 @@
</record>
<menuitem name="Partnerships" id="menu_report_crm_partner_assign_tree"
parent="sales_team.menu_sale_report" action="action_report_crm_partner_assign" sequence="4"/>
parent="crm.crm_menu_report" action="action_report_crm_partner_assign" sequence="4"/>
</odoo>
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="crm_menu_resellers" name="Resellers" parent="crm.crm_menu_config" sequence="16"/>
<!--Partner Activation -->
<record model="ir.ui.view" id="res_partner_activation_form">
@@ -32,7 +34,7 @@
<field name="view_mode">tree,form</field>
</record>
<menuitem id="res_partner_activation_config_mi" parent="sales_team.menu_localisation" action="res_partner_activation_act" groups="base.group_no_one"
<menuitem id="res_partner_activation_config_mi" parent="crm_menu_resellers" action="res_partner_activation_act"
sequence="6"/>
<!--Partner Level -->
@@ -80,8 +82,7 @@
<field name="view_type">form</field>
</record>
<menuitem action="res_partner_grade_action" id="menu_res_partner_grade_action"
groups="base.group_no_one"
parent="sales_team.menu_localisation"
parent="crm_menu_resellers"
sequence="5" />
<!-- Partner form -->
@@ -62,8 +62,7 @@
id="menu_partner_tag_form"
name="Website Tags"
sequence="2"
parent="sales_team.menu_config_address_book"
groups="base.group_no_one"
parent="contacts.res_partner_menu_config"
/>
</odoo>
@@ -4,20 +4,22 @@
<record id="sale_config_settings_view_form_inherit_website_quote" model="ir.ui.view">
<field name="name">sale.config.settings.view.form.inherit.website.quote</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sale.sale_config_settings_view_form_inherit_sale"/>
<field name="inherit_id" ref="sale.sale_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='website_quote']" position="replace">
<div class="mt16" attrs="{'invisible': [('module_website_quote','=',False)]}">
<label for="default_template_id" class="o_light_label"/>
<field name="default_template_id" class="oe_inline"/>
</div>
<div attrs="{'invisible': [('module_website_quote','=',False)]}">
<button name="%(website_quote.action_sale_quotation_template)d" icon="fa-arrow-right" type="action" string="Quotation Templates" class="btn-link"/>
</div>
<div attrs="{'invisible': [('module_website_quote','=',False)]}">
<button name='%(payment.action_payment_acquirer)d' icon="fa-arrow-right" type="action" string="Payment Acquirers" class="btn-link"/>
</div>
</xpath>
<xpath expr="//div[@id='website_quote']" position="after">
<div class="content-group">
<div class="mt16" attrs="{'invisible': [('module_website_quote','=',False)]}">
<label for="default_template_id" class="o_light_label"/>
<field name="default_template_id" class="oe_inline"/>
</div>
<div attrs="{'invisible': [('module_website_quote','=',False)]}">
<button name="%(website_quote.action_sale_quotation_template)d" icon="fa-arrow-right" type="action" string="Quotation Templates" class="btn-link"/>
</div>
<div attrs="{'invisible': [('module_website_quote','=',False)]}">
<button name='%(payment.action_payment_acquirer)d' icon="fa-arrow-right" type="action" string="Payment Acquirers" class="btn-link"/>
</div>
</div>
</xpath>
</field>
</record>
@@ -10,7 +10,7 @@ tour.register('main_flow_tour', {
test: true,
url: "/web",
}, [tour.STEPS.MENU_MORE, {
trigger: '.o_app[data-menu-xmlid="sales_team.menu_base_partner"], .oe_menu_toggler[data-menu-xmlid="sales_team.menu_base_partner"]',
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"], .oe_menu_toggler[data-menu-xmlid="sale.sale_menu_root"]',
content: _t('Organize your sales activities with the <b>Sales app</b>.'),
position: 'bottom',
}, {
@@ -239,13 +239,9 @@ tour.register('main_flow_tour', {
content: _t('Go back to the app switcher'),
position: 'bottom',
}, {
trigger: '.o_app[data-menu-xmlid="sales_team.menu_base_partner"], .oe_menu_toggler[data-menu-xmlid="sales_team.menu_base_partner"]',
content: _t('Organize your sales activities with the <b>Sales app</b>.'),
trigger: '.o_app[data-menu-xmlid="crm.crm_menu_root"], .oe_menu_toggler[data-menu-xmlid="crm.crm_menu_root"]',
content: _t('Organize your sales activities with the <b>CRM app</b>.'),
position: 'bottom',
}, {
trigger: ".o_sales_dashboard .o_dashboard_action[name='crm.action_your_pipeline']:last, .oe_secondary_submenu .oe_menu_text:contains('My Pipeline'):first",
content: _t("Let\'s have a look at your opportunities pipeline."),
position: "bottom"
}, {
trigger: ".o-kanban-button-new",
extra_trigger: '.o_opportunity_kanban',
@@ -516,16 +512,16 @@ tour.register('main_flow_tour', {
content: _t('Go back to the app switcher'),
position: 'bottom',
}, {
trigger: '.o_app[data-menu-xmlid="sales_team.menu_base_partner"], .oe_menu_toggler[data-menu-xmlid="sales_team.menu_base_partner"]',
trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"], .oe_menu_toggler[data-menu-xmlid="sale.sale_menu_root"]',
content: _t('Organize your sales activities with the <b>Sales app</b>.'),
position: 'bottom',
}, {
edition: "enterprise",
trigger: ".o_menu_sections a[data-menu-xmlid='sales_team.menu_sales']",
trigger: ".o_menu_sections a[data-menu-xmlid='sale.sale_order_menu']",
content: _t("Go to Sales menu"),
position: "bottom"
}, {
trigger: ".o_menu_sections a:has(span:contains('Sales Orders')), .oe_secondary_submenu .oe_menu_text:contains('Sales Orders'):first",
trigger: ".o_menu_sections a[data-menu-xmlid='sale.menu_sale_order'], .oe_secondary_submenu a[data-menu-xmlid='sale.menu_sale_order']",
content: _t("Go to the sales orders"),
position: "bottom"
}, {