Crm Salesperson Planner

crm_salesperson_planner
REPOSITORY
REPOSITORYOCA/crm
GIT
GIThttps://github.com/OCA/crm.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/crm/tree/18.0/crm_salesperson_planner
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Sygel Technology
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Sygel Technology
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, sygel, Bhavesh Heliconia
WEBSITE
WEBSITEhttps://github.com/OCA/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - crm
    - 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
This application allows you to track and schedule salespeople visits
to your customers, allowing you to determine which opportunities are
going to be dealt on each visit.

Visits create an all-day event in the calendar and they can be easily
rescheduled. Visits can be automatically created from a template, in
which it is possible to select the frequency of visits, as well as the
start and end dates. The last visit can also be calculated by selecting
the total number of repetitions.

This module creates a cron job that generates visits from templates, but
an option to create them manually is available from the template form view
when the template is validated.

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
crm_lead_crm_salesperson_planner crm.lead.view.crm.salesperson.planner crm.lead notebook Inherits crm.crm_lead_view_form
crm_salesperson_planner_visit_close_reason_form_view CRM - Salesperson Planner Visit Close Reason Form crm.salesperson.planner.visit.close.reason form New
crm_salesperson_planner_visit_close_reason_tree_view CRM - Salesperson Planner Visit Close Reason Tree crm.salesperson.planner.visit.close.reason list New
crm_salesperson_planner_visit_close_wiz_view_form crm.salesperson.lost.form crm.salesperson.planner.visit.close.wiz form New
crm_salesperson_planner_visit_filter CRM - Salesperson Planner Visit Search crm.salesperson.planner.visit search New
crm_salesperson_planner_visit_form_view CRM - Salesperson Planner Visit Form crm.salesperson.planner.visit form New
crm_salesperson_planner_visit_template_create_view_form crm.salesperson.planner.visit.template.create.form crm.salesperson.planner.visit.template.create form New
crm_salesperson_planner_visit_template_form_view CRM - Salesperson Planner Visit Template Form crm.salesperson.planner.visit.template form New
crm_salesperson_planner_visit_template_tree_view CRM - Salesperson Planner Visit Template Tree crm.salesperson.planner.visit.template list New
crm_salesperson_planner_visit_tree_view CRM - Salesperson Planner Visit Tree crm.salesperson.planner.visit list New
partner_view_crm_salesperson_planner partner.view.crm.salesperson.planner res.partner xpath Inherits base.view_partner_form
Models touched (8)

New fields (1)
  • salesperson_planner_visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='calendar_event_id' string='Salesperson Visits'
Public methods (2)
  • unlink(self)
  • write(self, values)

New fields (1)
  • crm_salesperson_planner_visit_ids Many2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' copy=False domain="[('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Visits'
Public methods (0)

No public methods.

New fields (16)
  • calendar_event_id Many2one → calendar.event
    comodel_name='calendar.event' string='Calendar Event'
  • close_reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' string='Close Reason'
  • close_reason_image Image
    attachment=True max_height=1024 max_width=1024
  • close_reason_notes Text
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • date Date
    default=fields.Date.context_today required=True
  • description Html
  • name Char
    copy=False default='/' required=True string='Visit Number'
  • opportunity_ids Many2many → crm.lead
    comodel_name='crm.lead' copy=False domain="[('type', '=', 'opportunity'), ('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Opportunities'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' required=True string='Customer'
  • partner_mobile Char
    related='partner_id.mobile' string='Mobile'
  • partner_phone Char
    related='partner_id.phone' string='Phone'
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • state Selection
    copy=False default='draft' required=True selection=[('draft', 'Draft'), ('confirm', 'Validated'), ('done', 'Visited'), ('cancel', 'Cancelled'), ('incident', 'Incident')] string='Status' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> index=True string='Salesperson' tracking=True
  • visit_template_id Many2one → crm.salesperson.planner.visit.template
    comodel_name='crm.salesperson.planner.visit.template' string='Visit Template'
Public methods (9)
  • action_cancel(self, reason_id, image=None, notes=None)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_incident(self, reason_id, image=None, notes=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_calendar_event(self)
  • unlink(self)
  • write(self, values)

New fields (4)
  • close_type Selection
    default='cancel' required=True selection=[('cancel', 'Cancel'), ('incident', 'Incident')] string='Type'
  • name Char
    required=True string='Description' translate=True
  • require_image Boolean
    default=False
  • reschedule Boolean
    default=False
Public methods (0)

No public methods.

New fields (8)
  • allow_reschedule Boolean
    related='reason_id.reschedule' string='Allow Reschedule'
  • image Image
    max_height=1024 max_width=1024
  • new_date Date
    default=<expr>
  • new_sequence Integer
    default=<expr> help='Used to order Visits in the different views' string='Sequence'
  • notes Text
  • reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' required=True string='Reason'
  • require_image Boolean
    related='reason_id.require_image' string='Require Image'
  • reschedule Boolean
    default=True
Public methods (1)
  • action_close_reason_apply(self)

New fields (39)
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Notifications sent to all attendees to remind of the meeting.' ondelete='restrict' string='Reminders'
  • allday Boolean
    default=True string='All Day'
  • auto_validate Boolean
    default=True
  • byday Selection
    args: BYDAY_SELECTION
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • count Integer
    help='Repeat x times' string='Repeat'
  • day Integer
    string='Date of month'
  • description Html
  • duration Float
    compute='_compute_duration' readonly=False store=True
  • end_type Selection
    string='Recurrence Termination' args: END_TYPE_SELECTION
  • event_tz Selection
    string='Timezone' args: _tz_get
  • final_date Date
    string='Repeat Until'
  • fri Boolean
  • interval Integer
    help='Repeat every (Days/Week/Month/Year)' string='Repeat Every'
  • last_visit_date Date
    compute='_compute_last_visit_date' store=True
  • mon Boolean
  • month_by Selection
    string='Option' args: MONTH_BY_SELECTION
  • name Char
    copy=False default='/' string='Visit Template Number'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' related='user_id.partner_id' string='Scheduled by'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' default=False required=True string='Customer'
  • rrule Char
    string='Recurrent Rule'
  • rrule_type Selection
    default='daily' help='Let the event automatically repeat at that interval' required=True string='Recurrence' args: RRULE_TYPE_SELECTION
  • sat Boolean
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • start Datetime
    default=fields.Date.today help='Start date of an event, without time for full days events' required=True tracking=True
  • start_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True tracking=True
  • state Selection
    copy=False default='draft' required=True selection=[('draft', 'Draft'), ('in-progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')] string='Status' tracking=True
  • stop Datetime
    compute='_compute_stop' default=<expr> help='Stop date of an event, without time for full days events' required=True store=True tracking=True
  • stop_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True string='End Date' tracking=True
  • sun Boolean
  • thu Boolean
  • tue Boolean
  • until Date
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> string='Salesperson' tracking=True
  • visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='visit_template_id' string='Visit Template'
  • visit_ids_count Integer
    compute='_compute_visit_ids_count' string='Number of Sales Person Visits'
  • wed Boolean
  • weekday Selection
    args: WEEKDAY_SELECTION
Public methods (6)
  • action_cancel(self)
  • action_draft(self)
  • action_validate(self)
  • action_view_salesperson_planner_visit(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_visits(self, days=7)

New fields (1)
  • date_to Date
    default=<expr> required=True string='Date to'
Public methods (1)
  • create_visits(self)

New fields (1)
  • salesperson_planner_visit_count Integer
    compute='_compute_salesperson_planner_visit_count' string='Number of Salesperson Visits'
Public methods (1)
  • action_view_salesperson_planner_visit(self)
REPOSITORY
REPOSITORYOCA/crm
GIT
GIThttps://github.com/OCA/crm.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/crm/tree/17.0/crm_salesperson_planner
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Sygel Technology
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Sygel Technology
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, sygel, bobrador, MohamedOsman7
WEBSITE
WEBSITEhttps://github.com/OCA/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:03
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - crm
    - 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
This application allows you to track and schedule salespeople visits to
your customers, allowing you to determine which opportunities are going
to be dealt on each visit. Visits create an all day event in calendar,
and they can be easily rescheduled. Visits can be automatically created
from a template, in which it is possible to select the frequency of
visits, as well as the start and end dates. The last visit can also be
calculated by selecting the total number of repetitions. This module
creates a cron that generates visits from templates, but an option to
create them manually is available from the template form view when the
template is validated.

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
crm_lead_crm_salesperson_planner crm.lead.view.crm.salesperson.planner crm.lead notebook Inherits crm.crm_lead_view_form
crm_salesperson_planner_visit_close_reason_form_view CRM - Salesperson Planner Visit Close Reason Form crm.salesperson.planner.visit.close.reason form New
crm_salesperson_planner_visit_close_reason_tree_view CRM - Salesperson Planner Visit Close Reason Tree crm.salesperson.planner.visit.close.reason tree New
crm_salesperson_planner_visit_close_wiz_view_form crm.salesperson.lost.form crm.salesperson.planner.visit.close.wiz form New
crm_salesperson_planner_visit_filter CRM - Salesperson Planner Visit Search crm.salesperson.planner.visit search New
crm_salesperson_planner_visit_form_view CRM - Salesperson Planner Visit Form crm.salesperson.planner.visit form New
crm_salesperson_planner_visit_template_create_view_form crm.salesperson.planner.visit.template.create.form crm.salesperson.planner.visit.template.create form New
crm_salesperson_planner_visit_template_form_view CRM - Salesperson Planner Visit Template Form crm.salesperson.planner.visit.template form New
crm_salesperson_planner_visit_template_tree_view CRM - Salesperson Planner Visit Template Tree crm.salesperson.planner.visit.template tree New
crm_salesperson_planner_visit_tree_view CRM - Salesperson Planner Visit Tree crm.salesperson.planner.visit tree New
partner_view_crm_salesperson_planner partner.view.crm.salesperson.planner res.partner xpath Inherits base.view_partner_form
Models touched (8)

New fields (1)
  • salesperson_planner_visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='calendar_event_id' string='Salesperson Visits'
Public methods (2)
  • unlink(self)
  • write(self, values)

New fields (1)
  • crm_salesperson_planner_visit_ids Many2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' copy=False domain="[('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Visits'
Public methods (0)

No public methods.

New fields (16)
  • calendar_event_id Many2one → calendar.event
    comodel_name='calendar.event' string='Calendar Event'
  • close_reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' string='Close Reason'
  • close_reason_image Image
    attachment=True max_height=1024 max_width=1024
  • close_reason_notes Text
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • date Date
    default=fields.Date.context_today required=True
  • description Html
  • name Char
    copy=False default='/' required=True string='Visit Number'
  • opportunity_ids Many2many → crm.lead
    comodel_name='crm.lead' copy=False domain="[('type', '=', 'opportunity'), ('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Opportunities'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' required=True string='Customer'
  • partner_mobile Char
    related='partner_id.mobile' string='Mobile'
  • partner_phone Char
    related='partner_id.phone' string='Phone'
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • state Selection
    copy=False default='draft' required=True selection=[('draft', 'Draft'), ('confirm', 'Validated'), ('done', 'Visited'), ('cancel', 'Cancelled'), ('incident', 'Incident')] string='Status' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> index=True string='Salesperson' tracking=True
  • visit_template_id Many2one → crm.salesperson.planner.visit.template
    comodel_name='crm.salesperson.planner.visit.template' string='Visit Template'
Public methods (9)
  • action_cancel(self, reason_id, image=None, notes=None)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_incident(self, reason_id, image=None, notes=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_calendar_event(self)
  • unlink(self)
  • write(self, values)

New fields (4)
  • close_type Selection
    default='cancel' required=True selection=[('cancel', 'Cancel'), ('incident', 'Incident')] string='Type'
  • name Char
    required=True string='Description' translate=True
  • require_image Boolean
    default=False
  • reschedule Boolean
    default=False
Public methods (0)

No public methods.

New fields (8)
  • allow_reschedule Boolean
    related='reason_id.reschedule' string='Allow Reschedule'
  • image Image
    max_height=1024 max_width=1024
  • new_date Date
    default=<expr>
  • new_sequence Integer
    default=<expr> help='Used to order Visits in the different views' string='Sequence'
  • notes Text
  • reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' required=True string='Reason'
  • require_image Boolean
    related='reason_id.require_image' string='Require Image'
  • reschedule Boolean
    default=True
Public methods (1)
  • action_close_reason_apply(self)

New fields (39)
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Notifications sent to all attendees to remind of the meeting.' ondelete='restrict' string='Reminders'
  • allday Boolean
    default=True string='All Day'
  • auto_validate Boolean
    default=True
  • byday Selection
    args: BYDAY_SELECTION
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • count Integer
    help='Repeat x times' string='Repeat'
  • day Integer
    string='Date of month'
  • description Html
  • duration Float
    compute='_compute_duration' readonly=False store=True
  • end_type Selection
    string='Recurrence Termination' args: END_TYPE_SELECTION
  • event_tz Selection
    string='Timezone' args: _tz_get
  • final_date Date
    string='Repeat Until'
  • fri Boolean
  • interval Integer
    help='Repeat every (Days/Week/Month/Year)' string='Repeat Every'
  • last_visit_date Date
    compute='_compute_last_visit_date' store=True
  • mon Boolean
  • month_by Selection
    string='Option' args: MONTH_BY_SELECTION
  • name Char
    copy=False default='/' string='Visit Template Number'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' related='user_id.partner_id' string='Scheduled by'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' default=False required=True string='Customer'
  • rrule Char
    string='Recurrent Rule'
  • rrule_type Selection
    default='daily' help='Let the event automatically repeat at that interval' required=True string='Recurrence' args: RRULE_TYPE_SELECTION
  • sat Boolean
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • start Datetime
    default=fields.Date.today help='Start date of an event, without time for full days events' required=True tracking=True
  • start_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True tracking=True
  • state Selection
    copy=False default='draft' required=True selection=[('draft', 'Draft'), ('in-progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')] string='Status' tracking=True
  • stop Datetime
    compute='_compute_stop' default=<expr> help='Stop date of an event, without time for full days events' required=True store=True tracking=True
  • stop_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True string='End Date' tracking=True
  • sun Boolean
  • thu Boolean
  • tue Boolean
  • until Date
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> string='Salesperson' tracking=True
  • visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='visit_template_id' string='Visit Template'
  • visit_ids_count Integer
    compute='_compute_visit_ids_count' string='Number of Sales Person Visits'
  • wed Boolean
  • weekday Selection
    args: WEEKDAY_SELECTION
Public methods (6)
  • action_cancel(self)
  • action_draft(self)
  • action_validate(self)
  • action_view_salesperson_planner_visit(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_visits(self, days=7)

New fields (1)
  • date_to Date
    default=<expr> required=True string='Date to'
Public methods (1)
  • create_visits(self)

New fields (1)
  • salesperson_planner_visit_count Integer
    compute='_compute_salesperson_planner_visit_count' string='Number of Salesperson Visits'
Public methods (1)
  • action_view_salesperson_planner_visit(self)
REPOSITORY
REPOSITORYOCA/crm
GIT
GIThttps://github.com/OCA/crm.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/crm/tree/16.0/crm_salesperson_planner
VERSION
VERSION 2.0.2
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Sygel Technology
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Sygel Technology
COMMITTERS
COMMITTERSPedro M. Baeza, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Zina Rasoamanana
WEBSITE
WEBSITEhttps://github.com/OCA/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - crm
    - 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 (11)
XML IDNameModelTypeStatus
crm_lead_crm_salesperson_planner crm.lead.view.crm.salesperson.planner crm.lead notebook Inherits crm.crm_lead_view_form
crm_salesperson_planner_visit_close_reason_form_view CRM - Salesperson Planner Visit Close Reason Form crm.salesperson.planner.visit.close.reason form New
crm_salesperson_planner_visit_close_reason_tree_view CRM - Salesperson Planner Visit Close Reason Tree crm.salesperson.planner.visit.close.reason tree New
crm_salesperson_planner_visit_close_wiz_view_form crm.salesperson.lost.form crm.salesperson.planner.visit.close.wiz form New
crm_salesperson_planner_visit_filter CRM - Salesperson Planner Visit Search crm.salesperson.planner.visit search New
crm_salesperson_planner_visit_form_view CRM - Salesperson Planner Visit Form crm.salesperson.planner.visit form New
crm_salesperson_planner_visit_template_create_view_form crm.salesperson.planner.visit.template.create.form crm.salesperson.planner.visit.template.create form New
crm_salesperson_planner_visit_template_form_view CRM - Salesperson Planner Visit Template Form crm.salesperson.planner.visit.template form New
crm_salesperson_planner_visit_template_tree_view CRM - Salesperson Planner Visit Template Tree crm.salesperson.planner.visit.template tree New
crm_salesperson_planner_visit_tree_view CRM - Salesperson Planner Visit Tree crm.salesperson.planner.visit tree New
partner_view_crm_salesperson_planner partner.view.crm.salesperson.planner res.partner xpath Inherits base.view_partner_form
Models touched (8)

New fields (1)
  • salesperson_planner_visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='calendar_event_id' string='Salesperson Visits'
Public methods (2)
  • unlink(self)
  • write(self, values)

New fields (1)
  • crm_salesperson_planner_visit_ids Many2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' copy=False domain="[('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Visits'
Public methods (0)

No public methods.

New fields (16)
  • calendar_event_id Many2one → calendar.event
    comodel_name='calendar.event' string='Calendar Event'
  • close_reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' string='Close Reason'
  • close_reason_image Image
    attachment=True max_height=1024 max_width=1024
  • close_reason_notes Text
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • date Date
    default=fields.Date.context_today required=True
  • description Html
  • name Char
    copy=False default='/' readonly=True required=True string='Visit Number'
  • opportunity_ids Many2many → crm.lead
    comodel_name='crm.lead' copy=False domain="[('type', '=', 'opportunity'), ('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Opportunities'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' required=True string='Customer'
  • partner_mobile Char
    related='partner_id.mobile' string='Mobile'
  • partner_phone Char
    related='partner_id.phone' string='Phone'
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • state Selection
    copy=False default='draft' readonly=True required=True selection=[('draft', 'Draft'), ('confirm', 'Validated'), ('done', 'Visited'), ('cancel', 'Cancelled'), ('incident', 'Incident')] string='Status' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> index=True string='Salesperson' tracking=True
  • visit_template_id Many2one → crm.salesperson.planner.visit.template
    comodel_name='crm.salesperson.planner.visit.template' string='Visit Template'
Public methods (9)
  • action_cancel(self, reason_id, image=None, notes=None)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_incident(self, reason_id, image=None, notes=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_calendar_event(self)
  • unlink(self)
  • write(self, values)

New fields (4)
  • close_type Selection
    default='cancel' required=True selection=[('cancel', 'Cancel'), ('incident', 'Incident')] string='Type'
  • name Char
    required=True string='Description' translate=True
  • require_image Boolean
    default=False
  • reschedule Boolean
    default=False
Public methods (0)

No public methods.

New fields (8)
  • allow_reschedule Boolean
    related='reason_id.reschedule' string='Allow Reschedule'
  • image Image
    max_height=1024 max_width=1024
  • new_date Date
    default=<expr>
  • new_sequence Integer
    default=<expr> help='Used to order Visits in the different views' string='Sequence'
  • notes Text
  • reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' required=True string='Reason'
  • require_image Boolean
    related='reason_id.require_image' string='Require Image'
  • reschedule Boolean
    default=True
Public methods (1)
  • action_close_reason_apply(self)

New fields (39)
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Notifications sent to all attendees to remind of the meeting.' ondelete='restrict' string='Reminders'
  • allday Boolean
    default=True string='All Day'
  • auto_validate Boolean
    default=True
  • byday Selection
    args: BYDAY_SELECTION
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • count Integer
    help='Repeat x times' string='Repeat'
  • day Integer
    string='Date of month'
  • description Html
  • duration Float
    compute='_compute_duration' readonly=False store=True
  • end_type Selection
    string='Recurrence Termination' args: END_TYPE_SELECTION
  • event_tz Selection
    string='Timezone' args: _tz_get
  • final_date Date
    string='Repeat Until'
  • fri Boolean
  • interval Integer
    help='Repeat every (Days/Week/Month/Year)' string='Repeat Every'
  • last_visit_date Date
    compute='_compute_last_visit_date' store=True
  • mon Boolean
  • month_by Selection
    string='Option' args: MONTH_BY_SELECTION
  • name Char
    copy=False default='/' readonly=True string='Visit Template Number'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='user_id.partner_id' string='Scheduled by'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' default=False required=True string='Customer'
  • rrule Char
    string='Recurrent Rule'
  • rrule_type Selection
    default='daily' help='Let the event automatically repeat at that interval' required=True string='Recurrence' args: RRULE_TYPE_SELECTION
  • sat Boolean
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • start Datetime
    default=fields.Date.today help='Start date of an event, without time for full days events' required=True tracking=True
  • start_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True tracking=True
  • state Selection
    copy=False default='draft' required=True selection=[('draft', 'Draft'), ('in-progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')] string='Status' tracking=True
  • stop Datetime
    compute='_compute_stop' default=<expr> help='Stop date of an event, without time for full days events' readonly=False required=True store=True tracking=True
  • stop_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True string='End Date' tracking=True
  • sun Boolean
  • thu Boolean
  • tue Boolean
  • until Date
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> string='Salesperson' tracking=True
  • visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='visit_template_id' string='Visit Template'
  • visit_ids_count Integer
    compute='_compute_visit_ids_count' string='Number of Sales Person Visits'
  • wed Boolean
  • weekday Selection
    args: WEEKDAY_SELECTION
Public methods (6)
  • action_cancel(self)
  • action_draft(self)
  • action_validate(self)
  • action_view_salesperson_planner_visit(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_visits(self, days=7)

New fields (1)
  • date_to Date
    default=<expr> required=True string='Date to'
Public methods (1)
  • create_visits(self)

New fields (1)
  • salesperson_planner_visit_count Integer
    compute='_compute_salesperson_planner_visit_count' string='Number of Salesperson Visits'
Public methods (1)
  • action_view_salesperson_planner_visit(self)
REPOSITORY
REPOSITORYOCA/crm
GIT
GIThttps://github.com/OCA/crm.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/crm/tree/15.0/crm_salesperson_planner
VERSION
VERSION 3.0.1
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Sygel Technology
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Sygel Technology
COMMITTERS
COMMITTERSPedro M. Baeza, sergio-teruel, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Roger, ilo
WEBSITE
WEBSITEhttps://github.com/OCA/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - crm
    - 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 (11)
XML IDNameModelTypeStatus
crm_lead_crm_salesperson_planner crm.lead.view.crm.salesperson.planner crm.lead notebook Inherits crm.crm_lead_view_form
crm_salesperson_planner_visit_close_reason_form_view CRM - Salesperson Planner Visit Close Reason Form crm.salesperson.planner.visit.close.reason form New
crm_salesperson_planner_visit_close_reason_tree_view CRM - Salesperson Planner Visit Close Reason Tree crm.salesperson.planner.visit.close.reason tree New
crm_salesperson_planner_visit_close_wiz_view_form crm.salesperson.lost.form crm.salesperson.planner.visit.close.wiz form New
crm_salesperson_planner_visit_filter CRM - Salesperson Planner Visit Search crm.salesperson.planner.visit search New
crm_salesperson_planner_visit_form_view CRM - Salesperson Planner Visit Form crm.salesperson.planner.visit form New
crm_salesperson_planner_visit_template_create_view_form crm.salesperson.planner.visit.template.create.form crm.salesperson.planner.visit.template.create form New
crm_salesperson_planner_visit_template_form_view CRM - Salesperson Planner Visit Template Form crm.salesperson.planner.visit.template form New
crm_salesperson_planner_visit_template_tree_view CRM - Salesperson Planner Visit Template Tree crm.salesperson.planner.visit.template tree New
crm_salesperson_planner_visit_tree_view CRM - Salesperson Planner Visit Tree crm.salesperson.planner.visit tree New
partner_view_crm_salesperson_planner partner.view.crm.salesperson.planner res.partner xpath Inherits base.view_partner_form
Models touched (8)

New fields (1)
  • salesperson_planner_visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='calendar_event_id' string='Salesperson Visits'
Public methods (2)
  • unlink(self)
  • write(self, values)

New fields (1)
  • crm_salesperson_planner_visit_ids Many2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' copy=False domain="[('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Visits'
Public methods (0)

No public methods.

New fields (16)
  • calendar_event_id Many2one → calendar.event
    comodel_name='calendar.event' string='Calendar Event'
  • close_reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' string='Close Reason'
  • close_reason_image Image
    attachment=True max_height=1024 max_width=1024
  • close_reason_notes Text
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • date Date
    default=fields.Date.context_today required=True
  • description Html
  • name Char
    copy=False default='/' readonly=True required=True string='Visit Number'
  • opportunity_ids Many2many → crm.lead
    comodel_name='crm.lead' copy=False domain="[('type', '=', 'opportunity'), ('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Opportunities'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' required=True string='Customer'
  • partner_mobile Char
    related='partner_id.mobile' string='Mobile'
  • partner_phone Char
    related='partner_id.phone' string='Phone'
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • state Selection
    copy=False default='draft' readonly=True required=True selection=[('draft', 'Draft'), ('confirm', 'Validated'), ('done', 'Visited'), ('cancel', 'Cancelled'), ('incident', 'Incident')] string='Status' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> index=True string='Salesperson' tracking=True
  • visit_template_id Many2one → crm.salesperson.planner.visit.template
    comodel_name='crm.salesperson.planner.visit.template' string='Visit Template'
Public methods (9)
  • action_cancel(self, reason_id, image=None, notes=None)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_incident(self, reason_id, image=None, notes=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_calendar_event(self)
  • unlink(self)
  • write(self, values)

New fields (4)
  • close_type Selection
    default='cancel' required=True selection=[('cancel', 'Cancel'), ('incident', 'Incident')] string='Type'
  • name Char
    required=True string='Description' translate=True
  • require_image Boolean
    default=False
  • reschedule Boolean
    default=False
Public methods (0)

No public methods.

New fields (8)
  • allow_reschedule Boolean
    related='reason_id.reschedule' string='Allow Reschedule'
  • image Image
    max_height=1024 max_width=1024
  • new_date Date
    default=<expr>
  • new_sequence Integer
    default=<expr> help='Used to order Visits in the different views' string='Sequence'
  • notes Text
  • reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' required=True string='Reason'
  • require_image Boolean
    related='reason_id.require_image' string='Require Image'
  • reschedule Boolean
    default=True
Public methods (1)
  • action_close_reason_apply(self)

New fields (39)
  • alarm_ids Many2many → calendar.alarm
    comodel_name='calendar.alarm' help='Notifications sent to all attendees to remind of the meeting.' ondelete='restrict' string='Reminders'
  • allday Boolean
    default=True string='All Day'
  • auto_validate Boolean
    default=True
  • byday Selection
    args: BYDAY_SELECTION
  • categ_ids Many2many → calendar.event.type
    comodel_name='calendar.event.type' string='Tags'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • count Integer
    help='Repeat x times' string='Repeat'
  • day Integer
    string='Date of month'
  • description Html
  • duration Float
    compute='_compute_duration' readonly=False store=True
  • end_type Selection
    string='Recurrence Termination' args: END_TYPE_SELECTION
  • event_tz Selection
    string='Timezone' args: _tz_get
  • final_date Date
    string='Repeat Until'
  • fri Boolean
  • interval Integer
    help='Repeat every (Days/Week/Month/Year)' string='Repeat Every'
  • last_visit_date Date
    compute='_compute_last_visit_date' store=True
  • mon Boolean
  • month_by Selection
    string='Option' args: MONTH_BY_SELECTION
  • name Char
    copy=False default='/' readonly=True string='Visit Template Number'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' readonly=True related='user_id.partner_id' string='Scheduled by'
  • partner_ids Many2many → res.partner
    comodel_name='res.partner' default=False required=True string='Customer'
  • rrule Char
    string='Recurrent Rule'
  • rrule_type Selection
    default='daily' help='Let the event automatically repeat at that interval' required=True string='Recurrence' args: RRULE_TYPE_SELECTION
  • sat Boolean
  • sequence Integer
    default=20 help='Used to order Visits in the different views'
  • start Datetime
    default=fields.Date.today help='Start date of an event, without time for full days events' required=True tracking=True
  • start_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True tracking=True
  • state Selection
    copy=False default='draft' required=True selection=[('draft', 'Draft'), ('in-progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')] string='Status' tracking=True
  • stop Datetime
    compute='_compute_stop' default=<expr> help='Stop date of an event, without time for full days events' readonly=False required=True store=True tracking=True
  • stop_date Date
    compute='_compute_dates' inverse='_inverse_dates' store=True string='End Date' tracking=True
  • sun Boolean
  • thu Boolean
  • tue Boolean
  • until Date
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> string='Salesperson' tracking=True
  • visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='visit_template_id' string='Visit Template'
  • visit_ids_count Integer
    compute='_compute_visit_ids_count' string='Number of Sales Person Visits'
  • wed Boolean
  • weekday Selection
    args: WEEKDAY_SELECTION
Public methods (6)
  • action_cancel(self)
  • action_draft(self)
  • action_validate(self)
  • action_view_salesperson_planner_visit(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_visits(self, days=7)

New fields (1)
  • date_to Date
    default=<expr> required=True string='Date to'
Public methods (1)
  • create_visits(self)

New fields (1)
  • salesperson_planner_visit_count Integer
    compute='_compute_salesperson_planner_visit_count' string='Number of Salesperson Visits'
Public methods (1)
  • action_view_salesperson_planner_visit(self)
REPOSITORY
REPOSITORYOCA/crm
GIT
GIThttps://github.com/OCA/crm.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/crm/tree/13.0/crm_salesperson_planner
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYCustomer Relationship Management
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Sygel Technology
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Sygel Technology
COMMITTERS
COMMITTERSoca-travis, Weblate, OCA-git-bot, Valentin Vinagre Urteaga
WEBSITE
WEBSITEhttps://github.com/OCA/crm
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - crm
    - 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 (11)
XML IDNameModelTypeStatus
crm_lead_crm_salesperson_planner crm.lead.view.crm.salesperson.planner crm.lead notebook Inherits crm.crm_lead_view_form
crm_salesperson_planner_visit_close_reason_form_view CRM - Salesperson Planner Visit Close Reason Form crm.salesperson.planner.visit.close.reason form New
crm_salesperson_planner_visit_close_reason_tree_view CRM - Salesperson Planner Visit Close Reason Tree crm.salesperson.planner.visit.close.reason tree New
crm_salesperson_planner_visit_close_wiz_view_form crm.salesperson.lost.form crm.salesperson.planner.visit.close.wiz form New
crm_salesperson_planner_visit_filter CRM - Salesperson Planner Visit Search crm.salesperson.planner.visit search New
crm_salesperson_planner_visit_form_view CRM - Salesperson Planner Visit Form crm.salesperson.planner.visit form New
crm_salesperson_planner_visit_template_create_view_form crm.salesperson.planner.visit.template.create.form crm.salesperson.planner.visit.template.create form New
crm_salesperson_planner_visit_template_form_view CRM - Salesperson Planner Visit Template Form crm.salesperson.planner.visit.template form New
crm_salesperson_planner_visit_template_tree_view CRM - Salesperson Planner Visit Template Tree crm.salesperson.planner.visit.template tree New
crm_salesperson_planner_visit_tree_view CRM - Salesperson Planner Visit Tree crm.salesperson.planner.visit tree New
partner_view_crm_salesperson_planner partner.view.crm.salesperson.planner res.partner xpath Inherits base.view_partner_form
Models touched (8)

New fields (1)
  • salesperson_planner_visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='calendar_event_id' string='Salesperson Visits'
Public methods (2)
  • unlink(self, can_be_deleted=True)
  • write(self, values)

New fields (1)
  • crm_salesperson_planner_visit_ids Many2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' copy=False domain="[('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Visits'
Public methods (0)

No public methods.

New fields (16)
  • calendar_event_id Many2one → calendar.event
    comodel_name='calendar.event' string='Calendar Event'
  • close_reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' string='Close Reason'
  • close_reason_image Image
    attachment=True max_height=1024 max_width=1024 string='Close Reason Image'
  • close_reason_notes Text
    string='Close Reason Notes'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • date Date
    default=fields.Date.context_today required=True string='Date'
  • description Html
    string='Description'
  • name Char
    copy=False default='/' readonly=True required=True string='Visit Number'
  • opportunity_ids Many2many → crm.lead
    comodel_name='crm.lead' copy=False domain="[('type', '=', 'opportunity'), ('partner_id', 'child_of', partner_id)]" relation='crm_salesperson_planner_visit_crm_lead_rel' string='Opportunities'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' required=True string='Customer'
  • partner_mobile Char
    related='partner_id.mobile' string='Mobile'
  • partner_phone Char
    related='partner_id.phone' string='Phone'
  • sequence Integer
    default=20 help='Used to order Visits in the different views' string='Sequence'
  • state Selection
    copy=False default='draft' readonly=True required=True selection=[('draft', 'Draft'), ('confirm', 'Validated'), ('done', 'Visited'), ('cancel', 'Cancelled'), ('incident', 'Incident')] string='Status' tracking=True
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=<expr> index=True string='Salesperson' tracking=True
  • visit_template_id Many2one → crm.salesperson.planner.visit.template
    comodel_name='crm.salesperson.planner.visit.template' string='Visit Template'
Public methods (9)
  • action_cancel(self, reason_id, image=None, notes=None)
  • action_confirm(self)
  • action_done(self)
  • action_draft(self)
  • action_incident(self, reason_id, image=None, notes=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_calendar_event(self)
  • unlink(self)
  • write(self, values)

New fields (4)
  • close_type Selection
    default='cancel' required=True selection=[('cancel', 'Cancel'), ('incident', 'Incident')] string='Type'
  • name Char
    required=True string='Description' translate=True
  • require_image Boolean
    default=False string='Require Image'
  • reschedule Boolean
    default=False string='Reschedule'
Public methods (0)

No public methods.

New fields (8)
  • allow_reschedule Boolean
    related='reason_id.reschedule' string='Allow Reschedule'
  • image Image
    max_height=1024 max_width=1024 string='Image'
  • new_date Date
    default=<expr> string='New Date'
  • new_sequence Integer
    default=<expr> help='Used to order Visits in the different views' string='Sequence'
  • notes Text
    string='Notes'
  • reason_id Many2one → crm.salesperson.planner.visit.close.reason
    comodel_name='crm.salesperson.planner.visit.close.reason' required=True string='Reason'
  • require_image Boolean
    related='reason_id.require_image' string='Require Image'
  • reschedule Boolean
    default=True string='Reschedule'
Public methods (1)
  • action_close_reason_apply(self)

New fields (16)
  • alarm_ids Many2many
    relation='visit_calendar_event_rel'
  • allday Boolean
    default=True
  • auto_validate Boolean
    default=True string='Auto Validate'
  • categ_ids Many2many
    relation='visit_category_rel'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • final_date Date
    string='Repeat Until'
  • last_visit_date Date
    compute='_compute_last_visit_date' store=True string='Last Visit Date'
  • name Char
    copy=False default='/' readonly=True string='Visit Template Number'
  • partner_ids Many2many
    default=False relation='salesperson_planner_res_partner_rel' required=True string='Customer'
  • recurrency Boolean
    default=True
  • rrule_type Selection
    default='daily' required=True
  • sequence Integer
    default=20 help='Used to order Visits in the different views' string='Sequence'
  • state Selection
    copy=False default='draft' required=True selection=[('draft', 'Draft'), ('in-progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')] string='Status' tracking=True
  • user_id Many2one
    default=<expr> domain=<expr> string='Salesperson' tracking=True
  • visit_ids One2many → crm.salesperson.planner.visit
    comodel_name='crm.salesperson.planner.visit' inverse_name='visit_template_id' string='Visit Template'
  • visit_ids_count Integer
    compute='_compute_visit_ids_count' string='Number of Sales Person Visits'
Public methods (11)
  • action_cancel(self)
  • action_draft(self)
  • action_validate(self)
  • action_view_salesperson_planner_visit(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_attendees(self)
  • create_visits(self, days=7)
  • filter_dates(self, recurrences, days='7')
  • get_recurrent_ids(self, domain, order=None)
  • unlink(self, can_be_deleted=True)
  • write(self, vals)

New fields (1)
  • date_to Date
    default=<expr> required=True string='Date to'
Public methods (1)
  • create_visits(self)

New fields (1)
  • salesperson_planner_visit_count Integer
    compute='_compute_salesperson_planner_visit_count' string='Number of Salesperson Visits'
Public methods (1)
  • action_view_salesperson_planner_visit(self)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/crm
PULL REQUEST
PULL REQUEST[19.0][MIG] crm_salesperson_planner: Migration to 19.0 (#751)