CRM

crm
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/crm
VERSION
VERSION 1.9
CATEGORY
CATEGORYSales/CRM
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, Joren Van Onder, Aaron Bohy, Christophe Monniez, Jorge Pinna Puissant, Julien Castiaux, Romeo Fragomeli, Adrien Dieudonné, Sébastien Theys, Julien Mougenot, std-odoo, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, Miquel Raïch, Didier (did), Hubert Van De Walle, luvi, Renaud Thiry, Julien Banken, Moises Lopez - https://www.vauxoo.com/, alsh-odoo, Louis Wicket (wil), Adrien Widart (awt), Maximilien (malb), Victor Piryns (pivi), Mahamadasif Ansari, amdi-odoo, Gauthier Wala (gawa), Dylan Kiss (dyki), Xavier Bol (xbo), Noe Antoine, omra-odoo, Zelong Lin, sesn-odoo, maad-odoo, vava-odoo, jobl, Julien Carion (juca), adsh-odoo, Lopes Marc (loma), Martin Trigaux (mat), nihp-odoo, Shaan Thakkar (THSH), guce, yagp-odoo, Pierre Pulinckx (PIPU), Victor Miguel Armenta Carrillo, sben-odoo, elhayyany, Pierre Lamotte (pila), Pierre Pulinckx, Bastien PIERRE, zel-odoo, Vincent Sevestre, Krzysztof Magusiak (krma), Ajit Singh, defl, MAGREMENT, ramh, path-odoo, damrOdoo, saurabh, Kadam Darji, ELCO, chpa-odoo, Romain ROSANO (rros)
WEBSITE
WEBSITEhttps://www.odoo.com/app/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - html_editor
    - calendar
    - resource
    - utm
    - contacts
    - digest
    - portal
    - http_routing
    - auth_signup
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (57)
XML IDNameModelTypeStatus
crm_action_helper crm action helper ir.ui.view qweb New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.list crm.activity.report list New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.list.lead crm.lead list New
crm_case_tree_view_oppor crm.lead.list.opportunity crm.lead list New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_merge_summary crm_lead_merge_summary ir.ui.view qweb New
crm_lead_pls_update_view_form crm.lead.pls.update.view.form crm.lead.pls.update form New
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_view_activity crm.lead.view.activity crm.lead activity New
crm_lead_view_form crm.lead.form crm.lead form New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_graph_forecast crm.lead.view.graph.forecast crm.lead graph New
crm_lead_view_kanban_forecast crm.lead.view.kanban.forecast crm.lead xpath Inherits crm.crm_case_kanban_view_leads
crm_lead_view_list_activities crm.lead.list.activities crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lead_view_pivot_forecast crm.lead.view.pivot.forecast crm.lead pivot New
crm_lead_view_search_forecast crm.lead.view.search.forecast crm.lead xpath Inherits crm.view_crm_case_opportunities_filter
crm_lead_view_tree_forecast crm.lead.view.list.forecast crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_tree_opportunity_reporting crm.lead.list.opportunity.reporting crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_tree_reporting crm.lead.list.lead.reporting crm.lead xpath Inherits crm.crm_case_tree_view_leads
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_lost_reason_view_tree crm.lost.reason.list crm.lost.reason list New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_recurring_plan_view_search crm.recurring.plan.view.search crm.recurring.plan search New
crm_recurring_plan_view_tree crm.recurring.plan.view.list crm.recurring.plan list New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.list crm.stage list New
crm_team_member_view_form crm.team.member.view.form.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_form
crm_team_member_view_kanban crm.team.member.view.kanban.inherit.crm crm.team.member field Inherits sales_team.crm_team_member_view_kanban
crm_team_member_view_tree crm.team.member.view.list crm.team.member field Inherits sales_team.crm_team_member_view_tree
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.crm crm.team data Inherits sales_team.crm_team_view_kanban_dashboard
crm_team_view_tree crm.team.list.inherit.crm crm.team field Inherits sales_team.crm_team_view_tree
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_my_activities_filter crm.lead.search.myactivities crm.lead xpath Inherits crm.view_crm_case_leads_filter
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (22)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" index=True ondelete='set null' args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (20)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Assigned To'
  • body Html
    readonly=True args: 'Activity Description'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Completion Date'
  • date_closed Datetime
    readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • lead_create_date Datetime
    readonly=True args: 'Creation Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Opportunity'
  • lead_type Selection
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • tag_ids Many2many
    readonly=True related='lead_id.tag_ids'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
  • won_status Selection
    readonly=True string='Is Won' args: [('won', 'Won'), ('lost', 'Lost'), ('pending', 'Pending')]
Public methods (1)
  • init(self)

New fields (70)
  • active Boolean
    default=True tracking=72 args: 'Active'
  • automated_probability Float
    compute='_compute_probabilities' readonly=True store=True args: 'Automated Probability'
  • calendar_event_ids One2many → calendar.event
    string='Meetings' args: 'calendar.event', 'opportunity_id'
  • campaign_id Many2one
    ondelete='set null'
  • city Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • commercial_partner_id Many2one → res.partner
    compute='_compute_commercial_partner_id' domain="[('is_company', '=', True)]" readonly=False store=False string='Customer Company' args: 'res.partner'
  • company_currency Many2one → res.currency
    compute='_compute_company_currency' compute_sudo=True string='Currency' args: 'res.currency'
  • company_id Many2one → res.company
    compute='_compute_company_id' index=True readonly=False store=True string='Company' args: 'res.company'
  • contact_name Char
    compute='_compute_contact_name' index='trigram' readonly=False store=True tracking=30 args: 'Contact Name'
  • country_id Many2one → res.country
    compute='_compute_partner_address_values' readonly=False store=True string='Country' args: 'res.country'
  • date_automation_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    compute='_compute_date_last_stage_update' index=True readonly=True store=True args: 'Last Stage Update'
  • date_open Datetime
    compute='_compute_date_open' readonly=True store=True args: 'Assignment Date'
  • day_close Float
    compute='_compute_day_close' store=True args: 'Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True args: 'Days to Assign'
  • description Html
    args: 'Notes'
  • duplicate_lead_count Integer
    compute='_compute_potential_lead_duplicates' compute_sudo=True string='Potential Duplicate Lead Count'
  • duplicate_lead_ids Many2many → crm.lead
    compute='_compute_potential_lead_duplicates' compute_sudo=True context={'active_test': False} string='Potential Duplicate Lead' args: 'crm.lead'
  • email_domain_criterion Char
    compute='_compute_email_domain_criterion' index='btree_not_null' store=True string='Email Domain Criterion'
  • email_from Char
    compute='_compute_email_from' index='trigram' inverse='_inverse_email_from' readonly=False store=True tracking=40 args: 'Email'
  • email_normalized Char
    index='trigram'
  • email_state Selection
    compute='_compute_email_state' store=True string='Email Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • expected_revenue Monetary
    currency_field='company_currency' default=0.0 tracking=True args: 'Expected Revenue'
  • function Char
    compute='_compute_function' readonly=False store=True args: 'Job Position'
  • is_automated_probability Boolean
    compute='_compute_is_automated_probability' args: 'Is automated probability?'
  • is_partner_visible Boolean
    compute='_compute_is_partner_visible' args: 'Is Partner Visible'
  • lang_active_count Integer
    compute='_compute_lang_active_count'
  • lang_code Char
    related='lang_id.code'
  • lang_id Many2one → res.lang
    compute='_compute_lang_id' readonly=False store=True string='Language' args: 'res.lang'
  • lead_properties Properties
    copy=True definition='team_id.lead_properties_definition' args: 'Properties'
  • lost_reason_id Many2one → crm.lost.reason
    index=True ondelete='restrict' string='Lost Reason' tracking=71 args: 'crm.lost.reason'
  • medium_id Many2one
    ondelete='set null'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_label Char
    compute='_compute_meeting_display'
  • name Char
    compute='_compute_name' index='trigram' readonly=False required=True store=True args: 'Opportunity'
  • partner_email_update Boolean
    compute='_compute_partner_email_update' args: 'Partner Email will Update'
  • partner_id Many2one → res.partner
    check_company=True help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Contact' tracking=10 args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    compute='_compute_partner_name' help='The name of the future partner company that will be created while converting the lead into opportunity' index='trigram' readonly=False store=True tracking=20 args: 'Company Name'
  • partner_phone_update Boolean
    compute='_compute_partner_phone_update' args: 'Partner Phone will Update'
  • phone Char
    compute='_compute_phone' inverse='_inverse_phone' readonly=False store=True tracking=50 args: 'Phone'
  • phone_sanitized Char
    index='btree_not_null'
  • phone_state Selection
    compute='_compute_phone_state' store=True string='Phone Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    aggregator='avg' compute='_compute_probabilities' copy=False readonly=False store=True args: 'Probability'
  • prorated_revenue Monetary
    compute='_compute_prorated_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • recurring_plan Many2one → crm.recurring.plan
    string='Recurring Plan' args: 'crm.recurring.plan'
  • recurring_revenue Monetary
    currency_field='company_currency' default=0.0 tracking=True args: 'Recurring Revenues'
  • recurring_revenue_monthly Monetary
    compute='_compute_recurring_revenue_monthly' currency_field='company_currency' store=True args: 'Expected MRR'
  • recurring_revenue_monthly_prorated Monetary
    compute='_compute_recurring_revenue_monthly_prorated' currency_field='company_currency' store=True args: 'Prorated MRR'
  • recurring_revenue_prorated Monetary
    compute='_compute_recurring_revenue_prorated' currency_field='company_currency' store=True args: 'Prorated Recurring Revenues'
  • referred Char
    args: 'Referred By'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → crm.stage
    compute='_compute_stage_id' copy=False domain="['|', ('team_ids', '=', False), ('team_ids', 'in', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'crm.stage'
  • stage_id_color Integer
    export_string_translation=False related='stage_id.color' string='Stage Color'
  • state_id Many2one → res.country.state
    compute='_compute_partner_address_values' domain="[('country_id', '=?', country_id)]" readonly=False store=True string='State' args: 'res.country.state'
  • street Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street'
  • street2 Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street2'
  • tag_ids Many2many → crm.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.tag', 'crm_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    check_company=True compute='_compute_team_id' index=True ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
  • type Selection
    default=<expr> index=True required=True tracking=15 args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_company_ids Many2many → res.company
    compute='_compute_user_company_ids' help='UX: Limit to lead company or all if no company' args: 'res.company'
  • user_id Many2one → res.users
    check_company=True default=<expr> domain="[('share', '=', False)]" index=True string='Salesperson' tracking=True args: 'res.users'
  • website Char
    compute='_compute_website' help='Website of the contact' readonly=False store=True args: 'Website'
  • won_status Selection
    compute='_compute_won_status' store=True string='Won/Lost' tracking=70 args: [('won', 'Won'), ('lost', 'Lost'), ('pending', 'Pending')]
  • zip Char
    change_default=True compute='_compute_partner_address_values' readonly=False store=True args: 'Zip'
Public methods (23)
  • action_reschedule_meeting(self)
  • action_restore(self)
    Restoring a lost lead means that it should go back to its normal life cycle. This should reactivate the lead but also force the recompute of its probability, for the stage where the lead is currently at. During toggle_active, when reactivating a lost lead,only the automated probability will be recomputed, because the probability is not automated anymore. Restore will reset this automation.
  • action_schedule_meeting(self, smart_calendar=True)
    Open meeting's calendar view to schedule meeting on current opportunity. :param bool smart_calendar: to set to False if the view should not try to choose relevant mode and initial date for calendar view, see ``_get_opportunity_meeting_view_parameters`` :returns: dictionary value for created Meeting view :rtype: dict
  • action_set_automated_probability(self)
    Update the automated probability and align probability to that value
  • action_set_lost(self, **additional_values)
    Lost semantic: probability = 0 AND active = False
  • action_set_won(self)
    Won semantic: stage.is_won (AND probability = 100 but implied)
  • action_set_won_rainbowman(self)
  • action_show_potential_duplicates(self)
    Open kanban view to display duplicate leads or opportunity. :return dict: dictionary value for created kanban view
  • action_unarchive(self)
    When re-activating, force update probability for both leads and opportunities. Note that archiving triggers nothing more, as a lead can be archived and not lost.
  • convert_opportunity(self, partner, user_ids=False, team_id=False)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help_message)
    @api.model
    This method returns the action helpers for the leads. If help is already provided on the action, the same is returned. Otherwise, we build the help message which contains the alias responsible for creating the lead (if available) and return it.
  • get_import_templates(self)
    @api.model
  • get_rainbowman_message(self)
  • log_meeting(self, meeting)
    Log the meeting info with a link to it in the chatter :param record meeting: the meeting we want to log
  • merge_opportunity(self, user_id=False, team_id=False, auto_unlink=True)
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id: the id of the saleperson. If not given, will be determined by :meth:`_merge_data`. :param team_id: the id of the Sales Team. If not given, will be determined by :meth:`_merge_data`. :returns: crm.lead record resulting of th merge
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • prepare_pls_tooltip_data(self)
    Compute and return all necessary information to render CrmPlsTooltip, displayed when pressing the small AI button, located next to the label of probability when automated, in the crm.lead form view. This method first replaces ids with display names of relational fields before returning data, then also recomputes probabilities and writes them on self. :returns: :: { low_3_data: list of field-value couples for lowest 3 criterions, lowest first probability: numerical value, used for display on tooltip team_name: string, name of lead team if any top_3_data: list of field-value couples for top 3 criterions, highest first } :rtype: dict
  • redirect_lead_opportunity_view(self)
  • search_fetch(self, domain, field_names=None, offset=0, limit=None, order=None)
    @api.model
    Override to support ordering on my_activity_date_deadline. Ordering through web client calls search_read() with an order parameter set. Method search_read() then calls search_fetch(). Here we override search_fetch() to intercept a search with an order on field my_activity_date_deadline. In that case we do the search in two steps. First step: fill with deadline-based results * Perform a read_group on my activities to get a mapping lead_id / deadline Remember date_deadline is required, we always have a value for it. Only the earliest deadline per lead is kept. * Search leads linked to those activities that also match the asked domain and order from the original search request. * Results of that search will be at the top of returned results. Use limit None because we have to search all leads linked to activities as ordering on deadline is done in post processing. * Reorder them according to deadline asc or desc depending on original search ordering. Finally take only a subset of those leads to fill with results matching asked offset / limit. Second step: fill with other results. If first step does not gives results enough to match offset and limit parameters we fill with a search on other leads. We keep the asked domain and ordering while filtering out already scanned leads to keep a coherent results. All other search and search_read are left untouched by this override to avoid side effects. Search_count is not affected by this override.
  • unlink(self)
    Update meetings when removing opportunities, otherwise you have a link to a record that does not lead anywhere.
  • write(self, vals)

New fields (3)
  • lead_ids Many2many → crm.lead
    context={'active_test': False} string='Leads' args: 'crm.lead'
  • lost_feedback Html
    sanitize=True args: 'Closing Note'
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)
    Mark lead as lost and apply the loss reason

New fields (2)
  • pls_fields Many2many → crm.lead.scoring.frequency.field
    default=_get_default_pls_fields args: 'crm.lead.scoring.frequency.field'
  • pls_start_date Date
    default=_get_default_pls_start_date required=True
Public methods (1)
  • action_update_crm_lead_probabilities(self)

New fields (5)
  • lost_count Float
    digits=(16, 1) args: 'Lost Count'
  • team_id Many2one → crm.team
    ondelete='cascade' args: 'crm.team', 'Sales Team'
  • value Char
    args: 'Value'
  • variable Char
    index=True args: 'Variable'
  • won_count Float
    digits=(16, 1) args: 'Won Count'
Public methods (0)

No public methods.

New fields (3)
  • color Integer
    default=_get_default_color args: 'Color'
  • field_id Many2one → ir.model.fields
    domain=[('model_id.model', '=', 'crm.lead')] ondelete='cascade' required=True args: 'ir.model.fields'
  • name Char
    related='field_id.field_description'
Public methods (0)

No public methods.

New fields (11)
  • action Selection
    compute='_compute_action' compute_sudo=False precompute=True readonly=False required=True store=True string='Related Customer' args: [('create', 'Create a new customer'), ('exist', 'Link to an existing customer')]
  • commercial_partner_id Many2one → res.partner
    compute='_compute_commercial_partner_id' compute_sudo=False domain=[('is_company', '=', True)] readonly=False store=True args: 'res.partner', 'Company'
  • duplicated_lead_ids Many2many → crm.lead
    compute='_compute_duplicated_lead_ids' compute_sudo=False context={'active_test': False} readonly=False store=True string='Opportunities' args: 'crm.lead'
  • force_assignment Boolean
    default=True help='If checked, forces salesman to be updated on updated opportunities even if already set.' args: 'Force assignment'
  • lead_contact_name Char
    help=False related='lead_id.contact_name'
  • lead_id Many2one → crm.lead
    required=True args: 'crm.lead', 'Associated Lead'
  • lead_partner_name Char
    help=False related='lead_id.partner_name'
  • name Selection
    compute='_compute_name' compute_sudo=False readonly=False store=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' compute_sudo=False readonly=False store=True args: 'res.partner', 'Customer'
  • team_id Many2one → crm.team
    compute='_compute_team_id' compute_sudo=False readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    compute='_compute_user_id' compute_sudo=False readonly=False store=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_apply(self)
  • default_get(self, fields)
    @api.model
    Allow support of active_id / active_model instead of jut default_lead_id to ease window action definitions, and be backward compatible.

New fields (6)
  • action Selection
    ondelete={'each_exist_or_create': <expr>} selection_add=[('each_exist_or_create', 'Use existing partner or create')] string='Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignment Boolean
    default=False
  • lead_id Many2one
    required=False
  • lead_tomerge_ids Many2many → crm.lead
    context={'active_test': False} default=<expr> string='Active Leads' args: 'crm.lead', 'crm_convert_lead_mass_lead_rel'
  • user_ids Many2many → res.users
    string='Salespersons' args: 'res.users'
Public methods (1)
  • action_mass_convert(self)

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • leads_count Integer
    compute='_compute_leads_count' args: 'Leads Count'
  • name Char
    required=True translate=True args: 'Description'
Public methods (1)
  • action_lost_leads(self)

New fields (3)
  • opportunity_ids Many2many → crm.lead
    context={'active_test': False} string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    domain="[('share', '=', False)]" args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps cannot be already 'Won' (closed)

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Plan Name'
  • number_of_months Integer
    required=True args: '# Months'
  • sequence Integer
    default=10 args: 'Sequence'
Public methods (0)

No public methods.

New fields (9)
  • color Integer
    export_string_translation=False string='Color'
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • is_won Boolean
    args: 'Is Won Stage?'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • rotting_threshold_days Integer
    default=0 help="Highlight opportunities that haven't been updated for this many days. Set to 0 to disable. Changing this parameter will not affect the rotting status/date of resources last updated before this change." args: 'Days to rot'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_ids Many2many → crm.team
    ondelete='restrict' string='Sales Teams' args: 'crm.team'
Public methods (1)
  • write(self, vals)
    Since leads that are in a won stage must have their probability = 100%, this override ensures that setting a stage as won will set all the leads in that stage to probability = 100%. Inversely, if a won stage is not marked as won anymore, the lead probability should be recomputed based on automated probability. Note: If a user sets a stage as won and changes his mind right after, the manual probability will be lost in the process.

New fields (12)
  • alias_id Many2one
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.'
  • assignment_auto_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Auto Assignment'
  • assignment_domain Char
    help='Additional filter domain when fetching unassigned leads to allocate to the team.' tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Lead Assign'
  • assignment_max Integer
    compute='_compute_assignment_max' help='Monthly average leads capacity for all salesmen belonging to the team' args: 'Lead Average Capacity'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_all_assigned_month_count Integer
    compute='_compute_lead_all_assigned_month_count' help='Number of leads and opportunities assigned this last month.' string='# Leads/Opps assigned this month'
  • lead_all_assigned_month_exceeded Boolean
    compute='_compute_lead_all_assigned_month_count' help='True if the monthly lead assignment count is greater than the maximum assignment limit, false otherwise.' args: 'Exceed monthly lead assignement'
  • lead_properties_definition PropertiesDefinition
    args: 'Lead Properties'
  • lead_unassigned_count Integer
    compute='_compute_lead_unassigned_count' string='# Unassigned Leads'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (8)
  • action_assign_leads(self)
    Manual (direct) leads assignment. This method both * assigns leads to teams given by self; * assigns leads to salespersons belonging to self; See sub methods for more details about assign process. :returns: action, a client notification giving some insights on assign process;
  • action_open_leads(self)
  • action_open_unassigned_leads(self)
  • action_opportunity_forecast(self)
    @api.model
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • unlink(self)
    When unlinking, concatenate ``crm.lead.scoring.frequency`` linked to the team into "no team" statistics.
  • write(self, vals)

New fields (7)
  • assignment_domain Char
    tracking=True args: 'Assignment Domain'
  • assignment_domain_preferred Char
    tracking=True args: 'Preference assignment Domain'
  • assignment_enabled Boolean
    related='crm_team_id.assignment_enabled'
  • assignment_max Integer
    default=30 args: 'Average Leads Capacity (on 30 days)'
  • assignment_optout Boolean
    args: 'Pause assignment'
  • lead_day_count Integer
    compute='_compute_lead_day_count' help='Number of leads assigned to this member in the last 24 hours (lost leads excluded)' args: 'Leads (last 24h)'
  • lead_month_count Integer
    compute='_compute_lead_month_count' help='Number of leads assigned to this member in the last 30 days' args: 'Leads (30 days)'
Public methods (0)

No public methods.

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • action_create_calendar_event(self)
    Small override of the action that creates a calendar. If the activity is linked to a crm.lead through the "opportunity_id" field, we include in the action context the default values used when scheduling a meeting from the crm.lead form view. e.g: It will set the partner_id of the crm.lead as default attendee of the meeting.

New fields (19)
  • crm_auto_assignment_action Selection
    compute='_compute_crm_auto_assignment_data' help='Manual assign allow to trigger assignment from team form view using an action button. Automatic configures a cron running repeatedly assignment in all teams.' readonly=False store=True string='Auto Assignment Action' args: [('manual', 'Manually'), ('auto', 'Repeatedly')]
  • crm_auto_assignment_interval_number Integer
    compute='_compute_crm_auto_assignment_data' help='Number of interval type between each cron run (e.g. each 2 days or each 4 days)' readonly=False store=True string='Repeat every'
  • crm_auto_assignment_interval_type Selection
    compute='_compute_crm_auto_assignment_data' help='Interval type between each cron run (e.g. each 2 days or each 2 hours)' readonly=False store=True string='Auto Assignment Interval Unit' args: [('minutes', 'Minutes'), ('hours', 'Hours'), ('days', 'Days'), ('weeks', 'Weeks')]
  • crm_auto_assignment_run_datetime Datetime
    compute='_compute_crm_auto_assignment_data' readonly=False store=True string='Auto Assignment Next Execution Date'
  • crm_use_auto_assignment Boolean
    config_parameter='crm.lead.auto.assignment' string='Rule-Based Assignment'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • group_use_recurring_revenues Boolean
    implied_group='crm.group_use_recurring_revenues' string='Recurring Revenues'
  • is_membership_multi Boolean
    config_parameter='sales_team.membership_multi' string='Multi Teams'
  • lead_enrich_auto Selection
    config_parameter='crm.iap.lead.enrich.setting' default='auto' string='Enrich lead automatically' args: [('manual', 'Enrich leads on demand only'), ('auto', 'Enrich all leads automatically')]
  • lead_mining_in_pipeline Boolean
    config_parameter='crm.lead_mining_in_pipeline' args: 'Create a lead mining request directly from the opportunity pipeline.'
  • module_crm_iap_enrich Boolean
    args: 'Enrich your leads automatically with company data based on their email address.'
  • module_crm_iap_mine Boolean
    args: 'Generate new leads based on their country, industries, size, etc.'
  • module_partnership Boolean
    args: 'Membership / Partnership'
  • module_website_crm_iap_reveal Boolean
    args: "Create Leads/Opportunities from your website's traffic"
  • predictive_lead_scoring_field_labels Char
    compute='_compute_predictive_lead_scoring_field_labels'
  • predictive_lead_scoring_fields Many2many → crm.lead.scoring.frequency.field
    compute='_compute_pls_fields' inverse='_inverse_pls_fields_str' string='Lead Scoring Frequency Fields' args: 'crm.lead.scoring.frequency.field'
  • predictive_lead_scoring_fields_str Char
    config_parameter='crm.pls_fields' string='Lead Scoring Frequency Fields in String'
  • predictive_lead_scoring_start_date Date
    compute='_compute_pls_start_date' inverse='_inverse_pls_start_date_str' string='Lead Scoring Starting Date'
  • predictive_lead_scoring_start_date_str Char
    config_parameter='crm.pls_start_date' string='Lead Scoring Starting Date in String'
Public methods (2)
  • action_crm_assign_leads(self)
  • set_values(self)

New fields (2)
  • opportunity_count Integer
    compute='_compute_opportunity_count' groups='sales_team.group_sale_salesman' string='Opportunity Count'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
Public methods (1)
  • action_view_opportunity(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • crm_lead_count Integer
    compute='_compute_crm_lead_count' groups='sales_team.group_sale_salesman' args: 'Leads/Opportunities count'
  • use_leads Boolean
    compute='_compute_use_leads' args: 'Use Leads'
Public methods (1)
  • action_redirect_to_leads_opportunities(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/crm
VERSION
VERSION 1.8
CATEGORY
CATEGORYSales/CRM
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier ALT, Christophe Simonis, Xavier Morel, Thibault Francois, Aaron Bohy, Yannick Tivisse, Odoo Online, Christophe Monniez, Jorge Pinna Puissant, Aurélien Warnon, Adrien Dieudonné, Sébastien Theys, Julien Mougenot, Achraf (abz), Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, William Braeckman, william-andre, aliya, Hubert Van De Walle, Renaud Thiry, Julien Banken, Vincent Larcin, Moises Lopez - https://www.vauxoo.com/, Thomas Lefebvre (thle), alsh-odoo, Louis Wicket (wil), Victor Piryns (pivi), amdi-odoo, Gauthier Wala (gawa), Pierre-Yves Dufays, Djamel Touati, Levi Siuzdak (sile), Dylan Kiss (dyki), Chong Wang (cwg), Vivek Pathak, Noe Antoine, Mattis Megevand (mmeg), omra-odoo, Andrzej(pian), sesn-odoo, kdeb@odoo.com, Paul Stroobant, Youssef Bashandy, OmarAbosamaha, Maryam Kia, kobros-tech, Jérémy Hennecart (jeh), vava-odoo, Gabriel (gdpf), adsh-odoo, Lopes Marc (loma), Martin Trigaux (mat), Lina (liew), nihp-odoo, aath-odoo, sami odoo, Louis (wil), Shaan Thakkar (THSH), Clément Cardot, yagp-odoo, Pierre Pulinckx (PIPU), Victor Miguel Armenta Carrillo, sben-odoo, Ricardo Gomes Rodrigues, elhayyany, Pierre Lamotte (pila), Pierre Pulinckx (pipu), Pierre Pulinckx, Bastien PIERRE, Vincent Sevestre, Krzysztof Magusiak (krma), defl, MAGREMENT, Ali Hassan (alhy), ramh, kmdi-odoo, saurabh, Kadam Darji
WEBSITE
WEBSITEhttps://www.odoo.com/app/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - html_editor
    - calendar
    - resource
    - utm
    - contacts
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (61)
XML IDNameModelTypeStatus
assets_backend CRM assets backend ir.ui.view qweb Inherits web.assets_backend
assets_tests CRM Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_action_helper crm action helper ir.ui.view qweb New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.list crm.activity.report list New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.list.lead crm.lead list New
crm_case_tree_view_oppor crm.lead.list.opportunity crm.lead list New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_merge_summary crm_lead_merge_summary ir.ui.view qweb New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner xpath Inherits base.res_partner_kanban_view
crm_lead_pls_update_view_form crm.lead.pls.update.view.form crm.lead.pls.update form New
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_view_activity crm.lead.view.activity crm.lead activity New
crm_lead_view_form crm.lead.form crm.lead form New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_graph_forecast crm.lead.view.graph.forecast crm.lead graph New
crm_lead_view_kanban_forecast crm.lead.view.kanban.forecast crm.lead xpath Inherits crm.crm_case_kanban_view_leads
crm_lead_view_list_activities crm.lead.list.activities crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lead_view_pivot_forecast crm.lead.view.pivot.forecast crm.lead pivot New
crm_lead_view_search_forecast crm.lead.view.search.forecast crm.lead xpath Inherits crm.view_crm_case_opportunities_filter
crm_lead_view_tree_forecast crm.lead.view.list.forecast crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_tree_opportunity_reporting crm.lead.list.opportunity.reporting crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_tree_reporting crm.lead.list.lead.reporting crm.lead xpath Inherits crm.crm_case_tree_view_leads
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_lost_reason_view_tree crm.lost.reason.list crm.lost.reason list New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_recurring_plan_view_search crm.recurring.plan.view.search crm.recurring.plan search New
crm_recurring_plan_view_tree crm.recurring.plan.view.list crm.recurring.plan list New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.list crm.stage list New
crm_team_member_view_form crm.team.member.view.form.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_form
crm_team_member_view_kanban crm.team.member.view.kanban.inherit.crm crm.team.member field Inherits sales_team.crm_team_member_view_kanban
crm_team_member_view_tree crm.team.member.view.list crm.team.member field Inherits sales_team.crm_team_member_view_tree
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.crm crm.team data Inherits sales_team.crm_team_view_kanban_dashboard
crm_team_view_tree crm.team.list.inherit.crm crm.team field Inherits sales_team.crm_team_view_tree
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
qunit_suite crm tests ir.ui.view qweb Inherits web.qunit_suite_tests
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_my_activities_filter crm.lead.search.myactivities crm.lead xpath Inherits crm.view_crm_case_leads_filter
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (22)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" index=True ondelete='set null' args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (19)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Assigned To'
  • body Html
    readonly=True args: 'Activity Description'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Completion Date'
  • date_closed Datetime
    readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • lead_create_date Datetime
    readonly=True args: 'Creation Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Opportunity'
  • lead_type Selection
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • tag_ids Many2many
    readonly=True related='lead_id.tag_ids'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (69)
  • active Boolean
    default=True tracking=True args: 'Active'
  • automated_probability Float
    compute='_compute_probabilities' readonly=True store=True args: 'Automated Probability'
  • calendar_event_ids One2many → calendar.event
    string='Meetings' args: 'calendar.event', 'opportunity_id'
  • campaign_id Many2one
    ondelete='set null'
  • city Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one → res.currency
    compute='_compute_company_currency' compute_sudo=True string='Currency' args: 'res.currency'
  • company_id Many2one → res.company
    compute='_compute_company_id' index=True readonly=False store=True string='Company' args: 'res.company'
  • contact_name Char
    compute='_compute_contact_name' index='trigram' readonly=False store=True tracking=30 args: 'Contact Name'
  • country_id Many2one → res.country
    compute='_compute_partner_address_values' readonly=False store=True string='Country' args: 'res.country'
  • date_automation_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    compute='_compute_date_last_stage_update' index=True readonly=True store=True args: 'Last Stage Update'
  • date_open Datetime
    compute='_compute_date_open' readonly=True store=True args: 'Assignment Date'
  • day_close Float
    compute='_compute_day_close' store=True args: 'Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True args: 'Days to Assign'
  • description Html
    args: 'Notes'
  • duplicate_lead_count Integer
    compute='_compute_potential_lead_duplicates' string='Potential Duplicate Lead Count'
  • duplicate_lead_ids Many2many → crm.lead
    compute='_compute_potential_lead_duplicates' context={'active_test': False} string='Potential Duplicate Lead' args: 'crm.lead'
  • email_domain_criterion Char
    compute='_compute_email_domain_criterion' index='btree_not_null' store=True string='Email Domain Criterion'
  • email_from Char
    compute='_compute_email_from' index='trigram' inverse='_inverse_email_from' readonly=False store=True tracking=40 args: 'Email'
  • email_normalized Char
    index='trigram'
  • email_state Selection
    compute='_compute_email_state' store=True string='Email Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • expected_revenue Monetary
    currency_field='company_currency' default=0.0 tracking=True args: 'Expected Revenue'
  • function Char
    compute='_compute_function' readonly=False store=True args: 'Job Position'
  • is_automated_probability Boolean
    compute='_compute_is_automated_probability' args: 'Is automated probability?'
  • is_partner_visible Boolean
    compute='_compute_is_partner_visible' args: 'Is Partner Visible'
  • lang_active_count Integer
    compute='_compute_lang_active_count'
  • lang_code Char
    related='lang_id.code'
  • lang_id Many2one → res.lang
    compute='_compute_lang_id' readonly=False store=True string='Language' args: 'res.lang'
  • lead_properties Properties
    copy=True definition='team_id.lead_properties_definition' args: 'Properties'
  • lost_reason_id Many2one → crm.lost.reason
    index=True ondelete='restrict' string='Lost Reason' tracking=True args: 'crm.lost.reason'
  • medium_id Many2one
    ondelete='set null'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_label Char
    compute='_compute_meeting_display'
  • mobile Char
    compute='_compute_mobile' readonly=False store=True args: 'Mobile'
  • name Char
    compute='_compute_name' index='trigram' readonly=False required=True store=True args: 'Opportunity'
  • partner_email_update Boolean
    compute='_compute_partner_email_update' args: 'Partner Email will Update'
  • partner_id Many2one → res.partner
    check_company=True help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Customer' tracking=10 args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    compute='_compute_partner_name' help='The name of the future partner company that will be created while converting the lead into opportunity' index='trigram' readonly=False store=True tracking=20 args: 'Company Name'
  • partner_phone_update Boolean
    compute='_compute_partner_phone_update' args: 'Partner Phone will Update'
  • phone Char
    compute='_compute_phone' inverse='_inverse_phone' readonly=False store=True tracking=50 args: 'Phone'
  • phone_sanitized Char
    index='btree_not_null'
  • phone_state Selection
    compute='_compute_phone_state' store=True string='Phone Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    aggregator='avg' compute='_compute_probabilities' copy=False readonly=False store=True args: 'Probability'
  • prorated_revenue Monetary
    compute='_compute_prorated_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • recurring_plan Many2one → crm.recurring.plan
    string='Recurring Plan' args: 'crm.recurring.plan'
  • recurring_revenue Monetary
    currency_field='company_currency' default=0.0 tracking=True args: 'Recurring Revenues'
  • recurring_revenue_monthly Monetary
    compute='_compute_recurring_revenue_monthly' currency_field='company_currency' store=True args: 'Expected MRR'
  • recurring_revenue_monthly_prorated Monetary
    compute='_compute_recurring_revenue_monthly_prorated' currency_field='company_currency' store=True args: 'Prorated MRR'
  • recurring_revenue_prorated Monetary
    compute='_compute_recurring_revenue_prorated' currency_field='company_currency' store=True args: 'Prorated Recurring Revenues'
  • referred Char
    args: 'Referred By'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → crm.stage
    compute='_compute_stage_id' copy=False domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'crm.stage'
  • state_id Many2one → res.country.state
    compute='_compute_partner_address_values' domain="[('country_id', '=?', country_id)]" readonly=False store=True string='State' args: 'res.country.state'
  • street Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street'
  • street2 Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street2'
  • tag_ids Many2many → crm.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.tag', 'crm_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    check_company=True compute='_compute_team_id' index=True ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
  • title Many2one → res.partner.title
    compute='_compute_title' readonly=False store=True string='Title' args: 'res.partner.title'
  • type Selection
    default=<expr> index=True required=True tracking=15 args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_company_ids Many2many → res.company
    compute='_compute_user_company_ids' help='UX: Limit to lead company or all if no company' args: 'res.company'
  • user_id Many2one → res.users
    check_company=True default=<expr> domain="[('share', '=', False)]" index=True string='Salesperson' tracking=True args: 'res.users'
  • website Char
    compute='_compute_website' help='Website of the contact' readonly=False store=True args: 'Website'
  • zip Char
    change_default=True compute='_compute_partner_address_values' readonly=False store=True args: 'Zip'
Public methods (22)
  • action_reschedule_meeting(self)
  • action_schedule_meeting(self, smart_calendar=True)
    Open meeting's calendar view to schedule meeting on current opportunity. :param smart_calendar: boolean, to set to False if the view should not try to choose relevant mode and initial date for calendar view, see ``_get_opportunity_meeting_view_parameters`` :return dict: dictionary value for created Meeting view
  • action_set_automated_probability(self)
  • action_set_lost(self, **additional_values)
    Lost semantic: probability = 0 or active = False
  • action_set_won(self)
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
  • action_show_potential_duplicates(self)
    Open kanban view to display duplicate leads or opportunity. :return dict: dictionary value for created kanban view
  • action_snooze(self)
  • convert_opportunity(self, partner, user_ids=False, team_id=False)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help_message)
    @api.model
    This method returns the action helpers for the leads. If help is already provided on the action, the same is returned. Otherwise, we build the help message which contains the alias responsible for creating the lead (if available) and return it.
  • get_import_templates(self)
    @api.model
  • get_rainbowman_message(self)
  • log_meeting(self, meeting)
    Log the meeting info with a link to it in the chatter :param record meeting: the meeting we want to log
  • merge_opportunity(self, user_id=False, team_id=False, auto_unlink=True)
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the Sales Team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • redirect_lead_opportunity_view(self)
  • search_fetch(self, domain, field_names, offset=0, limit=None, order=None)
    @api.model
    Override to support ordering on my_activity_date_deadline. Ordering through web client calls search_read() with an order parameter set. Method search_read() then calls search_fetch(). Here we override search_fetch() to intercept a search with an order on field my_activity_date_deadline. In that case we do the search in two steps. First step: fill with deadline-based results * Perform a read_group on my activities to get a mapping lead_id / deadline Remember date_deadline is required, we always have a value for it. Only the earliest deadline per lead is kept. * Search leads linked to those activities that also match the asked domain and order from the original search request. * Results of that search will be at the top of returned results. Use limit None because we have to search all leads linked to activities as ordering on deadline is done in post processing. * Reorder them according to deadline asc or desc depending on original search ordering. Finally take only a subset of those leads to fill with results matching asked offset / limit. Second step: fill with other results. If first step does not gives results enough to match offset and limit parameters we fill with a search on other leads. We keep the asked domain and ordering while filtering out already scanned leads to keep a coherent results. All other search and search_read are left untouched by this override to avoid side effects. Search_count is not affected by this override.
  • toggle_active(self)
    When archiving: mark probability as 0. When re-activating update probability again, for leads and opportunities.
  • unlink(self)
    Update meetings when removing opportunities, otherwise you have a link to a record that does not lead anywhere.
  • write(self, vals)

New fields (3)
  • lead_ids Many2many → crm.lead
    string='Leads' args: 'crm.lead'
  • lost_feedback Html
    sanitize=True args: 'Closing Note'
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)
    Mark lead as lost and apply the loss reason

New fields (2)
  • pls_fields Many2many → crm.lead.scoring.frequency.field
    default=_get_default_pls_fields args: 'crm.lead.scoring.frequency.field'
  • pls_start_date Date
    default=_get_default_pls_start_date required=True
Public methods (1)
  • action_update_crm_lead_probabilities(self)

New fields (5)
  • lost_count Float
    digits=(16, 1) args: 'Lost Count'
  • team_id Many2one → crm.team
    ondelete='cascade' args: 'crm.team', 'Sales Team'
  • value Char
    args: 'Value'
  • variable Char
    index=True args: 'Variable'
  • won_count Float
    digits=(16, 1) args: 'Won Count'
Public methods (0)

No public methods.

New fields (2)
  • field_id Many2one → ir.model.fields
    domain=[('model_id.model', '=', 'crm.lead')] ondelete='cascade' required=True args: 'ir.model.fields'
  • name Char
    related='field_id.field_description'
Public methods (0)

No public methods.

New fields (8)
  • action Selection
    compute='_compute_action' compute_sudo=False readonly=False store=True string='Related Customer' args: [('create', 'Create a new customer'), ('exist', 'Link to an existing customer'), ('nothing', 'Do not link to a customer')]
  • duplicated_lead_ids Many2many → crm.lead
    compute='_compute_duplicated_lead_ids' compute_sudo=False context={'active_test': False} readonly=False store=True string='Opportunities' args: 'crm.lead'
  • force_assignment Boolean
    default=True help='If checked, forces salesman to be updated on updated opportunities even if already set.' args: 'Force assignment'
  • lead_id Many2one → crm.lead
    required=True args: 'crm.lead', 'Associated Lead'
  • name Selection
    compute='_compute_name' compute_sudo=False readonly=False store=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' compute_sudo=False readonly=False store=True args: 'res.partner', 'Customer'
  • team_id Many2one → crm.team
    compute='_compute_team_id' compute_sudo=False readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    compute='_compute_user_id' compute_sudo=False readonly=False store=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_apply(self)
  • default_get(self, fields)
    @api.model
    Allow support of active_id / active_model instead of jut default_lead_id to ease window action definitions, and be backward compatible.

New fields (6)
  • action Selection
    ondelete={'each_exist_or_create': <expr>} selection_add=[('each_exist_or_create', 'Use existing partner or create')] string='Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignment Boolean
    default=False
  • lead_id Many2one
    required=False
  • lead_tomerge_ids Many2many → crm.lead
    context={'active_test': False} default=<expr> string='Active Leads' args: 'crm.lead', 'crm_convert_lead_mass_lead_rel'
  • user_ids Many2many → res.users
    string='Salespersons' args: 'res.users'
Public methods (1)
  • action_mass_convert(self)

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • leads_count Integer
    compute='_compute_leads_count' args: 'Leads Count'
  • name Char
    required=True translate=True args: 'Description'
Public methods (1)
  • action_lost_leads(self)

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    domain="[('share', '=', False)]" args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Plan Name'
  • number_of_months Integer
    required=True args: '# Months'
  • sequence Integer
    default=10 args: 'Sequence'
Public methods (0)

No public methods.

New fields (7)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • is_won Boolean
    args: 'Is Won Stage?'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    As we have lots of default_team_id in context used to filter out leads and opportunities, we pop this key from default of stage creation. Otherwise stage will be created for a given team only which is not the standard behavior of stages.

New fields (16)
  • alias_id Many2one
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.'
  • assignment_auto_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Auto Assignment'
  • assignment_domain Char
    help='Additional filter domain when fetching unassigned leads to allocate to the team.' tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Lead Assign'
  • assignment_max Integer
    compute='_compute_assignment_max' help='Monthly average leads capacity for all salesmen belonging to the team' args: 'Lead Average Capacity'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_all_assigned_month_count Integer
    compute='_compute_lead_all_assigned_month_count' help='Number of leads and opportunities assigned this last month.' string='# Leads/Opps assigned this month'
  • lead_all_assigned_month_exceeded Boolean
    compute='_compute_lead_all_assigned_month_count' help='True if the monthly lead assignment count is greater than the maximum assignment limit, false otherwise.' args: 'Exceed monthly lead assignement'
  • lead_properties_definition PropertiesDefinition
    args: 'Lead Properties'
  • lead_unassigned_count Integer
    compute='_compute_lead_unassigned_count' string='# Unassigned Leads'
  • opportunities_amount Monetary
    compute='_compute_opportunities_data' string='Opportunities Revenues'
  • opportunities_count Integer
    compute='_compute_opportunities_data' string='# Opportunities'
  • opportunities_overdue_amount Monetary
    compute='_compute_opportunities_overdue_data' string='Overdue Opportunities Revenues'
  • opportunities_overdue_count Integer
    compute='_compute_opportunities_overdue_data' string='# Overdue Opportunities'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (6)
  • action_assign_leads(self)
    Manual (direct) leads assignment. This method both * assigns leads to teams given by self; * assigns leads to salespersons belonging to self; See sub methods for more details about assign process. :return action: a client notification giving some insights on assign process;
  • action_opportunity_forecast(self)
    @api.model
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • unlink(self)
    When unlinking, concatenate ``crm.lead.scoring.frequency`` linked to the team into "no team" statistics.
  • write(self, vals)

New fields (6)
  • assignment_domain Char
    tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    related='crm_team_id.assignment_enabled'
  • assignment_max Integer
    default=30 args: 'Average Leads Capacity (on 30 days)'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_day_count Integer
    compute='_compute_lead_day_count' help='Lead assigned to this member this last day (lost one excluded)' args: 'Leads (last 24h)'
  • lead_month_count Integer
    compute='_compute_lead_month_count' help='Lead assigned to this member those last 30 days' args: 'Leads (30 days)'
Public methods (0)

No public methods.

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • action_create_calendar_event(self)
    Small override of the action that creates a calendar. If the activity is linked to a crm.lead through the "opportunity_id" field, we include in the action context the default values used when scheduling a meeting from the crm.lead form view. e.g: It will set the partner_id of the crm.lead as default attendee of the meeting.

New fields (18)
  • crm_auto_assignment_action Selection
    compute='_compute_crm_auto_assignment_data' help='Manual assign allow to trigger assignment from team form view using an action button. Automatic configures a cron running repeatedly assignment in all teams.' readonly=False store=True string='Auto Assignment Action' args: [('manual', 'Manually'), ('auto', 'Repeatedly')]
  • crm_auto_assignment_interval_number Integer
    compute='_compute_crm_auto_assignment_data' help='Number of interval type between each cron run (e.g. each 2 days or each 4 days)' readonly=False store=True string='Repeat every'
  • crm_auto_assignment_interval_type Selection
    compute='_compute_crm_auto_assignment_data' help='Interval type between each cron run (e.g. each 2 days or each 2 hours)' readonly=False store=True string='Auto Assignment Interval Unit' args: [('minutes', 'Minutes'), ('hours', 'Hours'), ('days', 'Days'), ('weeks', 'Weeks')]
  • crm_auto_assignment_run_datetime Datetime
    compute='_compute_crm_auto_assignment_data' readonly=False store=True string='Auto Assignment Next Execution Date'
  • crm_use_auto_assignment Boolean
    config_parameter='crm.lead.auto.assignment' string='Rule-Based Assignment'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • group_use_recurring_revenues Boolean
    implied_group='crm.group_use_recurring_revenues' string='Recurring Revenues'
  • is_membership_multi Boolean
    config_parameter='sales_team.membership_multi' string='Multi Teams'
  • lead_enrich_auto Selection
    config_parameter='crm.iap.lead.enrich.setting' default='auto' string='Enrich lead automatically' args: [('manual', 'Enrich leads on demand only'), ('auto', 'Enrich all leads automatically')]
  • lead_mining_in_pipeline Boolean
    config_parameter='crm.lead_mining_in_pipeline' args: 'Create a lead mining request directly from the opportunity pipeline.'
  • module_crm_iap_enrich Boolean
    args: 'Enrich your leads automatically with company data based on their email address.'
  • module_crm_iap_mine Boolean
    args: 'Generate new leads based on their country, industries, size, etc.'
  • module_website_crm_iap_reveal Boolean
    args: "Create Leads/Opportunities from your website's traffic"
  • predictive_lead_scoring_field_labels Char
    compute='_compute_predictive_lead_scoring_field_labels'
  • predictive_lead_scoring_fields Many2many → crm.lead.scoring.frequency.field
    compute='_compute_pls_fields' inverse='_inverse_pls_fields_str' string='Lead Scoring Frequency Fields' args: 'crm.lead.scoring.frequency.field'
  • predictive_lead_scoring_fields_str Char
    config_parameter='crm.pls_fields' string='Lead Scoring Frequency Fields in String'
  • predictive_lead_scoring_start_date Date
    compute='_compute_pls_start_date' inverse='_inverse_pls_start_date_str' string='Lead Scoring Starting Date'
  • predictive_lead_scoring_start_date_str Char
    config_parameter='crm.pls_start_date' string='Lead Scoring Starting Date in String'
Public methods (2)
  • action_crm_assign_leads(self)
  • set_values(self)

New fields (2)
  • opportunity_count Integer
    compute='_compute_opportunity_count' groups='sales_team.group_sale_salesman' string='Opportunity Count'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
Public methods (1)
  • action_view_opportunity(self)
    This function returns an action that displays the opportunities from partner.

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (2)
  • crm_lead_count Integer
    compute='_compute_crm_lead_count' groups='sales_team.group_sale_salesman' args: 'Leads/Opportunities count'
  • use_leads Boolean
    compute='_compute_use_leads' args: 'Use Leads'
Public methods (1)
  • action_redirect_to_leads_opportunities(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/crm
VERSION
VERSION 1.8
CATEGORY
CATEGORYSales/CRM
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, qdp-odoo, Géry Debongnie, Aaron Bohy, Damien Bouvy, Yannick Tivisse, Odoo Online, Romain Derie, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Sébastien Theys, Joseph Caburnay, Samuel Degueldre, std-odoo, Achraf (abz), Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, abd-msyukyu-odoo, William Braeckman, Romain Estievenart, william-andre, MerlinGuillaume, Florian Charlier, Hubert Van De Walle, luvi, Renaud Thiry, alsh-odoo, Louis Wicket (wil), Victor Piryns (pivi), miad-odoo, amdi-odoo, Gauthier Wala (gawa), Pierre-Yves Dufays, Djamel Touati, Naman Shah, Maruan Aguerdouh (magm), kva, Dylan Kiss (dyki), Bruno Boi, FrancoisGe, Michael (mcm), Mayurrajsinh Rathod, Chong Wang (cwg), Adrien Schoffeniels, Brieuc-brd, AH-Yussef, adda-odoo, Noe Antoine, Mattis Megevand (mmeg), sesn-odoo, kdeb@odoo.com, Paul Stroobant, stefanorigano (SRI), Youssef Bashandy, OmarAbosamaha, kobros-tech, Jérémy Hennecart (jeh), jugj-odoo, Julien Carion (juca), adsh-odoo, Lopes Marc (loma), nihp-odoo, aath-odoo, Louis (wil), Pratik Raval (PRRA), yagp-odoo, Victor Miguel Armenta Carrillo, Ricardo Gomes Rodrigues, Pierre Lamotte (pila), Julien, Pierre Pulinckx (pipu), Bastien PIERRE, Vincent Sevestre, ramh, kmdi-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:06
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - calendar
    - onboarding
    - resource
    - utm
    - contacts
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (62)
XML IDNameModelTypeStatus
assets_backend CRM assets backend ir.ui.view qweb Inherits web.assets_backend
assets_tests CRM Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_action_helper crm action helper ir.ui.view qweb New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_merge_summary crm_lead_merge_summary ir.ui.view qweb New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_pls_update_view_form crm.lead.pls.update.view.form crm.lead.pls.update form New
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_view_activity crm.lead.view.activity crm.lead activity New
crm_lead_view_form crm.lead.form crm.lead form New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_graph_forecast crm.lead.view.graph.forecast crm.lead graph New
crm_lead_view_kanban_forecast crm.lead.view.kanban.forecast crm.lead xpath Inherits crm.crm_case_kanban_view_leads
crm_lead_view_list_activities crm.lead.list.activities crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lead_view_pivot_forecast crm.lead.view.pivot.forecast crm.lead pivot New
crm_lead_view_search_forecast crm.lead.view.search.forecast crm.lead xpath Inherits crm.view_crm_case_opportunities_filter
crm_lead_view_tree_forecast crm.lead.view.tree.forecast crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_tree_opportunity_reporting crm.lead.tree.opportunity.reporting crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_tree_reporting crm.lead.tree.lead.reporting crm.lead xpath Inherits crm.crm_case_tree_view_leads
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_lost_reason_view_tree crm.lost.reason.tree crm.lost.reason tree New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_recurring_plan_view_search crm.recurring.plan.view.search crm.recurring.plan search New
crm_recurring_plan_view_tree crm.recurring.plan.view.tree crm.recurring.plan tree New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_member_view_form crm.team.member.view.form.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_form
crm_team_member_view_kanban crm.team.member.view.kanban.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_kanban
crm_team_member_view_tree crm.team.member.view.tree crm.team.member field Inherits sales_team.crm_team_member_view_tree
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.crm crm.team data Inherits sales_team.crm_team_view_kanban_dashboard
crm_team_view_tree crm.team.tree.inherit.crm crm.team field Inherits sales_team.crm_team_view_tree
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
qunit_suite crm tests ir.ui.view qweb Inherits web.qunit_suite_tests
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_view_form_simple_form res.partner.view.form.simple.form.crm res.partner data Inherits base.view_partner_simple_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_my_activities_filter crm.lead.search.myactivities crm.lead xpath Inherits crm.view_crm_case_leads_filter
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (23)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" index=True ondelete='set null' args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (19)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Assigned To'
  • body Html
    readonly=True args: 'Activity Description'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Completion Date'
  • date_closed Datetime
    readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • lead_create_date Datetime
    readonly=True args: 'Creation Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Opportunity'
  • lead_type Selection
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • tag_ids Many2many
    readonly=True related='lead_id.tag_ids'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (70)
  • active Boolean
    default=True tracking=True args: 'Active'
  • automated_probability Float
    compute='_compute_probabilities' readonly=True store=True args: 'Automated Probability'
  • calendar_event_ids One2many → calendar.event
    string='Meetings' args: 'calendar.event', 'opportunity_id'
  • campaign_id Many2one
    ondelete='set null'
  • city Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one → res.currency
    compute='_compute_company_currency' compute_sudo=True string='Currency' args: 'res.currency'
  • company_id Many2one → res.company
    compute='_compute_company_id' index=True readonly=False store=True string='Company' args: 'res.company'
  • contact_name Char
    compute='_compute_contact_name' index='trigram' readonly=False store=True tracking=30 args: 'Contact Name'
  • country_id Many2one → res.country
    compute='_compute_partner_address_values' readonly=False store=True string='Country' args: 'res.country'
  • date_automation_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    compute='_compute_date_last_stage_update' index=True readonly=True store=True args: 'Last Stage Update'
  • date_open Datetime
    compute='_compute_date_open' readonly=True store=True args: 'Assignment Date'
  • day_close Float
    compute='_compute_day_close' store=True args: 'Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True args: 'Days to Assign'
  • description Html
    args: 'Notes'
  • duplicate_lead_count Integer
    compute='_compute_potential_lead_duplicates' string='Potential Duplicate Lead Count'
  • duplicate_lead_ids Many2many → crm.lead
    compute='_compute_potential_lead_duplicates' context={'active_test': False} string='Potential Duplicate Lead' args: 'crm.lead'
  • email_domain_criterion Char
    compute='_compute_email_domain_criterion' index='btree_not_null' store=True string='Email Domain Criterion' unaccent=False
  • email_from Char
    compute='_compute_email_from' index='trigram' inverse='_inverse_email_from' readonly=False store=True tracking=40 args: 'Email'
  • email_normalized Char
    index='trigram'
  • email_state Selection
    compute='_compute_email_state' store=True string='Email Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • expected_revenue Monetary
    currency_field='company_currency' tracking=True args: 'Expected Revenue'
  • function Char
    compute='_compute_function' readonly=False store=True args: 'Job Position'
  • is_automated_probability Boolean
    compute='_compute_is_automated_probability' args: 'Is automated probability?'
  • is_partner_visible Boolean
    compute='_compute_is_partner_visible' args: 'Is Partner Visible'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Kanban State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lang_active_count Integer
    compute='_compute_lang_active_count'
  • lang_code Char
    related='lang_id.code'
  • lang_id Many2one → res.lang
    compute='_compute_lang_id' readonly=False store=True string='Language' args: 'res.lang'
  • lead_properties Properties
    copy=True definition='team_id.lead_properties_definition' args: 'Properties'
  • lost_reason_id Many2one → crm.lost.reason
    index=True ondelete='restrict' string='Lost Reason' tracking=True args: 'crm.lost.reason'
  • medium_id Many2one
    ondelete='set null'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_label Char
    compute='_compute_meeting_display'
  • mobile Char
    compute='_compute_mobile' readonly=False store=True args: 'Mobile'
  • name Char
    compute='_compute_name' index='trigram' readonly=False required=True store=True args: 'Opportunity'
  • partner_email_update Boolean
    compute='_compute_partner_email_update' args: 'Partner Email will Update'
  • partner_id Many2one → res.partner
    check_company=True help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Customer' tracking=10 args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    compute='_compute_partner_name' help='The name of the future partner company that will be created while converting the lead into opportunity' index='trigram' readonly=False store=True tracking=20 args: 'Company Name'
  • partner_phone_update Boolean
    compute='_compute_partner_phone_update' args: 'Partner Phone will Update'
  • phone Char
    compute='_compute_phone' inverse='_inverse_phone' readonly=False store=True tracking=50 args: 'Phone'
  • phone_sanitized Char
    index='btree_not_null'
  • phone_state Selection
    compute='_compute_phone_state' store=True string='Phone Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    compute='_compute_probabilities' copy=False group_operator='avg' readonly=False store=True args: 'Probability'
  • prorated_revenue Monetary
    compute='_compute_prorated_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • recurring_plan Many2one → crm.recurring.plan
    string='Recurring Plan' args: 'crm.recurring.plan'
  • recurring_revenue Monetary
    currency_field='company_currency' tracking=True args: 'Recurring Revenues'
  • recurring_revenue_monthly Monetary
    compute='_compute_recurring_revenue_monthly' currency_field='company_currency' store=True args: 'Expected MRR'
  • recurring_revenue_monthly_prorated Monetary
    compute='_compute_recurring_revenue_monthly_prorated' currency_field='company_currency' store=True args: 'Prorated MRR'
  • recurring_revenue_prorated Monetary
    compute='_compute_recurring_revenue_prorated' currency_field='company_currency' store=True args: 'Prorated Recurring Revenues'
  • referred Char
    args: 'Referred By'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → crm.stage
    compute='_compute_stage_id' copy=False domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'crm.stage'
  • state_id Many2one → res.country.state
    compute='_compute_partner_address_values' domain="[('country_id', '=?', country_id)]" readonly=False store=True string='State' args: 'res.country.state'
  • street Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street'
  • street2 Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street2'
  • tag_ids Many2many → crm.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.tag', 'crm_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    check_company=True compute='_compute_team_id' index=True ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
  • title Many2one → res.partner.title
    compute='_compute_title' readonly=False store=True string='Title' args: 'res.partner.title'
  • type Selection
    default=<expr> index=True required=True tracking=15 args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_company_ids Many2many → res.company
    compute='_compute_user_company_ids' help='UX: Limit to lead company or all if no company' args: 'res.company'
  • user_id Many2one → res.users
    check_company=True default=<expr> domain="[('share', '=', False)]" index=True string='Salesperson' tracking=True args: 'res.users'
  • website Char
    compute='_compute_website' help='Website of the contact' readonly=False store=True args: 'Website'
  • zip Char
    change_default=True compute='_compute_partner_address_values' readonly=False store=True args: 'Zip'
Public methods (22)
  • action_reschedule_meeting(self)
  • action_schedule_meeting(self, smart_calendar=True)
    Open meeting's calendar view to schedule meeting on current opportunity. :param smart_calendar: boolean, to set to False if the view should not try to choose relevant mode and initial date for calendar view, see ``_get_opportunity_meeting_view_parameters`` :return dict: dictionary value for created Meeting view
  • action_set_automated_probability(self)
  • action_set_lost(self, **additional_values)
    Lost semantic: probability = 0 or active = False
  • action_set_won(self)
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
  • action_show_potential_duplicates(self)
    Open kanban view to display duplicate leads or opportunity. :return dict: dictionary value for created kanban view
  • action_snooze(self)
  • convert_opportunity(self, partner, user_ids=False, team_id=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help_message)
    @api.model
    This method returns the action helpers for the leads. If help is already provided on the action, the same is returned. Otherwise, we build the help message which contains the alias responsible for creating the lead (if available) and return it.
  • get_import_templates(self)
    @api.model
  • get_rainbowman_message(self)
  • log_meeting(self, meeting)
    Log the meeting info with a link to it in the chatter :param record meeting: the meeting we want to log
  • merge_opportunity(self, user_id=False, team_id=False, auto_unlink=True)
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the Sales Team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • redirect_lead_opportunity_view(self)
  • search_fetch(self, domain, field_names, offset=0, limit=None, order=None)
    @api.model
    Override to support ordering on my_activity_date_deadline. Ordering through web client calls search_read() with an order parameter set. Method search_read() then calls search_fetch(). Here we override search_fetch() to intercept a search with an order on field my_activity_date_deadline. In that case we do the search in two steps. First step: fill with deadline-based results * Perform a read_group on my activities to get a mapping lead_id / deadline Remember date_deadline is required, we always have a value for it. Only the earliest deadline per lead is kept. * Search leads linked to those activities that also match the asked domain and order from the original search request. * Results of that search will be at the top of returned results. Use limit None because we have to search all leads linked to activities as ordering on deadline is done in post processing. * Reorder them according to deadline asc or desc depending on original search ordering. Finally take only a subset of those leads to fill with results matching asked offset / limit. Second step: fill with other results. If first step does not gives results enough to match offset and limit parameters we fill with a search on other leads. We keep the asked domain and ordering while filtering out already scanned leads to keep a coherent results. All other search and search_read are left untouched by this override to avoid side effects. Search_count is not affected by this override.
  • toggle_active(self)
    When archiving: mark probability as 0. When re-activating update probability again, for leads and opportunities.
  • unlink(self)
    Update meetings when removing opportunities, otherwise you have a link to a record that does not lead anywhere.
  • write(self, vals)

New fields (3)
  • lead_ids Many2many → crm.lead
    string='Leads' args: 'crm.lead'
  • lost_feedback Html
    sanitize=True args: 'Closing Note'
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)
    Mark lead as lost and apply the loss reason

New fields (2)
  • pls_fields Many2many → crm.lead.scoring.frequency.field
    default=_get_default_pls_fields args: 'crm.lead.scoring.frequency.field'
  • pls_start_date Date
    default=_get_default_pls_start_date required=True
Public methods (1)
  • action_update_crm_lead_probabilities(self)

New fields (5)
  • lost_count Float
    digits=(16, 1) args: 'Lost Count'
  • team_id Many2one → crm.team
    ondelete='cascade' args: 'crm.team', 'Sales Team'
  • value Char
    args: 'Value'
  • variable Char
    index=True args: 'Variable'
  • won_count Float
    digits=(16, 1) args: 'Won Count'
Public methods (0)

No public methods.

New fields (2)
  • field_id Many2one → ir.model.fields
    domain=[('model_id.model', '=', 'crm.lead')] ondelete='cascade' required=True args: 'ir.model.fields'
  • name Char
    related='field_id.field_description'
Public methods (0)

No public methods.

New fields (8)
  • action Selection
    compute='_compute_action' compute_sudo=False readonly=False store=True string='Related Customer' args: [('create', 'Create a new customer'), ('exist', 'Link to an existing customer'), ('nothing', 'Do not link to a customer')]
  • duplicated_lead_ids Many2many → crm.lead
    compute='_compute_duplicated_lead_ids' compute_sudo=False context={'active_test': False} readonly=False store=True string='Opportunities' args: 'crm.lead'
  • force_assignment Boolean
    default=True help='If checked, forces salesman to be updated on updated opportunities even if already set.' args: 'Force assignment'
  • lead_id Many2one → crm.lead
    required=True args: 'crm.lead', 'Associated Lead'
  • name Selection
    compute='_compute_name' compute_sudo=False readonly=False store=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' compute_sudo=False readonly=False store=True args: 'res.partner', 'Customer'
  • team_id Many2one → crm.team
    compute='_compute_team_id' compute_sudo=False readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    compute='_compute_user_id' compute_sudo=False readonly=False store=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_apply(self)
  • default_get(self, fields)
    @api.model
    Allow support of active_id / active_model instead of jut default_lead_id to ease window action definitions, and be backward compatible.

New fields (6)
  • action Selection
    ondelete={'each_exist_or_create': <expr>} selection_add=[('each_exist_or_create', 'Use existing partner or create')] string='Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignment Boolean
    default=False
  • lead_id Many2one
    required=False
  • lead_tomerge_ids Many2many → crm.lead
    context={'active_test': False} default=<expr> string='Active Leads' args: 'crm.lead', 'crm_convert_lead_mass_lead_rel'
  • user_ids Many2many → res.users
    string='Salespersons' args: 'res.users'
Public methods (1)
  • action_mass_convert(self)

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • leads_count Integer
    compute='_compute_leads_count' args: 'Leads Count'
  • name Char
    required=True translate=True args: 'Description'
Public methods (1)
  • action_lost_leads(self)

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    domain="[('share', '=', False)]" args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Plan Name'
  • number_of_months Integer
    required=True args: '# Months'
  • sequence Integer
    default=10 args: 'Sequence'
Public methods (0)

No public methods.

New fields (7)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • is_won Boolean
    args: 'Is Won Stage?'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    As we have lots of default_team_id in context used to filter out leads and opportunities, we pop this key from default of stage creation. Otherwise stage will be created for a given team only which is not the standard behavior of stages.

New fields (16)
  • alias_id Many2one
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.'
  • assignment_auto_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Auto Assignment'
  • assignment_domain Char
    help='Additional filter domain when fetching unassigned leads to allocate to the team.' tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Lead Assign'
  • assignment_max Integer
    compute='_compute_assignment_max' help='Monthly average leads capacity for all salesmen belonging to the team' args: 'Lead Average Capacity'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_all_assigned_month_count Integer
    compute='_compute_lead_all_assigned_month_count' help='Number of leads and opportunities assigned this last month.' string='# Leads/Opps assigned this month'
  • lead_all_assigned_month_exceeded Boolean
    compute='_compute_lead_all_assigned_month_count' help='True if the monthly lead assignment count is greater than the maximum assignment limit, false otherwise.' args: 'Exceed monthly lead assignement'
  • lead_properties_definition PropertiesDefinition
    args: 'Lead Properties'
  • lead_unassigned_count Integer
    compute='_compute_lead_unassigned_count' string='# Unassigned Leads'
  • opportunities_amount Monetary
    compute='_compute_opportunities_data' string='Opportunities Revenues'
  • opportunities_count Integer
    compute='_compute_opportunities_data' string='# Opportunities'
  • opportunities_overdue_amount Monetary
    compute='_compute_opportunities_overdue_data' string='Overdue Opportunities Revenues'
  • opportunities_overdue_count Integer
    compute='_compute_opportunities_overdue_data' string='# Overdue Opportunities'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (6)
  • action_assign_leads(self, work_days=1, log=True)
    Manual (direct) leads assignment. This method both * assigns leads to teams given by self; * assigns leads to salespersons belonging to self; See sub methods for more details about assign process. :param float work_days: number of work days to consider when assigning leads to teams or salespersons. We consider that Member.assignment_max (or its equivalent on team model) targets 30 work days. We make a ratio between expected number of work days and maximum assignment for those 30 days to know lead count to assign. :return action: a client notification giving some insights on assign process;
  • action_opportunity_forecast(self)
    @api.model
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • unlink(self)
    When unlinking, concatenate ``crm.lead.scoring.frequency`` linked to the team into "no team" statistics.
  • write(self, vals)

New fields (5)
  • assignment_domain Char
    tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    related='crm_team_id.assignment_enabled'
  • assignment_max Integer
    default=30 args: 'Average Leads Capacity (on 30 days)'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_month_count Integer
    compute='_compute_lead_month_count' help='Lead assigned to this member those last 30 days' args: 'Leads (30 days)'
Public methods (0)

No public methods.

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • action_create_calendar_event(self)
    Small override of the action that creates a calendar. If the activity is linked to a crm.lead through the "opportunity_id" field, we include in the action context the default values used when scheduling a meeting from the crm.lead form view. e.g: It will set the partner_id of the crm.lead as default attendee of the meeting.

New fields (18)
  • crm_auto_assignment_action Selection
    compute='_compute_crm_auto_assignment_data' help='Manual assign allow to trigger assignment from team form view using an action button. Automatic configures a cron running repeatedly assignment in all teams.' readonly=False store=True string='Auto Assignment Action' args: [('manual', 'Manually'), ('auto', 'Repeatedly')]
  • crm_auto_assignment_interval_number Integer
    compute='_compute_crm_auto_assignment_data' help='Number of interval type between each cron run (e.g. each 2 days or each 4 days)' readonly=False store=True string='Repeat every'
  • crm_auto_assignment_interval_type Selection
    compute='_compute_crm_auto_assignment_data' help='Interval type between each cron run (e.g. each 2 days or each 2 hours)' readonly=False store=True string='Auto Assignment Interval Unit' args: [('minutes', 'Minutes'), ('hours', 'Hours'), ('days', 'Days'), ('weeks', 'Weeks')]
  • crm_auto_assignment_run_datetime Datetime
    compute='_compute_crm_auto_assignment_data' readonly=False store=True string='Auto Assignment Next Execution Date'
  • crm_use_auto_assignment Boolean
    config_parameter='crm.lead.auto.assignment' string='Rule-Based Assignment'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • group_use_recurring_revenues Boolean
    implied_group='crm.group_use_recurring_revenues' string='Recurring Revenues'
  • is_membership_multi Boolean
    config_parameter='sales_team.membership_multi' string='Multi Teams'
  • lead_enrich_auto Selection
    config_parameter='crm.iap.lead.enrich.setting' default='auto' string='Enrich lead automatically' args: [('manual', 'Enrich leads on demand only'), ('auto', 'Enrich all leads automatically')]
  • lead_mining_in_pipeline Boolean
    config_parameter='crm.lead_mining_in_pipeline' args: 'Create a lead mining request directly from the opportunity pipeline.'
  • module_crm_iap_enrich Boolean
    args: 'Enrich your leads automatically with company data based on their email address.'
  • module_crm_iap_mine Boolean
    args: 'Generate new leads based on their country, industries, size, etc.'
  • module_website_crm_iap_reveal Boolean
    args: "Create Leads/Opportunities from your website's traffic"
  • predictive_lead_scoring_field_labels Char
    compute='_compute_predictive_lead_scoring_field_labels'
  • predictive_lead_scoring_fields Many2many → crm.lead.scoring.frequency.field
    compute='_compute_pls_fields' inverse='_inverse_pls_fields_str' string='Lead Scoring Frequency Fields' args: 'crm.lead.scoring.frequency.field'
  • predictive_lead_scoring_fields_str Char
    config_parameter='crm.pls_fields' string='Lead Scoring Frequency Fields in String'
  • predictive_lead_scoring_start_date Date
    compute='_compute_pls_start_date' inverse='_inverse_pls_start_date_str' string='Lead Scoring Starting Date'
  • predictive_lead_scoring_start_date_str Char
    config_parameter='crm.pls_start_date' string='Lead Scoring Starting Date in String'
Public methods (2)
  • action_crm_assign_leads(self)
  • set_values(self)

New fields (3)
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' ondelete='set null' precompute=True readonly=False store=True string='Sales Team' args: 'crm.team'
Public methods (2)
  • action_view_opportunity(self)
    This function returns an action that displays the opportunities from partner.
  • default_get(self, fields)
    @api.model

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (2)
  • crm_lead_count Integer
    compute='_compute_crm_lead_count' groups='sales_team.group_sale_salesman' args: 'Leads/Opportunities count'
  • use_leads Boolean
    compute='_compute_use_leads' args: 'Use Leads'
Public methods (1)
  • action_redirect_to_leads_opportunities(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/crm
VERSION
VERSION 1.8
CATEGORY
CATEGORYSales/CRM
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, Thibault Francois, Géry Debongnie, Aaron Bohy, Damien Bouvy, Yannick Tivisse, Dharmraj Jhala, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Julien Castiaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Sébastien Theys, alt-odoo, Julien Mougenot, Nikunj Ladava, Samuel Degueldre, std-odoo, David Beguin, Philémon van Helden, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, abd-msyukyu-odoo, William Braeckman, william-andre, mafo-odoo, ijas ahammed, Florian Charlier, Patrick Hoste, anhe-odoo, Nshimiyimana Séna, Abdelouahab (abla), Adrien Minet, Antoine Vandevenne (anv), Hubert Van De Walle, luvi, dht-odoo, Fabio Barbero, Renaud Thiry, Elias Regopoulos, Louis Wicket (wil), miad-odoo, amdi-odoo, Pierre-Yves Dufays, Djamel Touati, Naman Shah, Maruan Aguerdouh (magm), kva, Bruno Boi, Antoine (ande), Mitul Shah, FrancoisGe, Michael (mcm), Simon Goffaux (sigo), Adrien Schoffeniels, adda-odoo, Noe Antoine, Mattis Megevand (mmeg), Paul Stroobant, stefanorigano (SRI), MAHAMADASIF ANSARI, Umesh Gupta, Pratik Raval, Youssef Bashandy, OmarAbosamaha, kobros-tech, Jérémy Hennecart (jeh), adsh-odoo, Lopes Marc (loma), Martin Trigaux (mat), nihp-odoo, aath-odoo, yagp-odoo, Victor Miguel Armenta Carrillo, quyen
WEBSITE
WEBSITEhttps://www.odoo.com/app/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - calendar
    - resource
    - utm
    - web_kanban_gauge
    - contacts
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (60)
XML IDNameModelTypeStatus
assets_backend CRM assets backend ir.ui.view qweb Inherits web.assets_backend
assets_tests CRM Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_action_helper crm action helper ir.ui.view qweb New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_merge_summary crm_lead_merge_summary ir.ui.view qweb New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_pls_update_view_form crm.lead.pls.update.view.form crm.lead.pls.update form New
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_view_activity crm.lead.view.activity crm.lead activity New
crm_lead_view_form crm.lead.form crm.lead form New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_graph_forecast crm.lead.view.graph.forecast crm.lead graph New
crm_lead_view_kanban_forecast crm.lead.view.kanban.forecast crm.lead xpath Inherits crm.crm_case_kanban_view_leads
crm_lead_view_list_activities crm.lead.list.activities crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lead_view_pivot_forecast crm.lead.view.pivot.forecast crm.lead pivot New
crm_lead_view_search_forecast crm.lead.view.search.forecast crm.lead xpath Inherits crm.view_crm_case_opportunities_filter
crm_lead_view_tree_forecast crm.lead.view.tree.forecast crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_tree_reporting crm.lead.tree.lead.reporting crm.lead xpath Inherits crm.crm_case_tree_view_leads
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_lost_reason_view_tree crm.lost.reason.tree crm.lost.reason tree New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_recurring_plan_view_search crm.recurring.plan.view.search crm.recurring.plan search New
crm_recurring_plan_view_tree crm.recurring.plan.view.tree crm.recurring.plan tree New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_member_view_form crm.team.member.view.form.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_form
crm_team_member_view_kanban crm.team.member.view.kanban.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_kanban
crm_team_member_view_tree crm.team.member.view.tree crm.team.member field Inherits sales_team.crm_team_member_view_tree
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.crm crm.team data Inherits sales_team.crm_team_view_kanban_dashboard
crm_team_view_tree crm.team.tree.inherit.crm crm.team field Inherits sales_team.crm_team_view_tree
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
qunit_suite crm tests ir.ui.view qweb Inherits web.qunit_suite_tests
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_my_activities_filter crm.lead.search.myactivities crm.lead xpath Inherits crm.view_crm_case_leads_filter
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (23)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" index=True ondelete='set null' args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (18)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Assigned To'
  • body Html
    readonly=True args: 'Activity Description'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Completion Date'
  • date_closed Datetime
    readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • lead_create_date Datetime
    readonly=True args: 'Creation Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Opportunity'
  • lead_type Selection
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (65)
  • active Boolean
    default=True tracking=True args: 'Active'
  • automated_probability Float
    compute='_compute_probabilities' readonly=True store=True args: 'Automated Probability'
  • calendar_event_count Integer
    compute='_compute_calendar_event_count' args: '# Meetings'
  • calendar_event_ids One2many → calendar.event
    string='Meetings' args: 'calendar.event', 'opportunity_id'
  • campaign_id Many2one
    ondelete='set null'
  • city Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one → res.currency
    compute='_compute_company_currency' compute_sudo=True string='Currency' args: 'res.currency'
  • company_id Many2one → res.company
    compute='_compute_company_id' index=True readonly=False store=True string='Company' args: 'res.company'
  • contact_name Char
    compute='_compute_contact_name' readonly=False store=True tracking=30 args: 'Contact Name'
  • country_id Many2one → res.country
    compute='_compute_partner_address_values' readonly=False store=True string='Country' args: 'res.country'
  • date_action_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    compute='_compute_date_last_stage_update' index=True readonly=True store=True args: 'Last Stage Update'
  • date_open Datetime
    compute='_compute_date_open' readonly=True store=True args: 'Assignment Date'
  • day_close Float
    compute='_compute_day_close' store=True args: 'Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True args: 'Days to Assign'
  • description Html
    args: 'Notes'
  • duplicate_lead_count Integer
    compute='_compute_potential_lead_duplicates' string='Potential Duplicate Lead Count'
  • duplicate_lead_ids Many2many → crm.lead
    compute='_compute_potential_lead_duplicates' context={'active_test': False} string='Potential Duplicate Lead' args: 'crm.lead'
  • email_from Char
    compute='_compute_email_from' index='trigram' inverse='_inverse_email_from' readonly=False store=True tracking=40 args: 'Email'
  • email_state Selection
    compute='_compute_email_state' store=True string='Email Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • expected_revenue Monetary
    currency_field='company_currency' tracking=True args: 'Expected Revenue'
  • function Char
    compute='_compute_function' readonly=False store=True args: 'Job Position'
  • is_automated_probability Boolean
    compute='_compute_is_automated_probability' args: 'Is automated probability?'
  • is_partner_visible Boolean
    compute='_compute_is_partner_visible' args: 'Is Partner Visible'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Kanban State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lang_active_count Integer
    compute='_compute_lang_active_count'
  • lang_code Char
    related='lang_id.code'
  • lang_id Many2one → res.lang
    compute='_compute_lang_id' readonly=False store=True string='Language' args: 'res.lang'
  • lead_properties Properties
    copy=True definition='team_id.lead_properties_definition' args: 'Properties'
  • lost_reason_id Many2one → crm.lost.reason
    index=True ondelete='restrict' string='Lost Reason' tracking=True args: 'crm.lost.reason'
  • medium_id Many2one
    ondelete='set null'
  • mobile Char
    compute='_compute_mobile' readonly=False store=True args: 'Mobile'
  • name Char
    compute='_compute_name' index='trigram' readonly=False required=True store=True args: 'Opportunity'
  • partner_email_update Boolean
    compute='_compute_partner_email_update' args: 'Partner Email will Update'
  • partner_id Many2one → res.partner
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Customer' tracking=10 args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    compute='_compute_partner_name' help='The name of the future partner company that will be created while converting the lead into opportunity' readonly=False store=True tracking=20 args: 'Company Name'
  • partner_phone_update Boolean
    compute='_compute_partner_phone_update' args: 'Partner Phone will Update'
  • phone Char
    compute='_compute_phone' inverse='_inverse_phone' readonly=False store=True tracking=50 args: 'Phone'
  • phone_state Selection
    compute='_compute_phone_state' store=True string='Phone Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    compute='_compute_probabilities' copy=False group_operator='avg' readonly=False store=True args: 'Probability'
  • prorated_revenue Monetary
    compute='_compute_prorated_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • recurring_plan Many2one → crm.recurring.plan
    string='Recurring Plan' args: 'crm.recurring.plan'
  • recurring_revenue Monetary
    currency_field='company_currency' tracking=True args: 'Recurring Revenues'
  • recurring_revenue_monthly Monetary
    compute='_compute_recurring_revenue_monthly' currency_field='company_currency' store=True args: 'Expected MRR'
  • recurring_revenue_monthly_prorated Monetary
    compute='_compute_recurring_revenue_monthly_prorated' currency_field='company_currency' store=True args: 'Prorated MRR'
  • referred Char
    args: 'Referred By'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → crm.stage
    compute='_compute_stage_id' copy=False domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'crm.stage'
  • state_id Many2one → res.country.state
    compute='_compute_partner_address_values' domain="[('country_id', '=?', country_id)]" readonly=False store=True string='State' args: 'res.country.state'
  • street Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street'
  • street2 Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street2'
  • tag_ids Many2many → crm.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.tag', 'crm_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    check_company=True compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='set null' precompute=True readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
  • title Many2one → res.partner.title
    compute='_compute_title' readonly=False store=True string='Title' args: 'res.partner.title'
  • type Selection
    default=<expr> index=True required=True tracking=15 args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_company_ids Many2many → res.company
    compute='_compute_user_company_ids' help='UX: Limit to lead company or all if no company' args: 'res.company'
  • user_id Many2one → res.users
    check_company=True default=<expr> domain="['&', ('share', '=', False), ('company_ids', 'in', user_company_ids)]" index=True string='Salesperson' tracking=True args: 'res.users'
  • website Char
    compute='_compute_website' help='Website of the contact' readonly=False store=True args: 'Website'
  • zip Char
    change_default=True compute='_compute_partner_address_values' readonly=False store=True args: 'Zip'
Public methods (22)
  • action_reschedule_meeting(self)
  • action_schedule_meeting(self, smart_calendar=True)
    Open meeting's calendar view to schedule meeting on current opportunity. :param smart_calendar: boolean, to set to False if the view should not try to choose relevant mode and initial date for calendar view, see ``_get_opportunity_meeting_view_parameters`` :return dict: dictionary value for created Meeting view
  • action_set_automated_probability(self)
  • action_set_lost(self, **additional_values)
    Lost semantic: probability = 0 or active = False
  • action_set_won(self)
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
  • action_show_potential_duplicates(self)
    Open kanban view to display duplicate leads or opportunity. :return dict: dictionary value for created kanban view
  • action_snooze(self)
  • convert_opportunity(self, partner, user_ids=False, team_id=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help)
    @api.model
    This method returns the action helpers for the leads. If help is already provided on the action, the same is returned. Otherwise, we build the help message which contains the alias responsible for creating the lead (if available) and return it.
  • get_import_templates(self)
    @api.model
  • get_rainbowman_message(self)
  • log_meeting(self, meeting_subject, meeting_date, duration)
  • merge_opportunity(self, user_id=False, team_id=False, auto_unlink=True)
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the Sales Team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • redirect_lead_opportunity_view(self)
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model
    Override to support ordering on my_activity_date_deadline. Ordering through web client calls search_read with an order parameter set. Search_read then calls search. In this override we therefore override search to intercept a search without count with an order on my_activity_date_deadline. In that case we do the search in two steps. First step: fill with deadline-based results * Perform a read_group on my activities to get a mapping lead_id / deadline Remember date_deadline is required, we always have a value for it. Only the earliest deadline per lead is kept. * Search leads linked to those activities that also match the asked domain and order from the original search request. * Results of that search will be at the top of returned results. Use limit None because we have to search all leads linked to activities as ordering on deadline is done in post processing. * Reorder them according to deadline asc or desc depending on original search ordering. Finally take only a subset of those leads to fill with results matching asked offset / limit. Second step: fill with other results. If first step does not gives results enough to match offset and limit parameters we fill with a search on other leads. We keep the asked domain and ordering while filtering out already scanned leads to keep a coherent results. All other search and search_read are left untouched by this override to avoid side effects. Search_count is not affected by this override.
  • toggle_active(self)
    When archiving: mark probability as 0. When re-activating update probability again, for leads and opportunities.
  • unlink(self)
    Update meetings when removing opportunities, otherwise you have a link to a record that does not lead anywhere.
  • write(self, vals)

New fields (2)
  • lost_feedback Html
    sanitize=True args: 'Closing Note'
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)

New fields (2)
  • pls_fields Many2many → crm.lead.scoring.frequency.field
    default=_get_default_pls_fields args: 'crm.lead.scoring.frequency.field'
  • pls_start_date Date
    default=_get_default_pls_start_date required=True
Public methods (1)
  • action_update_crm_lead_probabilities(self)

New fields (5)
  • lost_count Float
    digits=(16, 1) args: 'Lost Count'
  • team_id Many2one → crm.team
    ondelete='cascade' args: 'crm.team', 'Sales Team'
  • value Char
    args: 'Value'
  • variable Char
    index=True args: 'Variable'
  • won_count Float
    digits=(16, 1) args: 'Won Count'
Public methods (0)

No public methods.

New fields (2)
  • field_id Many2one → ir.model.fields
    domain=[('model_id.model', '=', 'crm.lead')] ondelete='cascade' required=True args: 'ir.model.fields'
  • name Char
    related='field_id.field_description'
Public methods (0)

No public methods.

New fields (8)
  • action Selection
    compute='_compute_action' compute_sudo=False readonly=False store=True string='Related Customer' args: [('create', 'Create a new customer'), ('exist', 'Link to an existing customer'), ('nothing', 'Do not link to a customer')]
  • duplicated_lead_ids Many2many → crm.lead
    compute='_compute_duplicated_lead_ids' compute_sudo=False context={'active_test': False} readonly=False store=True string='Opportunities' args: 'crm.lead'
  • force_assignment Boolean
    default=True help='If checked, forces salesman to be updated on updated opportunities even if already set.' args: 'Force assignment'
  • lead_id Many2one → crm.lead
    required=True args: 'crm.lead', 'Associated Lead'
  • name Selection
    compute='_compute_name' compute_sudo=False readonly=False store=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' compute_sudo=False readonly=False store=True args: 'res.partner', 'Customer'
  • team_id Many2one → crm.team
    compute='_compute_team_id' compute_sudo=False readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    compute='_compute_user_id' compute_sudo=False readonly=False store=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_apply(self)
  • default_get(self, fields)
    @api.model
    Allow support of active_id / active_model instead of jut default_lead_id to ease window action definitions, and be backward compatible.

New fields (6)
  • action Selection
    ondelete={'each_exist_or_create': <expr>} selection_add=[('each_exist_or_create', 'Use existing partner or create')] string='Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignment Boolean
    default=False
  • lead_id Many2one
    required=False
  • lead_tomerge_ids Many2many → crm.lead
    context={'active_test': False} default=<expr> string='Active Leads' args: 'crm.lead', 'crm_convert_lead_mass_lead_rel'
  • user_ids Many2many → res.users
    string='Salespersons' args: 'res.users'
Public methods (1)
  • action_mass_convert(self)

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • leads_count Integer
    compute='_compute_leads_count' args: 'Leads Count'
  • name Char
    required=True translate=True args: 'Description'
Public methods (1)
  • action_lost_leads(self)

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    domain="[('share', '=', False)]" args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Plan Name'
  • number_of_months Integer
    required=True args: '# Months'
  • sequence Integer
    default=10 args: 'Sequence'
Public methods (0)

No public methods.

New fields (7)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • is_won Boolean
    args: 'Is Won Stage?'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    As we have lots of default_team_id in context used to filter out leads and opportunities, we pop this key from default of stage creation. Otherwise stage will be created for a given team only which is not the standard behavior of stages.

New fields (16)
  • alias_id Many2one → mail.alias
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • alias_user_id Many2one → res.users
    domain=<expr> inherited=True readonly=False related='alias_id.alias_user_id' args: 'res.users'
  • assignment_auto_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Auto Assignment'
  • assignment_domain Char
    help='Additional filter domain when fetching unassigned leads to allocate to the team.' tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Lead Assign'
  • assignment_max Integer
    compute='_compute_assignment_max' help='Monthly average leads capacity for all salesmen belonging to the team' args: 'Lead Average Capacity'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_all_assigned_month_count Integer
    compute='_compute_lead_all_assigned_month_count' help='Number of leads and opportunities assigned this last month.' string='# Leads/Opps assigned this month'
  • lead_properties_definition PropertiesDefinition
    args: 'Lead Properties'
  • lead_unassigned_count Integer
    compute='_compute_lead_unassigned_count' string='# Unassigned Leads'
  • opportunities_amount Monetary
    compute='_compute_opportunities_data' string='Opportunities Revenues'
  • opportunities_count Integer
    compute='_compute_opportunities_data' string='# Opportunities'
  • opportunities_overdue_amount Monetary
    compute='_compute_opportunities_overdue_data' string='Overdue Opportunities Revenues'
  • opportunities_overdue_count Integer
    compute='_compute_opportunities_overdue_data' string='# Overdue Opportunities'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (6)
  • action_assign_leads(self, work_days=1, log=True)
    Manual (direct) leads assignment. This method both * assigns leads to teams given by self; * assigns leads to salespersons belonging to self; See sub methods for more details about assign process. :param float work_days: number of work days to consider when assigning leads to teams or salespersons. We consider that Member.assignment_max (or its equivalent on team model) targets 30 work days. We make a ratio between expected number of work days and maximum assignment for those 30 days to know lead count to assign. :return action: a client notification giving some insights on assign process;
  • action_opportunity_forecast(self)
    @api.model
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • unlink(self)
    When unlinking, concatenate ``crm.lead.scoring.frequency`` linked to the team into "no team" statistics.
  • write(self, vals)

New fields (5)
  • assignment_domain Char
    tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    related='crm_team_id.assignment_enabled'
  • assignment_max Integer
    default=30 args: 'Average Leads Capacity (on 30 days)'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_month_count Integer
    compute='_compute_lead_month_count' help='Lead assigned to this member those last 30 days' args: 'Leads (30 days)'
Public methods (0)

No public methods.

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • action_create_calendar_event(self)
    Small override of the action that creates a calendar. If the activity is linked to a crm.lead through the "opportunity_id" field, we include in the action context the default values used when scheduling a meeting from the crm.lead form view. e.g: It will set the partner_id of the crm.lead as default attendee of the meeting.

New fields (18)
  • crm_auto_assignment_action Selection
    compute='_compute_crm_auto_assignment_data' help='Manual assign allow to trigger assignment from team form view using an action button. Automatic configures a cron running repeatedly assignment in all teams.' readonly=False store=True string='Auto Assignment Action' args: [('manual', 'Manually'), ('auto', 'Repeatedly')]
  • crm_auto_assignment_interval_number Integer
    compute='_compute_crm_auto_assignment_data' help='Number of interval type between each cron run (e.g. each 2 days or each 4 days)' readonly=False store=True string='Repeat every'
  • crm_auto_assignment_interval_type Selection
    compute='_compute_crm_auto_assignment_data' help='Interval type between each cron run (e.g. each 2 days or each 2 hours)' readonly=False store=True string='Auto Assignment Interval Unit' args: [('minutes', 'Minutes'), ('hours', 'Hours'), ('days', 'Days'), ('weeks', 'Weeks')]
  • crm_auto_assignment_run_datetime Datetime
    compute='_compute_crm_auto_assignment_data' readonly=False store=True string='Auto Assignment Next Execution Date'
  • crm_use_auto_assignment Boolean
    config_parameter='crm.lead.auto.assignment' string='Rule-Based Assignment'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • group_use_recurring_revenues Boolean
    implied_group='crm.group_use_recurring_revenues' string='Recurring Revenues'
  • is_membership_multi Boolean
    config_parameter='sales_team.membership_multi' string='Multi Teams'
  • lead_enrich_auto Selection
    config_parameter='crm.iap.lead.enrich.setting' default='auto' string='Enrich lead automatically' args: [('manual', 'Enrich leads on demand only'), ('auto', 'Enrich all leads automatically')]
  • lead_mining_in_pipeline Boolean
    config_parameter='crm.lead_mining_in_pipeline' args: 'Create a lead mining request directly from the opportunity pipeline.'
  • module_crm_iap_enrich Boolean
    args: 'Enrich your leads automatically with company data based on their email address.'
  • module_crm_iap_mine Boolean
    args: 'Generate new leads based on their country, industries, size, etc.'
  • module_website_crm_iap_reveal Boolean
    args: "Create Leads/Opportunities from your website's traffic"
  • predictive_lead_scoring_field_labels Char
    compute='_compute_predictive_lead_scoring_field_labels'
  • predictive_lead_scoring_fields Many2many → crm.lead.scoring.frequency.field
    compute='_compute_pls_fields' inverse='_inverse_pls_fields_str' string='Lead Scoring Frequency Fields' args: 'crm.lead.scoring.frequency.field'
  • predictive_lead_scoring_fields_str Char
    config_parameter='crm.pls_fields' string='Lead Scoring Frequency Fields in String'
  • predictive_lead_scoring_start_date Date
    compute='_compute_pls_start_date' inverse='_inverse_pls_start_date_str' string='Lead Scoring Starting Date'
  • predictive_lead_scoring_start_date_str Char
    config_parameter='crm.pls_start_date' string='Lead Scoring Starting Date in String'
Public methods (2)
  • action_crm_assign_leads(self)
  • set_values(self)

New fields (3)
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' ondelete='set null' precompute=True readonly=False store=True string='Sales Team' args: 'crm.team'
Public methods (2)
  • action_view_opportunity(self)
    This function returns an action that displays the opportunities from partner.
  • default_get(self, fields)
    @api.model

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (2)
  • crm_lead_count Integer
    compute='_compute_crm_lead_count' groups='sales_team.group_sale_salesman' args: 'Leads/Opportunities count'
  • use_leads Boolean
    compute='_compute_use_leads' args: 'Use Leads'
Public methods (1)
  • action_redirect_to_leads_opportunities(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/crm
VERSION
VERSION 1.6
CATEGORY
CATEGORYSales/CRM
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier ALT, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Aaron Bohy, Barad Mahendra, Yannick Tivisse, Dharmraj Jhala, Romain Derie, Christophe Monniez, Aurélien Warnon, Xavier-Do, Victor Feyens, Nasreddin (bon), alt-odoo, Julien Mougenot, Anh Thao Pham (pta), std-odoo, David Beguin, Adrien Widart, Ivan Yelizariev, Jérémy Hennecart, Touati Djamel (otd), Kamesh Patel, Tiffany Chang (tic), IEL, Mathieu Duckerts-Antoine, abd-msyukyu-odoo, Arnaud Joset, nounoubensebia, Kevin Baptiste, mafo-odoo, ijas ahammed, Florian Charlier, Nshimiyimana Séna, Abdelouahab (abla), Adrien Minet, Nicolas Bayet, Michael Mattiello (mcm), dht-odoo, Ipsita Borisagar, Louis Wicket (wil), Simon Genin (ges), Djamel Touati, Qiuyu (QHO), Naman Shah, Maruan Aguerdouh (magm), kva, Bruno Boi, Mitul Shah, Leonardo Pavan Rocha, adda-odoo, Noe Antoine, Mattis Megevand (mmeg), Zelong Lin, Paul Stroobant, Damien (abd), MAHAMADASIF ANSARI, OmarAbosamaha, kobros-tech, Jérémy Hennecart (jeh), Sunil Shrimali
WEBSITE
WEBSITEhttps://www.odoo.com/app/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - calendar
    - resource
    - fetchmail
    - utm
    - web_kanban_gauge
    - contacts
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (58)
XML IDNameModelTypeStatus
assets_backend CRM assets backend ir.ui.view qweb Inherits web.assets_backend
assets_tests CRM Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_action_helper crm action helper ir.ui.view qweb New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_pls_update_view_form crm.lead.pls.update.view.form crm.lead.pls.update form New
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_view_activity crm.lead.view.activity crm.lead activity New
crm_lead_view_form crm.lead.form crm.lead form New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_graph_forecast crm.lead.view.graph.forecast crm.lead graph New
crm_lead_view_kanban_forecast crm.lead.view.kanban.forecast crm.lead xpath Inherits crm.crm_case_kanban_view_leads
crm_lead_view_list_activities crm.lead.list.activities crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lead_view_pivot_forecast crm.lead.view.pivot.forecast crm.lead pivot New
crm_lead_view_search_forecast crm.lead.view.search.forecast crm.lead xpath Inherits crm.view_crm_case_opportunities_filter
crm_lead_view_tree_forecast crm.lead.view.tree.forecast crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_lost_reason_view_tree crm.lost.reason.tree crm.lost.reason tree New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_recurring_plan_view_search crm.recurring.plan.view.search crm.recurring.plan search New
crm_recurring_plan_view_tree crm.recurring.plan.view.tree crm.recurring.plan tree New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_member_view_form crm.team.member.view.form.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_form
crm_team_member_view_kanban crm.team.member.view.kanban.inherit.crm crm.team.member xpath Inherits sales_team.crm_team_member_view_kanban
crm_team_member_view_tree crm.team.member.view.tree crm.team.member field Inherits sales_team.crm_team_member_view_tree
crm_team_view_kanban_dashboard crm.team.view.kanban.dashboard.inherit.crm crm.team data Inherits sales_team.crm_team_view_kanban_dashboard
crm_team_view_tree crm.team.tree.inherit.crm crm.team field Inherits sales_team.crm_team_view_tree
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
qunit_suite crm tests ir.ui.view qweb Inherits web.qunit_suite_tests
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_my_activities_filter crm.lead.search.myactivities crm.lead xpath Inherits crm.view_crm_case_leads_filter
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (22)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" index=True ondelete='set null' args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (18)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Assigned To'
  • body Html
    readonly=True args: 'Activity Description'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Completion Date'
  • date_closed Datetime
    readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • lead_create_date Datetime
    readonly=True args: 'Creation Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Opportunity'
  • lead_type Selection
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (60)
  • active Boolean
    default=True tracking=True args: 'Active'
  • automated_probability Float
    compute='_compute_probabilities' readonly=True store=True args: 'Automated Probability'
  • calendar_event_count Integer
    compute='_compute_calendar_event_count' args: '# Meetings'
  • calendar_event_ids One2many → calendar.event
    string='Meetings' args: 'calendar.event', 'opportunity_id'
  • city Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one → res.currency
    compute='_compute_company_currency' readonly=True string='Currency' args: 'res.currency'
  • company_id Many2one → res.company
    compute='_compute_company_id' index=True readonly=False store=True string='Company' args: 'res.company'
  • contact_name Char
    compute='_compute_contact_name' readonly=False store=True tracking=30 args: 'Contact Name'
  • country_id Many2one → res.country
    compute='_compute_partner_address_values' readonly=False store=True string='Country' args: 'res.country'
  • date_action_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    compute='_compute_date_last_stage_update' index=True readonly=True store=True args: 'Last Stage Update'
  • date_open Datetime
    compute='_compute_date_open' readonly=True store=True args: 'Assignment Date'
  • day_close Float
    compute='_compute_day_close' store=True args: 'Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True args: 'Days to Assign'
  • description Html
    args: 'Notes'
  • duplicate_lead_count Integer
    compute='_compute_potential_lead_duplicates' string='Potential Duplicate Lead Count'
  • duplicate_lead_ids Many2many → crm.lead
    compute='_compute_potential_lead_duplicates' context={'active_test': False} string='Potential Duplicate Lead' args: 'crm.lead'
  • email_from Char
    compute='_compute_email_from' index=True inverse='_inverse_email_from' readonly=False store=True tracking=40 args: 'Email'
  • email_state Selection
    compute='_compute_email_state' store=True string='Email Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • expected_revenue Monetary
    currency_field='company_currency' tracking=True args: 'Expected Revenue'
  • function Char
    compute='_compute_function' readonly=False store=True args: 'Job Position'
  • is_automated_probability Boolean
    compute='_compute_is_automated_probability' args: 'Is automated probability?'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Kanban State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lang_id Many2one → res.lang
    compute='_compute_lang_id' readonly=False store=True string='Language' args: 'res.lang'
  • lost_reason Many2one → crm.lost.reason
    index=True ondelete='restrict' string='Lost Reason' tracking=True args: 'crm.lost.reason'
  • mobile Char
    compute='_compute_mobile' readonly=False store=True args: 'Mobile'
  • name Char
    compute='_compute_name' index=True readonly=False required=True store=True args: 'Opportunity'
  • partner_email_update Boolean
    compute='_compute_partner_email_update' args: 'Partner Email will Update'
  • partner_id Many2one → res.partner
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Customer' tracking=10 args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    compute='_compute_partner_name' help='The name of the future partner company that will be created while converting the lead into opportunity' index=True readonly=False store=True tracking=20 args: 'Company Name'
  • partner_phone_update Boolean
    compute='_compute_partner_phone_update' args: 'Partner Phone will Update'
  • phone Char
    compute='_compute_phone' inverse='_inverse_phone' readonly=False store=True tracking=50 args: 'Phone'
  • phone_state Selection
    compute='_compute_phone_state' store=True string='Phone Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    compute='_compute_probabilities' copy=False group_operator='avg' readonly=False store=True args: 'Probability'
  • prorated_revenue Monetary
    compute='_compute_prorated_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • recurring_plan Many2one → crm.recurring.plan
    groups='crm.group_use_recurring_revenues' string='Recurring Plan' args: 'crm.recurring.plan'
  • recurring_revenue Monetary
    currency_field='company_currency' groups='crm.group_use_recurring_revenues' tracking=True args: 'Recurring Revenues'
  • recurring_revenue_monthly Monetary
    compute='_compute_recurring_revenue_monthly' currency_field='company_currency' groups='crm.group_use_recurring_revenues' store=True args: 'Expected MRR'
  • recurring_revenue_monthly_prorated Monetary
    compute='_compute_recurring_revenue_monthly_prorated' currency_field='company_currency' groups='crm.group_use_recurring_revenues' store=True args: 'Prorated MRR'
  • referred Char
    args: 'Referred By'
  • stage_id Many2one → crm.stage
    compute='_compute_stage_id' copy=False domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'crm.stage'
  • state_id Many2one → res.country.state
    compute='_compute_partner_address_values' domain="[('country_id', '=?', country_id)]" readonly=False store=True string='State' args: 'res.country.state'
  • street Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street'
  • street2 Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street2'
  • tag_ids Many2many → crm.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.tag', 'crm_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    check_company=True compute='_compute_team_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True ondelete='set null' readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
  • title Many2one → res.partner.title
    compute='_compute_title' readonly=False store=True string='Title' args: 'res.partner.title'
  • type Selection
    default=<expr> index=True required=True tracking=15 args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_company_ids Many2many → res.company
    compute='_compute_user_company_ids' help='UX: Limit to lead company or all if no company' args: 'res.company'
  • user_email Char
    readonly=True related='user_id.email' args: 'User Email'
  • user_id Many2one → res.users
    check_company=True default=<expr> domain="['&', ('share', '=', False), ('company_ids', 'in', user_company_ids)]" index=True string='Salesperson' tracking=True args: 'res.users'
  • user_login Char
    readonly=True related='user_id.login' args: 'User Login'
  • website Char
    compute='_compute_website' help='Website of the contact' index=True readonly=False store=True args: 'Website'
  • zip Char
    change_default=True compute='_compute_partner_address_values' readonly=False store=True args: 'Zip'
Public methods (22)
  • action_reschedule_meeting(self)
  • action_schedule_meeting(self, smart_calendar=True)
    Open meeting's calendar view to schedule meeting on current opportunity. :param smart_calendar: boolean, to set to False if the view should not try to choose relevant mode and initial date for calendar view, see ``_get_opportunity_meeting_view_parameters`` :return dict: dictionary value for created Meeting view
  • action_set_automated_probability(self)
  • action_set_lost(self, **additional_values)
    Lost semantic: probability = 0 or active = False
  • action_set_won(self)
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
  • action_show_potential_duplicates(self)
    Open kanban view to display duplicate leads or opportunity. :return dict: dictionary value for created kanban view
  • action_snooze(self)
  • convert_opportunity(self, partner_id, user_ids=False, team_id=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help)
    @api.model
    This method returns the action helpers for the leads. If help is already provided on the action, the same is returned. Otherwise, we build the help message which contains the alias responsible for creating the lead (if available) and return it.
  • get_import_templates(self)
    @api.model
  • get_rainbowman_message(self)
  • log_meeting(self, meeting_subject, meeting_date, duration)
  • merge_opportunity(self, user_id=False, team_id=False, auto_unlink=True)
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the Sales Team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • redirect_lead_opportunity_view(self)
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model
    Override to support ordering on my_activity_date_deadline. Ordering through web client calls search_read with an order parameter set. Search_read then calls search. In this override we therefore override search to intercept a search without count with an order on my_activity_date_deadline. In that case we do the search in two steps. First step: fill with deadline-based results * Perform a read_group on my activities to get a mapping lead_id / deadline Remember date_deadline is required, we always have a value for it. Only the earliest deadline per lead is kept. * Search leads linked to those activities that also match the asked domain and order from the original search request. * Results of that search will be at the top of returned results. Use limit None because we have to search all leads linked to activities as ordering on deadline is done in post processing. * Reorder them according to deadline asc or desc depending on original search ordering. Finally take only a subset of those leads to fill with results matching asked offset / limit. Second step: fill with other results. If first step does not gives results enough to match offset and limit parameters we fill with a search on other leads. We keep the asked domain and ordering while filtering out already scanned leads to keep a coherent results. All other search and search_read are left untouched by this override to avoid side effects. Search_count is not affected by this override.
  • toggle_active(self)
    When archiving: mark probability as 0. When re-activating update probability again, for leads and opportunities.
  • unlink(self)
    Update meetings when removing opportunities, otherwise you have a link to a record that does not lead anywhere.
  • write(self, vals)

New fields (1)
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)

New fields (2)
  • pls_fields Many2many → crm.lead.scoring.frequency.field
    default=_get_default_pls_fields args: 'crm.lead.scoring.frequency.field'
  • pls_start_date Date
    default=_get_default_pls_start_date required=True
Public methods (1)
  • action_update_crm_lead_probabilities(self)

New fields (5)
  • lost_count Float
    digits=(16, 1) args: 'Lost Count'
  • team_id Many2one → crm.team
    ondelete='cascade' args: 'crm.team', 'Sales Team'
  • value Char
    args: 'Value'
  • variable Char
    index=True args: 'Variable'
  • won_count Float
    digits=(16, 1) args: 'Won Count'
Public methods (0)

No public methods.

New fields (2)
  • field_id Many2one → ir.model.fields
    domain=[('model_id.model', '=', 'crm.lead')] ondelete='cascade' required=True args: 'ir.model.fields'
  • name Char
    related='field_id.field_description'
Public methods (0)

No public methods.

New fields (8)
  • action Selection
    compute='_compute_action' compute_sudo=False readonly=False store=True string='Related Customer' args: [('create', 'Create a new customer'), ('exist', 'Link to an existing customer'), ('nothing', 'Do not link to a customer')]
  • duplicated_lead_ids Many2many → crm.lead
    compute='_compute_duplicated_lead_ids' compute_sudo=False context={'active_test': False} readonly=False store=True string='Opportunities' args: 'crm.lead'
  • force_assignment Boolean
    default=True help='If checked, forces salesman to be updated on updated opportunities even if already set.' args: 'Force assignment'
  • lead_id Many2one → crm.lead
    required=True args: 'crm.lead', 'Associated Lead'
  • name Selection
    compute='_compute_name' compute_sudo=False readonly=False store=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' compute_sudo=False readonly=False store=True args: 'res.partner', 'Customer'
  • team_id Many2one → crm.team
    compute='_compute_team_id' compute_sudo=False readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    compute='_compute_user_id' compute_sudo=False readonly=False store=True args: 'res.users', 'Salesperson'
Public methods (3)
  • action_apply(self)
  • default_get(self, fields)
    @api.model
    Allow support of active_id / active_model instead of jut default_lead_id to ease window action definitions, and be backward compatible.
  • view_init(self, fields)
    @api.model
    Check some preconditions before the wizard executes.

New fields (6)
  • action Selection
    ondelete={'each_exist_or_create': <expr>} selection_add=[('each_exist_or_create', 'Use existing partner or create')] string='Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignment Boolean
    default=False
  • lead_id Many2one
    required=False
  • lead_tomerge_ids Many2many → crm.lead
    context={'active_test': False} default=<expr> string='Active Leads' args: 'crm.lead', 'crm_convert_lead_mass_lead_rel'
  • user_ids Many2many → res.users
    string='Salespersons' args: 'res.users'
Public methods (1)
  • action_mass_convert(self)

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • leads_count Integer
    compute='_compute_leads_count' args: 'Leads Count'
  • name Char
    required=True translate=True args: 'Description'
Public methods (1)
  • action_lost_leads(self)

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' index=True readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    domain="[('share', '=', False)]" index=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Plan Name'
  • number_of_months Integer
    required=True args: '# Months'
  • sequence Integer
    default=10 args: 'Sequence'
Public methods (0)

No public methods.

New fields (7)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • is_won Boolean
    args: 'Is Won Stage?'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    As we have lots of default_team_id in context used to filter out leads and opportunities, we pop this key from default of stage creation. Otherwise stage will be created for a given team only which is not the standard behavior of stages.

New fields (15)
  • alias_id Many2one → mail.alias
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • alias_user_id Many2one → res.users
    domain=<expr> inherited=True readonly=False related='alias_id.alias_user_id' args: 'res.users'
  • assignment_auto_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Auto Assignment'
  • assignment_domain Char
    help='Additional filter domain when fetching unassigned leads to allocate to the team.' tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    compute='_compute_assignment_enabled' args: 'Lead Assign'
  • assignment_max Integer
    compute='_compute_assignment_max' help='Monthly average leads capacity for all salesmen belonging to the team' args: 'Lead Average Capacity'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_all_assigned_month_count Integer
    compute='_compute_lead_all_assigned_month_count' help='Number of leads and opportunities assigned this last month.' string='# Leads/Opps assigned this month'
  • lead_unassigned_count Integer
    compute='_compute_lead_unassigned_count' string='# Unassigned Leads'
  • opportunities_amount Monetary
    compute='_compute_opportunities_data' string='Opportunities Revenues'
  • opportunities_count Integer
    compute='_compute_opportunities_data' string='# Opportunities'
  • opportunities_overdue_amount Monetary
    compute='_compute_opportunities_overdue_data' string='Overdue Opportunities Revenues'
  • opportunities_overdue_count Integer
    compute='_compute_opportunities_overdue_data' string='# Overdue Opportunities'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (6)
  • action_assign_leads(self, work_days=1, log=True)
    Manual (direct) leads assignment. This method both * assigns leads to teams given by self; * assigns leads to salespersons belonging to self; See sub methods for more details about assign process. :param float work_days: number of work days to consider when assigning leads to teams or salespersons. We consider that Member.assignment_max (or its equivalent on team model) targets 30 work days. We make a ratio between expected number of work days and maximum assignment for those 30 days to know lead count to assign. :return action: a client notification giving some insights on assign process;
  • action_opportunity_forecast(self)
    @api.model
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • unlink(self)
    When unlinking, concatenate ``crm.lead.scoring.frequency`` linked to the team into "no team" statistics.
  • write(self, vals)

New fields (5)
  • assignment_domain Char
    tracking=True args: 'Assignment Domain'
  • assignment_enabled Boolean
    related='crm_team_id.assignment_enabled'
  • assignment_max Integer
    default=30 args: 'Average Leads Capacity (on 30 days)'
  • assignment_optout Boolean
    args: 'Skip auto assignment'
  • lead_month_count Integer
    compute='_compute_lead_month_count' help='Lead assigned to this member those last 30 days' args: 'Leads (30 days)'
Public methods (0)

No public methods.

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads/Opportunities'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (1)
  • action_create_calendar_event(self)
    Small override of the action that creates a calendar. If the activity is linked to a crm.lead through the "opportunity_id" field, we include in the action context the default values used when scheduling a meeting from the crm.lead form view. e.g: It will set the partner_id of the crm.lead as default attendee of the meeting.

New fields (18)
  • crm_auto_assignment_action Selection
    compute='_compute_crm_auto_assignment_data' help='Manual assign allow to trigger assignment from team form view using an action button. Automatic configures a cron running repeatedly assignment in all teams.' readonly=False store=True string='Auto Assignment Action' args: [('manual', 'Manually'), ('auto', 'Repeatedly')]
  • crm_auto_assignment_interval_number Integer
    compute='_compute_crm_auto_assignment_data' help='Number of interval type between each cron run (e.g. each 2 days or each 4 days)' readonly=False store=True string='Repeat every'
  • crm_auto_assignment_interval_type Selection
    compute='_compute_crm_auto_assignment_data' help='Interval type between each cron run (e.g. each 2 days or each 2 hours)' readonly=False store=True string='Auto Assignment Interval Unit' args: [('minutes', 'Minutes'), ('hours', 'Hours'), ('days', 'Days'), ('weeks', 'Weeks')]
  • crm_auto_assignment_run_datetime Datetime
    compute='_compute_crm_auto_assignment_data' readonly=False store=True string='Auto Assignment Next Execution Date'
  • crm_use_auto_assignment Boolean
    config_parameter='crm.lead.auto.assignment' string='Rule-Based Assignment'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • group_use_recurring_revenues Boolean
    implied_group='crm.group_use_recurring_revenues' string='Recurring Revenues'
  • is_membership_multi Boolean
    config_parameter='sales_team.membership_multi' string='Multi Teams'
  • lead_enrich_auto Selection
    config_parameter='crm.iap.lead.enrich.setting' default='manual' string='Enrich lead automatically' args: [('manual', 'Enrich leads on demand only'), ('auto', 'Enrich all leads automatically')]
  • lead_mining_in_pipeline Boolean
    config_parameter='crm.lead_mining_in_pipeline' args: 'Create a lead mining request directly from the opportunity pipeline.'
  • module_crm_iap_enrich Boolean
    args: 'Enrich your leads automatically with company data based on their email address.'
  • module_crm_iap_mine Boolean
    args: 'Generate new leads based on their country, industries, size, etc.'
  • module_website_crm_iap_reveal Boolean
    args: "Create Leads/Opportunities from your website's traffic"
  • predictive_lead_scoring_field_labels Char
    compute='_compute_predictive_lead_scoring_field_labels'
  • predictive_lead_scoring_fields Many2many → crm.lead.scoring.frequency.field
    compute='_compute_pls_fields' inverse='_inverse_pls_fields_str' string='Lead Scoring Frequency Fields' args: 'crm.lead.scoring.frequency.field'
  • predictive_lead_scoring_fields_str Char
    config_parameter='crm.pls_fields' string='Lead Scoring Frequency Fields in String'
  • predictive_lead_scoring_start_date Date
    compute='_compute_pls_start_date' inverse='_inverse_pls_start_date_str' string='Lead Scoring Starting Date'
  • predictive_lead_scoring_start_date_str Char
    config_parameter='crm.pls_start_date' string='Lead Scoring Starting Date in String'
Public methods (2)
  • action_crm_assign_leads(self)
  • set_values(self)

New fields (3)
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (2)
  • action_view_opportunity(self)
    This function returns an action that displays the opportunities from partner.
  • default_get(self, fields)
    @api.model

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (2)
  • crm_lead_count Integer
    compute='_compute_crm_lead_count' groups='sales_team.group_sale_salesman' args: 'Leads/Opportunities count'
  • use_leads Boolean
    compute='_compute_use_leads' args: 'Use Leads'
Public methods (1)
  • action_redirect_to_leads_opportunities(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/crm
VERSION
VERSION 1.2
CATEGORY
CATEGORYSales/CRM
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Aaron Bohy, GitHub, Lucas Perais (lpe), Barad Mahendra, Yannick Tivisse, Dharmraj Jhala, Adrien Dieudonne, Jorge Pinna Puissant, Adrian Torres, Julien Castiaux, Aurélien Warnon, Xavier-Do, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, Nasreddin (bon), alt-odoo, Julien Mougenot, fw-bot, Anh Thao Pham (pta), std-odoo, Rémy Baranx (bar), David Beguin, Lucas Lefèvre, Adrien Widart, Ivan Yelizariev, Jérémy Hennecart, Touati Djamel (otd), Kamesh Patel, Tiffany Chang (tic), IEL, Mathieu Duckerts-Antoine, Hiral Bhavsar, Kevin Baptiste, mcm-odoo, mafo-odoo, Krzysztof Magusiak, Nshimiyimana Séna, Julien Banken, Ipsita Borisagar, Louis Wicket (wil), Julien (jula), Krupal Oza, Naman Shah, dasa-odoo, Maruan Aguerdouh (magm), Aymane (ayt), kva, Pierre Collinet (pic), Nisha patel
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - calendar
    - resource
    - fetchmail
    - utm
    - contacts
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (47)
XML IDNameModelTypeStatus
assets_backend CRM assets backend ir.ui.view qweb Inherits web.assets_backend
assets_tests CRM Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_view_activity crm.lead.view.activity crm.lead activity New
crm_lead_view_form crm.lead.form crm.lead form New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_list_activities crm.lead.list.activities crm.lead xpath Inherits crm.crm_case_tree_view_oppor
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_lost_reason_view_tree crm.lost.reason.tree crm.lost.reason tree New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_recurring_plan_view_search crm.recurring.plan.view.search crm.recurring.plan search New
crm_recurring_plan_view_tree crm.recurring.plan.view.tree crm.recurring.plan tree New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
qunit_suite crm tests ir.ui.view qweb Inherits web.qunit_suite_tests
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_my_activities_filter crm.lead.search.myactivities crm.lead xpath Inherits crm.view_crm_case_leads_filter
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (19)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" index=True ondelete='set null' args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (18)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Assigned To'
  • body Html
    readonly=True args: 'Activity Description'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Completion Date'
  • date_closed Datetime
    readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • lead_create_date Datetime
    readonly=True args: 'Creation Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Opportunity'
  • lead_type Selection
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (57)
  • active Boolean
    default=True tracking=True args: 'Active'
  • activity_date_deadline_my Date
    compute='_compute_activity_date_deadline_my' compute_sudo=False groups='base.group_user' readonly=True search='_search_activity_date_deadline_my' store=False args: 'My Activities Deadline'
  • automated_probability Float
    compute='_compute_probabilities' readonly=True store=True args: 'Automated Probability'
  • city Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one → res.currency
    readonly=True related='company_id.currency_id' string='Currency' args: 'res.currency'
  • company_id Many2one → res.company
    default=<expr> index=True string='Company' args: 'res.company'
  • contact_name Char
    compute='_compute_contact_name' readonly=False store=True tracking=30 args: 'Contact Name'
  • country_id Many2one → res.country
    compute='_compute_partner_address_values' readonly=False store=True string='Country' args: 'res.country'
  • date_action_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    compute='_compute_date_last_stage_update' index=True readonly=True store=True args: 'Last Stage Update'
  • date_open Datetime
    compute='_compute_date_open' readonly=True store=True args: 'Assignment Date'
  • day_close Float
    compute='_compute_day_close' store=True args: 'Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True args: 'Days to Assign'
  • description Text
    args: 'Notes'
  • email_from Char
    compute='_compute_email_from' index=True inverse='_inverse_email_from' readonly=False store=True tracking=40 args: 'Email'
  • email_state Selection
    compute='_compute_email_state' store=True string='Email Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • expected_revenue Monetary
    currency_field='company_currency' tracking=True args: 'Expected Revenue'
  • function Char
    compute='_compute_function' readonly=False store=True args: 'Job Position'
  • is_automated_probability Boolean
    compute='_compute_is_automated_probability' args: 'Is automated probability?'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Kanban State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lang_id Many2one → res.lang
    compute='_compute_lang_id' readonly=False store=True string='Language' args: 'res.lang'
  • lost_reason Many2one → crm.lost.reason
    index=True ondelete='restrict' string='Lost Reason' tracking=True args: 'crm.lost.reason'
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • mobile Char
    compute='_compute_mobile' readonly=False store=True args: 'Mobile'
  • name Char
    compute='_compute_name' index=True readonly=False required=True store=True args: 'Opportunity'
  • partner_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Customer' tracking=10 args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    compute='_compute_partner_name' help='The name of the future partner company that will be created while converting the lead into opportunity' index=True readonly=False store=True tracking=20 args: 'Company Name'
  • phone Char
    compute='_compute_phone' inverse='_inverse_phone' readonly=False store=True tracking=50 args: 'Phone'
  • phone_mobile_search Char
    search='_search_phone_mobile_search' store=False args: 'Phone/Mobile'
  • phone_state Selection
    compute='_compute_phone_state' store=True string='Phone Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    compute='_compute_probabilities' copy=False group_operator='avg' readonly=False store=True args: 'Probability'
  • prorated_revenue Monetary
    compute='_compute_prorated_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • recurring_plan Many2one → crm.recurring.plan
    groups='crm.group_use_recurring_revenues' string='Recurring Plan' args: 'crm.recurring.plan'
  • recurring_revenue Monetary
    currency_field='company_currency' groups='crm.group_use_recurring_revenues' args: 'Recurring Revenues'
  • recurring_revenue_monthly Monetary
    compute='_compute_recurring_revenue_monthly' currency_field='company_currency' groups='crm.group_use_recurring_revenues' store=True args: 'Expected MRR'
  • recurring_revenue_monthly_prorated Monetary
    compute='_compute_recurring_revenue_monthly_prorated' currency_field='company_currency' groups='crm.group_use_recurring_revenues' store=True args: 'Prorated MRR'
  • referred Char
    args: 'Referred By'
  • ribbon_message Char
    compute='_compute_ribbon_message' args: 'Ribbon message'
  • stage_id Many2one → crm.stage
    compute='_compute_stage_id' copy=False domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'crm.stage'
  • state_id Many2one → res.country.state
    compute='_compute_partner_address_values' domain="[('country_id', '=?', country_id)]" readonly=False store=True string='State' args: 'res.country.state'
  • street Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street'
  • street2 Char
    compute='_compute_partner_address_values' readonly=False store=True args: 'Street2'
  • tag_ids Many2many → crm.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.tag', 'crm_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' index=True readonly=False store=True string='Sales Team' tracking=True args: 'crm.team'
  • title Many2one → res.partner.title
    compute='_compute_title' readonly=False store=True string='Title' args: 'res.partner.title'
  • type Selection
    default=<expr> index=True required=True tracking=15 args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_email Char
    readonly=True related='user_id.email' args: 'User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' tracking=True args: 'res.users'
  • user_login Char
    readonly=True related='user_id.login' args: 'User Login'
  • website Char
    compute='_compute_website' help='Website of the contact' index=True readonly=False store=True args: 'Website'
  • zip Char
    change_default=True compute='_compute_partner_address_values' readonly=False store=True args: 'Zip'
Public methods (23)
  • action_schedule_meeting(self)
    Open meeting's calendar view to schedule meeting on current opportunity. :return dict: dictionary value for created Meeting view
  • action_set_automated_probability(self)
  • action_set_lost(self, **additional_values)
    Lost semantic: probability = 0 or active = False
  • action_set_won(self)
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
  • action_snooze(self)
  • convert_opportunity(self, partner_id, user_ids=False, team_id=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • get_empty_list_help(self, help)
    @api.model
  • get_import_templates(self)
    @api.model
  • get_rainbowman_message(self)
  • handle_partner_assignment(self, force_partner_id=False, create_missing=True)
    Update customer (partner_id) of leads. Purpose is to set the same partner on most leads; either through a newly created partner either through a given partner_id. :param int force_partner_id: if set, update all leads to that customer; :param create_missing: for leads without customer, create a new one based on lead information;
  • handle_salesmen_assignment(self, user_ids=None, team_id=False)
    Assign salesmen and salesteam to a batch of leads. If there are more leads than salesmen, these salesmen will be assigned in round-robin. E.g. 4 salesmen (S1, S2, S3, S4) for 6 leads (L1, L2, ... L6) will assigned as following: L1 - S1, L2 - S2, L3 - S3, L4 - S4, L5 - S1, L6 - S2. :param list user_ids: salesmen to assign :param int team_id: salesteam to assign
  • log_meeting(self, meeting_subject, meeting_date, duration)
  • merge_dependences(self, opportunities)
    Merge dependences (messages, attachments, ...). These dependences will be transfered to `self`, the most important lead. :param opportunities : recordset of opportunities to transfer. Does not include `self` which is the target crm.lead being the result of the merge.
  • merge_opportunity(self, user_id=False, team_id=False, auto_unlink=True)
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the Sales Team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • redirect_lead_opportunity_view(self)
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model
    Override to support ordering on activity_date_deadline_my. Ordering through web client calls search_read with an order parameter set. Search_read then calls search. In this override we therefore override search to intercept a search without count with an order on activity_date_deadline_my. In that case we do the search in two steps. First step: fill with deadline-based results * Perform a read_group on my activities to get a mapping lead_id / deadline Remember date_deadline is required, we always have a value for it. Only the earliest deadline per lead is kept. * Search leads linked to those activities that also match the asked domain and order from the original search request. * Results of that search will be at the top of returned results. Use limit None because we have to search all leads linked to activities as ordering on deadline is done in post processing. * Reorder them according to deadline asc or desc depending on original search ordering. Finally take only a subset of those leads to fill with results matching asked offset / limit. Second step: fill with other results. If first step does not gives results enough to match offset and limit parameters we fill with a search on other leads. We keep the asked domain and ordering while filtering out already scanned leads to keep a coherent results. All other search and search_read are left untouched by this override to avoid side effects. Search_count is not affected by this override.
  • toggle_active(self)
    When archiving: mark probability as 0. When re-activating update probability again, for leads and opportunities.
  • unlink(self)
    Update meetings when removing opportunities, otherwise you have a link to a record that does not lead anywhere.
  • write(self, vals)

New fields (1)
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)

New fields (5)
  • lost_count Float
    digits=(16, 1) args: 'Lost Count'
  • team_id Many2one → crm.team
    args: 'crm.team', 'Sales Team'
  • value Char
    args: 'Value'
  • variable Char
    index=True args: 'Variable'
  • won_count Float
    digits=(16, 1) args: 'Won Count'
Public methods (0)

No public methods.

New fields (2)
  • field_id Many2one → ir.model.fields
    domain=[('model_id.model', '=', 'crm.lead')] ondelete='cascade' required=True args: 'ir.model.fields'
  • name Char
    related='field_id.field_description'
Public methods (0)

No public methods.

New fields (8)
  • action Selection
    compute='_compute_action' compute_sudo=False readonly=False store=True string='Related Customer' args: [('create', 'Create a new customer'), ('exist', 'Link to an existing customer'), ('nothing', 'Do not link to a customer')]
  • duplicated_lead_ids Many2many → crm.lead
    compute='_compute_duplicated_lead_ids' compute_sudo=False context={'active_test': False} readonly=False store=True string='Opportunities' args: 'crm.lead'
  • force_assignment Boolean
    default=True help='If checked, forces salesman to be updated on updated opportunities even if already set.' args: 'Force assignment'
  • lead_id Many2one → crm.lead
    required=True args: 'crm.lead', 'Associated Lead'
  • name Selection
    compute='_compute_name' compute_sudo=False readonly=False store=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' compute_sudo=False readonly=False store=True args: 'res.partner', 'Customer'
  • team_id Many2one → crm.team
    compute='_compute_team_id' compute_sudo=False readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    compute='_compute_user_id' compute_sudo=False readonly=False store=True args: 'res.users', 'Salesperson'
Public methods (3)
  • action_apply(self)
  • default_get(self, fields)
    @api.model
    Allow support of active_id / active_model instead of jut default_lead_id to ease window action definitions, and be backward compatible.
  • view_init(self, fields)
    @api.model
    Check some preconditions before the wizard executes.

New fields (6)
  • action Selection
    ondelete={'each_exist_or_create': <expr>} selection_add=[('each_exist_or_create', 'Use existing partner or create')] string='Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignment Boolean
    default=False
  • lead_id Many2one
    required=False
  • lead_tomerge_ids Many2many → crm.lead
    context={'active_test': False} default=<expr> string='Active Leads' args: 'crm.lead', 'crm_convert_lead_mass_lead_rel'
  • user_ids Many2many → res.users
    string='Salespersons' args: 'res.users'
Public methods (1)
  • action_mass_convert(self)

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • leads_count Integer
    compute='_compute_leads_count' args: 'Leads Count'
  • name Char
    required=True translate=True args: 'Description'
Public methods (1)
  • action_lost_leads(self)

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    compute='_compute_team_id' index=True readonly=False store=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Plan Name'
  • number_of_months Integer
    required=True args: '# Months'
  • sequence Integer
    default=10 args: 'Sequence'
Public methods (0)

No public methods.

New fields (7)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • is_won Boolean
    args: 'Is Won Stage?'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    Hack : when going from the pipeline, creating a stage with a sales team in context should not create a stage for the current Sales Team only

New fields (10)
  • alias_id Many2one → mail.alias
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • alias_user_id Many2one → res.users
    domain=<expr> inherited=True related='alias_id.alias_user_id' args: 'res.users'
  • lead_all_assigned_month_count Integer
    compute='_compute_lead_all_assigned_month_count' help='Number of leads and opportunities assigned this last month.' string='# Leads/Opps assigned this month'
  • lead_unassigned_count Integer
    compute='_compute_lead_unassigned_count' string='# Unassigned Leads'
  • opportunities_amount Monetary
    compute='_compute_opportunities_data' string='Opportunities Revenues'
  • opportunities_count Integer
    compute='_compute_opportunities_data' string='# Opportunities'
  • opportunities_overdue_amount Monetary
    compute='_compute_opportunities_overdue_data' string='Overdue Opportunities Revenues'
  • opportunities_overdue_count Integer
    compute='_compute_opportunities_overdue_data' string='# Overdue Opportunities'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (3)
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • write(self, vals)

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads/Opportunities'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (14)
  • crm_alias_prefix Char
    compute='_compute_crm_alias_prefix' readonly=False store=True args: 'Default Alias Name for Leads'
  • generate_lead_from_alias Boolean
    compute='_compute_generate_lead_from_alias' config_parameter='crm.generate_lead_from_alias' readonly=False store=True args: 'Manual Assignment of Emails'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • group_use_recurring_revenues Boolean
    implied_group='crm.group_use_recurring_revenues' string='Recurring Revenues'
  • lead_enrich_auto Selection
    config_parameter='crm.iap.lead.enrich.setting' default='manual' string='Enrich lead automatically' args: [('manual', 'Enrich leads on demand only'), ('auto', 'Enrich all leads automatically')]
  • lead_mining_in_pipeline Boolean
    config_parameter='crm.lead_mining_in_pipeline' args: 'Create a lead mining request directly from the opportunity pipeline.'
  • module_crm_iap_lead Boolean
    args: 'Generate new leads based on their country, industries, size, etc.'
  • module_crm_iap_lead_enrich Boolean
    args: 'Enrich your leads automatically with company data based on their email address.'
  • module_crm_iap_lead_website Boolean
    args: "Create Leads/Opportunities from your website's traffic"
  • module_mail_client_extension Boolean
    args: 'See and manage users, companies, and leads from our mail client extensions.'
  • predictive_lead_scoring_fields Many2many → crm.lead.scoring.frequency.field
    compute='_compute_pls_fields' inverse='_inverse_pls_fields_str' string='Lead Scoring Frequency Fields' args: 'crm.lead.scoring.frequency.field'
  • predictive_lead_scoring_fields_str Char
    config_parameter='crm.pls_fields' string='Lead Scoring Frequency Fields in String'
  • predictive_lead_scoring_start_date Date
    compute='_compute_pls_start_date' inverse='_inverse_pls_start_date_str' string='Lead Scoring Starting Date'
  • predictive_lead_scoring_start_date_str Char
    config_parameter='crm.pls_start_date' string='Lead Scoring Starting Date in String'
Public methods (3)
  • action_reset_lead_probabilities(self)
  • get_values(self)
    @api.model
  • set_values(self)

New fields (5)
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • meeting_ids Many2many → calendar.event
    copy=False string='Meetings' args: 'calendar.event', 'calendar_event_res_partner_rel', 'res_partner_id', 'calendar_event_id'
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (3)
  • action_view_opportunity(self)
    This function returns an action that displays the opportunities from partner.
  • default_get(self, fields)
    @api.model
  • schedule_meeting(self)

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (2)
  • crm_lead_count Integer
    compute='_compute_crm_lead_count' groups='sales_team.group_sale_salesman' args: 'Leads/Opportunities count'
  • use_leads Boolean
    compute='_compute_use_leads' args: 'Use Leads'
Public methods (1)
  • action_redirect_to_leads_opportunities(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales/CRM
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Aaron Bohy, Jeremy Kersten, Lucas Perais (lpe), Barad Mahendra, Yannick Tivisse, Martin Geubelle, Dharmraj Jhala, Odoo Online, Pierre Masereel, Jigar Patel, jem-odoo, Adrien Dieudonne, Jorge Pinna Puissant, Alexandre Kühn, Adrian Torres, Aurélien Warnon, Xavier-Do, jerome hanke (jhk), Florimond Husquinet (fhu), Andrea Grazioso (agr-odoo), Sébastien Theys, Nasreddin (bon), fw-bot, Anh Thao Pham (pta), David Beguin, Ivan Yelizariev, Naglis Jonaitis, Jérémy Hennecart, Prakash Prajapati, IEL, Pierre Rousseau, Thanh Dodeur, Mathieu Duckerts-Antoine, Varun Raval, Hiral Bhavsar, shreya thakrar, Jinal Patel, Kevin Baptiste, qmo-odoo, Geoffroy Larue, Nshimiyimana Séna, Louis Baudoux
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - calendar
    - resource
    - fetchmail
    - utm
    - contacts
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (46)
XML IDNameModelTypeStatus
assets_backend crm assets ir.ui.view qweb Inherits web.assets_backend
assets_tests CRM Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_tag_form crm.lead.tag.form crm.lead.tag form New
crm_lead_tag_tree crm.lead.tag.tree crm.lead.tag tree New
crm_lead_view_activity crm.lead.view.activity crm.lead activity New
crm_lead_view_form crm.lead.form crm.lead form New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lead_view_tree_activity crm.lead.tree.opportunity.next.activity crm.lead tree New
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_lost_reason_view_tree crm.lost.reason.tree crm.lost.reason tree New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
utm_campaign_view_form utm.campaign.view.form utm.campaign xpath Inherits utm.utm_campaign_view_form
utm_campaign_view_kanban utm.campaign.view.kanban utm.campaign xpath Inherits utm.utm_campaign_view_kanban
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (19)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model
  • default_get(self, fields)
    @api.model

New fields (18)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Assigned To'
  • body Html
    readonly=True args: 'Activity Description'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Completion Date'
  • date_closed Datetime
    readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • lead_create_date Datetime
    readonly=True args: 'Creation Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Opportunity'
  • lead_type Selection
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (53)
  • active Boolean
    default=True tracking=True args: 'Active'
  • automated_probability Float
    readonly=True args: 'Automated Probability'
  • city Char
    args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one
    readonly=True related='company_id.currency_id' relation='res.currency' string='Currency'
  • company_id Many2one → res.company
    default=<expr> index=True string='Company' args: 'res.company'
  • contact_name Char
    tracking=30 args: 'Contact Name'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • date_action_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True string='Last Stage Update'
  • date_open Datetime
    default=fields.Datetime.now readonly=True args: 'Assignation Date'
  • day_close Float
    compute='_compute_day_close' store=True string='Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True string='Days to Assign'
  • description Text
    args: 'Notes'
  • email_from Char
    help='Email address of the contact' index=True tracking=40 args: 'Email'
  • email_state Selection
    compute='_compute_email_state' store=True string='Email Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • expected_revenue Monetary
    compute='_compute_expected_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • function Char
    args: 'Job Position'
  • is_automated_probability Boolean
    compute='_compute_is_automated_probability' args: 'Is automated probability?'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Kanban State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lang_id Many2one → res.lang
    help='Language of the lead.' string='Language' args: 'res.lang'
  • lost_reason Many2one → crm.lost.reason
    index=True string='Lost Reason' tracking=True args: 'crm.lost.reason'
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • mobile Char
    args: 'Mobile'
  • name Char
    index=True required=True args: 'Opportunity'
  • partner_address_email Char
    readonly=True related='partner_id.email' args: 'Partner Contact Email'
  • partner_address_name Char
    readonly=True related='partner_id.name' args: 'Partner Contact Name'
  • partner_address_phone Char
    readonly=True related='partner_id.phone' args: 'Partner Contact Phone'
  • partner_id Many2one → res.partner
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Customer' tracking=10 args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    help='The name of the future partner company that will be created while converting the lead into opportunity' index=True tracking=20 args: 'Company Name'
  • phone Char
    tracking=50 args: 'Phone'
  • phone_state Selection
    compute='_compute_phone_state' store=True string='Phone Quality' args: [('correct', 'Correct'), ('incorrect', 'Incorrect')]
  • planned_revenue Monetary
    currency_field='company_currency' tracking=True args: 'Expected Revenue'
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    copy=False group_operator='avg' args: 'Probability'
  • referred Char
    args: 'Referred By'
  • stage_id Many2one → crm.stage
    copy=False default=<expr> domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' string='Stage' tracking=True args: 'crm.stage'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • tag_ids Many2many → crm.lead.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.lead.tag', 'crm_lead_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    default=<expr> help='When sending mails, the default email address is taken from the Sales Team.' index=True string='Sales Team' tracking=True args: 'crm.team'
  • title Many2one → res.partner.title
    args: 'res.partner.title'
  • type Selection
    default=<expr> help='Type is used to separate Leads and Opportunities' index=True required=True tracking=15 args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_email Char
    readonly=True related='user_id.email' args: 'User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' tracking=True args: 'res.users'
  • user_login Char
    readonly=True related='user_id.login' args: 'User Login'
  • website Char
    help='Website of the contact' index=True args: 'Website'
  • zip Char
    change_default=True args: 'Zip'
Public methods (23)
  • action_schedule_meeting(self)
    Open meeting's calendar view to schedule meeting on current opportunity. :return dict: dictionary value for created Meeting view
  • action_set_automated_probability(self)
  • action_set_lost(self, **additional_values)
    Lost semantic: probability = 0 or active = False
  • action_set_won(self)
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
  • allocate_salesman(self, user_ids=None, team_id=False)
    Assign salesmen and salesteam to a batch of leads. If there are more leads than salesmen, these salesmen will be assigned in round-robin. E.g.: 4 salesmen (S1, S2, S3, S4) for 6 leads (L1, L2, ... L6). They will be assigned as followed: L1 - S1, L2 - S2, L3 - S3, L4 - S4, L5 - S1, L6 - S2. :param list ids: leads/opportunities ids to process :param list user_ids: salesmen to assign :param int team_id: salesteam to assign :return bool
  • convert_opportunity(self, partner_id, user_ids=False, team_id=False)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • get_duplicated_leads(self, partner_id, include_lost=False)
    Search for opportunities that have the same partner and that arent done or cancelled :param partner_id : partner to search
  • get_empty_list_help(self, help)
    @api.model
  • get_import_templates(self)
    @api.model
  • handle_partner_assignation(self, action='create', partner_id=False)
    Handle partner assignation during a lead conversion. if action is 'create', create new partner with contact and assign lead to new partner_id. otherwise assign lead to the specified partner_id :param list ids: leads/opportunities ids to process :param string action: what has to be done regarding partners (create it, assign an existing one, or nothing) :param int partner_id: partner to assign if any :return dict: dictionary organized as followed: {lead_id: partner_assigned_id}
  • log_meeting(self, meeting_subject, meeting_date, duration)
  • merge_dependences(self, opportunities)
    Merge dependences (messages, attachments, ...). These dependences will be transfered to `self`, the most important lead. :param opportunities : recordset of opportunities to transfert. Does not include `self`.
  • merge_opportunity(self, user_id=False, team_id=False)
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the Sales Team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • modify_target_sales_dashboard(self, target_name, target_value)
    @api.model
    Update the user objectives (`target_sales_done`, target_sales_won` and `target_sales_invoiced` fields). :param target_name : part of the fields name to update :param target_value : value of the field to update
  • redirect_lead_opportunity_view(self)
  • retrieve_sales_dashboard(self)
    @api.model
    Fetch data to setup Sales Dashboard
  • toggle_active(self)
  • unlink(self)
    Update meetings when removing opportunities, otherwise you have a link to a record that does not lead anywhere.
  • write(self, vals)

New fields (1)
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)

New fields (5)
  • lost_count Float
    digits=(16, 1) args: 'Lost Count'
  • team_id Many2one → crm.team
    args: 'crm.team', 'Sales Team'
  • value Char
    args: 'Value'
  • variable Char
    index=True args: 'Variable'
  • won_count Float
    digits=(16, 1) args: 'Won Count'
Public methods (0)

No public methods.

New fields (2)
  • field_id Many2one → ir.model.fields
    domain=[('model_id.model', '=', 'crm.lead')] required=True args: 'ir.model.fields'
  • name Char
    related='field_id.field_description'
Public methods (0)

No public methods.

New fields (2)
  • color Integer
    args: 'Color Index'
  • name Char
    required=True translate=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (4)
  • name Selection
    required=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • opportunity_ids Many2many → crm.lead
    string='Opportunities' args: 'crm.lead'
  • team_id Many2one → crm.team
    index=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (4)
  • action_apply(self)
    Convert lead to opportunity or merge lead and opportunity and open the freshly created opportunity view.
  • default_get(self, fields)
    @api.model
    Default get for name, opportunity_ids. If there is an exisitng partner link to the lead, find all existing opportunities links with this partner to merge all information together
  • onchange_action(self)
    @api.onchange('action')
  • view_init(self, fields)
    @api.model
    Check some preconditions before the wizard executes.

New fields (5)
  • action Selection
    required=True selection_add=[('each_exist_or_create', 'Use existing partner or create'), ('nothing', 'Do not link to a customer')] string='Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignation Boolean
    help='If unchecked, this will leave the salesman of duplicated opportunities' args: 'Force assignation'
  • team_id Many2one → crm.team
    index=True args: 'crm.team', 'Sales Team'
  • user_ids Many2many → res.users
    string='Salesmen' args: 'res.users'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • mass_convert(self)

New fields (2)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Description'
Public methods (0)

No public methods.

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    index=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (2)
  • action Selection
    required=True args: [('create', 'Create a new customer'), ('exist', 'Link to an existing customer'), ('nothing', 'Do not link to a customer')], 'Related Customer'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Customer'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (7)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • is_won Boolean
    args: 'Is Won Stage?'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    Hack : when going from the pipeline, creating a stage with a sales team in context should not create a stage for the current Sales Team only

New fields (9)
  • alias_id Many2one → mail.alias
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • alias_user_id Many2one → res.users
    domain=<expr> inherited=True related='alias_id.alias_user_id' args: 'res.users'
  • opportunities_amount Integer
    compute='_compute_opportunities' string='Opportunities Revenues'
  • opportunities_count Integer
    compute='_compute_opportunities' string='Number of open opportunities'
  • overdue_opportunities_amount Integer
    compute='_compute_overdue_opportunities' string='Overdue Opportunities Revenues'
  • overdue_opportunities_count Integer
    compute='_compute_overdue_opportunities' string='Number of overdue opportunities'
  • unassigned_leads_count Integer
    compute='_compute_unassigned_leads_count' string='Unassigned Leads'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (5)
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • write(self, vals)

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads/Opportunities'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (12)
  • crm_alias_prefix Char
    args: 'Default Alias Name for Leads'
  • generate_lead_from_alias Boolean
    config_parameter='crm.generate_lead_from_alias' args: 'Manual Assignation of Emails'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • lead_enrich_auto Selection
    config_parameter='crm.iap.lead.enrich.setting' default='manual' string='Enrich lead automatically' args: [('manual', 'Enrich leads on demand only'), ('auto', 'Enrich all leads automatically')]
  • lead_mining_in_pipeline Boolean
    config_parameter='crm.lead_mining_in_pipeline' args: 'Create a lead mining request directly from the opportunity pipeline.'
  • module_crm_iap_lead Boolean
    args: 'Generate new leads based on their country, industries, size, etc.'
  • module_crm_iap_lead_enrich Boolean
    args: 'Enrich your leads automatically with company data based on their email address.'
  • module_crm_iap_lead_website Boolean
    args: "Create Leads/Opportunities from your website's traffic"
  • predictive_lead_scoring_fields Many2many → crm.lead.scoring.frequency.field
    compute='_compute_pls_fields' inverse='_inverse_pls_fields_str' string='Lead Scoring Frequency Fields' args: 'crm.lead.scoring.frequency.field'
  • predictive_lead_scoring_fields_str Char
    config_parameter='crm.pls_fields' string='Lead Scoring Frequency Fields in String'
  • predictive_lead_scoring_start_date Date
    compute='_compute_pls_start_date' inverse='_inverse_pls_start_date_str' string='Lead Scoring Starting Date'
  • predictive_lead_scoring_start_date_str Char
    config_parameter='crm.pls_start_date' string='Lead Scoring Starting Date in String'
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)

New fields (6)
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • meeting_ids Many2many → calendar.event
    copy=False string='Meetings' args: 'calendar.event', 'calendar_event_res_partner_rel', 'res_partner_id', 'calendar_event_id'
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_count_ids Many2many → crm.lead
    compute='_compute_opportunity_count' help='Technical field used for stat button' string='Opportunities Count' args: 'crm.lead'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (3)
  • action_view_opportunity(self)
    This function returns an action that displays the opportunities from partner.
  • default_get(self, fields)
    @api.model
  • schedule_meeting(self)

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (3)
  • crm_lead_activated Boolean
    compute='_compute_crm_lead_activated' args: 'Use Leads'
  • lead_count Integer
    compute='_compute_global_opportunity_and_lead_count' groups='sales_team.group_sale_salesman' args: 'Lead Count'
  • opportunity_count Integer
    compute='_compute_global_opportunity_and_lead_count' groups='sales_team.group_sale_salesman' args: 'Opportunity Count'
Public methods (2)
  • action_redirect_to_leads(self)
  • action_redirect_to_opportunities(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, xmo-odoo, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, GitHub, Lucas Perais (lpe), Olivier Colson, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Martin Geubelle, Nicolas Seinlet, Toufik Benjaa, Adrien Dieudonne, RomainLibert, Christophe Monniez, Jorge Pinna Puissant, Jairo Llopis, Nans Lefebvre, Alexandre Kühn, Toufik Ben Jaa, Adrian Torres, XavierDo, Julien Castiaux, Rémi Rahir, Priyanka Kakadiya, Xavier-Do, jvm-odoo, Nasreddin (bon), Kinjal Mehta, Quentin Smetz (qsm), David Beguin, Denis Mudarisov, Mathieu Duckerts-Antoine, Pierre Paridans, TWA
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - calendar
    - resource
    - fetchmail
    - utm
    - contacts
    - digest
    - portal
    - http_routing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (42)
XML IDNameModelTypeStatus
assets_backend crm assets ir.ui.view qweb Inherits web.assets_backend
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_form_view_leads crm.lead.form.lead crm.lead form New
crm_case_form_view_oppor crm.lead.form.opportunity crm.lead form New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_tag_form crm.lead.tag.form crm.lead.tag form New
crm_lead_tag_tree crm.lead.tag.tree crm.lead.tag tree New
crm_lead_view_graph crm.lead.view.graph crm.lead graph New
crm_lead_view_pivot crm.lead.view.pivot crm.lead pivot New
crm_lead_view_tree_activity crm.lead.tree.opportunity.next.activity crm.lead tree New
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.lead graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.lead graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.lead pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.lead pivot New
crm_opportunity_report_view_search crm.lead.search crm.lead search New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
digest_digest_view_form digest.digest.view.form.inherit.crm.lead digest.digest xpath Inherits digest.digest_digest_view_form
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
quick_create_opportunity_form crm.lead.form.quick_create crm.lead form New
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
view_create_opportunity_simplified crm.lead.form.simple crm.lead form New
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (16)

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model
  • default_get(self, fields)
    @api.model

New fields (15)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Created By'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Lead'
  • lead_type Char
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner/Customer'
  • probability Float
    group_operator='avg' readonly=True args: 'Probability'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subject Char
    readonly=True args: 'Summary'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (51)
  • active Boolean
    default=True track_visibility=True args: 'Active'
  • city Char
    args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one
    readonly=True related='company_id.currency_id' relation='res.currency' string='Currency'
  • company_id Many2one → res.company
    default=<expr> index=True string='Company' args: 'res.company'
  • contact_name Char
    track_sequence=3 track_visibility='onchange' args: 'Contact Name'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • date_action_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True string='Last Stage Update'
  • date_open Datetime
    default=fields.Datetime.now readonly=True args: 'Assignation Date'
  • day_close Float
    compute='_compute_day_close' store=True string='Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True string='Days to Assign'
  • description Text
    args: 'Notes'
  • email_cc Text
    help='These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma' args: 'Global CC'
  • email_from Char
    help='Email address of the contact' index=True track_sequence=4 track_visibility='onchange' args: 'Email'
  • expected_revenue Monetary
    compute='_compute_expected_revenue' currency_field='company_currency' store=True args: 'Prorated Revenue'
  • function Char
    args: 'Job Position'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Kanban State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lost_reason Many2one → crm.lost.reason
    index=True string='Lost Reason' track_visibility='onchange' args: 'crm.lost.reason'
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • message_bounce Integer
    default=0 help='Counter of the number of bounced emails for this contact' args: 'Bounce'
  • mobile Char
    args: 'Mobile'
  • name Char
    index=True required=True args: 'Opportunity'
  • partner_address_email Char
    readonly=True related='partner_id.email' args: 'Partner Contact Email'
  • partner_address_mobile Char
    readonly=True related='partner_id.mobile' args: 'Partner Contact Mobile'
  • partner_address_name Char
    readonly=True related='partner_id.name' args: 'Partner Contact Name'
  • partner_address_phone Char
    readonly=True related='partner_id.phone' args: 'Partner Contact Phone'
  • partner_id Many2one → res.partner
    help='Linked partner (optional). Usually created when converting the lead. You can find a partner by its Name, TIN, Email or Internal Reference.' index=True string='Customer' track_sequence=1 track_visibility='onchange' args: 'res.partner'
  • partner_is_blacklisted Boolean
    readonly=True related='partner_id.is_blacklisted' args: 'Partner is blacklisted'
  • partner_name Char
    help='The name of the future partner company that will be created while converting the lead into opportunity' index=True track_sequence=2 track_visibility='onchange' args: 'Customer Name'
  • phone Char
    track_sequence=5 track_visibility='onchange' args: 'Phone'
  • planned_revenue Monetary
    currency_field='company_currency' track_visibility='always' args: 'Expected Revenue'
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    copy=False default=<expr> group_operator='avg' args: 'Probability'
  • referred Char
    args: 'Referred By'
  • stage_id Many2one → crm.stage
    copy=False default=<expr> domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' string='Stage' track_visibility='onchange' args: 'crm.stage'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • tag_ids Many2many → crm.lead.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.lead.tag', 'crm_lead_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    default=<expr> help='When sending mails, the default email address is taken from the Sales Team.' index=True oldname='section_id' string='Sales Team' track_visibility='onchange' args: 'crm.team'
  • title Many2one → res.partner.title
    args: 'res.partner.title'
  • type Selection
    default=<expr> help='Type is used to separate Leads and Opportunities' index=True required=True args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_email Char
    readonly=True related='user_id.email' args: 'User Email'
  • user_id Many2one → res.users
    default=<expr> string='Salesperson' track_visibility='onchange' args: 'res.users'
  • user_login Char
    readonly=True related='user_id.login' args: 'User Login'
  • website Char
    help='Website of the contact' index=True args: 'Website'
  • zip Char
    change_default=True args: 'Zip'
Public methods (29)
  • action_schedule_meeting(self)
    @api.multi
    Open meeting's calendar view to schedule meeting on current opportunity. :return dict: dictionary value for created Meeting view
  • action_set_lost(self)
    @api.multi
    Lost semantic: probability = 0, active = False
  • action_set_won(self)
    @api.multi
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
    @api.multi
  • allocate_salesman(self, user_ids=None, team_id=False)
    @api.multi
    Assign salesmen and salesteam to a batch of leads. If there are more leads than salesmen, these salesmen will be assigned in round-robin. E.g.: 4 salesmen (S1, S2, S3, S4) for 6 leads (L1, L2, ... L6). They will be assigned as followed: L1 - S1, L2 - S2, L3 - S3, L4 - S4, L5 - S1, L6 - S2. :param list ids: leads/opportunities ids to process :param list user_ids: salesmen to assign :param int team_id: salesteam to assign :return bool
  • close_dialog(self)
    @api.multi
  • convert_opportunity(self, partner_id, user_ids=False, team_id=False)
    @api.multi
  • copy(self, default=None)
    @api.multi@api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • edit_dialog(self)
    @api.multi
  • get_duplicated_leads(self, partner_id, include_lost=False)
    @api.multi
    Search for opportunities that have the same partner and that arent done or cancelled :param partner_id : partner to search
  • get_empty_list_help(self, help)
    @api.model
  • get_formview_id(self, access_uid=None)
    @api.multi
  • get_import_templates(self)
    @api.model
  • handle_partner_assignation(self, action='create', partner_id=False)
    @api.multi
    Handle partner assignation during a lead conversion. if action is 'create', create new partner with contact and assign lead to new partner_id. otherwise assign lead to the specified partner_id :param list ids: leads/opportunities ids to process :param string action: what has to be done regarding partners (create it, assign an existing one, or nothing) :param int partner_id: partner to assign if any :return dict: dictionary organized as followed: {lead_id: partner_assigned_id}
  • log_meeting(self, meeting_subject, meeting_date, duration)
    @api.multi
  • merge_dependences(self, opportunities)
    @api.multi
    Merge dependences (messages, attachments, ...). These dependences will be transfered to `self`, the most important lead. :param opportunities : recordset of opportunities to transfert. Does not include `self`.
  • merge_opportunity(self, user_id=False, team_id=False)
    @api.multi
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the Sales Team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_get_default_recipients(self)
    @api.multi
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_partner_info_from_emails(self, emails, link_mail=False)
    @api.multi
  • modify_target_sales_dashboard(self, target_name, target_value)
    @api.model
    Update the user objectives (`target_sales_done`, target_sales_won` and `target_sales_invoiced` fields). :param target_name : part of the fields name to update :param target_value : value of the field to update
  • name_create(self, name)
    @api.model
  • redirect_lead_view(self)
    @api.multi
  • redirect_opportunity_view(self)
    @api.multi
  • retrieve_sales_dashboard(self)
    @api.model
    Fetch data to setup Sales Dashboard
  • toggle_active(self)
    When re-activating leads and opportunities set their probability to the default stage one.
  • write(self, vals)
    @api.multi

New fields (1)
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)
    @api.multi

New fields (2)
  • color Integer
    args: 'Color Index'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (4)
  • name Selection
    required=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • opportunity_ids Many2many → crm.lead
    string='Opportunities' args: 'crm.lead'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (4)
  • action_apply(self)
    @api.multi
    Convert lead to opportunity or merge lead and opportunity and open the freshly created opportunity view.
  • default_get(self, fields)
    @api.model
    Default get for name, opportunity_ids. If there is an exisitng partner link to the lead, find all existing opportunities links with this partner to merge all information together
  • onchange_action(self)
    @api.onchange('action')
  • view_init(self, fields)
    @api.model
    Check some preconditions before the wizard executes.

New fields (5)
  • action Selection
    required=True args: [('each_exist_or_create', 'Use existing partner or create'), ('nothing', 'Do not link to a customer')], 'Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignation Boolean
    help='If unchecked, this will leave the salesman of duplicated opportunities' args: 'Force assignation'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_ids Many2many → res.users
    string='Salesmen' args: 'res.users'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • mass_convert(self)
    @api.multi

New fields (2)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
    @api.multi
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (2)
  • action Selection
    required=True args: [('exist', 'Link to an existing customer'), ('create', 'Create a new customer'), ('nothing', 'Do not link to a customer')], 'Related Customer'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Customer'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (9)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or issues that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True translate=True args: 'Stage Name'
  • on_change Boolean
    help='Setting this stage will change the probability automatically on the opportunity.' args: 'Change Probability Automatically'
  • probability Float
    default=10.0 help='This percentage depicts the default/average probability of the Case for this stage to be a success' required=True args: 'Probability (%)'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_count Integer
    compute='_compute_team_count' args: 'team_count'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Sales Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    Hack : when going from the pipeline, creating a stage with a sales team in context should not create a stage for the current Sales Team only

New fields (9)
  • alias_id Many2one → mail.alias
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • dashboard_graph_group_pipeline Selection
    default='day' help="How this channel's dashboard graph will group the results." string='Grouping Method' args: [('day', 'Expected Closing Day'), ('week', 'Expected Closing Week'), ('month', 'Expected Closing Month'), ('user', 'Salesperson'), ('stage', 'Stage')]
  • dashboard_graph_model Selection
    selection_add=[('crm.lead', 'Pipeline')]
  • dashboard_graph_period_pipeline Selection
    compute='_compute_dashboard_graph_period_pipeline' help="The time period this channel's dashboard graph will consider." inverse='_inverse_dashboard_graph_period_pipeline' string='Expected to Close' args: [('week', 'Within a Week'), ('month', 'Within a Month'), ('year', 'Within a Year')]
  • opportunities_amount Integer
    compute='_compute_opportunities' readonly=True string='Opportunities Revenues'
  • opportunities_count Integer
    compute='_compute_opportunities' readonly=True string='Number of open opportunities'
  • unassigned_leads_count Integer
    compute='_compute_unassigned_leads_count' readonly=True string='Unassigned Leads'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (5)
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • write(self, vals)
    @api.multi

New fields (4)
  • kpi_crm_lead_created Boolean
    args: 'New Leads/Opportunities'
  • kpi_crm_lead_created_value Integer
    compute='_compute_kpi_crm_lead_created_value'
  • kpi_crm_opportunities_won Boolean
    args: 'Opportunities Won'
  • kpi_crm_opportunities_won_value Integer
    compute='_compute_kpi_crm_opportunities_won_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (5)
  • crm_alias_prefix Char
    args: 'Default Alias Name for Leads'
  • generate_lead_from_alias Boolean
    config_parameter='crm.generate_lead_from_alias' args: 'Manual Assignation of Emails'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • module_crm_phone_validation Boolean
    args: 'Phone Formatting'
  • module_crm_reveal Boolean
    args: "Create Leads/Opportunities from your website's traffic"
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)
    @api.multi

New fields (5)
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • meeting_ids Many2many → calendar.event
    copy=False string='Meetings' args: 'calendar.event', 'calendar_event_res_partner_rel', 'res_partner_id', 'calendar_event_id'
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    oldname='section_id' string='Sales Team' args: 'crm.team'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • schedule_meeting(self)
    @api.multi

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Damien Bouvy, Olivier Colson, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Denis Vermylen (dve), Toufik Benjaa, DVE, fwi-odoo, RomainLibert, len-odoo, Jorge Pinna Puissant, Denis Vermylen, Rémi Rahir, Andrea Grazioso (agr-odoo), Nasreddin (bon)
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - sales_team
    - mail
    - bus
    - web_tour
    - calendar
    - resource
    - fetchmail
    - utm
    - web_planner
    - contacts
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (42)
XML IDNameModelTypeStatus
assets_backend crm assets ir.ui.view qweb Inherits web.assets_backend
base_partner_merge_automatic_wizard_form base.partner.merge.automatic.wizard.form base.partner.merge.automatic.wizard form New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_form_view_leads crm.lead.form.lead crm.lead form New
crm_case_form_view_oppor crm.lead.form.opportunity crm.lead form New
crm_case_graph_view_leads crm.lead.graph.lead crm.lead graph New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_pivot_view_leads crm.lead.pivot.lead crm.lead pivot New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_tag_form crm.lead.tag.form crm.lead.tag form New
crm_lead_tag_tree crm.lead.tag.tree crm.lead.tag tree New
crm_lead_view_tree_activity crm.lead.tree.opportunity.next.activity crm.lead tree New
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.opportunity.report graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.opportunity.report graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.opportunity.report pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.opportunity.report pivot New
crm_opportunity_report_view_search crm.opportunity.report.select crm.opportunity.report search New
crm_planner crm_planner ir.ui.view qweb New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
res_config_settings_view_form res.config.settings.view.form.inherit.crm res.config.settings xpath Inherits base.res_config_settings_view_form
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
view_create_opportunity_simplified crm.lead.form.simple crm.lead form New
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead_kanban crm.lead.kanban crm.lead kanban New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
Models touched (19)

New fields (14)
  • current_line_id Many2one → base.partner.merge.line
    string='Current Line' args: 'base.partner.merge.line'
  • dst_partner_id Many2one → res.partner
    string='Destination Contact' args: 'res.partner'
  • exclude_contact Boolean
    args: 'A user associated to the contact'
  • exclude_journal_item Boolean
    args: 'Journal Items associated to the contact'
  • group_by_email Boolean
    args: 'Email'
  • group_by_is_company Boolean
    args: 'Is Company'
  • group_by_name Boolean
    args: 'Name'
  • group_by_parent_id Boolean
    args: 'Parent Company'
  • group_by_vat Boolean
    args: 'VAT'
  • line_ids One2many → base.partner.merge.line
    string='Lines' args: 'base.partner.merge.line', 'wizard_id'
  • maximum_group Integer
    args: 'Maximum of Group of Contacts'
  • number_group Integer
    readonly=True args: 'Group of Contacts'
  • partner_ids Many2many → res.partner
    string='Contacts' args: 'res.partner'
  • state Selection
    default='option' readonly=True required=True string='State' args: [('option', 'Option'), ('selection', 'Selection'), ('finished', 'Finished')]
Public methods (7)
  • action_merge(self)
    @api.multi
    Merge Contact button. Merge the selected partners, and redirect to the end screen (since there is no other wizard line to process.
  • action_skip(self)
    @api.multi
    Skip this wizard line. Don't compute any thing, and simply redirect to the new step.
  • action_start_automatic_process(self)
    @api.multi
    Start the process 'Merge Automatically'. This will fill the wizard with the same mechanism as 'Merge with Manual Check', but instead of refreshing wizard with the current line, it will automatically process all lines by merging partner grouped according to the checked options.
  • action_start_manual_process(self)
    @api.multi
    Start the process 'Merge with Manual Check'. Fill the wizard according to the group_by and exclude options, and redirect to the first step (treatment of first wizard line). After, for each subset of partner to merge, the wizard will be actualized. - Compute the selected groups (with duplication) - If the user has selected the 'exclude_xxx' fields, avoid the partners
  • action_update_all_process(self)
    @api.multi
  • default_get(self, fields)
    @api.model
  • parent_migration_process_cb(self)
    @api.multi

New fields (3)
  • aggr_ids Char
    required=True args: 'Ids'
  • min_id Integer
    args: 'MinID'
  • wizard_id Many2one → base.partner.merge.automatic.wizard
    args: 'base.partner.merge.automatic.wizard', 'Wizard'
Public methods (0)

No public methods.

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" args: 'crm.lead', 'Opportunity'
Public methods (2)
  • create(self, vals)
    @api.model
  • default_get(self, fields)
    @api.model

New fields (15)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Created By'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Lead'
  • lead_type Char
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • mail_activity_type_id Many2one → mail.activity.type
    readonly=True args: 'mail.activity.type', 'Activity Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner/Customer'
  • probability Float
    group_operator='avg' readonly=True args: 'Probability'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subject Char
    readonly=True args: 'Summary'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Subtype'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Channel'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (50)
  • active Boolean
    default=True args: 'Active'
  • city Char
    args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one
    readonly=True related='company_id.currency_id' relation='res.currency' string='Currency'
  • company_id Many2one → res.company
    default=<expr> index=True string='Company' args: 'res.company'
  • contact_name Char
    args: 'Contact Name'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • create_date Datetime
    readonly=True args: 'Create Date'
  • date_action_last Datetime
    readonly=True args: 'Last Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True string='Last Stage Update'
  • date_open Datetime
    default=fields.Datetime.now readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day_close' store=True string='Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True string='Days to Assign'
  • description Text
    args: 'Notes'
  • email_cc Text
    help='These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma' args: 'Global CC'
  • email_from Char
    help='Email address of the contact' index=True args: 'Email'
  • function Char
    args: 'Job Position'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Activity State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lost_reason Many2one → crm.lost.reason
    index=True string='Lost Reason' track_visibility='onchange' args: 'crm.lost.reason'
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • message_bounce Integer
    default=0 help='Counter of the number of bounced emails for this contact' args: 'Bounce'
  • mobile Char
    args: 'Mobile'
  • name Char
    index=True required=True args: 'Opportunity'
  • opt_out Boolean
    help="If opt-out is checked, this contact has refused to receive emails for mass mailing and marketing campaign. Filter 'Available for Mass Mailing' allows users to filter the leads when performing mass mailing." oldname='optout' string='Opt-Out'
  • partner_address_email Char
    readonly=True related='partner_id.email' args: 'Partner Contact Email'
  • partner_address_name Char
    readonly=True related='partner_id.name' args: 'Partner Contact Name'
  • partner_id Many2one → res.partner
    help='Linked partner (optional). Usually created when converting the lead.' index=True string='Customer' track_visibility='onchange' args: 'res.partner'
  • partner_name Char
    help='The name of the future partner company that will be created while converting the lead into opportunity' index=True args: 'Customer Name'
  • phone Char
    args: 'Phone'
  • planned_revenue Float
    track_visibility='always' args: 'Expected Revenue'
  • priority Selection
    default=<expr> index=True string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    default=<expr> group_operator='avg' args: 'Probability'
  • referred Char
    args: 'Referred By'
  • stage_id Many2one → crm.stage
    default=<expr> domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'crm.stage'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • tag_ids Many2many → crm.lead.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.lead.tag', 'crm_lead_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    default=<expr> help='When sending mails, the default email address is taken from the sales channel.' index=True oldname='section_id' string='Sales Channel' track_visibility='onchange' args: 'crm.team'
  • title Many2one → res.partner.title
    args: 'res.partner.title'
  • type Selection
    default=<expr> help='Type is used to separate Leads and Opportunities' index=True required=True args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_email Char
    readonly=True related='user_id.email' args: 'User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' track_visibility='onchange' args: 'res.users'
  • user_login Char
    readonly=True related='user_id.login' args: 'User Login'
  • website Char
    help='Website of the contact' index=True args: 'Website'
  • write_date Datetime
    readonly=True args: 'Update Date'
  • zip Char
    change_default=True args: 'Zip'
Public methods (31)
  • action_schedule_meeting(self)
    @api.multi
    Open meeting's calendar view to schedule meeting on current opportunity. :return dict: dictionary value for created Meeting view
  • action_set_active(self)
    @api.multi
  • action_set_lost(self)
    @api.multi
    Lost semantic: probability = 0, active = False
  • action_set_unactive(self)
    @api.multi
  • action_set_won(self)
    @api.multi
    Won semantic: probability = 100 (active untouched)
  • action_set_won_rainbowman(self)
    @api.multi
  • allocate_salesman(self, user_ids=None, team_id=False)
    @api.multi
    Assign salesmen and salesteam to a batch of leads. If there are more leads than salesmen, these salesmen will be assigned in round-robin. E.g.: 4 salesmen (S1, S2, S3, S4) for 6 leads (L1, L2, ... L6). They will be assigned as followed: L1 - S1, L2 - S2, L3 - S3, L4 - S4, L5 - S1, L6 - S2. :param list ids: leads/opportunities ids to process :param list user_ids: salesmen to assign :param int team_id: salesteam to assign :return bool
  • close_dialog(self)
    @api.multi
  • convert_opportunity(self, partner_id, user_ids=False, team_id=False)
    @api.multi
  • copy(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • edit_dialog(self)
    @api.multi
  • get_duplicated_leads(self, partner_id, include_lost=False)
    @api.multi
    Search for opportunities that have the same partner and that arent done or cancelled :param partner_id : partner to search
  • get_empty_list_help(self, help)
    @api.model
  • get_formview_id(self, access_uid=None)
    @api.multi
  • handle_partner_assignation(self, action='create', partner_id=False)
    @api.multi
    Handle partner assignation during a lead conversion. if action is 'create', create new partner with contact and assign lead to new partner_id. otherwise assign lead to the specified partner_id :param list ids: leads/opportunities ids to process :param string action: what has to be done regarding partners (create it, assign an existing one, or nothing) :param int partner_id: partner to assign if any :return dict: dictionary organized as followed: {lead_id: partner_assigned_id}
  • log_meeting(self, meeting_subject, meeting_date, duration)
    @api.multi
  • merge_dependences(self, opportunities)
    @api.multi
    Merge dependences (messages, attachments, ...). These dependences will be transfered to `self`, the most important lead. :param opportunities : recordset of opportunities to transfert. Does not include `self`.
  • merge_opportunity(self, user_id=False, team_id=False)
    @api.multi
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the sales channel. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_get_default_recipients(self)
    @api.multi
  • message_get_reply_to(self, res_ids, default=None)
    @api.model
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_partner_info_from_emails(self, emails, link_mail=False)
    @api.multi
  • message_update(self, msg_dict, update_vals=None)
    @api.multi
    Overrides mail_thread message_update that is called by the mailgateway through message_process. This method updates the document according to the email.
  • modify_target_sales_dashboard(self, target_name, target_value)
    @api.model
    Update the user objectives (`target_sales_done`, target_sales_won` and `target_sales_invoiced` fields). :param target_name : part of the fields name to update :param target_value : value of the field to update
  • name_create(self, name)
    @api.model
  • redirect_lead_view(self)
    @api.multi
  • redirect_opportunity_view(self)
    @api.multi
  • retrieve_sales_dashboard(self)
    @api.model
    Fetch data to setup Sales Dashboard
  • write(self, vals)
    @api.multi

New fields (1)
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)
    @api.multi

New fields (2)
  • color Integer
    default=10 args: 'Color Index'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (4)
  • name Selection
    required=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • opportunity_ids Many2many → crm.lead
    string='Opportunities' args: 'crm.lead'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Channel'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (4)
  • action_apply(self)
    @api.multi
    Convert lead to opportunity or merge lead and opportunity and open the freshly created opportunity view.
  • default_get(self, fields)
    @api.model
    Default get for name, opportunity_ids. If there is an exisitng partner link to the lead, find all existing opportunities links with this partner to merge all information together
  • onchange_action(self)
    @api.onchange('action')
  • view_init(self, fields)
    @api.model
    Check some preconditions before the wizard executes.

New fields (5)
  • action Selection
    required=True args: [('each_exist_or_create', 'Use existing partner or create'), ('nothing', 'Do not link to a customer')], 'Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignation Boolean
    help='If unchecked, this will leave the salesman of duplicated opportunities' args: 'Force assignation'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Channel'
  • user_ids Many2many → res.users
    string='Salesmen' args: 'res.users'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • mass_convert(self)
    @api.multi

New fields (2)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Channel'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
    @api.multi
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (28)
  • active Boolean
    readonly=True args: 'Active'
  • campaign_id Many2one → utm.campaign
    readonly=True string='Campaign' args: 'utm.campaign'
  • city Char
    args: 'City'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    readonly=True string='Country' args: 'res.country'
  • create_date Datetime
    readonly=True args: 'Creation Date'
  • date_closed Datetime
    readonly=True args: 'Close Date'
  • date_conversion Datetime
    readonly=True string='Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • date_last_stage_update Datetime
    readonly=True args: 'Last Stage Update'
  • delay_close Float
    digits=(16, 2) group_operator='avg' help='Number of Days to close the case' readonly=True args: 'Delay to Close'
  • delay_expected Float
    digits=(16, 2) group_operator='avg' readonly=True args: 'Overpassed Deadline'
  • delay_open Float
    digits=(16, 2) group_operator='avg' help='Number of Days to open the case' readonly=True args: 'Delay to Assign'
  • expected_revenue Float
    digits=(16, 2) readonly=True string='Probable Turnover'
  • lost_reason Many2one → crm.lost.reason
    readonly=True string='Lost Reason' args: 'crm.lost.reason'
  • medium_id Many2one → utm.medium
    readonly=True string='Medium' args: 'utm.medium'
  • nbr_activities Integer
    readonly=True args: '# of Activities'
  • opening_date Datetime
    readonly=True args: 'Assignation Date'
  • partner_id Many2one → res.partner
    readonly=True string='Partner' args: 'res.partner'
  • priority Selection
    group_operator='avg' string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    digits=(16, 2) group_operator='avg' readonly=True string='Probability'
  • source_id Many2one → utm.source
    readonly=True string='Source' args: 'utm.source'
  • stage_id Many2one → crm.stage
    domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" readonly=True string='Stage' args: 'crm.stage'
  • stage_name Char
    readonly=True string='Stage Name'
  • team_id Many2one → crm.team
    oldname='section_id' readonly=True args: 'crm.team', 'Sales Channel'
  • total_revenue Float
    digits=(16, 2) readonly=True string='Total Revenue'
  • type Selection
    help='Type is used to separate Leads and Opportunities' args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (2)
  • action Selection
    required=True args: [('exist', 'Link to an existing customer'), ('create', 'Create a new customer'), ('nothing', 'Do not link to a customer')], 'Related Customer'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Customer'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (8)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or issues that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True translate=True args: 'Stage Name'
  • on_change Boolean
    help='Setting this stage will change the probability automatically on the opportunity.' args: 'Change Probability Automatically'
  • probability Float
    default=10.0 help='This percentage depicts the default/average probability of the Case for this stage to be a success' required=True args: 'Probability (%)'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    Hack : when going from the pipeline, creating a stage with a sales team in context should not create a stage for the current sales channel only

New fields (9)
  • alias_id Many2one → mail.alias
    help='The email address associated with this channel. New emails received will automatically create new leads assigned to the channel.' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • dashboard_graph_group_pipeline Selection
    default='day' help="How this channel's dashboard graph will group the results." string='Group by' args: [('day', 'Expected Closing Day'), ('week', 'Expected Closing Week'), ('month', 'Expected Closing Month'), ('user', 'Salesperson'), ('stage', 'Stage')]
  • dashboard_graph_model Selection
    selection_add=[('crm.opportunity.report', 'Pipeline')]
  • dashboard_graph_period_pipeline Selection
    compute='_compute_dashboard_graph_period_pipeline' help="The time period this channel's dashboard graph will consider." inverse='_inverse_dashboard_graph_period_pipeline' string='Expected to Close' args: [('week', 'Within a Week'), ('month', 'Within a Month'), ('year', 'Within a Year')]
  • opportunities_amount Integer
    compute='_compute_opportunities' readonly=True string='Amount of quotations to invoice'
  • opportunities_count Integer
    compute='_compute_opportunities' readonly=True string='Number of open opportunities'
  • unassigned_leads_count Integer
    compute='_compute_unassigned_leads_count' readonly=True string='Unassigned Leads'
  • use_leads Boolean
    help='Check this box to filter and qualify incoming requests as leads before converting them into opportunities and assigning them to a salesperson.' args: 'Leads'
  • use_opportunities Boolean
    help='Check this box to manage a presales process with opportunities.' args: 'Pipeline'
Public methods (5)
  • action_primary_channel_button(self)
  • action_your_pipeline(self)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • write(self, vals)
    @api.multi

New fields (5)
  • crm_alias_prefix Char
    args: 'Default Alias Name for Leads'
  • generate_lead_from_alias Boolean
    args: 'Manual Assignation of Emails'
  • group_use_lead Boolean
    implied_group='crm.group_use_lead' string='Leads'
  • module_crm_phone_validation Boolean
    args: 'Phone Formatting'
  • module_web_clearbit Boolean
    args: 'Customer Autocomplete'
Public methods (2)
  • get_values(self)
    @api.model
  • set_values(self)
    @api.multi

New fields (5)
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • meeting_ids Many2many → calendar.event
    copy=False string='Meetings' args: 'calendar.event', 'calendar_event_res_partner_rel', 'res_partner_id', 'calendar_event_id'
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    oldname='section_id' string='Sales Channel' args: 'crm.team'
Public methods (1)
  • schedule_meeting(self)
    @api.multi

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, qdp-odoo, Aaron Bohy, Jeremy Kersten, GitHub, Lucas Perais (lpe), Damien Bouvy, Yannick Tivisse, qsm-odoo, len-odoo, fda-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_action_rule
    - base
    - resource
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - sales_team
    - calendar
    - web_calendar
    - fetchmail
    - utm
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The generic Odoo Customer Relationship Management
====================================================

This application enables a group of people to intelligently and efficiently manage leads, opportunities, meetings and activities.

It manages key tasks such as communication, identification, prioritization, assignment, resolution and notification.

Odoo ensures that all cases are successfully tracked by users, customers and vendors. It can automatically send reminders, trigger specific methods and many other actions based on your own enterprise rules.

The greatest thing about this system is that users don't need to do anything special. The CRM module has an email gateway for the synchronization interface between mails and Odoo. That way, users can just send emails to the request tracker.

Odoo will take care of thanking them for their message, automatically routing it to the appropriate staff and make sure all future correspondence gets to the right place.


Dashboard for CRM will include:
-------------------------------
* Planned Revenue by Stage and User (graph)
* Opportunities by Stage (graph)

Code Analysis

Views touched (46)
XML IDNameModelTypeStatus
assets_backend crm assets ir.ui.view qweb Inherits web.assets_backend
base_partner_merge_automatic_wizard_form base.partner.merge.automatic.wizard.form base.partner.merge.automatic.wizard form New
crm_activity_log_view_form Log an Activity crm.activity.log form New
crm_activity_log_view_form_schedule Schedule next Activity crm.activity.log form New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_report_view_tree crm.activity.report.tree crm.activity.report tree New
crm_activity_view_form crm.activity.form crm.activity form New
crm_activity_view_search crm.activity.search crm.activity search New
crm_activity_view_tree crm.activity.tree crm.activity tree New
crm_case_calendar_view_leads crm.lead.calendar.lead crm.lead calendar New
crm_case_form_view_leads crm.lead.form.lead crm.lead form New
crm_case_form_view_oppor crm.lead.form.opportunity crm.lead form New
crm_case_graph_view_leads crm.lead.graph.lead crm.lead graph New
crm_case_kanban_view_leads crm.lead.kanban.lead crm.lead kanban New
crm_case_pivot_view_leads crm.lead.pivot.lead crm.lead pivot New
crm_case_tree_view_leads crm.lead.tree.lead crm.lead tree New
crm_case_tree_view_oppor crm.lead.tree.opportunity crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_tag_form crm.lead.tag.form crm.lead.tag form New
crm_lead_tag_tree crm.lead.tag.tree crm.lead.tag tree New
crm_lead_view_tree_activity crm.lead.tree.opportunity.next.activity crm.lead tree New
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.opportunity.report graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.opportunity.report graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.opportunity.report pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.opportunity.report pivot New
crm_opportunity_report_view_search crm.opportunity.report.select crm.opportunity.report search New
crm_planner crm_planner ir.ui.view qweb New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
sales_team_form_view_in_crm crm.team.form.inherit crm.team xpath Inherits sales_team.crm_team_view_form
view_create_opportunity_simplified crm.lead.form.simple crm.lead form New
view_crm_case_leads_filter crm.lead.search.lead crm.lead search New
view_crm_case_opportunities_filter crm.lead.search.opportunity crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_meeting_search calendar.event.form.inherit calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
view_sale_config_settings crm settings sale.config.settings div Inherits sales_team.view_sale_config_settings
Models touched (21)

New fields (14)
  • current_line_id Many2one → base.partner.merge.line
    string='Current Line' args: 'base.partner.merge.line'
  • dst_partner_id Many2one → res.partner
    string='Destination Contact' args: 'res.partner'
  • exclude_contact Boolean
    args: 'A user associated to the contact'
  • exclude_journal_item Boolean
    args: 'Journal Items associated to the contact'
  • group_by_email Boolean
    args: 'Email'
  • group_by_is_company Boolean
    args: 'Is Company'
  • group_by_name Boolean
    args: 'Name'
  • group_by_parent_id Boolean
    args: 'Parent Company'
  • group_by_vat Boolean
    args: 'VAT'
  • line_ids One2many → base.partner.merge.line
    string='Lines' args: 'base.partner.merge.line', 'wizard_id'
  • maximum_group Integer
    args: 'Maximum of Group of Contacts'
  • number_group Integer
    readonly=True args: 'Group of Contacts'
  • partner_ids Many2many → res.partner
    string='Contacts' args: 'res.partner'
  • state Selection
    default='option' readonly=True required=True string='State' args: [('option', 'Option'), ('selection', 'Selection'), ('finished', 'Finished')]
Public methods (7)
  • action_merge(self)
    @api.multi
    Merge Contact button. Merge the selected partners, and redirect to the end screen (since there is no other wizard line to process.
  • action_skip(self)
    @api.multi
    Skip this wizard line. Don't compute any thing, and simply redirect to the new step.
  • action_start_automatic_process(self)
    @api.multi
    Start the process 'Merge Automatically'. This will fill the wizard with the same mechanism as 'Merge with Manual Check', but instead of refreshing wizard with the current line, it will automatically process all lines by merging partner grouped according to the checked options.
  • action_start_manual_process(self)
    @api.multi
    Start the process 'Merge with Manual Check'. Fill the wizard according to the group_by and exclude options, and redirect to the first step (treatment of first wizard line). After, for each subset of partner to merge, the wizard will be actualized. - Compute the selected groups (with duplication) - If the user has selected the 'exclude_xxx' fields, avoid the partners
  • action_update_all_process(self)
    @api.multi
  • default_get(self, fields)
    @api.model
  • parent_migration_process_cb(self)
    @api.multi

New fields (3)
  • aggr_ids Char
    required=True args: 'Ids'
  • min_id Integer
    args: 'MinID'
  • wizard_id Many2one → base.partner.merge.automatic.wizard
    args: 'base.partner.merge.automatic.wizard', 'Wizard'
Public methods (0)

No public methods.

New fields (1)
  • opportunity_id Many2one → crm.lead
    domain="[('type', '=', 'opportunity')]" args: 'crm.lead', 'Opportunity'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (9)
  • days Integer
    default=0 help='Number of days before executing the action, allowing you to plan the date of the action.' args: 'Number of days'
  • default Boolean
    default=False inherited=True related='subtype_id.default' args: 'Default'
  • internal Boolean
    default=True inherited=True related='subtype_id.internal' args: 'Internal Only'
  • preceding_activity_ids Many2many → crm.activity
    string='Preceding Activities' args: 'crm.activity', 'crm_activity_rel', 'recommended_id', 'activity_id'
  • recommended_activity_ids Many2many → crm.activity
    string='Recommended Next Activities' args: 'crm.activity', 'crm_activity_rel', 'activity_id', 'recommended_id'
  • res_model Char
    default='crm.lead' inherited=True related='subtype_id.res_model' args: 'Model'
  • sequence Integer
    default=0 args: 'Sequence'
  • subtype_id Many2one → mail.message.subtype
    ondelete='cascade' required=True string='Message Subtype' args: 'mail.message.subtype'
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (1)
  • unlink(self)
    @api.multi

New fields (10)
  • date_action Date
    args: 'Next Activity Date'
  • date_deadline Date
    args: 'Expected Closing'
  • last_activity_id Many2one → crm.activity
    default=False args: 'crm.activity', 'Previous Activity'
  • lead_id Many2one → crm.lead
    default=_default_lead_id required=True args: 'crm.lead', 'Lead'
  • next_activity_id Many2one → crm.activity
    args: 'crm.activity', 'Activity'
  • note Html
    args: 'Note'
  • planned_revenue Float
    args: 'Expected Revenue'
  • recommended_activity_id Many2one → crm.activity
    args: 'crm.activity', 'Recommended Activities'
  • team_id Many2one → crm.team
    args: 'crm.team', 'Sales Team'
  • title_action Char
    args: 'Summary'
Public methods (6)
  • action_log(self)
    @api.multi
  • action_log_and_schedule(self)
    @api.multi
  • action_schedule(self)
    @api.multi
  • onchange_lead_id(self)
    @api.onchange('lead_id')
  • onchange_next_activity_id(self)
    @api.onchange('next_activity_id')
  • onchange_recommended_activity_id(self)
    @api.onchange('recommended_activity_id')

New fields (14)
  • active Boolean
    readonly=True args: 'Active'
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Created By'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Date'
  • lead_id Many2one → crm.lead
    readonly=True args: 'crm.lead', 'Lead'
  • lead_type Char
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner/Customer'
  • probability Float
    group_operator='avg' readonly=True args: 'Probability'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subject Char
    readonly=True args: 'Summary'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Activity'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Salesperson'
Public methods (1)
  • init(self)

New fields (54)
  • active Boolean
    default=True args: 'Active'
  • city Char
    args: 'City'
  • color Integer
    default=0 args: 'Color Index'
  • company_currency Many2one
    readonly=True related='company_id.currency_id' relation='res.currency' string='Currency'
  • company_id Many2one → res.company
    default=<expr> index=True string='Company' args: 'res.company'
  • contact_name Char
    args: 'Contact Name'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • create_date Datetime
    readonly=True args: 'Create Date'
  • date_action Date
    index=True args: 'Next Activity Date'
  • date_action_last Datetime
    readonly=True args: 'Last Action'
  • date_action_next Datetime
    readonly=True args: 'Next Action'
  • date_closed Datetime
    copy=False readonly=True args: 'Closed Date'
  • date_conversion Datetime
    readonly=True args: 'Conversion Date'
  • date_deadline Date
    help='Estimate of the date on which the opportunity will be won.' args: 'Expected Closing'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True string='Last Stage Update'
  • date_open Datetime
    default=<expr> readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day_close' store=True string='Days to Close'
  • day_open Float
    compute='_compute_day_open' store=True string='Days to Assign'
  • description Text
    args: 'Notes'
  • email_cc Text
    help='These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma' args: 'Global CC'
  • email_from Char
    help='Email address of the contact' index=True args: 'Email'
  • fax Char
    args: 'Fax'
  • function Char
    args: 'Job Position'
  • kanban_state Selection
    compute='_compute_kanban_state' string='Activity State' args: [('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')]
  • lost_reason Many2one → crm.lost.reason
    index=True string='Lost Reason' track_visibility='onchange' args: 'crm.lost.reason'
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • message_bounce Integer
    help='Counter of the number of bounced emails for this contact' args: 'Bounce'
  • mobile Char
    args: 'Mobile'
  • name Char
    index=True required=True args: 'Opportunity'
  • next_activity_id Many2one → crm.activity
    index=True string='Next Activity' args: 'crm.activity'
  • opt_out Boolean
    help="If opt-out is checked, this contact has refused to receive emails for mass mailing and marketing campaign. Filter 'Available for Mass Mailing' allows users to filter the leads when performing mass mailing." oldname='optout' string='Opt-Out'
  • partner_address_email Char
    readonly=True related='partner_id.email' args: 'Partner Contact Email'
  • partner_address_name Char
    readonly=True related='partner_id.name' args: 'Partner Contact Name'
  • partner_id Many2one → res.partner
    help='Linked partner (optional). Usually created when converting the lead.' index=True string='Customer' track_visibility='onchange' args: 'res.partner'
  • partner_name Char
    help='The name of the future partner company that will be created while converting the lead into opportunity' index=True args: 'Customer Name'
  • phone Char
    args: 'Phone'
  • planned_revenue Float
    track_visibility='always' args: 'Expected Revenue'
  • priority Selection
    default=<expr> index=True string='Rating' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    default=<expr> group_operator='avg' args: 'Probability'
  • referred Char
    args: 'Referred By'
  • stage_id Many2one → crm.stage
    default=<expr> domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'crm.stage'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • tag_ids Many2many → crm.lead.tag
    help='Classify and analyze your lead/opportunity categories like: Training, Service' string='Tags' args: 'crm.lead.tag', 'crm_lead_tag_rel', 'lead_id', 'tag_id'
  • team_id Many2one → crm.team
    default=<expr> help='When sending mails, the default email address is taken from the sales team.' index=True oldname='section_id' string='Sales Team' track_visibility='onchange' args: 'crm.team'
  • title Many2one → res.partner.title
    args: 'res.partner.title'
  • title_action Char
    args: 'Next Activity Summary'
  • type Selection
    default=<expr> help='Type is used to separate Leads and Opportunities' index=True required=True args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_email Char
    readonly=True related='user_id.email' args: 'User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Salesperson' track_visibility='onchange' args: 'res.users'
  • user_login Char
    readonly=True related='user_id.login' args: 'User Login'
  • write_date Datetime
    readonly=True args: 'Update Date'
  • zip Char
    change_default=True args: 'Zip'
Public methods (29)
  • action_schedule_meeting(self)
    @api.multi
    Open meeting's calendar view to schedule meeting on current opportunity. :return dict: dictionary value for created Meeting view
  • action_set_active(self)
    @api.multi
  • action_set_lost(self)
    @api.multi
    Lost semantic: probability = 0, active = False
  • action_set_unactive(self)
    @api.multi
  • action_set_won(self)
    @api.multi
    Won semantic: probability = 100 (active untouched)
  • allocate_salesman(self, user_ids=None, team_id=False)
    @api.multi
    Assign salesmen and salesteam to a batch of leads. If there are more leads than salesmen, these salesmen will be assigned in round-robin. E.g.: 4 salesmen (S1, S2, S3, S4) for 6 leads (L1, L2, ... L6). They will be assigned as followed: L1 - S1, L2 - S2, L3 - S3, L4 - S4, L5 - S1, L6 - S2. :param list ids: leads/opportunities ids to process :param list user_ids: salesmen to assign :param int team_id: salesteam to assign :return bool
  • close_dialog(self)
    @api.multi
  • convert_opportunity(self, partner_id, user_ids=False, team_id=False)
    @api.multi
  • copy(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • get_duplicated_leads(self, partner_id, include_lost=False)
    @api.multi
    Search for opportunities that have the same partner and that arent done or cancelled :param partner_id : partner to search
  • get_empty_list_help(self, help)
    @api.model
  • get_formview_id(self)
    @api.multi
  • handle_partner_assignation(self, action='create', partner_id=False)
    @api.multi
    Handle partner assignation during a lead conversion. if action is 'create', create new partner with contact and assign lead to new partner_id. otherwise assign lead to the specified partner_id :param list ids: leads/opportunities ids to process :param string action: what has to be done regarding partners (create it, assign an existing one, or nothing) :param int partner_id: partner to assign if any :return dict: dictionary organized as followed: {lead_id: partner_assigned_id}
  • log_meeting(self, meeting_subject, meeting_date, duration)
    @api.multi
  • merge_dependences(self, opportunities)
    @api.multi
    Merge dependences (messages, attachments, ...). These dependences will be transfered to `self`, the most important lead. :param opportunities : recordset of opportunities to transfert. Does not include `self`.
  • merge_opportunity(self, user_id=False, team_id=False)
    @api.multi
    Merge opportunities in one. Different cases of merge: - merge leads together = 1 new lead - merge at least 1 opp with anything else (lead or opp) = 1 new opp The resulting lead/opportunity will be the most important one (based on its confidence level) updated with values from other opportunities to merge. :param user_id : the id of the saleperson. If not given, will be determined by `_merge_data`. :param team : the id of the sales team. If not given, will be determined by `_merge_data`. :return crm.lead record resulting of th merge
  • message_get_reply_to(self, res_ids, default=None)
    @api.model
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg_dict, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_partner_info_from_emails(self, emails, link_mail=False)
    @api.multi
  • message_update(self, msg_dict, update_vals=None)
    @api.multi
    Overrides mail_thread message_update that is called by the mailgateway through message_process. This method updates the document according to the email.
  • modify_target_sales_dashboard(self, target_name, target_value)
    @api.model
    Update the user objectives (`target_sales_done`, target_sales_won` and `target_sales_invoiced` fields). :param target_name : part of the fields name to update :param target_value : value of the field to update
  • name_create(self, name)
    @api.model
  • redirect_lead_view(self)
    @api.multi
  • redirect_opportunity_view(self)
    @api.multi
  • retrieve_sales_dashboard(self)
    @api.model
    Fetch data to setup Sales Dashboard
  • write(self, vals)
    @api.multi

New fields (1)
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)
    @api.multi

New fields (2)
  • color Integer
    args: 'Color Index'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (4)
  • name Selection
    required=True args: [('convert', 'Convert to opportunity'), ('merge', 'Merge with existing opportunities')], 'Conversion Action'
  • opportunity_ids Many2many → crm.lead
    string='Opportunities' args: 'crm.lead'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (4)
  • action_apply(self)
    @api.multi
    Convert lead to opportunity or merge lead and opportunity and open the freshly created opportunity view.
  • default_get(self, fields)
    @api.model
    Default get for name, opportunity_ids. If there is an exisitng partner link to the lead, find all existing opportunities links with this partner to merge all information together
  • onchange_action(self)
    @api.onchange('action')
  • view_init(self, fields)
    @api.model
    Check some preconditions before the wizard executes.

New fields (5)
  • action Selection
    required=True args: [('each_exist_or_create', 'Use existing partner or create'), ('nothing', 'Do not link to a customer')], 'Related Customer'
  • deduplicate Boolean
    default=True help='Merge with existing leads/opportunities of each partner' args: 'Apply deduplication'
  • force_assignation Boolean
    help='If unchecked, this will leave the salesman of duplicated opportunities' args: 'Force assignation'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_ids Many2many → res.users
    string='Salesmen' args: 'res.users'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • mass_convert(self)
    @api.multi

New fields (2)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (3)
  • opportunity_ids Many2many → crm.lead
    string='Leads/Opportunities' args: 'crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id'
  • team_id Many2one → crm.team
    index=True oldname='section_id' args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Salesperson'
Public methods (2)
  • action_merge(self)
    @api.multi
  • default_get(self, fields)
    @api.model
    Use active_ids from the context to fetch the leads/opps to merge. In order to get merged, these leads/opps can't be in 'Dead' or 'Closed'

New fields (28)
  • active Boolean
    readonly=True args: 'Active'
  • campaign_id Many2one → utm.campaign
    readonly=True string='Campaign' args: 'utm.campaign'
  • city Char
    args: 'City'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    readonly=True string='Country' args: 'res.country'
  • create_date Datetime
    readonly=True args: 'Creation Date'
  • date_closed Datetime
    readonly=True args: 'Close Date'
  • date_conversion Datetime
    readonly=True string='Conversion Date'
  • date_deadline Date
    readonly=True args: 'Expected Closing'
  • date_last_stage_update Datetime
    readonly=True args: 'Last Stage Update'
  • delay_close Float
    digits=(16, 2) group_operator='avg' help='Number of Days to close the case' readonly=True args: 'Delay to Close'
  • delay_expected Float
    digits=(16, 2) group_operator='avg' readonly=True args: 'Overpassed Deadline'
  • delay_open Float
    digits=(16, 2) group_operator='avg' help='Number of Days to open the case' readonly=True args: 'Delay to Assign'
  • expected_revenue Float
    digits=(16, 2) readonly=True string='Probable Turnover'
  • lost_reason Many2one → crm.lost.reason
    readonly=True string='Lost Reason' args: 'crm.lost.reason'
  • medium_id Many2one → utm.medium
    readonly=True string='Medium' args: 'utm.medium'
  • nbr_activities Integer
    readonly=True args: '# of Activities'
  • opening_date Datetime
    readonly=True args: 'Assignation Date'
  • partner_id Many2one → res.partner
    readonly=True string='Partner' args: 'res.partner'
  • priority Selection
    group_operator='avg' string='Priority' args: crm_stage.AVAILABLE_PRIORITIES
  • probability Float
    digits=(16, 2) group_operator='avg' readonly=True string='Probability'
  • source_id Many2one → utm.source
    readonly=True string='Source' args: 'utm.source'
  • stage_id Many2one → crm.stage
    domain="['|', ('team_id', '=', False), ('team_id', '=', team_id)]" readonly=True string='Stage' args: 'crm.stage'
  • stage_name Char
    readonly=True string='Stage Name'
  • team_id Many2one → crm.team
    oldname='section_id' readonly=True args: 'crm.team', 'Sales Team'
  • total_revenue Float
    digits=(16, 2) readonly=True string='Total Revenue'
  • type Selection
    help='Type is used to separate Leads and Opportunities' args: [('lead', 'Lead'), ('opportunity', 'Opportunity')]
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (2)
  • action Selection
    required=True args: [('exist', 'Link to an existing customer'), ('create', 'Create a new customer'), ('nothing', 'Do not link to a customer')], 'Related Customer'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Customer'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (8)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Pipeline'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or issues that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True translate=True args: 'Stage Name'
  • on_change Boolean
    help='Setting this stage will change the probability automatically on the opportunity.' args: 'Change Probability Automatically'
  • probability Float
    default=10.0 help='This percentage depicts the default/average probability of the Case for this stage to be a success' required=True args: 'Probability (%)'
  • requirements Text
    help="Enter here the internal requirements for this stage (ex: Offer sent to customer). It will appear as a tooltip over the stage's name." args: 'Requirements'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • team_id Many2one → crm.team
    help='Specific team that uses this stage. Other teams will not be able to see or use this stage.' ondelete='set null' string='Team' args: 'crm.team'
Public methods (1)
  • default_get(self, fields)
    @api.model
    Hack : when going from the pipeline, creating a stage with a sales team in context should not create a stage for the current sales team only

New fields (4)
  • alias_id Many2one → mail.alias
    help='The email address associated with this team. New emails received will automatically create new leads assigned to the team.' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • resource_calendar_id Many2one → resource.calendar
    help='Used to compute open days' string='Working Time' args: 'resource.calendar'
  • use_leads Boolean
    help='The first contact you get with a potential customer is a lead you qualify before converting it into a real business opportunity. Check this box to manage leads in this sales team.' args: 'Leads'
  • use_opportunities Boolean
    default=True help='Check this box to manage opportunities in this sales team.' args: 'Opportunities'
Public methods (5)
  • action_your_pipeline(self)
    @api.model
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • write(self, vals)
    @api.multi

New fields (6)
  • activities_count Integer
    compute='_compute_activities_count' args: 'Activities'
  • meeting_count Integer
    compute='_compute_meeting_count' args: '# Meetings'
  • meeting_ids Many2many → calendar.event
    copy=False string='Meetings' args: 'calendar.event', 'calendar_event_res_partner_rel', 'res_partner_id', 'calendar_event_id'
  • opportunity_count Integer
    compute='_compute_opportunity_count' args: 'Opportunity'
  • opportunity_ids One2many → crm.lead
    domain=[('type', '=', 'opportunity')] string='Opportunities' args: 'crm.lead', 'partner_id'
  • team_id Many2one → crm.team
    oldname='section_id' string='Sales Team' args: 'crm.team'
Public methods (1)
  • schedule_meeting(self)
    @api.multi

New fields (2)
  • target_sales_done Integer
    args: 'Activities Done Target'
  • target_sales_won Integer
    args: 'Won in Opportunities Target'
Public methods (0)

No public methods.

New fields (6)
  • alias_domain Char
    default=<expr> args: 'Alias Domain'
  • alias_prefix Char
    args: 'Default Alias Name for Leads'
  • generate_sales_team_alias Boolean
    help='Odoo will generate an email alias based on the sales team name' args: 'Automatically generate an email alias at the sales team creation'
  • group_use_lead Selection
    implied_group='crm.group_use_lead' string='Leads' args: [(0, 'Each mail sent to the alias creates a new opportunity'), (1, 'Use leads if you need a qualification step before creating an opportunity or a customer')]
  • module_crm_voip Boolean
    help='Integration with Asterisk' args: 'VoIP integration'
  • module_website_sign Boolean
    args: 'Odoo Sign'
Public methods (4)
  • get_default_alias_prefix(self, fields)
    @api.model
  • get_default_generate_sales_team_alias(self, fields)
    @api.model
  • set_default_alias_prefix(self)
    @api.multi
  • set_default_generate_sales_team_alias(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, xmo-odoo, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Lucas Perais (lpe), Damien Bouvy, Julien De Coster, Yannick Tivisse, qsm-odoo, Martin Geubelle, Toufik Benjaa, Ray Carnes, yti
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_action_rule
    - base
    - resource
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - sales_team
    - calendar
    - web_calendar
    - fetchmail
    - utm
    - marketing
    - web_tip
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The generic OpenERP Customer Relationship Management
====================================================

This application enables a group of people to intelligently and efficiently manage leads, opportunities, meetings and activities.

It manages key tasks such as communication, identification, prioritization, assignment, resolution and notification.

OpenERP ensures that all cases are successfully tracked by users, customers and vendors. It can automatically send reminders, trigger specific methods and many other actions based on your own enterprise rules.

The greatest thing about this system is that users don't need to do anything special. The CRM module has an email gateway for the synchronization interface between mails and OpenERP. That way, users can just send emails to the request tracker.

OpenERP will take care of thanking them for their message, automatically routing it to the appropriate staff and make sure all future correspondence gets to the right place.


Dashboard for CRM will include:
-------------------------------
* Planned Revenue by Stage and User (graph)
* Opportunities by Stage (graph)

Code Analysis

Views touched (42)
XML IDNameModelTypeStatus
assets_backend crm assets ir.ui.view qweb Inherits web.assets_backend
base_partner_merge_automatic_wizard_form base.partner.merge.automatic.wizard.form base.partner.merge.automatic.wizard form New
crm_activity_report_view_graph crm.activity.report.graph crm.activity.report graph New
crm_activity_report_view_pivot crm.activity.report.pivot crm.activity.report pivot New
crm_activity_report_view_search crm.activity.report.search crm.activity.report search New
crm_activity_view_form crm.activity.view.form crm.activity form New
crm_activity_view_search crm.activity.view.search crm.activity search New
crm_activity_view_tree crm.activity.view.tree crm.activity tree New
crm_case_calendar_view_leads CRM - Leads Calendar crm.lead calendar New
crm_case_form_view_leads CRM - Leads Form crm.lead form New
crm_case_form_view_oppor Opportunities crm.lead form New
crm_case_graph_view_leads Opportunities crm.lead graph New
crm_case_kanban_view_leads CRM - Leads Kanban crm.lead kanban New
crm_case_pivot_view_leads Opportunities crm.lead pivot New
crm_case_tree_view_leads Leads crm.lead tree New
crm_case_tree_view_oppor Opportunities Tree crm.lead tree New
crm_lead_lost_view_form crm.lead.lost.form crm.lead.lost form New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.stage search New
crm_lead_tag_form crm.lead.tag.form crm.lead.tag form New
crm_lead_tag_tree crm.lead.tag.tree crm.lead.tag tree New
crm_lead_view_tree_activity crm.lead.next.activity.tree crm.lead tree New
crm_lost_reason_view_form crm.lost.reason.form crm.lost.reason form New
crm_lost_reason_view_search crm.lost.reason.view.search crm.lost.reason search New
crm_opportunity_report_view_graph crm.opportunity.report.graph crm.opportunity.report graph New
crm_opportunity_report_view_graph_lead crm.opportunity.report.graph.lead crm.opportunity.report graph New
crm_opportunity_report_view_pivot crm.opportunity.report.pivot crm.opportunity.report pivot New
crm_opportunity_report_view_pivot_lead crm.opportunity.report.view.pivot.lead crm.opportunity.report pivot New
crm_opportunity_report_view_search crm.opportunity.report.select crm.opportunity.report search New
crm_planner crm_planner ir.ui.view qweb New
crm_stage_form crm.stage.form crm.stage form New
crm_stage_tree crm.stage.tree crm.stage tree New
crm_team_salesteams_view_kanban crm.team.kanban crm.team data Inherits sales_team.crm_team_salesteams_view_kanban
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
sales_team_form_view_in_crm crm.team.form crm.team xpath Inherits sales_team.crm_team_view_form
view_crm_case_leads_filter CRM - Leads Search crm.lead search New
view_crm_case_opportunities_filter CRM - Opportunities Search crm.lead search New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_meeting_search CRM - Meetings Search calendar.event xpath Inherits calendar.view_calendar_event_search
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
view_sale_config_settings crm settings sale.config.settings div Inherits base_setup.view_sale_config_settings
Models touched (14)

New fields (0)

No new fields.

Public methods (12)
  • auto_set_parent_id(self, cr, uid, ids, context=None)
  • automatic_process_cb(self, cr, uid, ids, context=None)
  • clean_emails(self, cr, uid, context=None)
    Clean the email address of the partner, if there is an email field with a mimum of two addresses, the system will create a new partner, with the information of the previous one and will copy the new cleaned email into the email field.
  • close_cb(self, cr, uid, ids, context=None)
  • compute_models(self, cr, uid, ids, context=None)
    Compute the different models needed by the system if you want to exclude some partners.
  • default_get(self, cr, uid, fields, context=None)
  • get_fk_on(self, cr, table)
  • merge_cb(self, cr, uid, ids, context=None)
  • next_cb(self, cr, uid, ids, context=None)
    Don't compute any thing
  • parent_migration_process_cb(self, cr, uid, ids, context=None)
  • start_process_cb(self, cr, uid, ids, context=None)
    Start the process. * Compute the selected groups (with duplication) * If the user has selected the 'exclude_XXX' fields, avoid the partners.
  • update_all_process_cb(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, cr, uid, vals, context=None)

New fields (7)
  • activity_1_id Many2one → crm.activity
    string='Next Activity 1' args: 'crm.activity'
  • activity_2_id Many2one → crm.activity
    string='Next Activity 2' args: 'crm.activity'
  • activity_3_id Many2one → crm.activity
    string='Next Activity 3' args: 'crm.activity'
  • days Integer
    default=0 help='Number of days before executing the action, allowing you to plan the date of the action.' args: 'Number of days'
  • sequence Integer
    default=0 args: 'Sequence'
  • subtype_id Many2one → mail.message.subtype
    ondelete='cascade' required=True string='Message Subtype' args: 'mail.message.subtype'
  • team_id Many2one → crm.team
    string='Sales Team' args: 'crm.team'
Public methods (2)
  • create(self, values)
    @api.model
    Override to set the res_model of inherited subtype to crm.lead. This cannot be achieved using a default on res_model field because of the inherits. Indeed a new field would be created. However the field on the subtype would still exist. Being void, the subtype will be present for every model in Odoo. That's quite an issue.
  • unlink(self)
    @api.multi

New fields (10)
  • author_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Author'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • country_id Many2one → res.country
    readonly=True args: 'res.country', 'Country'
  • date Datetime
    readonly=True args: 'Date'
  • lead_type Char
    help='Type is used to separate Leads and Opportunities' selection=[('lead', 'Lead'), ('opportunity', 'Opportunity')] string='Type'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner/Customer'
  • stage_id Many2one → crm.stage
    readonly=True args: 'crm.stage', 'Stage'
  • subtype_id Many2one → mail.message.subtype
    readonly=True args: 'mail.message.subtype', 'Activity'
  • team_id Many2one → crm.team
    readonly=True args: 'crm.team', 'Sales Team'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'Responsible'
Public methods (1)
  • init(self, cr)

New fields (2)
  • lead_id Many2one → crm.lead
    required=True args: 'crm.lead', 'Lead'
  • lost_reason_id Many2one → crm.lost.reason
    args: 'crm.lost.reason', 'Lost Reason'
Public methods (1)
  • action_lost_reason_apply(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • init(self, cr)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (5)
  • action_your_pipeline(self, cr, uid, context=None)
  • create(self, cr, uid, vals, context=None)
  • onchange_use_leads_opportunities(self, cr, uid, ids, use_leads, use_opportunities, context=None)
  • unlink(self, cr, uid, ids, context=None)
  • write(self, cr, uid, ids, vals, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (4)
  • get_default_alias_prefix(self, cr, uid, ids, context=None)
  • get_default_generate_sales_team_alias(self, cr, uid, ids, context=None)
  • set_default_alias_prefix(self, cr, uid, ids, context=None)
  • set_default_generate_sales_team_alias(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Rucha (Open ERP), Atul Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, ajay javiya (OpenERP), Martin Trigaux, Foram Katharotiya (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Rajesh Prajapati (OpenERP), Thibault Delavallée, Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, niv-openerp, ggh-openerp, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Anael Closson, dle@openerp.com, Cedric Snauwaert, Frédéric van der Essen, Nicolas Martinelli, Ravish (Open ERP), Kersten Jeremy, Dharti Ratani (Open ERP), Amit Bhavsar (Open ERP), Paramjit Singh Sahota, Nicolas Lempereur, Nimesh Contractor (OpenERP), Amit Vora, Richard Mathot, Amit Vora (OpenERP), Géry Debongnie, Darshan Kalola (OpenERP Trainee), jke-openerp, Aaron Bohy, Thibault Delavallee, Bharat R. Devnani (OpenERP), Richard Mathot (OpenERP), ged-odoo, Jaydeep Barot (OpenERP Trainee), Mahendra Barad (OpenERP), Jeremy Kersten, ima-openerp, Gery Debongnie, Randhir Mayatra rma-openerp, Amit Vora (OpenERP Trainee), sgo@tinyerp.com, Darshan Kalola (OpenERP), Darshan Kalola, Sunil Sharma (OpenERP Trainee), Sunil Sharma (OpenERP), Mantavya Gajjar, Prashant Panchal (OpenERP), Ravi Gadhia, Parth Gajjar (Open ERP), Barad Mahendra, Rucha Dave, DJ Patel
WEBSITE
WEBSITEhttps://www.odoo.com/page/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_action_rule
    - base
    - resource
    - mail
    - base_setup
    - web_kanban
    - web
    - sales_team
    - web_kanban_sparkline
    - email_template
    - calendar
    - web_calendar
    - board
    - fetchmail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The generic OpenERP Customer Relationship Management
====================================================

This application enables a group of people to intelligently and efficiently manage leads, opportunities, meetings and phone calls.

It manages key tasks such as communication, identification, prioritization, assignment, resolution and notification.

OpenERP ensures that all cases are successfully tracked by users, customers and suppliers. It can automatically send reminders, escalate the request, trigger specific methods and many other actions based on your own enterprise rules.

The greatest thing about this system is that users don't need to do anything special. The CRM module has an email gateway for the synchronization interface between mails and OpenERP. That way, users can just send emails to the request tracker.

OpenERP will take care of thanking them for their message, automatically routing it to the appropriate staff and make sure all future correspondence gets to the right place.


Dashboard for CRM will include:
-------------------------------
* Planned Revenue by Stage and User (graph)
* Opportunities by Stage (graph)

Code Analysis

Views touched (67)
XML IDNameModelTypeStatus
base_partner_merge_automatic_wizard_form base.partner.merge.automatic.wizard.form base.partner.merge.automatic.wizard form New
crm_case_calendar_view_leads CRM - Leads Calendar crm.lead calendar New
crm_case_categ-view crm.case.categ.form crm.case.categ form New
crm_case_categ_tree-view crm.case.categ.tree crm.case.categ tree New
crm_case_form_view_leads CRM - Leads Form crm.lead form New
crm_case_form_view_oppor Opportunities crm.lead form New
crm_case_graph_view_leads Opportunities crm.lead graph New
crm_case_inbound_phone_tree_view CRM - Logged Phone Calls Tree crm.phonecall tree New
crm_case_kanban_view_leads CRM - Leads Kanban crm.lead kanban New
crm_case_phone_calendar_view CRM - Phone Calls Calendar crm.phonecall calendar New
crm_case_phone_form_view CRM - Phone Call Form crm.phonecall form New
crm_case_phone_tree_view CRM - Phone Calls Tree crm.phonecall tree New
crm_case_section_salesteams_view_kanban crm.case.section.kanban crm.case.section data Inherits sales_team.crm_case_section_salesteams_view_kanban
crm_case_stage_form crm.case.stage.form crm.case.stage form New
crm_case_stage_tree crm.case.stage.tree crm.case.stage tree New
crm_case_tree_view_leads Leads crm.lead tree New
crm_case_tree_view_oppor Opportunities Tree crm.lead tree New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.case.stage search New
crm_segmentation-view crm.segmentation.form crm.segmentation form New
crm_segmentation_line-view crm.segmentation.line.form crm.segmentation.line form New
crm_segmentation_line_tree-view crm.segmentation.line.tree crm.segmentation.line tree New
crm_segmentation_tree-view crm.segmentation.tree crm.segmentation tree New
crm_tracking_campaign_form crm.tracking.campaign.form crm.tracking.campaign form New
crm_tracking_campaign_tree crm.tracking.campaign.tree crm.tracking.campaign tree New
crm_tracking_medium_view_form crm.tracking.medium.form crm.tracking.medium form New
crm_tracking_medium_view_tree crm.tracking.medium.tree crm.tracking.medium tree New
crm_tracking_source_view_form crm.tracking.source.form crm.tracking.source form New
crm_tracking_source_view_tree crm.tracking.source.tree crm.tracking.source tree New
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
phonecall2phonecall2meeting_view crm.phonecall2meeting.form crm.phonecall2meeting form New
phonecall_to_phonecall_view crm.phonecall2phonecall.form crm.phonecall2phonecall form New
sales_team_form_view_in_crm crm.case.section.form crm.case.section xpath Inherits sales_team.crm_case_section_view_form
view_crm_case_leads_filter CRM - Leads Search crm.lead search New
view_crm_case_opportunities_filter CRM - Opportunities Search crm.lead search New
view_crm_case_phonecalls_filter CRM - Phone Calls Search crm.phonecall search New
view_crm_case_section_categ_categ2_filter CRM Report - Section, Category and Type(Select) report.crm.case.section.categ.categ2 search New
view_crm_case_section_categ_categ2_form CRM Report - Section, Category and Type(Form) report.crm.case.section.categ.categ2 form New
view_crm_case_section_categ_categ2_graph CRM Report - Section, Category and Type(Select) report.crm.case.section.categ.categ2 graph New
view_crm_case_section_categ_categ2_tree CRM Report - Section, Category and Type(Tree) report.crm.case.section.categ.categ2 tree New
view_crm_case_section_categ_filter CRM Report - Teams and Type(Select) report.crm.case.section.categ2 search New
view_crm_case_section_categ_form CRM Report - Teams and Type(Form) report.crm.case.section.categ2 form New
view_crm_case_section_categ_graph CRM Report - Teams and Type(Graph) report.crm.case.section.categ2 graph New
view_crm_case_section_categ_stage_filter CRM Report - Section, Category and Stage(Select) report.crm.case.section.categ.stage search New
view_crm_case_section_categ_stage_form CRM Report - Team, Category and Stage(Form) report.crm.case.section.categ.stage form New
view_crm_case_section_categ_stage_graph CRM Report - Section, Category and Stage(Select) report.crm.case.section.categ.stage graph New
view_crm_case_section_categ_stage_tree CRM Report - Team, Category and Stage(Tree) report.crm.case.section.categ.stage tree New
view_crm_case_section_categ_tree CRM Report - Teams and Type(Tree) report.crm.case.section.categ2 tree New
view_crm_case_section_stage_filter CRM Report - Teams and Stage(Select) report.crm.case.section.stage search New
view_crm_case_section_stage_form CRM Report - Teams and Stage(Form) report.crm.case.section.stage form New
view_crm_case_section_stage_graph CRM Report - Teams and Stage(Graph) report.crm.case.section.stage graph New
view_crm_case_section_stage_tree CRM Report - Teams and Stage(Tree) report.crm.case.section.stage tree New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_meeting_search CRM - Meetings Search calendar.event xpath Inherits calendar.view_calendar_event_search
view_crm_payment_mode_form crm.payment.mode.form crm.payment.mode form New
view_crm_payment_mode_tree crm.payment.mode.tree crm.payment.mode tree New
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner data Inherits base.view_partner_form
view_partners_form_crm_calls view.res.partner.form.crm.inherited.calls res.partner data Inherits base.view_partner_form
view_report_crm_lead_filter crm.lead.report.select crm.lead.report search New
view_report_crm_lead_graph crm.lead.report.graph crm.lead.report graph New
view_report_crm_lead_graph_two crm.lead.report.graph.two crm.lead.report graph New
view_report_crm_opportunity_filter crm.opportunity.report.select crm.opportunity.report search New
view_report_crm_opportunity_graph crm.opportunity.report.graph crm.opportunity.report graph New
view_report_crm_phonecall_filter crm.phonecall.report.select crm.phonecall.report search New
view_report_crm_phonecall_graph crm.phonecall.report.graph crm.phonecall.report graph New
view_sale_config_settings crm settings sale.config.settings data Inherits base_setup.view_sale_config_settings
Models touched (13)

New fields (0)

No new fields.

Public methods (12)
  • auto_set_parent_id(self, cr, uid, ids, context=None)
  • automatic_process_cb(self, cr, uid, ids, context=None)
  • clean_emails(self, cr, uid, context=None)
    Clean the email address of the partner, if there is an email field with a mimum of two addresses, the system will create a new partner, with the information of the previous one and will copy the new cleaned email into the email field.
  • close_cb(self, cr, uid, ids, context=None)
  • compute_models(self, cr, uid, ids, context=None)
    Compute the different models needed by the system if you want to exclude some partners.
  • default_get(self, cr, uid, fields, context=None)
  • get_fk_on(self, cr, table)
  • merge_cb(self, cr, uid, ids, context=None)
  • next_cb(self, cr, uid, ids, context=None)
    Don't compute any thing
  • parent_migration_process_cb(self, cr, uid, ids, context=None)
  • start_process_cb(self, cr, uid, ids, context=None)
    Start the process. * Compute the selected groups (with duplication) * If the user has selected the 'exclude_XXX' fields, avoid the partners.
  • update_all_process_cb(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, cr, uid, vals, context=None)

New fields (0)

No new fields.

Public methods (2)
  • create(self, cr, uid, vals, context=None)
  • unlink(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • init(self, cr)
    CRM Lead Report @param cr: the current row, from the database cursor

New fields (0)

No new fields.

Public methods (1)
  • init(self, cr)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • tracking_fields(self)
  • tracking_get_values(self, cr, uid, vals, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_utm_domain_cookies(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • get_default_alias_prefix(self, cr, uid, ids, context=None)
  • set_default_alias_prefix(self, cr, uid, ids, context=None)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Christophe Matthieu, Pinakin Nayi (OpenERP), DBR (OpenERP), Harry (OpenERP), Antonin Bourguignon, pankita shah (Open ERP), ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Bhumika (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Hardik, Josse Colpaert, Arnaud Pineux, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Denis Ledoux, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Alexis de Lattre, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, Ujjvala Collins (OpenERP), Ravi Gohil (OpenERP), Jiten (OpenERP), Dharti Ratani (OpenERP), Anael Closson, Khushboo Bhatt (Open ERP), dle@openerp.com, Bhumi Thakkar (Open ERP), Roberto López López (OpenERP), Cedric Snauwaert, Amit Patel, Simon Lejeune, Frédéric van der Essen, Gilles Major, Chris Biersbach, Vijaykumar Baladaniya, Jigar Amin, Somesh Khare (OpenERP), Amit (OpenERP), Minh Tran, Ankita Patel (OpenERP), RGA(OpenERP), Dharti Ratani (Open ERP), Paramjit Singh Sahota, Rifakat, Jérome Maes, hacker on test server, Georges Grogero
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_action_rule
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - base_status
    - process
    - email_template
    - base_calendar
    - resource
    - board
    - fetchmail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The generic OpenERP Customer Relationship Management
====================================================

This application enables a group of people to intelligently and efficiently manage leads, opportunities, meetings and phone calls.

It manages key tasks such as communication, identification, prioritization, assignment, resolution and notification.

OpenERP ensures that all cases are successfully tracked by users, customers and suppliers. It can automatically send reminders, escalate the request, trigger specific methods and many other actions based on your own enterprise rules.

The greatest thing about this system is that users don't need to do anything special. The CRM module has an email gateway for the synchronization interface between mails and OpenERP. That way, users can just send emails to the request tracker.

OpenERP will take care of thanking them for their message, automatically routing it to the appropriate staff and make sure all future correspondence gets to the right place.


Dashboard for CRM will include:
-------------------------------
* Planned Revenue by Stage and User (graph)
* Opportunities by Stage (graph)

Code Analysis

Views touched (69)
XML IDNameModelTypeStatus
board_crm_statistical_form CRM - Statistical Dashboard Form board.board form New
crm_case_calendar_view_leads CRM - Leads Calendar crm.lead calendar New
crm_case_categ-view crm.case.categ.form crm.case.categ form New
crm_case_categ_tree-view crm.case.categ.tree crm.case.categ tree New
crm_case_channel_view_form crm.case.channel.form crm.case.channel form New
crm_case_channel_view_tree crm.case.channel.tree crm.case.channel tree New
crm_case_form_view_leads CRM - Leads Form crm.lead form New
crm_case_form_view_oppor Opportunities crm.lead form New
crm_case_graph_view_leads Opportunities crm.lead graph New
crm_case_inbound_phone_tree_view CRM - Logged Phone Calls Tree crm.phonecall tree New
crm_case_kanban_view_leads CRM - Leads Kanban crm.lead kanban New
crm_case_phone_calendar_view CRM - Phone Calls Calendar crm.phonecall calendar New
crm_case_phone_form_view CRM - Phone Call Form crm.phonecall form New
crm_case_phone_tree_view CRM - Phone Calls Tree crm.phonecall tree New
crm_case_resource_type_form crm.case.resource.type.form crm.case.resource.type form New
crm_case_resource_type_tree crm.case.resource.type.tree crm.case.resource.type tree New
crm_case_section_view_form crm.case.section.form crm.case.section form New
crm_case_section_view_tree crm.case.section.tree crm.case.section tree New
crm_case_stage_form crm.case.stage.form crm.case.stage form New
crm_case_stage_tree crm.case.stage.tree crm.case.stage tree New
crm_case_tree_view_leads Leads crm.lead tree New
crm_case_tree_view_oppor Opportunities Tree crm.lead tree New
crm_lead_partner_kanban_view res.partner.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
crm_lead_stage_search Stage - Search crm.case.stage search New
crm_segmentation-view crm.segmentation.form crm.segmentation form New
crm_segmentation_line-view crm.segmentation.line.form crm.segmentation.line form New
crm_segmentation_line_tree-view crm.segmentation.line.tree crm.segmentation.line tree New
crm_segmentation_tree-view crm.segmentation.tree crm.segmentation tree New
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
opportunity2phonecall_view crm.opportunity2phonecall.form crm.opportunity2phonecall form New
phonecall2phonecall2meeting_view crm.phonecall2meeting.form crm.phonecall2meeting form New
phonecall_to_phonecall_view crm.phonecall2phonecall.form crm.phonecall2phonecall form New
res_partner_view_buttons res.partner.view.buttons res.partner xpath Inherits base.view_partner_form
view_crm_case_leads_filter CRM - Leads Search crm.lead search New
view_crm_case_opportunities_filter CRM - Opportunities Search crm.lead search New
view_crm_case_phonecalls_filter CRM - Phone Calls Search crm.phonecall search New
view_crm_case_section_categ_categ2_filter CRM Report - Section, Category and Type(Select) report.crm.case.section.categ.categ2 search New
view_crm_case_section_categ_categ2_form CRM Report - Section, Category and Type(Form) report.crm.case.section.categ.categ2 form New
view_crm_case_section_categ_categ2_graph CRM Report - Section, Category and Type(Select) report.crm.case.section.categ.categ2 graph New
view_crm_case_section_categ_categ2_tree CRM Report - Section, Category and Type(Tree) report.crm.case.section.categ.categ2 tree New
view_crm_case_section_categ_filter CRM Report - Teams and Type(Select) report.crm.case.section.categ2 search New
view_crm_case_section_categ_form CRM Report - Teams and Type(Form) report.crm.case.section.categ2 form New
view_crm_case_section_categ_graph CRM Report - Teams and Type(Graph) report.crm.case.section.categ2 graph New
view_crm_case_section_categ_stage_filter CRM Report - Section, Category and Stage(Select) report.crm.case.section.categ.stage search New
view_crm_case_section_categ_stage_form CRM Report - Team, Category and Stage(Form) report.crm.case.section.categ.stage form New
view_crm_case_section_categ_stage_graph CRM Report - Section, Category and Stage(Select) report.crm.case.section.categ.stage graph New
view_crm_case_section_categ_stage_tree CRM Report - Team, Category and Stage(Tree) report.crm.case.section.categ.stage tree New
view_crm_case_section_categ_tree CRM Report - Teams and Type(Tree) report.crm.case.section.categ2 tree New
view_crm_case_section_stage_filter CRM Report - Teams and Stage(Select) report.crm.case.section.stage search New
view_crm_case_section_stage_form CRM Report - Teams and Stage(Form) report.crm.case.section.stage form New
view_crm_case_section_stage_graph CRM Report - Teams and Stage(Graph) report.crm.case.section.stage graph New
view_crm_case_section_stage_tree CRM Report - Teams and Stage(Tree) report.crm.case.section.stage tree New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_meeting_search CRM - Meetings Search crm.meeting xpath Inherits base_calendar.view_crm_meeting_search
view_crm_opportunity_stage_graph Opportunities By Stage - Graph crm.lead.report graph New
view_crm_opportunity_user_stage_graph Opportunities By Stage Per User - Graph crm.lead.report graph New
view_crm_payment_mode_form crm.payment.mode.form crm.payment.mode form New
view_crm_payment_mode_tree crm.payment.mode.tree crm.payment.mode tree New
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner field Inherits base.view_partner_form
view_report_crm_lead_filter crm.lead.report.select crm.lead.report search New
view_report_crm_lead_graph crm.lead.report.graph crm.lead.report graph New
view_report_crm_lead_tree crm.lead.report.tree crm.lead.report tree New
view_report_crm_opportunity_graph crm.opportunity.report.graph crm.lead.report graph New
view_report_crm_opportunity_tree crm.lead.report.tree crm.lead.report tree New
view_report_crm_phonecall_filter crm.phonecall.report.select crm.phonecall.report search New
view_report_crm_phonecall_graph crm.phonecall.report.graph crm.phonecall.report graph New
view_report_crm_phonecall_tree crm.phonecall.report.tree crm.phonecall.report tree New
view_sale_config_settings crm settings sale.config.settings div Inherits base_setup.view_sale_config_settings
Models touched (1)

New fields (0)

No new fields.

Public methods (1)
  • create(self, cr, uid, vals, context=None)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/crm
VERSION
VERSION 1.0
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Rucha (Open ERP), Atul Patel (OpenERP), Stephane Wirtel, Numerigraphe - Lionel Sausin, DBR (OpenERP), Harry (OpenERP), Bhumika (OpenERP), Fabien Pinckaers, Antony Lesuisse, Meera Trambadia (OpenERP), Olivier Dony, Thibault Delavallée, Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, vro, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, Ujjvala Collins (OpenERP), Xavier Morel, Khushboo Bhatt (Open ERP), Jigar Amin, Serpent Consulting Services, Amit (OpenERP), Minh Tran, Amit Bhavsar (Open ERP), Thibault Francois, Carlos Vásquez, odoo, ksa (Open ERP), Husen Daudi, Els Van Vossel, Israel Fermin Montilla, Rifakat Haradwala (Open ERP), Hardik Ansodariy (OpenERP), ssu, Bharat (OpenERP), aag (OpenERP), Yogesh (OpenERP), Sbh (OpenERP), jam-openerp, tfr@openerp.com, ron@tinyerp.com, fp, qdp-launchpad@tinyerp.com, AMP (OpenERP), Tejas (OpenERP), Amit Parmar (OpenERP), RME (OpenERP), RavishchanraMurari (Open ERP), Anup (OpenERP), YSA (Openerp), Atik Agewan (OpenERP), Ariel Figueroa, tfr, Ashutosh Srivastava (Open ERP), Aline Preillon
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_action_rule
    - base
    - mail
    - base_tools
    - base_setup
    - process
    - base_calendar
    - resource
    - board
    - fetchmail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The generic OpenERP Customer Relationship Management.
=====================================================

This system enables a group of people to intelligently and efficiently manage
leads, opportunities, meeting, phonecall etc.
It manages key tasks such as communication, identification, prioritization,
assignment, resolution and notification.

OpenERP ensures that all cases are successfully tracked by users, customers and
suppliers. It can automatically send reminders, escalate the request, trigger
specific methods and lots of other actions based on your own enterprise rules.

The greatest thing about this system is that users don't need to do anything
special. They can just send email to the request tracker. OpenERP will take
care of thanking them for their message, automatically routing it to the
appropriate staff, and make sure all future correspondence gets to the right
place.

The CRM module has a email gateway for the synchronisation interface
between mails and OpenERP.

Creates a dashboard for CRM that includes:
    * Opportunities by Categories (graph)
    * Opportunities by Stage (graph)
    * Planned Revenue by Stage and User (graph)

Code Analysis

Views touched (90)
XML IDNameModelTypeStatus
attendee_form_view_inherit calendar.attendee.form.inherit calendar.attendee field Inherits base_calendar.base_calendar_attendee_form_view
board_crm_form Sales Dashboard Form board.board form New
board_crm_statistical_form CRM - Statistical Dashboard Form board.board form New
crm_add_new_note_view crm.new.add.note.form crm.add.note form New
crm_case_calendar_view_leads CRM - Leads Calendar crm.lead calendar New
crm_case_calendar_view_meet CRM - Meetings Calendar crm.meeting calendar New
crm_case_categ-view crm.case.categ.form crm.case.categ form New
crm_case_categ_tree-view crm.case.categ.tree crm.case.categ tree New
crm_case_channel_view_form crm.case.channel.form crm.case.channel form New
crm_case_channel_view_tree crm.case.channel.tree crm.case.channel tree New
crm_case_form_view_leads CRM - Leads Form crm.lead form New
crm_case_form_view_meet CRM - Meetings Form crm.meeting form New
crm_case_form_view_oppor Opportunities crm.lead form New
crm_case_gantt_view_meet CRM - Meetings Gantt crm.meeting gantt New
crm_case_graph_view_opportunity CRM - Opportunity Graph crm.lead graph New
crm_case_inbound_phone_tree_view CRM - Logged Phone Calls Tree crm.phonecall tree New
crm_case_kanban_view_leads CRM - Leads Kanban crm.lead kanban New
crm_case_my_open_oppor Opportunities crm.lead tree New
crm_case_phone_calendar_view CRM - Phone Calls Calendar crm.phonecall calendar New
crm_case_phone_form_view CRM - Phone Call Form crm.phonecall form New
crm_case_phone_tree_view CRM - Phone Calls Tree crm.phonecall tree New
crm_case_resource_type_form crm.case.resource.type.form crm.case.resource.type form New
crm_case_resource_type_tree crm.case.resource.type.tree crm.case.resource.type tree New
crm_case_section_view_form crm.case.section.form crm.case.section form New
crm_case_section_view_tree crm.case.section.tree crm.case.section tree New
crm_case_stage_form crm.case.stage.form crm.case.stage form New
crm_case_stage_tree crm.case.stage.tree crm.case.stage tree New
crm_case_tree_view_leads Leads crm.lead tree New
crm_case_tree_view_meet CRM - Meetings Tree crm.meeting tree New
crm_case_tree_view_oppor Opportunities Tree crm.lead tree New
crm_lead_stage_search Stage - Search crm.case.stage search New
crm_segmentation-view crm.segmentation.form crm.segmentation form New
crm_segmentation_line-view crm.segmentation.line.form crm.segmentation.line form New
crm_segmentation_line_tree-view crm.segmentation.line.tree crm.segmentation.line tree New
crm_segmentation_tree-view crm.segmentation.tree crm.segmentation tree New
merge_opportunity_form crm.merge.opportunity.form crm.merge.opportunity form New
opportunity2phonecall_view crm.opportunity2phonecall.form crm.opportunity2phonecall form New
phonecall2opportunity_view crm.phonecall2opportunity.form crm.phonecall2opportunity form New
phonecall2phonecall2meeting_view crm.phonecall2meeting.form crm.phonecall2meeting form New
phonecall_to_phonecall_view crm.phonecall2phonecall.form crm.phonecall2phonecall form New
view_base_action_rule_line_form1 base.action.rule.form.inherit base.action.rule group Inherits base_action_rule.view_base_action_rule_form
view_base_action_rule_line_form2 base.action.rule.form2.inherit base.action.rule group Inherits base_action_rule.view_base_action_rule_form
view_base_action_rule_line_form3 base.action.rule.form3.inherit base.action.rule field Inherits base_action_rule.view_base_action_rule_form
view_base_action_rule_line_form4 base.action.rule.form4.inherit base.action.rule field Inherits base_action_rule.view_base_action_rule_form
view_crm_case_leads_filter CRM - Leads Search crm.lead search New
view_crm_case_meetings_filter CRM - Meetings Search crm.meeting search New
view_crm_case_opportunities_filter CRM - Opportunities Search crm.lead search New
view_crm_case_phonecalls_filter CRM - Phone Calls Search crm.phonecall search New
view_crm_case_scheduled_phonecalls_filter CRM - Scheduled Calls Search crm.phonecall search New
view_crm_case_section_categ_categ2_filter CRM Report - Section, Category and Type(Select) report.crm.case.section.categ.categ2 search New
view_crm_case_section_categ_categ2_form CRM Report - Section, Category and Type(Form) report.crm.case.section.categ.categ2 form New
view_crm_case_section_categ_categ2_graph CRM Report - Section, Category and Type(Select) report.crm.case.section.categ.categ2 graph New
view_crm_case_section_categ_categ2_tree CRM Report - Section, Category and Type(Tree) report.crm.case.section.categ.categ2 tree New
view_crm_case_section_categ_filter CRM Report - Teams and Type(Select) report.crm.case.section.categ2 search New
view_crm_case_section_categ_form CRM Report - Teams and Type(Form) report.crm.case.section.categ2 form New
view_crm_case_section_categ_graph CRM Report - Teams and Type(Graph) report.crm.case.section.categ2 graph New
view_crm_case_section_categ_stage_filter CRM Report - Section, Category and Stage(Select) report.crm.case.section.categ.stage search New
view_crm_case_section_categ_stage_form CRM Report - Team, Category and Stage(Form) report.crm.case.section.categ.stage form New
view_crm_case_section_categ_stage_graph CRM Report - Section, Category and Stage(Select) report.crm.case.section.categ.stage graph New
view_crm_case_section_categ_stage_tree CRM Report - Team, Category and Stage(Tree) report.crm.case.section.categ.stage tree New
view_crm_case_section_categ_tree CRM Report - Teams and Type(Tree) report.crm.case.section.categ2 tree New
view_crm_case_section_stage_filter CRM Report - Teams and Stage(Select) report.crm.case.section.stage search New
view_crm_case_section_stage_form CRM Report - Teams and Stage(Form) report.crm.case.section.stage form New
view_crm_case_section_stage_graph CRM Report - Teams and Stage(Graph) report.crm.case.section.stage graph New
view_crm_case_section_stage_tree CRM Report - Teams and Stage(Tree) report.crm.case.section.stage tree New
view_crm_lead2opportunity_partner crm.lead2opportunity.partner.form crm.lead2opportunity.partner form New
view_crm_lead2opportunity_partner_mass crm.lead2opportunity.partner.mass.form crm.lead2opportunity.partner.mass form New
view_crm_lead2partner crm.lead2partner.view crm.lead2partner form New
view_crm_opportunity_categ_graph Opportunities By Categories - Graph crm.lead.report graph New
view_crm_opportunity_stage_graph Opportunities By Stage - Graph crm.lead.report graph New
view_crm_opportunity_user_graph1 crm.opportunity.user.graph1 crm.lead.report graph New
view_crm_opportunity_user_stage_graph Opportunities By Stage Per User - Graph crm.lead.report graph New
view_crm_partner2opportunity crm.crm.partner2opportunity crm.partner2opportunity form New
view_crm_partner_info_form1 res.partner.crm.info.inherit1 res.partner page Inherits base.view_partner_form
view_crm_phonecall2partner crm.phonecall2partner.view crm.phonecall2partner form New
view_crm_phonecall2partner_create crm.phonecall2partner.view.create crm.phonecall2partner form New
view_partners_form_crm1 view.res.partner.form.crm.inherited1 res.partner field Inherits base.view_partner_form
view_partners_form_crm3 view.res.partner.search.crm.inherited3 res.partner field Inherits base.view_res_partner_filter
view_partners_tree_crm2 view.res.partner.tree.crm.inherited2 res.partner field Inherits base.view_partner_tree
view_report_crm_lead_filter crm.lead.report.select crm.lead.report search New
view_report_crm_lead_graph crm.lead.report.graph crm.lead.report graph New
view_report_crm_lead_tree crm.lead.report.tree crm.lead.report tree New
view_report_crm_oppor_graph crm.lead.report.graph crm.lead.report graph New
view_report_crm_opportunity_graph crm.opportunity.report.graph crm.lead.report graph New
view_report_crm_opportunity_tree crm.lead.report.tree crm.lead.report tree New
view_report_crm_phonecall_filter crm.phonecall.report.select crm.phonecall.report search New
view_report_crm_phonecall_graph crm.phonecall.report.graph crm.phonecall.report graph New
view_report_crm_phonecall_tree crm.phonecall.report.tree crm.phonecall.report tree New
view_users_form_simple_modif_inherited1 view.users.form.crm.modif.inherited1 res.users group Inherits base.view_users_form_simple_modif
view_users_form_simple_modif_inherited2 view.users.form.crm.modif.inherited2 res.users group Inherits base.view_users_form
Models touched (0)

No models found for this module.