TIP: You can type at any time to perform a new search.
Crm Salesperson Planner
crm_salesperson_planner · OCA/crm
- Repository
- OCA/crm · module folder · Try on Runboat
- Module version
- 1.1.0
- Category
- Customer Relationship Management
- Folder size
- 0.3 MB
- License
- AGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/crm
- Last tracking update
- 2026-08-07 08:42:48
- Authors
- Odoo Community Association (OCA), Sygel Technology
- Maintainers
- Odoo Community Association (OCA), Sygel Technology
- Committers
- sygel, Weblate, OCA-git-bot, oca-ci, Bhavesh Heliconia
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- None
- 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 ID | Name | Model | Type | Status |
|---|---|---|---|---|
crm_lead_crm_salesperson_planner |
crm.lead.view.crm.salesperson.planner | crm.lead | form | 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 | form | Inherits base.view_partner_form |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (8)
New fields (1)
-
salesperson_planner_visit_idsOne2many → crm.salesperson.planner.visitcomodel_name='crm.salesperson.planner.visit'inverse_name='calendar_event_id'string='Salesperson Visits'
-
unlink(self) -
write(self, values)
New fields (1)
-
crm_salesperson_planner_visit_idsMany2many → crm.salesperson.planner.visitcomodel_name='crm.salesperson.planner.visit'copy=Falsedomain="[('partner_id', 'child_of', partner_id)]"relation='crm_salesperson_planner_visit_crm_lead_rel'string='Visits'
No public methods.
New fields (16)
-
calendar_event_idMany2one → calendar.eventcomodel_name='calendar.event'string='Calendar Event' -
close_reason_idMany2one → crm.salesperson.planner.visit.close.reasoncomodel_name='crm.salesperson.planner.visit.close.reason'string='Close Reason' -
close_reason_imageImageattachment=Truemax_height=1024max_width=1024 -
close_reason_notesText -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>string='Company' -
dateDatedefault=fields.Date.context_todayrequired=True -
descriptionHtml -
nameCharcopy=Falsedefault='/'required=Truestring='Visit Number' -
opportunity_idsMany2many → crm.leadcomodel_name='crm.lead'copy=Falsedomain="[('type', '=', 'opportunity'), ('partner_id', 'child_of', partner_id)]"relation='crm_salesperson_planner_visit_crm_lead_rel'string='Opportunities' -
partner_idMany2one → res.partnercomodel_name='res.partner'required=Truestring='Customer' -
partner_mobileCharrelated='partner_id.mobile'string='Mobile' -
partner_phoneCharrelated='partner_id.phone'string='Phone' -
sequenceIntegerdefault=20help='Used to order Visits in the different views' -
stateSelectioncopy=Falsedefault='draft'required=Trueselection=[('draft', 'Draft'), ('confirm', 'Validated'), ('done', 'Visited'), ('cancel', 'Cancelled'), ('incident', 'Incident')]string='Status'tracking=True -
user_idMany2one → res.userscomodel_name='res.users'default=<expr>domain=<expr>index=Truestring='Salesperson'tracking=True -
visit_template_idMany2one → crm.salesperson.planner.visit.templatecomodel_name='crm.salesperson.planner.visit.template'string='Visit Template'
-
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_typeSelectiondefault='cancel'required=Trueselection=[('cancel', 'Cancel'), ('incident', 'Incident')]string='Type' -
nameCharrequired=Truestring='Description'translate=True -
require_imageBooleandefault=False -
rescheduleBooleandefault=False
No public methods.
New fields (8)
-
allow_rescheduleBooleanrelated='reason_id.reschedule'string='Allow Reschedule' -
imageImagemax_height=1024max_width=1024 -
new_dateDatedefault=<expr> -
new_sequenceIntegerdefault=<expr>help='Used to order Visits in the different views'string='Sequence' -
notesText -
reason_idMany2one → crm.salesperson.planner.visit.close.reasoncomodel_name='crm.salesperson.planner.visit.close.reason'required=Truestring='Reason' -
require_imageBooleanrelated='reason_id.require_image'string='Require Image' -
rescheduleBooleandefault=True
-
action_close_reason_apply(self)
New fields (39)
-
alarm_idsMany2many → calendar.alarmcomodel_name='calendar.alarm'help='Notifications sent to all attendees to remind of the meeting.'ondelete='restrict'string='Reminders' -
alldayBooleandefault=Truestring='All Day' -
auto_validateBooleandefault=True -
bydaySelectionargs: BYDAY_SELECTION -
categ_idsMany2many → calendar.event.typecomodel_name='calendar.event.type'string='Tags' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>string='Company' -
countIntegerhelp='Repeat x times'string='Repeat' -
dayIntegerstring='Date of month' -
descriptionHtml -
durationFloatcompute='_compute_duration'readonly=Falsestore=True -
end_typeSelectionstring='Recurrence Termination' args: END_TYPE_SELECTION -
event_tzSelectionstring='Timezone' args: _tz_get -
final_dateDatestring='Repeat Until' -
friBoolean -
intervalIntegerhelp='Repeat every (Days/Week/Month/Year)'string='Repeat Every' -
last_visit_dateDatecompute='_compute_last_visit_date'store=True -
monBoolean -
month_bySelectionstring='Option' args: MONTH_BY_SELECTION -
nameCharcopy=Falsedefault='/'string='Visit Template Number' -
partner_idMany2one → res.partnercomodel_name='res.partner'related='user_id.partner_id'string='Scheduled by' -
partner_idsMany2many → res.partnercomodel_name='res.partner'default=Falserequired=Truestring='Customer' -
rruleCharstring='Recurrent Rule' -
rrule_typeSelectiondefault='daily'help='Let the event automatically repeat at that interval'required=Truestring='Recurrence' args: RRULE_TYPE_SELECTION -
satBoolean -
sequenceIntegerdefault=20help='Used to order Visits in the different views' -
startDatetimedefault=fields.Date.todayhelp='Start date of an event, without time for full days events'required=Truetracking=True -
start_dateDatecompute='_compute_dates'inverse='_inverse_dates'store=Truetracking=True -
stateSelectioncopy=Falsedefault='draft'required=Trueselection=[('draft', 'Draft'), ('in-progress', 'In Progress'), ('done', 'Done'), ('cancel', 'Cancelled')]string='Status'tracking=True -
stopDatetimecompute='_compute_stop'default=<expr>help='Stop date of an event, without time for full days events'required=Truestore=Truetracking=True -
stop_dateDatecompute='_compute_dates'inverse='_inverse_dates'store=Truestring='End Date'tracking=True -
sunBoolean -
thuBoolean -
tueBoolean -
untilDate -
user_idMany2one → res.userscomodel_name='res.users'default=<expr>domain=<expr>string='Salesperson'tracking=True -
visit_idsOne2many → crm.salesperson.planner.visitcomodel_name='crm.salesperson.planner.visit'inverse_name='visit_template_id'string='Visit Template' -
visit_ids_countIntegercompute='_compute_visit_ids_count'string='Number of Sales Person Visits' -
wedBoolean -
weekdaySelectionargs: WEEKDAY_SELECTION
-
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_toDatedefault=<expr>required=Truestring='Date to'
-
create_visits(self)
New fields (1)
-
salesperson_planner_visit_countIntegercompute='_compute_salesperson_planner_visit_count'string='Number of Salesperson Visits'
-
action_view_salesperson_planner_visit(self)
Loading…
Loading…
Loading…
Loading…
- Status
- Open migration PR — not merged yet for this version
- CI status
- checks failing
- Open since
- 69 days ago
- Last activity
- 20 days ago
- Repository
- OCA/crm
- Pull request
- [19.0][MIG] crm_salesperson_planner: Migration to 19.0 (#751)