Field Service

fieldservice
REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/19.0/fieldservice
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Hoa - Truong Thi Kim
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-07 14:01:36
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/field-service:
    - base_territory
odoo/odoo:
    - base
    - base_geolocalize
    - base_setup
    - web
    - resource
    - contacts
    - mail
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module is the base of the Field Service application in Odoo.

Code Analysis

Views touched (47)
XML IDNameModelTypeStatus
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_list_view fsm.category.list fsm.category list New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_list_view fsm.equipment.list fsm.equipment list New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_list_view fsm.location.list fsm.location list New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_list_view fsm.location.person.list fsm.location.person list New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_list_view fsm.order.list fsm.order list New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_sign_wizard_view_form fsm.order.sign.wizard form New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_list_view fsm.order.type.list fsm.order.type list New
fsm_partner_fields res.partner.fsm.form res.partner div Inherits base.view_partner_form
fsm_person_form fsm.person.form fsm.person form New
fsm_person_list fsm.person.list fsm.person list New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_list_view Stages fsm.stage list New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_list_view Tags fsm.tag list New
fsm_template_form_view Order Template fsm.template form New
fsm_template_list_view Order Templates fsm.template list New
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
res_territory_form_view_inherit res.territory.form.inherit res.territory xpath Inherits base_territory.res_territory_form_view
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_list fsm.team.list fsm.team list New
view_team_search fsm.team.search fsm.team search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (20)

New fields (6)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    help='Company related to this category' index=True required=False string='Company' args: 'res.company'
  • description Char
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True
  • parent_id Many2one → fsm.category
    string='Parent' args: 'fsm.category'
Public methods (0)

No public methods.

New fields (15)
  • branch_id Many2one → res.branch
    compute='_compute_branch_id' readonly=False store=True string='Branch' args: 'res.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → res.district
    compute='_compute_district_id' readonly=False store=True string='District' args: 'res.district'
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required=True
  • notes Html
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → res.region
    compute='_compute_region_id' readonly=False store=True string='Region' args: 'res.region'
  • territory_id Many2one → res.territory
    compute='_compute_territory_id' readonly=False store=True string='Territory' args: 'res.territory'
Public methods (0)

No public methods.

New fields (25)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • child_ids One2many → fsm.location
    comodel_name='fsm.location' inverse_name='parent_id' readonly=True string='Children Locations'
  • complete_direction Html
    compute='_compute_complete_direction' recursive=True store=True
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • contact_count Integer
    compute='_compute_contact_count' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain=<expr> index=True string='Primary Contact' args: 'res.partner'
  • description Char
  • direction Html
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • notes Html
    string='Location Notes'
  • owner_id Many2one → res.partner
    bypass_search_access=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • parent_path Char
    index=True
  • partner_id Many2one → res.partner
    bypass_search_access=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • sublocation_count Integer
    compute='_compute_sublocation_count' string='Sub Locations'
  • team_id Many2one → fsm.team
    comodel_name='fsm.team' help='Default team assigned to orders in this location'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (5)
  • action_view_contacts(self)
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • create(self, vals)
    @api.model_create_multi
  • geo_localize(self)

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone'
  • sequence Integer
    default='10' required=True
Public methods (0)

No public methods.

New fields (2)
  • hide Boolean
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
Public methods (3)
  • new_stage(self, operator)
  • next_stage(self)
  • previous_stage(self)

New fields (50)
  • branch_id Many2one → res.branch
    related='location_id.branch_id' store=True string='Branch' args: 'res.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.Datetime.now store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • description Html
    compute='_compute_description' precompute=True readonly=False store=True
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → res.district
    related='location_id.district_id' store=True string='District' args: 'res.district'
  • duration Float
    compute='_compute_duration' help='Actual duration in hours' string='Actual duration'
  • equipment_ids Many2many → fsm.equipment
    compute='_compute_equipment_ids' precompute=True readonly=False store=True string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type'
  • is_closed Boolean
    related='stage_id.is_closed' args: 'Is closed'
  • location_directions Html
    compute='_compute_location_directions' precompute=True readonly=False store=True
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • name Char
    copy=False default=<expr> index=True required=True
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → res.region
    related='location_id.region_id' store=True string='Region' args: 'res.region'
  • request_early Datetime
    default=<expr> string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • require_signature Boolean
    related='stage_id.require_signature'
  • resolution Html
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours'
  • sequence Integer
    default=10
  • signature Image
    copy=False max_height=1024 max_width=1024 readonly=True
  • signed_by Char
    copy=False readonly=True
  • signed_on Datetime
    copy=False readonly=True
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    compute='_compute_team_id' index=True precompute=True readonly=False required=True store=True string='Team' tracking=True args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → res.territory
    related='location_id.territory_id' store=True string='Territory' args: 'res.territory'
  • todo Html
    compute='_compute_todo' precompute=True readonly=False store=True string='Instructions'
  • type Many2one → fsm.order.type
    args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (8)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • check_day(self)
    @api.constrains('scheduled_date_start')
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • write(self, vals)

New fields (3)
  • order_id Many2one → fsm.order
    comodel_name='fsm.order' ondelete='cascade' required=True string='Order'
  • signature Image
    max_height=1024 max_width=1024 required=True
  • signed_by Char
    required=True
Public methods (2)
  • action_sign(self)
  • default_get(self, fields)

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True
  • active_partner Boolean
    readonly=True related='partner_id.active' string='Partner is Active'
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • mobile Char
  • partner_id Many2one → res.partner
    bypass_search_access=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • state_id Many2one
    domain="[('country_id', '=?', country_id)]" inherited=True readonly=False related='partner_id.state_id' store=True
  • team_id Many2one → fsm.team
    string='Team' args: 'fsm.team'
  • territory_ids Many2many → res.territory
    string='Territories' args: 'res.territory'
Public methods (2)
  • action_unarchive(self)
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True
  • person_checked Boolean
    default=True
  • person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True translate=True
  • require_signature Boolean
    help='Whether to ask for a Customer Signature when the order is in this stage.'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.'
  • stage_type Selection
    default='order' required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • get_color_information(self)

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=True string='Company' args: 'res.company'
  • description Text
    translate=True
  • name Char
    required=True translate=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    domain=Domain('stage_id.is_closed', '=', False) string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.'
  • stage_ids Many2many → fsm.stage
    default=<expr> string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    help='Company related to this template' index=True string='Company' args: 'res.company'
  • duration Float
    help='Default duration in hours'
  • instructions Html
  • name Char
    required=True
  • team_id Many2one → fsm.team
    help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (7)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    default=8 string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    default=48 string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    default=72 string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    default=24 string='Hours of Buffer for Medium Priority FS Orders'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (38)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    readonly=False related='company_id.fsm_order_request_late_high' string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    readonly=False related='company_id.fsm_order_request_late_low' string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    readonly=False related='company_id.fsm_order_request_late_lowest' string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    readonly=False related='company_id.fsm_order_request_late_medium' string='Hours of Buffer for Medium Priority FS Orders'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • group_fsm_territory Boolean
    implied_group='fieldservice.group_fsm_territory' string='Manage Territory'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • module_fieldservice_web_timeline_view Boolean
    string='Allow Field Service Web Timeline View'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (7)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_location_ids One2many → fsm.location
    comodel_name='fsm.location' inverse_name='partner_id' readonly=True string='Related FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=Domain('parent_id', '=', False) string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
  • type Selection
    selection_add=[('fsm_location', 'Location')]
Public methods (3)
  • action_open_owned_locations(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (2)
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/18.0/fieldservice
VERSION
VERSION 5.8.0
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSGitHub, Weblate, OCA-git-bot, Iván Todorovich, oca-ci, Vincent Van Rossem, PicchiSeba, Quirino Leone, EdgarRetes, Christian, Julio Santa Cruz
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-07 13:55:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/field-service:
    - base_territory
odoo/odoo:
    - base
    - base_geolocalize
    - base_setup
    - web
    - resource
    - contacts
    - mail
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module is the base of the Field Service application in Odoo.

Code Analysis

Views touched (47)
XML IDNameModelTypeStatus
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_list_view fsm.category.list fsm.category list New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_list_view fsm.equipment.list fsm.equipment list New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_list_view fsm.location.list fsm.location list New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_list_view fsm.location.person.list fsm.location.person list New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_list_view fsm.order.list fsm.order list New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_sign_wizard_view_form fsm.order.sign.wizard form New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_list_view fsm.order.type.list fsm.order.type list New
fsm_partner_fields res.partner.fsm.form res.partner div Inherits base.view_partner_form
fsm_person_form fsm.person.form fsm.person form New
fsm_person_list fsm.person.list fsm.person list New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_list_view Stages fsm.stage list New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_list_view Tags fsm.tag list New
fsm_template_form_view Order Template fsm.template form New
fsm_template_list_view Order Templates fsm.template list New
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
res_territory_form_view_inherit res.territory.form.inherit res.territory xpath Inherits base_territory.res_territory_form_view
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_list fsm.team.list fsm.team list New
view_team_search fsm.team.search fsm.team search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (20)

New fields (6)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    help='Company related to this category' index=True required=False string='Company' args: 'res.company'
  • description Char
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True
  • parent_id Many2one → fsm.category
    string='Parent' args: 'fsm.category'
Public methods (0)

No public methods.

New fields (15)
  • branch_id Many2one → res.branch
    compute='_compute_branch_id' readonly=False store=True string='Branch' args: 'res.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → res.district
    compute='_compute_district_id' readonly=False store=True string='District' args: 'res.district'
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required=True
  • notes Html
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → res.region
    compute='_compute_region_id' readonly=False store=True string='Region' args: 'res.region'
  • territory_id Many2one → res.territory
    compute='_compute_territory_id' readonly=False store=True string='Territory' args: 'res.territory'
Public methods (0)

No public methods.

New fields (26)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • child_ids One2many → fsm.location
    comodel_name='fsm.location' inverse_name='parent_id' readonly=True string='Children Locations'
  • complete_direction Char
    compute='_compute_complete_direction' recursive=True store=True
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • contact_count Integer
    compute='_compute_contact_count' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain="[('is_company', '=', False), ('fsm_location', '=', False)]" index=True string='Primary Contact' args: 'res.partner'
  • description Char
  • direction Char
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • fsm_parent_id Many2one
    related='parent_id' string='Deprecated Parent'
  • notes Html
    string='Location Notes'
  • owner_id Many2one → res.partner
    auto_join=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • parent_path Char
    index=True
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • sublocation_count Integer
    compute='_compute_sublocation_count' string='Sub Locations'
  • team_id Many2one → fsm.team
    comodel_name='fsm.team' help='Default team assigned to orders in this location'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (5)
  • action_view_contacts(self)
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • create(self, vals)
    @api.model_create_multi
  • geo_localize(self)

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone'
  • sequence Integer
    default='10' required=True
Public methods (0)

No public methods.

New fields (2)
  • hide Boolean
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
Public methods (3)
  • new_stage(self, operator)
  • next_stage(self)
  • previous_stage(self)

New fields (51)
  • branch_id Many2one → res.branch
    related='location_id.branch_id' store=True string='Branch' args: 'res.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.Datetime.now store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • description Html
    compute='_compute_description' precompute=True readonly=False store=True
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → res.district
    related='location_id.district_id' store=True string='District' args: 'res.district'
  • duration Float
    compute=_compute_duration help='Actual duration in hours' string='Actual duration'
  • equipment_ids Many2many → fsm.equipment
    compute='_compute_equipment_ids' precompute=True readonly=False store=True string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type'
  • is_closed Boolean
    related='stage_id.is_closed' args: 'Is closed'
  • location_directions Char
    compute='_compute_location_directions' precompute=True readonly=False store=True
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • mobile Char
    related='location_id.mobile'
  • name Char
    copy=False default=<expr> index=True required=True
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → res.region
    related='location_id.region_id' store=True string='Region' args: 'res.region'
  • request_early Datetime
    default=<expr> string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • require_signature Boolean
    related='stage_id.require_signature'
  • resolution Html
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours'
  • sequence Integer
    default=10
  • signature Image
    copy=False max_height=1024 max_width=1024 readonly=True
  • signed_by Char
    copy=False readonly=True
  • signed_on Datetime
    copy=False readonly=True
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    compute='_compute_team_id' index=True precompute=True readonly=False required=True store=True string='Team' tracking=True args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → res.territory
    related='location_id.territory_id' store=True string='Territory' args: 'res.territory'
  • todo Html
    compute='_compute_todo' precompute=True readonly=False store=True string='Instructions'
  • type Many2one → fsm.order.type
    args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (9)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • check_day(self)
    @api.constrains('scheduled_date_start')
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • unlink(self)
  • write(self, vals)

New fields (3)
  • order_id Many2one → fsm.order
    comodel_name='fsm.order' ondelete='cascade' required=True string='Order'
  • signature Image
    max_height=1024 max_width=1024 required=True
  • signed_by Char
    required=True
Public methods (2)
  • action_sign(self)
  • default_get(self, fields)

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • active_partner Boolean
    readonly=True related='partner_id.active' string='Partner is Active'
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • mobile Char
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • territory_ids Many2many → res.territory
    string='Territories' args: 'res.territory'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • toggle_active(self)

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True
  • person_checked Boolean
    default=True
  • person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True translate=True
  • require_signature Boolean
    help='Whether to ask for a Customer Signature when the order is in this stage.'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.'
  • stage_type Selection
    default='order' required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • get_color_information(self)

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=True string='Company' args: 'res.company'
  • description Text
    translate=True
  • name Char
    required=True translate=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.'
  • stage_ids Many2many → fsm.stage
    default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    help='Company related to this template' index=True string='Company' args: 'res.company'
  • duration Float
    help='Default duration in hours'
  • instructions Html
  • name Char
    required=True
  • team_id Many2one → fsm.team
    help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (7)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    default=8 string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    default=48 string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    default=72 string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    default=24 string='Hours of Buffer for Medium Priority FS Orders'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (38)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    readonly=False related='company_id.fsm_order_request_late_high' string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    readonly=False related='company_id.fsm_order_request_late_low' string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    readonly=False related='company_id.fsm_order_request_late_lowest' string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    readonly=False related='company_id.fsm_order_request_late_medium' string='Hours of Buffer for Medium Priority FS Orders'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • group_fsm_territory Boolean
    implied_group='fieldservice.group_fsm_territory' string='Manage Territory'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • module_fieldservice_web_timeline_view Boolean
    string='Allow Field Service Web Timeline View'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (7)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_location_ids One2many → fsm.location
    comodel_name='fsm.location' inverse_name='partner_id' readonly=True string='Related FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=[('parent_id', '=', False)] string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
  • type Selection
    selection_add=[('fsm_location', 'Location')]
Public methods (3)
  • action_open_owned_locations(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (2)
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/17.0/fieldservice
VERSION
VERSION 2.8.0
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSMaxime Chambreuil, GitHub, Daniel Reis, Weblate, OCA-git-bot, Iván Todorovich, oca-ci, Brian McMaster, DoDo, PicchiSeba, Antoni Marroig Campomar, ilo, bobrador, Quirino Leone, Samuel Macias Oropeza (smo)
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/field-service:
    - base_territory
odoo/odoo:
    - base
    - base_geolocalize
    - base_setup
    - web
    - resource
    - contacts
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module is the base of the Field Service application in Odoo.

Videos from OCA Days:

 * 2024: [Field Service Management](https://www.youtube.com/watch?v=zBCa3e9rLHU)
 * 2022: [Field Service - New features and roadmap](https://www.youtube.com/watch?v=MH8agrNE88A)
 * 2021: [Job and Service Management for Install and Construction](https://www.youtube.com/watch?v=b7iivgfzPoo)
 * 2020: [Advanced Field Service Management](https://www.youtube.com/watch?v=7bq3cwMFeME)

Code Analysis

Views touched (48)
XML IDNameModelTypeStatus
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_tree_view fsm.category.tree fsm.category tree New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_equipment_tree_view fsm.equipment.tree fsm.equipment tree New
fsm_location_form_inherit fsm.location.form.inherit.sub.location fsm.location xpath Inherits fieldservice.fsm_location_form_view
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_person_tree_view fsm.location.person.tree fsm.location.person tree New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_location_tree_view fsm.location.tree fsm.location tree New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_tree_view fsm.order.tree fsm.order tree New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_tree_view fsm.order.type.tree fsm.order.type tree New
fsm_partner_fields res.partner.fsm.form res.partner div Inherits base.view_partner_form
fsm_person_form fsm.person.form fsm.person form New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_person_tree fsm.person.tree fsm.person tree New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_stage_tree_view Stages fsm.stage tree New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_tree_view Tags fsm.tag tree New
fsm_template_form_view Order Template fsm.template form New
fsm_template_tree_view Order Templates fsm.template tree New
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
res_territory_form_view_inherit res.territory.form.inherit res.territory xpath Inherits base_territory.res_territory_form_view
view_create_sub_location_wizard fsm.create.sub.location.wizard.form fsm.create.sub.location.wizard form New
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_search fsm.team.search fsm.team search New
view_team_tree fsm.team.tree fsm.team tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (20)

New fields (8)
  • child_id One2many → fsm.category
    args: 'fsm.category', 'parent_id', 'Child Categories'
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    help='Company related to this category' index=True required=False string='Company' args: 'res.company'
  • description Char
  • full_name Char
    compute='_compute_full_name' recursive=True store=True
  • name Char
    required=True
  • parent_id Many2one → fsm.category
    index=True string='Parent' args: 'fsm.category'
  • parent_path Char
    index=True unaccent=False
Public methods (0)

No public methods.

New fields (11)
  • city Char
  • country_id Many2one → res.country
    ondelete='restrict' string='Country' args: 'res.country'
  • email Char
  • name Char
    compute='_compute_name' store=True
  • parent_location_id Many2one → fsm.location
    required=True string='Parent Location' args: 'fsm.location'
  • phone Char
  • related_owner_id Many2one → res.partner
    required=True string='Related Owner' args: 'res.partner'
  • state_id Many2one → res.country.state
    domain="[('country_id', '=?', country_id)]" ondelete='restrict' string='State' args: 'res.country.state'
  • street Char
  • street2 Char
  • zip Char
    change_default=True
Public methods (2)
  • create_sub_location(self)
  • default_get(self, fields)
    @api.model

New fields (15)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • child_ids One2many → fsm.equipment
    check_company=True string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    check_company=True string='Managed By' args: 'res.partner'
  • name Char
    required=True
  • notes Text
  • owned_by_id Many2one → res.partner
    check_company=True string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    check_company=True string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    check_company=True string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
Public methods (0)

No public methods.

New fields (22)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • contact_count Integer
    compute='_compute_contact_ids' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain="[('is_company', '=', False), ('fsm_location', '=', False)]" index=True string='Primary Contact' args: 'res.partner'
  • description Char
  • direction Html
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_ids' string='Equipment'
  • fsm_parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • notes Html
    string='Location Notes'
  • owner_id Many2one → res.partner
    auto_join=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • sublocation_count Integer
    compute='_compute_sublocation_ids' string='Sub Locations'
  • team_id Many2one → fsm.team
    comodel_name='fsm.team' help='Default team assigned to orders in this location'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (8)
  • action_view_contacts(self)
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • comp_count(self, contact, equipment, loc)
  • create(self, vals_list)
    @api.model_create_multi
  • geo_localize(self)
  • get_action_views(self, contact, equipment, loc)
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone'
  • sequence Integer
    default='10' required=True
Public methods (0)

No public methods.

New fields (2)
  • hide Boolean
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
Public methods (3)
  • new_stage(self, operator)
  • next_stage(self)
  • previous_stage(self)

New fields (51)
  • branch_id Many2one → res.branch
    related='location_id.branch_id' store=True string='Branch' args: 'res.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.Datetime.now store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • date_today_order_tz Date
    compute='_compute_date_today_order_tz' store=True string='Scheduled Date (User TZ)'
  • description Text
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → res.district
    related='location_id.district_id' store=True string='District' args: 'res.district'
  • duration Float
    compute=_compute_duration help='Actual duration in hours' string='Actual duration'
  • equipment_id Many2one → fsm.equipment
    string='Equipment' args: 'fsm.equipment'
  • equipment_ids Many2many → fsm.equipment
    string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type'
  • is_button Boolean
    default=False
  • is_closed Boolean
    related='stage_id.is_closed' args: 'Is closed'
  • location_directions Html
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • location_owner_id Many2one
    related='location_id.owner_id' string='Location Related Owner'
  • mobile Char
    related='location_id.mobile'
  • name Char
    copy=False default=<expr> index=True required=True
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    check_company=True string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → res.region
    related='location_id.region_id' store=True string='Region' args: 'res.region'
  • request_early Datetime
    default=<expr> string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • resolution Text
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours'
  • sequence Integer
    default=10
  • stage_id Many2one → fsm.stage
    check_company=True copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    check_company=True help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    check_company=True compute='_compute_team_id' index=True precompute=True readonly=False required=True store=True string='Team' tracking=True args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → res.territory
    related='location_id.territory_id' store=True string='Territory' args: 'res.territory'
  • todo Html
    string='Instructions'
  • type Many2one → fsm.order.type
    args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (10)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • copy_notes(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_equipment_ids(self)
    @api.onchange('equipment_ids')
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • unlink(self)
  • write(self, vals)

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (8)
  • active Boolean
    default=True
  • active_partner Boolean
    readonly=True related='partner_id.active' string='Partner is Active'
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • mobile Char
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • team_id Many2one → fsm.team
    string='Team' args: 'fsm.team'
  • territory_ids Many2many → res.territory
    string='Territories' args: 'res.territory'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • toggle_active(self)

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True
  • person_checked Boolean
    default=True
  • person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True translate=True
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.'
  • stage_type Selection
    default='order' required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    check_company=True default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • get_color_information(self)

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True
  • parent_id Many2one → fsm.tag
    check_company=True string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=True string='Company' args: 'res.company'
  • description Text
    translate=True
  • location_id Many2one → fsm.location
    string='Default Location ' args: 'fsm.location'
  • name Char
    required=True translate=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    check_company=True domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.'
  • stage_ids Many2many → fsm.stage
    check_company=True default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    help='Company related to this template' index=True string='Company' args: 'res.company'
  • duration Float
    help='Default duration in hours'
  • instructions Html
  • name Char
    required=True
  • team_id Many2one → fsm.team
    check_company=True help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (7)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    default=8 string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    default=48 string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    default=72 string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    default=24 string='Hours of Buffer for Medium Priority FS Orders'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (39)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    readonly=False related='company_id.fsm_order_request_late_high' string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    readonly=False related='company_id.fsm_order_request_late_low' string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    readonly=False related='company_id.fsm_order_request_late_lowest' string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    readonly=False related='company_id.fsm_order_request_late_medium' string='Hours of Buffer for Medium Priority FS Orders'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • group_fsm_territory Boolean
    implied_group='fieldservice.group_fsm_territory' string='Manage Territory'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_availability Boolean
    string='Restricts blackout days for Scheduled Start (ETA)'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • module_fieldservice_web_timeline_view Boolean
    string='Allow Field Service Web Timeline View'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (7)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_location_id One2many → fsm.location
    comodel_name='fsm.location' inverse_name='partner_id' readonly=True string='Related FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=[('fsm_parent_id', '=', False)] string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
  • type Selection
    selection_add=[('fsm_location', 'Location')]
Public methods (3)
  • action_open_owned_locations(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (2)
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/16.0/fieldservice
VERSION
VERSION 1.13.0
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSMaxime Chambreuil, GitHub, tafaRU, Víctor Martínez, Weblate, OCA-git-bot, Simone Rubino, oca-ci, Brian McMaster, Marcel Savegnago, Alessandro Uffreduzzi, PicchiSeba, Nils Coenen, Houzéfa Abbasbhay, Quirino Leone, Goncalo Brito
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/field-service:
    - base_territory
odoo/odoo:
    - base
    - base_geolocalize
    - base_setup
    - web
    - resource
    - contacts
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (46)
XML IDNameModelTypeStatus
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_tree_view fsm.category.tree fsm.category tree New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_equipment_tree_view fsm.equipment.tree fsm.equipment tree New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_person_tree_view fsm.location.person.tree fsm.location.person tree New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_location_tree_view fsm.location.tree fsm.location tree New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_tree_view fsm.order.tree fsm.order tree New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_tree_view fsm.order.type.tree fsm.order.type tree New
fsm_partner_fields res.partner.fsm.form res.partner div Inherits base.view_partner_form
fsm_person_form fsm.person.form fsm.person form New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_person_tree fsm.person.tree fsm.person tree New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_stage_tree_view Stages fsm.stage tree New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_tree_view Tags fsm.tag tree New
fsm_template_form_view Order Template fsm.template form New
fsm_template_tree_view Order Templates fsm.template tree New
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
res_territory_form_view_inherit res.territory.form.inherit res.territory xpath Inherits base_territory.res_territory_form_view
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_search fsm.team.search fsm.team search New
view_team_tree fsm.team.tree fsm.team tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (19)

New fields (8)
  • child_id One2many → fsm.category
    args: 'fsm.category', 'parent_id', 'Child Categories'
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    help='Company related to this category' index=True required=False string='Company' args: 'res.company'
  • description Char
  • full_name Char
    compute='_compute_full_name' recursive=True store=True
  • name Char
    required='True'
  • parent_id Many2one → fsm.category
    index=True string='Parent' args: 'fsm.category'
  • parent_path Char
    index=True unaccent=False
Public methods (0)

No public methods.

New fields (15)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required='True'
  • notes Text
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
Public methods (0)

No public methods.

New fields (22)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • contact_count Integer
    compute='_compute_contact_ids' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain="[('is_company', '=', False), ('fsm_location', '=', False)]" index=True string='Primary Contact' args: 'res.partner'
  • description Char
  • direction Html
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_ids' string='Equipment'
  • fsm_parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • notes Html
    string='Location Notes'
  • owner_id Many2one → res.partner
    auto_join=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • sublocation_count Integer
    compute='_compute_sublocation_ids' string='Sub Locations'
  • team_id Many2one → fsm.team
    comodel_name='fsm.team' help='Default team assigned to orders in this location'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (9)
  • action_view_contacts(self)
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • comp_count(self, contact, equipment, loc)
  • create(self, vals_list)
    @api.model_create_multi
  • geo_localize(self)
  • get_action_views(self, contact, equipment, loc)
  • name_get(self)
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone'
  • sequence Integer
    default='10' required=True
Public methods (0)

No public methods.

New fields (2)
  • hide Boolean
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
Public methods (3)
  • new_stage(self, operator)
  • next_stage(self)
  • previous_stage(self)

New fields (49)
  • branch_id Many2one → res.branch
    related='location_id.branch_id' store=True string='Branch' args: 'res.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.Datetime.now store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • description Text
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → res.district
    related='location_id.district_id' store=True string='District' args: 'res.district'
  • duration Float
    compute=_compute_duration help='Actual duration in hours' string='Actual duration'
  • equipment_id Many2one → fsm.equipment
    string='Equipment' args: 'fsm.equipment'
  • equipment_ids Many2many → fsm.equipment
    string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type'
  • is_button Boolean
    default=False
  • is_closed Boolean
    related='stage_id.is_closed' args: 'Is closed'
  • location_directions Html
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • mobile Char
    related='location_id.mobile'
  • name Char
    copy=False default=<expr> index=True required=True
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → res.region
    related='location_id.region_id' store=True string='Region' args: 'res.region'
  • request_early Datetime
    default=<expr> string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • resolution Text
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours'
  • sequence Integer
    default=10
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    compute='_compute_team_id' index=True precompute=True readonly=False required=True store=True string='Team' tracking=True args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → res.territory
    related='location_id.territory_id' store=True string='Territory' args: 'res.territory'
  • todo Html
    string='Instructions'
  • type Many2one → fsm.order.type
    args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (11)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • check_day(self)
    @api.constrains('scheduled_date_start')
  • copy_notes(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_equipment_ids(self)
    @api.onchange('equipment_ids')
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • unlink(self)
  • write(self, vals)

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • active_partner Boolean
    readonly=True related='partner_id.active' string='Partner is Active'
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • mobile Char
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • territory_ids Many2many → res.territory
    string='Territories' args: 'res.territory'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • toggle_active(self)

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True
  • person_checked Boolean
    default=True
  • person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True translate=True
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.'
  • stage_type Selection
    default='order' required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • get_color_information(self)

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=True string='Company' args: 'res.company'
  • description Text
    translate=True
  • name Char
    required=True translate=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.'
  • stage_ids Many2many → fsm.stage
    default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    help='Company related to this template' index=True string='Company' args: 'res.company'
  • duration Float
    help='Default duration in hours'
  • instructions Html
  • name Char
    required=True
  • team_id Many2one → fsm.team
    help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (7)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    default=8 string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    default=48 string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    default=72 string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    default=24 string='Hours of Buffer for Medium Priority FS Orders'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (38)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    readonly=False related='company_id.fsm_order_request_late_high' string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    readonly=False related='company_id.fsm_order_request_late_low' string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    readonly=False related='company_id.fsm_order_request_late_lowest' string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    readonly=False related='company_id.fsm_order_request_late_medium' string='Hours of Buffer for Medium Priority FS Orders'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • group_fsm_territory Boolean
    implied_group='fieldservice.group_fsm_territory' string='Manage Territory'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • module_fieldservice_web_timeline_view Boolean
    string='Allow Field Service Web Timeline View'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (7)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_location_id One2many → fsm.location
    comodel_name='fsm.location' inverse_name='partner_id' readonly=1 string='Related FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=[('fsm_parent_id', '=', False)] string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
  • type Selection
    selection_add=[('fsm_location', 'Location')]
Public methods (3)
  • action_open_owned_locations(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (2)
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/15.0/fieldservice
VERSION
VERSION 1.7.1
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSGitHub, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Brian McMaster, Marcel Savegnago, Alessandro Uffreduzzi, Patryk Pyczko, bobrador, ppyczko, Christian Santamaria
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/field-service:
    - base_territory
odoo/odoo:
    - base
    - base_geolocalize
    - base_setup
    - web
    - resource
    - contacts
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (45)
XML IDNameModelTypeStatus
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_tree_view fsm.category.tree fsm.category tree New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_equipment_tree_view fsm.equipment.tree fsm.equipment tree New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_person_tree_view fsm.location.person.tree fsm.location.person tree New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_location_tree_view fsm.location.tree fsm.location tree New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_tree_view fsm.order.tree fsm.order tree New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_tree_view fsm.order.type.tree fsm.order.type tree New
fsm_partner_fields res.partner.fsm.form res.partner div Inherits base.view_partner_form
fsm_person_form fsm.person.form fsm.person form New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_person_tree fsm.person.tree fsm.person tree New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_stage_tree_view Stages fsm.stage tree New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_tree_view Tags fsm.tag tree New
fsm_template_form_view Order Template fsm.template form New
fsm_template_tree_view Order Templates fsm.template tree New
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
res_territory_form_view_inherit res.territory.form.inherit res.territory xpath Inherits base_territory.res_territory_form_view
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_tree fsm.team.tree fsm.team tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (19)

New fields (8)
  • child_id One2many → fsm.category
    args: 'fsm.category', 'parent_id', 'Child Categories'
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    help='Company related to this category' index=True required=False string='Company' args: 'res.company'
  • description Char
  • full_name Char
    compute='_compute_full_name' recursive=True store=True
  • name Char
    required='True'
  • parent_id Many2one → fsm.category
    index=True string='Parent' args: 'fsm.category'
  • parent_path Char
    index=True
Public methods (0)

No public methods.

New fields (15)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required='True'
  • notes Text
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
Public methods (0)

No public methods.

New fields (21)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • complete_name Char
    compute='_compute_complete_name' recursive=True store=True
  • contact_count Integer
    compute='_compute_contact_ids' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain="[('is_company', '=', False), ('fsm_location', '=', False)]" index=True string='Primary Contact' args: 'res.partner'
  • description Char
  • direction Char
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_ids' string='Equipment'
  • fsm_parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • notes Text
    string='Location Notes'
  • owner_id Many2one → res.partner
    auto_join=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • sublocation_count Integer
    compute='_compute_sublocation_ids' string='Sub Locations'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (9)
  • action_view_contacts(self)
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • comp_count(self, contact, equipment, loc)
  • create(self, vals)
    @api.model
  • geo_localize(self)
  • get_action_views(self, contact, equipment, loc)
  • name_get(self)
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone'
  • sequence Integer
    default='10' required=True
Public methods (0)

No public methods.

New fields (2)
  • hide Boolean
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
Public methods (3)
  • new_stage(self, operator)
  • next_stage(self)
  • previous_stage(self)

New fields (49)
  • branch_id Many2one → res.branch
    related='location_id.branch_id' store=True string='Branch' args: 'res.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.Datetime.now store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • description Text
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → res.district
    related='location_id.district_id' store=True string='District' args: 'res.district'
  • duration Float
    compute=_compute_duration help='Actual duration in hours' string='Actual duration'
  • equipment_id Many2one → fsm.equipment
    string='Equipment' args: 'fsm.equipment'
  • equipment_ids Many2many → fsm.equipment
    string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type'
  • is_button Boolean
    default=False
  • is_closed Boolean
    related='stage_id.is_closed' args: 'Is closed'
  • location_directions Char
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • mobile Char
    related='location_id.mobile'
  • name Char
    copy=False default=<expr> index=True required=True
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → res.region
    related='location_id.region_id' store=True string='Region' args: 'res.region'
  • request_early Datetime
    default=<expr> string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • resolution Text
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours'
  • sequence Integer
    default=10
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    default=<expr> index=True required=True string='Team' tracking=True args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → res.territory
    related='location_id.territory_id' store=True string='Territory' args: 'res.territory'
  • todo Html
    string='Instructions'
  • type Many2one → fsm.order.type
    args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (11)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • check_day(self)
    @api.constrains('scheduled_date_start')
  • copy_notes(self)
  • create(self, vals)
    @api.model
  • onchange_equipment_ids(self)
    @api.onchange('equipment_ids')
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • unlink(self)
  • write(self, vals)

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (7)
  • active Boolean
    default=True
  • active_partner Boolean
    readonly=True related='partner_id.active' string='Partner is Active'
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • mobile Char
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • territory_ids Many2many → res.territory
    string='Territories' args: 'res.territory'
Public methods (2)
  • create(self, vals)
    @api.model
  • toggle_active(self)

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True
  • fsm_person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.'
  • stage_type Selection
    default='order' required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals)
    @api.model
  • get_color_information(self)

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name'
  • name Char
    required=True
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (10)
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=True string='Company' args: 'res.company'
  • description Text
    translate=True
  • name Char
    required=True translate=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.'
  • stage_ids Many2many → fsm.stage
    default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    help='Company related to this template' index=True string='Company' args: 'res.company'
  • duration Float
    help='Default duration in hours'
  • instructions Text
  • name Char
    required=True
  • team_id Many2one → fsm.team
    help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (7)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    default=8 string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    default=48 string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    default=72 string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    default=24 string='Hours of Buffer for Medium Priority FS Orders'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (38)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    readonly=False related='company_id.fsm_order_request_late_high' string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    readonly=False related='company_id.fsm_order_request_late_low' string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    readonly=False related='company_id.fsm_order_request_late_lowest' string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    readonly=False related='company_id.fsm_order_request_late_medium' string='Hours of Buffer for Medium Priority FS Orders'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • module_fieldservice_web_timeline_view Boolean
    string='Allow Field Service Web Timeline View'
  • module_fieldservice_website_sale Boolean
    string='Integrate E-Commerce with Field Service Workflows'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (7)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_location_id One2many → fsm.location
    comodel_name='fsm.location' inverse_name='partner_id' limit=1 readonly=1 string='Related FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=[('fsm_parent_id', '=', False)] string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
  • type Selection
    selection_add=[('fsm_location', 'Location')]
Public methods (2)
  • action_open_owned_locations(self)
  • write(self, value)

New fields (2)
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/14.0/fieldservice
VERSION
VERSION 1.30.1
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSMaxime Chambreuil, Pedro M. Baeza, GitHub, Daniel Reis, tafaRU, OCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, hparfr, Mourad, oca-ci, Murtuza Saleh, Stefano Consolaro, Vimal Patel, HemanginiPatel, Brian McMaster, Marcel Savegnago, Alessandro Uffreduzzi, AmmarOfficewalaSerpentCS, Yves Goldberg, Reed Hayashikawa, Freni-OSI, BojanOD, Chankya Soni, Francois Poizat, PicchiSeba, Vandan-OSI, bojan, Murtaza Mithaiwala
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/field-service:
    - base_territory
odoo/odoo:
    - base
    - base_geolocalize
    - base_setup
    - web
    - resource
    - contacts
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (46)
XML IDNameModelTypeStatus
assets_backend_team fsm_team_assets ir.ui.view qweb Inherits web.assets_backend
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_tree_view fsm.category.tree fsm.category tree New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_equipment_tree_view fsm.equipment.tree fsm.equipment tree New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_person_tree_view fsm.location.person.tree fsm.location.person tree New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_location_tree_view fsm.location.tree fsm.location tree New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_tree_view fsm.order.tree fsm.order tree New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_tree_view fsm.order.type.tree fsm.order.type tree New
fsm_partner_fields res.partner.fsm.form res.partner div Inherits base.view_partner_form
fsm_person_form fsm.person.form fsm.person form New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_person_tree fsm.person.tree fsm.person tree New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_stage_tree_view Stages fsm.stage tree New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_tree_view Tags fsm.tag tree New
fsm_template_form_view Order Template fsm.template form New
fsm_template_tree_view Order Templates fsm.template tree New
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
res_territory_form_view_inherit res.territory.form.inherit res.territory xpath Inherits base_territory.res_territory_form_view
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_tree fsm.team.tree fsm.team tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (18)

New fields (6)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    help='Company related to this category' index=True required=False string='Company' args: 'res.company'
  • description Char
    string='Description'
  • full_name Char
    compute='_compute_full_name' string='Full Name'
  • name Char
    required='True' string='Name'
  • parent_id Many2one → fsm.category
    string='Parent' args: 'fsm.category'
Public methods (0)

No public methods.

New fields (17)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • hide Boolean
    default=False
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required='True' string='Name'
  • notes Text
    string='Notes'
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> domain="[('stage_type', '=', 'equipment')]" group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
Public methods (3)
  • copy(self, default=None)
  • next_stage(self)
  • previous_stage(self)

New fields (23)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • complete_name Char
    compute='_compute_complete_name' store=True string='Complete Name'
  • contact_count Integer
    compute='_compute_contact_ids' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain="[('is_company', '=', False), ('fsm_location', '=', False)]" index=True string='Primary Contact' args: 'res.partner'
  • description Char
    string='Description'
  • direction Char
    string='Directions'
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_ids' string='Equipment'
  • fsm_parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • hide Boolean
    default=False
  • notes Text
    string='Location Notes'
  • owner_id Many2one → res.partner
    auto_join=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • sublocation_count Integer
    compute='_compute_sublocation_ids' string='Sub Locations'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (11)
  • action_view_contacts(self)
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • comp_count(self, contact, equipment, loc)
  • create(self, vals)
    @api.model
  • geo_localize(self)
  • get_action_views(self, contact, equipment, loc)
  • name_get(self)
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • next_stage(self)
  • previous_stage(self)

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email' string='Email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone' string='Phone'
  • sequence Integer
    default='10' required=True string='Sequence'
Public methods (0)

No public methods.

New fields (49)
  • branch_id Many2one → res.branch
    related='location_id.branch_id' store=True string='Branch' args: 'res.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city' string='City'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.datetime.now() store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • description Text
    string='Description'
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → res.district
    related='location_id.district_id' store=True string='District' args: 'res.district'
  • duration Float
    compute=_compute_duration help='Actual duration in hours' string='Actual duration'
  • equipment_id Many2one → fsm.equipment
    string='Equipment' args: 'fsm.equipment'
  • equipment_ids Many2many → fsm.equipment
    string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type' string='Internal Type'
  • is_button Boolean
    default=False
  • is_closed Boolean
    related='stage_id.is_closed' args: 'Is closed'
  • location_directions Char
    string='Location Directions'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • mobile Char
    related='location_id.mobile'
  • name Char
    copy=False default=<expr> index=True required=True string='Name'
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True string='Priority' args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → res.region
    related='location_id.region_id' store=True string='Region' args: 'res.region'
  • request_early Datetime
    default=<expr> string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • resolution Text
    string='Resolution'
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    default=fields.Datetime.now string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours' string='Scheduled duration'
  • sequence Integer
    default=10 string='Sequence'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' tracking=True args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    default=<expr> index=True required=True string='Team' tracking=True args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → res.territory
    related='location_id.territory_id' store=True string='Territory' args: 'res.territory'
  • todo Text
    string='Instructions'
  • type Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (12)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • check_day(self)
    @api.constrains('scheduled_date_start')
  • copy_notes(self)
  • create(self, vals)
    @api.model
  • onchange_equipment_ids(self)
    @api.onchange('equipment_ids')
  • onchange_location_id(self)
    @api.onchange('location_id')
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • unlink(self)
  • write(self, vals)

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')] string='Internal Type'
  • name Char
    string='Name'
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True
  • active_partner Boolean
    readonly=True related='partner_id.active' string='Partner is Active'
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • hide Boolean
    default=False
  • mobile Char
    string='Mobile'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' args: 'fsm.stage'
  • territory_ids Many2many → res.territory
    string='Territories' args: 'res.territory'
Public methods (4)
  • create(self, vals)
    @api.model
  • next_stage(self)
  • previous_stage(self)
  • toggle_active(self)

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • fsm_person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True string='Active'
  • company_id Many2one → res.company
    string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • stage_type Selection
    default='order' required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals)
    @api.model
  • get_color_information(self)

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    help='Company related to this tag' index=True required=False string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name' string='Full Name'
  • name Char
    required=True string='Name' translate=True
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (10)
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=False string='Company' args: 'res.company'
  • description Text
    translate=True
  • name Char
    required=True translate=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.' args: 'Sequence'
  • stage_ids Many2many → fsm.stage
    default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    help='Company related to this template' index=True string='Company' args: 'res.company'
  • duration Float
    help='Default duration in hours' string='Duration'
  • instructions Text
    string='Instructions'
  • name Char
    required=True string='Name'
  • team_id Many2one → fsm.team
    help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (7)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    default=8 string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    default=48 string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    default=72 string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    default=24 string='Hours of Buffer for Medium Priority FS Orders'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (37)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • fsm_order_request_late_high Float
    readonly=False related='company_id.fsm_order_request_late_high' string='Hours of Buffer for High Priority FS Orders'
  • fsm_order_request_late_low Float
    readonly=False related='company_id.fsm_order_request_late_low' string='Hours of Buffer for Low Priority FS Orders'
  • fsm_order_request_late_lowest Float
    readonly=False related='company_id.fsm_order_request_late_lowest' string='Hours of Buffer for Lowest Priority FS Orders'
  • fsm_order_request_late_medium Float
    readonly=False related='company_id.fsm_order_request_late_medium' string='Hours of Buffer for Medium Priority FS Orders'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_timeline Boolean
    string='Allow Field Service Web Timeline View'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (7)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_location_id One2many → fsm.location
    comodel_name='fsm.location' inverse_name='partner_id' readonly=1 string='Related FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=[('fsm_parent_id', '=', False)] string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
  • type Selection
    selection_add=[('fsm_location', 'Location')]
Public methods (2)
  • action_open_owned_locations(self)
  • write(self, value)

New fields (2)
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/13.0/fieldservice
VERSION
VERSION 1.2.1
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSdavid, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Murtuza Saleh, Brian McMaster, Marcel Savegnago
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/field-service:
    - base_territory
odoo/odoo:
    - base
    - base_geolocalize
    - base_setup
    - web
    - resource
    - contacts
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (48)
XML IDNameModelTypeStatus
assets_backend_team fsm_team_assets ir.ui.view qweb Inherits web.assets_backend
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_tree_view fsm.category.tree fsm.category tree New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_equipment_tree_view fsm.equipment.tree fsm.equipment tree New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_person_tree_view fsm.location.person.tree fsm.location.person tree New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_location_tree_view fsm.location.tree fsm.location tree New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_tree_view fsm.order.tree fsm.order tree New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_tree_view fsm.order.type.tree fsm.order.type tree New
fsm_partner_fields res.partner.fsm.form res.partner div Inherits base.view_partner_form
fsm_partner_kanban_state res.partner.kanban.state res.partner xpath Inherits base.res_partner_kanban_view
fsm_person_form fsm.person.form fsm.person form New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_person_tree fsm.person.tree fsm.person tree New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_stage_tree_view Stages fsm.stage tree New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_tree_view Tags fsm.tag tree New
fsm_template_form_view Order Template fsm.template form New
fsm_template_tree_view Order Templates fsm.template tree New
partner_id_short_context partner.id.short.context res.partner field Inherits base.view_partner_short_form
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
res_territory_form_view_inherit res.territory.form.inherit res.territory xpath Inherits base_territory.res_territory_form_view
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_tree fsm.team.tree fsm.team tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (18)

New fields (6)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this category' index=True required=True string='Company' args: 'res.company'
  • description Char
    string='Description'
  • full_name Char
    compute='_compute_full_name' string='Full Name'
  • name Char
    required='True' string='Name'
  • parent_id Many2one → fsm.category
    string='Parent' args: 'fsm.category'
Public methods (0)

No public methods.

New fields (17)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • hide Boolean
    default=False
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required='True' string='Name'
  • notes Text
    string='Notes'
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
Public methods (2)
  • next_stage(self)
  • previous_stage(self)

New fields (24)
  • branch_id Many2one → res.branch
    string='Branch' args: 'res.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • complete_name Char
    compute='_compute_complete_name' store=True string='Complete Name'
  • contact_count Integer
    compute='_compute_contact_ids' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain="[('is_company', '=', False), ('fsm_location', '=', False)]" index=True string='Primary Contact' args: 'res.partner'
  • description Char
    string='Description'
  • direction Char
    string='Directions'
  • district_id Many2one → res.district
    string='District' args: 'res.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_ids' string='Equipment'
  • fsm_parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • hide Boolean
    default=False
  • notes Text
    string='Location Notes'
  • owner_id Many2one → res.partner
    auto_join=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • ref Char
    copy=False string='Internal Reference'
  • region_id Many2one → res.region
    string='Region' args: 'res.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • sublocation_count Integer
    compute='_compute_sublocation_ids' string='Sub Locations'
  • territory_id Many2one → res.territory
    string='Territory' args: 'res.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (10)
  • action_view_contacts(self)
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • comp_count(self, contact, equipment, loc)
  • geo_localize(self)
  • get_action_views(self, contact, equipment, loc)
  • name_get(self)
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • next_stage(self)
  • previous_stage(self)

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email' string='Email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone' string='Phone'
  • sequence Integer
    default='10' required=True string='Sequence'
Public methods (0)

No public methods.

New fields (48)
  • branch_id Many2one → res.branch
    related='location_id.branch_id' store=True string='Branch' args: 'res.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city' string='City'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    ondelete='restrict' related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.datetime.now() store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • description Text
    string='Description'
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → res.district
    related='location_id.district_id' store=True string='District' args: 'res.district'
  • duration Float
    compute=_compute_duration help='Actual duration in hours' string='Actual duration'
  • equipment_id Many2one → fsm.equipment
    string='Equipment' args: 'fsm.equipment'
  • equipment_ids Many2many → fsm.equipment
    string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type' string='Internal Type'
  • is_button Boolean
    default=False
  • location_directions Char
    string='Location Directions'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • mobile Char
    related='location_id.mobile'
  • name Char
    copy=False default=<expr> index=True required=True string='Name'
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True string='Priority' args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → res.region
    related='location_id.region_id' store=True string='Region' args: 'res.region'
  • request_early Datetime
    default=datetime.now() string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • resolution Text
    placeholder='Resolution of the order' string='Resolution'
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours' string='Scheduled duration'
  • sequence Integer
    default=10 string='Sequence'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    ondelete='restrict' related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    default=<expr> index=True required=True string='Team' track_visibility='onchange' args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → res.territory
    related='location_id.territory_id' store=True string='Territory' args: 'res.territory'
  • todo Text
    string='Instructions'
  • type Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (12)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • check_day(self)
    @api.constrains('scheduled_date_start')
  • copy_notes(self)
  • create(self, vals)
    @api.model
  • onchange_equipment_ids(self)
    @api.onchange('equipment_ids')
  • onchange_location_id(self)
    @api.onchange('location_id')
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • unlink(self)
  • write(self, vals)

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')] string='Internal Type'
  • name Char
    string='Name'
Public methods (0)

No public methods.

New fields (7)
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • hide Boolean
    default=False
  • mobile Char
    string='Mobile'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • territory_ids Many2many → res.territory
    string='Territories' args: 'res.territory'
Public methods (4)
  • create(self, vals)
    @api.model
  • get_person_information(self, vals)
  • next_stage(self)
  • previous_stage(self)

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • fsm_person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • stage_type Selection
    required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals)
    @api.model
  • get_color_information(self)

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name' string='Full Name'
  • name Char
    required=True string='Name'
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (10)
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=True string='Company' args: 'res.company'
  • description Text
    translation=True
  • name Char
    required=True translation=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.' args: 'Sequence'
  • stage_ids Many2many → fsm.stage
    default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this template' index=True required=True string='Company' args: 'res.company'
  • hours Float
    string='Hours'
  • instructions Text
    string='Instructions'
  • name Char
    required=True string='Name'
  • team_id Many2one → fsm.team
    help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (3)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (33)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • module_fieldservice_web_timeline_view Boolean
    string='Allow Field Service Web Timeline View'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (5)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=[('fsm_parent_id', '=', False)] string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
Public methods (1)
  • action_open_owned_locations(self)

New fields (2)
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/12.0/fieldservice
VERSION
VERSION 2.21.1
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSMaxime Chambreuil, GitHub, Daniel Reis, david, Bhavesh Odedra, OCA Transbot, oca-travis, Weblate, OCA-git-bot, hparfr, oca-ci, Kitti U, Sandip Mangukiya, brian10048, scampbell, Murtuza Saleh, HemanginiPatel, patrickrwilson, Brian McMaster, Marcel Savegnago, Patrick Wilson, Alessandro Uffreduzzi, AmmarOfficewalaSerpentCS, peasebenjamin
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:13
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/partner-contact:
    - partner_fax
OCA/web:
    - web_timeline
odoo/odoo:
    - base_geolocalize
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - resource
    - contacts
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (57)
XML IDNameModelTypeStatus
assets_backend web_timeline_custom assets ir.ui.view qweb Inherits web.assets_backend
assets_backend_team fsm_team_assets ir.ui.view qweb Inherits web.assets_backend
fsm_branch_form_view fsm.branch.form fsm.branch form New
fsm_branch_tree_view fsm.branch.tree fsm.branch tree New
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_tree_view fsm.category.tree fsm.category tree New
fsm_district_form_view fsm.district.form fsm.district form New
fsm_district_tree_view fsm.district.tree fsm.district tree New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_equipment_tree_view fsm.equipment.tree fsm.equipment tree New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_graph_view fsm.location.graph fsm.location graph New
fsm_location_person_form_view fsm.location.person.form fsm.location.person form New
fsm_location_person_search_view fsm.location.person.search fsm.location.person search New
fsm_location_person_tree_view fsm.location.person.tree fsm.location.person tree New
fsm_location_pivot_view fsm.location.pivot fsm.location pivot New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_location_tree_view fsm.location.tree fsm.location tree New
fsm_order_calendar_view Orders fsm.order calendar New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_timeline_view fsm.order.timeline fsm.order timeline New
fsm_order_tree_view fsm.order.tree fsm.order tree New
fsm_order_type_form_view fsm.order.type.form fsm.order.type form New
fsm_order_type_tree_view fsm.order.type.tree fsm.order.type tree New
fsm_partner_fields res.partner.fsm.form res.partner xpath Inherits base.view_partner_form
fsm_partner_kanban_state res.partner.kanban.state res.partner xpath Inherits base.res_partner_kanban_view
fsm_person_form fsm.person.form fsm.person form New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_person_tree fsm.person.tree fsm.person tree New
fsm_region_form_view fsm.region.form fsm.region form New
fsm_region_tree_view fsm.region.tree fsm.region tree New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_search_view fsm.stage.search fsm.stage search New
fsm_stage_tree_view Stages fsm.stage tree New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_tree_view Tags fsm.tag tree New
fsm_template_form_view Order Template fsm.template form New
fsm_template_tree_view Order Templates fsm.template tree New
fsm_territory_form_view fsm.territory.form fsm.territory form New
fsm_territory_tree_view fsm.territory.tree fsm.territory tree New
partner_id_short_context partner.id.short.context res.partner field Inherits base.view_partner_short_form
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings xpath Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner field Inherits base.view_res_partner_filter
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_tree fsm.team.tree fsm.team tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (23)

New fields (4)
  • description Char
    string='Description'
  • district_id Many2one → fsm.district
    string='District' args: 'fsm.district'
  • name Char
    required=True string='Name'
  • partner_id Many2one → res.partner
    string='Branch Manager' args: 'res.partner'
Public methods (0)

No public methods.

New fields (6)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this category' index=True required=True string='Company' args: 'res.company'
  • description Char
    string='Description'
  • full_name Char
    compute='_compute_full_name' string='Full Name'
  • name Char
    required='True' string='Name'
  • parent_id Many2one → fsm.category
    string='Parent' args: 'fsm.category'
Public methods (0)

No public methods.

New fields (4)
  • description Char
    string='Description'
  • name Char
    required=True string='Name'
  • partner_id Many2one → res.partner
    string='District Manager' args: 'res.partner'
  • region_id Many2one → fsm.region
    string='Region' args: 'fsm.region'
Public methods (0)

No public methods.

New fields (17)
  • branch_id Many2one → fsm.branch
    string='Branch' args: 'fsm.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this equipment' index=True required=True string='Company' args: 'res.company'
  • current_location_id Many2one → fsm.location
    string='Current Location' args: 'fsm.location'
  • district_id Many2one → fsm.district
    string='District' args: 'fsm.district'
  • hide Boolean
    default=False
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required='True' string='Name'
  • notes Text
    string='Notes'
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → fsm.region
    string='Region' args: 'fsm.region'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • territory_id Many2one → fsm.territory
    string='Territory' args: 'fsm.territory'
Public methods (2)
  • next_stage(self)
  • previous_stage(self)

New fields (24)
  • branch_id Many2one → fsm.branch
    string='Branch' args: 'fsm.branch'
  • branch_manager_id Many2one
    related='branch_id.partner_id' string='Branch Manager'
  • calendar_id Many2one → resource.calendar
    string='Office Hours' args: 'resource.calendar'
  • complete_name Char
    compute='_compute_complete_name' store=True string='Complete Name'
  • contact_count Integer
    compute='_compute_contact_ids' string='Contacts Count'
  • contact_id Many2one → res.partner
    domain="[('is_company', '=', False), ('fsm_location', '=', False)]" index=True string='Primary Contact' args: 'res.partner'
  • description Char
    string='Description'
  • direction Char
    string='Directions'
  • district_id Many2one → fsm.district
    string='District' args: 'fsm.district'
  • district_manager_id Many2one
    related='district_id.partner_id' string='District Manager'
  • equipment_count Integer
    compute='_compute_equipment_ids' string='Equipment'
  • fsm_parent_id Many2one → fsm.location
    index=True string='Parent' args: 'fsm.location'
  • hide Boolean
    default=False
  • notes Text
    string='Location Notes'
  • owner_id Many2one → res.partner
    auto_join=True ondelete='restrict' required=True string='Related Owner' args: 'res.partner'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • person_ids One2many → fsm.location.person
    string='Workers' args: 'fsm.location.person', 'location_id'
  • ref Char
    copy=False string='Internal Reference'
  • region_id Many2one → fsm.region
    string='Region' args: 'fsm.region'
  • region_manager_id Many2one
    related='region_id.partner_id' string='Region Manager'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • sublocation_count Integer
    compute='_compute_sublocation_ids' string='Sub Locations'
  • territory_id Many2one → fsm.territory
    string='Territory' args: 'fsm.territory'
  • territory_manager_id Many2one
    related='territory_id.person_id' string='Primary Assignment'
Public methods (11)
  • action_view_contacts(self)
    @api.multi
    This function returns an action that display existing contacts of given fsm location id and its child locations. It can either be a in a list or in a form view, if there is only one contact to show.
  • action_view_equipment(self)
    @api.multi
    This function returns an action that display existing equipment of given fsm location id. It can either be a in a list or in a form view, if there is only one equipment to show.
  • action_view_sublocation(self)
    @api.multi
    This function returns an action that display existing sub-locations of a given fsm location id. It can either be a in a list or in a form view, if there is only one sub-location to show.
  • comp_count(self, contact, equipment, loc)
  • create(self, vals)
    @api.model
  • geo_localize(self)
    @api.multi
  • get_action_views(self, contact, equipment, loc)
  • name_get(self)
    @api.multi
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • next_stage(self)
  • previous_stage(self)

New fields (7)
  • contact_id Many2one
    related='location_id.contact_id' string='Contact'
  • email Char
    related='person_id.email' string='Email'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • owner_id Many2one
    related='location_id.owner_id' string='Owner'
  • person_id Many2one → fsm.person
    index=True required=True string='Worker' args: 'fsm.person'
  • phone Char
    related='person_id.phone' string='Phone'
  • sequence Integer
    default='10' required=True string='Sequence'
Public methods (0)

No public methods.

New fields (48)
  • branch_id Many2one → fsm.branch
    related='location_id.branch_id' store=True string='Branch' args: 'fsm.branch'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • city Char
    related='location_id.city' string='City'
  • color Integer
    default=0 args: 'Color Index'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this order' index=True required=True string='Company' args: 'res.company'
  • country_name Char
    ondelete='restrict' related='location_id.country_id.name' string='Country'
  • current_date Datetime
    default=fields.datetime.now() store=True
  • custom_color Char
    related='stage_id.custom_color' string='Stage Color'
  • date_end Datetime
    string='Actual End'
  • date_start Datetime
    string='Actual Start'
  • description Text
    string='Description'
  • display_name Char
    related='name' string='Order'
  • district_id Many2one → fsm.district
    related='location_id.district_id' store=True string='District' args: 'fsm.district'
  • duration Float
    compute=_compute_duration help='Actual duration in hours' string='Actual duration'
  • equipment_id Many2one → fsm.equipment
    string='Equipment' args: 'fsm.equipment'
  • equipment_ids Many2many → fsm.equipment
    string='Equipments' args: 'fsm.equipment'
  • internal_type Selection
    related='type.internal_type' string='Internal Type'
  • is_button Boolean
    default=False
  • location_directions Char
    string='Location Directions'
  • location_id Many2one → fsm.location
    index=True required=True string='Location' args: 'fsm.location'
  • mobile Char
    related='location_id.mobile'
  • name Char
    copy=False default=<expr> index=True required=True string='Name'
  • person_id Many2one → fsm.person
    index=True string='Assigned To' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • person_phone Char
    related='person_id.phone' string='Worker Phone'
  • phone Char
    related='location_id.phone' string='Location Phone'
  • priority Selection
    default=<expr> index=True string='Priority' args: fsm_stage.AVAILABLE_PRIORITIES
  • region_id Many2one → fsm.region
    related='location_id.region_id' store=True string='Region' args: 'fsm.region'
  • request_early Datetime
    default=<expr> string='Earliest Request Date'
  • request_late Datetime
    string='Latest Request Date'
  • resolution Text
    placeholder='Resolution of the order' string='Resolution'
  • scheduled_date_end Datetime
    string='Scheduled End'
  • scheduled_date_start Datetime
    string='Scheduled Start (ETA)'
  • scheduled_duration Float
    help='Scheduled duration of the work in hours' string='Scheduled duration'
  • sequence Integer
    default=10 string='Sequence'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • stage_name Char
    related='stage_id.name' string='Stage Name'
  • state_name Char
    ondelete='restrict' related='location_id.state_id.name' string='State'
  • street Char
    related='location_id.street'
  • street2 Char
    related='location_id.street2'
  • tag_ids Many2many → fsm.tag
    help='Classify and analyze your orders' string='Tags' args: 'fsm.tag', 'fsm_order_tag_rel', 'fsm_order_id', 'tag_id'
  • team_id Many2one → fsm.team
    default=<expr> index=True required=True string='Team' track_visibility='onchange' args: 'fsm.team'
  • template_id Many2one → fsm.template
    string='Template' args: 'fsm.template'
  • territory_id Many2one → fsm.territory
    related='location_id.territory_id' store=True string='Territory' args: 'fsm.territory'
  • todo Text
    string='Instructions'
  • type Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
  • zip Char
    related='location_id.zip'
Public methods (12)
  • action_cancel(self)
  • action_complete(self)
  • can_unlink(self)
    :return True if the order can be deleted, False otherwise
  • check_day(self)
    @api.constrains('scheduled_date_start')
  • copy_notes(self)
  • create(self, vals)
    @api.model
  • onchange_equipment_ids(self)
    @api.onchange('equipment_ids')
  • onchange_location_id(self)
    @api.onchange('location_id')
  • onchange_scheduled_date_end(self)
    @api.onchange('scheduled_date_end')
  • onchange_scheduled_duration(self)
    @api.onchange('scheduled_date_start', 'scheduled_duration')
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • internal_type Selection
    default='fsm' selection=[('fsm', 'FSM')] string='Internal Type'
  • name Char
    string='Name'
Public methods (0)

No public methods.

New fields (7)
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • hide Boolean
    default=False
  • mobile Char
    string='Mobile'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • territory_ids Many2many → fsm.territory
    string='Territories' args: 'fsm.territory'
Public methods (4)
  • create(self, vals)
    @api.model
  • get_person_information(self, vals)
    @api.multi
  • next_stage(self)
  • previous_stage(self)

New fields (1)
  • location_ids One2many → fsm.location.person
    string='Linked Locations' args: 'fsm.location.person', 'person_id'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • fsm_person_id Many2one → fsm.person
    required=True args: 'fsm.person', 'FSM Worker'
  • user_id Many2one → res.users
    default=<expr> required=True args: 'res.users', 'Me'
Public methods (0)

No public methods.

New fields (3)
  • description Char
    string='Description'
  • name Char
    required=True string='Name'
  • partner_id Many2one → res.partner
    string='Region Manager' args: 'res.partner'
Public methods (0)

No public methods.

New fields (11)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • custom_color Char
    default='#FFFFFF' help='Use Hex Code only Ex:-#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • stage_type Selection
    required=True args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=<expr> string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (2)
  • create(self, vals)
    @api.model
  • get_color_information(self)
    @api.multi

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this tag' index=True required=True string='Company' args: 'res.company'
  • full_name Char
    compute='_compute_full_name' string='Full Name'
  • name Char
    required=True string='Name'
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (10)
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this team' index=True required=True string='Company' args: 'res.company'
  • description Text
    translation=True
  • name Char
    required=True translation=True
  • order_count Integer
    compute='_compute_order_count' string='Orders Count'
  • order_ids One2many → fsm.order
    domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.' args: 'Sequence'
  • stage_ids Many2many → fsm.stage
    default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (7)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    default=<expr> help='Company related to this template' index=True required=True string='Company' args: 'res.company'
  • hours Float
    string='Hours'
  • instructions Text
    string='Instructions'
  • name Char
    required=True string='Name'
  • team_id Many2one → fsm.team
    help='Choose a team to be set on orders of this template' string='Team' args: 'fsm.team'
  • type_id Many2one → fsm.order.type
    string='Type' args: 'fsm.order.type'
Public methods (0)

No public methods.

New fields (11)
  • branch_id Many2one → fsm.branch
    string='Branch' args: 'fsm.branch'
  • country_ids One2many → res.country
    string='Country Names' args: 'res.country', 'territory_id'
  • description Char
    string='Description'
  • district_id Many2one
    related='branch_id.district_id' string='District'
  • name Char
    required=True string='Name'
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • region_id Many2one
    related='branch_id.district_id.region_id' string='Region'
  • state_ids One2many → res.country.state
    string='State Names' args: 'res.country.state', 'territory_id'
  • type Selection
    args: [('zip', 'Zip'), ('state', 'State'), ('country', 'Country')], 'Type'
  • zip_codes Char
    string='ZIP Codes'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (4)
  • action_convert(self)
    @api.multi
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)
  • action_other_address(self, partner)

New fields (7)
  • auto_populate_equipments_on_order Boolean
    string='Auto-populate Equipments on Order based on Location'
  • auto_populate_persons_on_location Boolean
    string='Auto-populate Workers on Location based on Territory'
  • order_prio0_request_late Float
    default=72 string='Hours of Buffer for Lowest Priority FS Orders'
  • order_prio1_request_late Float
    default=48 string='Hours of Buffer for Low Priority FS Orders'
  • order_prio2_request_late Float
    default=24 string='Hours of Buffer for Medium Priority FS Orders'
  • order_prio3_request_late Float
    default=8 string='Hours of Buffer for High Priority FS Orders'
  • search_on_complete_name Boolean
    string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (39)
  • auto_populate_equipments_on_order Boolean
    readonly=False related='company_id.auto_populate_equipments_on_order' string='Auto-populate equipments on Order based on the Location'
  • auto_populate_persons_on_location Boolean
    readonly=False related='company_id.auto_populate_persons_on_location' string='Auto-populate Workers on Location based on Territory'
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_activity Boolean
    string='Manage FSM Activities'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_change_management Boolean
    string='Change Management'
  • module_fieldservice_crm Boolean
    string='CRM'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_fleet Boolean
    string='Link FSM vehicles to Fleet vehicles'
  • module_fieldservice_geoengine Boolean
    string='Use GeoEngine'
  • module_fieldservice_google_map Boolean
    string='Allow Field Service Google Map'
  • module_fieldservice_location_builder Boolean
    string='Use FSM Location Builder'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_mgmtsystem_nonconformity Boolean
    string='Manage Order Non-Conformities'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_project Boolean
    string='Projects and Tasks'
  • module_fieldservice_purchase Boolean
    string='Manage subcontractors and their pricelists'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_route Boolean
    string='Manage routes'
  • module_fieldservice_route_account Boolean
    string='Check the amount collected during the route'
  • module_fieldservice_route_stock Boolean
    string='Check the inventory of the vehicle at the end of the route'
  • module_fieldservice_sale Boolean
    string='Sell FSM orders'
  • module_fieldservice_size Boolean
    string='Manage sizes for orders and locations'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stage_validation Boolean
    string='Validate data at each stage'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
  • order_prio0_request_late Float
    readonly=False related='company_id.order_prio0_request_late' string='Hours of Buffer for Lowest Priority FS Orders'
  • order_prio1_request_late Float
    readonly=False related='company_id.order_prio1_request_late' string='Hours of Buffer for Low Priority FS Orders'
  • order_prio2_request_late Float
    readonly=False related='company_id.order_prio2_request_late' string='Hours of Buffer for Medium Priority FS Orders'
  • order_prio3_request_late Float
    readonly=False related='company_id.order_prio3_request_late' string='Hours of Buffer for High Priority FS Orders'
  • search_on_complete_name Boolean
    readonly=False related='company_id.search_on_complete_name' string='Search Location By Hierarchy'
Public methods (0)

No public methods.

New fields (1)
  • territory_id Many2one → fsm.territory
    string='Territory' args: 'fsm.territory'
Public methods (0)

No public methods.

New fields (1)
  • territory_id Many2one → fsm.territory
    string='Territory' args: 'fsm.territory'
Public methods (0)

No public methods.

New fields (5)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • owned_location_count Integer
    compute='_compute_owned_location_count' string='# of Owned Locations'
  • owned_location_ids One2many → fsm.location
    domain=[('fsm_parent_id', '=', False)] string='Owned Locations' args: 'fsm.location', 'owner_id'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
Public methods (1)
  • action_open_owned_locations(self)
    @api.multi
REPOSITORY
REPOSITORYOCA/field-service
GIT
GIThttps://github.com/OCA/field-service.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/field-service/tree/11.0/fieldservice
VERSION
VERSION 0.3.0
CATEGORY
CATEGORYField Service
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Open Source Integrators
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Open Source Integrators
COMMITTERS
COMMITTERSMaxime Chambreuil, GitHub, Bhavesh Odedra, OCA-git-bot, OCA Git Bot, Sandip Mangukiya, brian10048, scampbell, osi-scampbell, Michael Allen
WEBSITE
WEBSITEhttps://github.com/OCA/field-service
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/geospatial:
    - base_geoengine
OCA/web:
    - web_timeline
odoo/odoo:
    - base_geolocalize
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES geojson
shapely
simplejson
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (52)
XML IDNameModelTypeStatus
assets_backend web_timeline_custom assets ir.ui.view qweb Inherits web.assets_backend
assets_backend_team fsm_team_assets ir.ui.view qweb Inherits web.assets_backend
fsm_branch_form_view fsm.branch.form fsm.branch form New
fsm_branch_tree_view fsm.branch.tree fsm.branch tree New
fsm_category_form_view fsm.category.form fsm.category form New
fsm_category_tree_view fsm.category.tree fsm.category tree New
fsm_district_form_view fsm.district.form fsm.district form New
fsm_district_tree_view fsm.district.tree fsm.district tree New
fsm_equipment_form_view fsm.equipment.form fsm.equipment form New
fsm_equipment_graph_view fsm.equipment.graph fsm.equipment graph New
fsm_equipment_kanban_view fsm.equipment.kanban fsm.equipment kanban New
fsm_equipment_pivot_view fsm.equipment.pivot fsm.equipment pivot New
fsm_equipment_search_view fsm.equipment.search fsm.equipment search New
fsm_equipment_tree_view fsm.equipment.tree fsm.equipment tree New
fsm_location_form_view fsm.location.form fsm.location form New
fsm_location_search_view fsm.location.search fsm.location search New
fsm_location_tree_view fsm.location.tree fsm.location tree New
fsm_order_form fsm.order.form fsm.order form New
fsm_order_graph_view fsm.order.graph fsm.order graph New
fsm_order_kanban_view fsm.order.kanban fsm.order kanban New
fsm_order_pivot_view fsm.order.pivot fsm.order pivot New
fsm_order_search_view fsm.order.search fsm.order search New
fsm_order_timeline_view fsm.order.timeline fsm.order timeline New
fsm_order_tree_view fsm.order.tree fsm.order tree New
fsm_partner_fields res.partner.fsm.form res.partner notebook Inherits base.view_partner_form
fsm_partner_kanban_state res.partner.kanban.state res.partner Inherits base.res_partner_kanban_view
fsm_person_form fsm.person.form fsm.person form New
fsm_person_search_view fsm.person.search fsm.person search New
fsm_person_tree fsm.person.tree fsm.person tree New
fsm_region_form_view fsm.region.form fsm.region form New
fsm_region_tree_view fsm.region.tree fsm.region tree New
fsm_route_form fsm.route.form fsm.route form New
fsm_route_graph_view fsm.route.graph fsm.route graph New
fsm_route_pivot_view fsm.route.pivot fsm.route pivot New
fsm_route_tree fsm.route.tree fsm.route tree New
fsm_stage_form_view Stage fsm.stage form New
fsm_stage_tree_view Stages fsm.stage tree New
fsm_tag_form_view Tag fsm.tag form New
fsm_tag_tree_view Tags fsm.tag tree New
fsm_template_form_view Order Template fsm.template form New
fsm_template_tree_view Order Templates fsm.template tree New
fsm_territory_form_view fsm.territory.form fsm.territory form New
fsm_territory_tree_view fsm.territory.tree fsm.territory tree New
ir_ui_view_fsm_order_map ir.ui.view.fsm.order.map fsm.order geoengine New
partner_wizard_view Convert to a FSM Worker or Location fsm.wizard form New
report_fsm_order report_fsm_order ir.ui.view qweb New
report_fsm_order_document report_fsm_order_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.fsm res.config.settings Inherits base.res_config_settings_view_form
res_partner_search_reference res.partner.search.reference res.partner Inherits base.view_res_partner_filter
view_team_form fsm.team.form fsm.team form New
view_team_kanban fsm.team.kanban fsm.team kanban New
view_team_tree fsm.team.tree fsm.team tree New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (17)

New fields (5)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • description Char
    string='Description'
  • district_id Many2one → fsm.district
    string='District' args: 'fsm.district'
  • name Char
    required=True string='Name'
  • partner_id Many2one → res.partner
    string='Branch Manager' args: 'res.partner'
Public methods (0)

No public methods.

New fields (5)
  • color Integer
    default=10 args: 'Color Index'
  • description Char
    string='Description'
  • full_name Char
    compute='_compute_full_name' string='Name'
  • name Char
    required='True' string='Name'
  • parent_id Many2one → fsm.category
    string='Parent' args: 'fsm.category'
Public methods (0)

No public methods.

New fields (5)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • description Char
    string='Description'
  • name Char
    required=True string='Name'
  • partner_id Many2one → res.partner
    string='District Manager' args: 'res.partner'
  • region_id Many2one → fsm.region
    string='Region' args: 'fsm.region'
Public methods (0)

No public methods.

New fields (16)
  • branch_id Many2one → fsm.branch
    string='Branch' args: 'fsm.branch'
  • child_ids One2many → fsm.equipment
    string='Children' args: 'fsm.equipment', 'parent_id'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • current_location_id Many2one → fsm.location
    required=True string='Current Location' args: 'fsm.location'
  • district_id Many2one → fsm.district
    string='District' args: 'fsm.district'
  • hide Boolean
    default=False
  • location_id Many2one → fsm.location
    string='Assigned Location' args: 'fsm.location'
  • managed_by_id Many2one → res.partner
    string='Managed By' args: 'res.partner'
  • name Char
    required='True' string='Name'
  • notes Text
    string='Notes'
  • owned_by_id Many2one → res.partner
    string='Owned By' args: 'res.partner'
  • parent_id Many2one → fsm.equipment
    string='Parent' args: 'fsm.equipment'
  • person_id Many2one → fsm.person
    string='Assigned Operator' args: 'fsm.person'
  • region_id Many2one → fsm.region
    string='Region' args: 'fsm.region'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • territory_id Many2one → fsm.territory
    string='Territory' args: 'fsm.territory'
Public methods (1)
  • advance_stage(self)

New fields (8)
  • calendar_id Many2one → resource.calendar
    string='Working Schedule' args: 'resource.calendar'
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • hide Boolean
    default=False
  • location_ids Many2many → fsm.location
    string='Linked Locations' args: 'fsm.location', 'fsm_person_location_rel', 'fsm_person_id', 'fsm_location_id'
  • partner_id Many2one → res.partner
    auto_join=True delegate=True ondelete='restrict' required=True string='Related Partner' args: 'res.partner'
  • stage_id Many2one → fsm.stage
    copy=False default=<expr> group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'fsm.stage'
  • territory_ids Many2many → fsm.territory
    string='Territories' args: 'fsm.territory'
Public methods (3)
  • advance_stage(self)
  • create(self, vals)
    @api.model
  • get_person_information(self, vals)
    @api.multi

New fields (4)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • description Char
    string='Description'
  • name Char
    required=True string='Name'
  • partner_id Many2one → res.partner
    string='Region Manager' args: 'res.partner'
Public methods (0)

No public methods.

New fields (4)
  • date Date
    required=True string='Date'
  • name Char
    default=<expr> required=True string='Name'
  • order_ids One2many → fsm.order
    string='Orders' args: 'fsm.order', 'route_id'
  • person_id Many2one → fsm.person
    required=True string='Assigned To' args: 'fsm.person'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (11)
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • custom_color Char
    default='#FFFFFF' args: 'Color Code'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no record in that stage to display.' args: 'Folded in Kanban'
  • is_closed Boolean
    help='Services in this stage are considered as closed.' args: 'Is a close stage'
  • is_default Boolean
    help='Used a default stage' args: 'Is a default stage'
  • legend_priority Text
    help='Explanation text to help users using the star and priority mechanism on stages or orders that are in this stage.' translate=True args: 'Priority Management Explanation'
  • name Char
    required=True string='Name'
  • sequence Integer
    default=1 help='Used to order stages. Lower is better.' args: 'Sequence'
  • stage_type Selection
    args: [('order', 'Order'), ('equipment', 'Equipment'), ('location', 'Location'), ('worker', 'Worker')], 'Type'
  • team_ids Many2many → fsm.team
    default=_default_team_ids string='Teams' args: 'fsm.team', 'order_team_stage_rel', 'stage_id', 'team_id'
Public methods (1)
  • get_color_information(self)
    @api.multi

New fields (4)
  • color Integer
    default=10 args: 'Color Index'
  • full_name Char
    compute='_compute_full_name' string='Name'
  • name Char
    required=True string='Name'
  • parent_id Many2one → fsm.tag
    string='Parent' args: 'fsm.tag'
Public methods (0)

No public methods.

New fields (10)
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • description Text
    translation=True
  • name Char
    required=True translation=True
  • order_count Integer
    compute='_compute_order_count' string='Orders'
  • order_ids One2many → fsm.order
    domain=[('stage_id.is_closed', '=', False)] string='Orders' args: 'fsm.order', 'team_id'
  • order_need_assign_count Integer
    compute='_compute_order_need_assign_count' string='Orders to Assign'
  • order_need_schedule_count Integer
    compute='_compute_order_need_schedule_count' string='Orders to Schedule'
  • sequence Integer
    default=1 help='Used to sort teams. Lower is better.' args: 'Sequence'
  • stage_ids Many2many → fsm.stage
    default=_default_stages string='Stages' args: 'fsm.stage', 'order_team_stage_rel', 'team_id', 'stage_id'
Public methods (0)

No public methods.

New fields (4)
  • category_ids Many2many → fsm.category
    string='Categories' args: 'fsm.category'
  • hours Float
    string='Hours'
  • instructions Text
    string='Instructions'
  • name Char
    required=True string='Name'
Public methods (0)

No public methods.

New fields (12)
  • branch_id Many2one → fsm.branch
    string='Branch' args: 'fsm.branch'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • country_ids One2many → res.country
    string='Country Names' args: 'res.country', 'territory_id'
  • description Char
    string='Description'
  • district_id Many2one
    related='branch_id.district_id' string='District'
  • name Char
    required=True string='Name'
  • person_id Many2one → fsm.person
    string='Primary Assignment' args: 'fsm.person'
  • person_ids Many2many → fsm.person
    string='Field Service Workers' args: 'fsm.person'
  • region_id Many2one
    related='branch_id.district_id.region_id' string='Region'
  • state_ids One2many → res.country.state
    string='State Names' args: 'res.country.state', 'territory_id'
  • type Selection
    args: [('zip', 'Zip'), ('state', 'State'), ('country', 'Country')], 'Type'
  • zip_codes Char
    string='ZIP Codes'
Public methods (0)

No public methods.

New fields (1)
  • fsm_record_type Selection
    args: [('person', 'Worker'), ('location', 'Location')], 'Record Type'
Public methods (3)
  • action_convert(self)
    @api.multi
  • action_convert_location(self, partner)
  • action_convert_person(self, partner)

New fields (16)
  • group_fsm_category Boolean
    implied_group='fieldservice.group_fsm_category' string='Manage Categories'
  • group_fsm_equipment Boolean
    implied_group='fieldservice.group_fsm_equipment' string='Manage Equipment'
  • group_fsm_tag Boolean
    implied_group='fieldservice.group_fsm_tag' string='Manage Tags'
  • group_fsm_team Boolean
    implied_group='fieldservice.group_fsm_team' string='Manage Teams'
  • group_fsm_template Boolean
    implied_group='fieldservice.group_fsm_template' string='Manage Template'
  • module_fieldservice_account Boolean
    string='Invoice your FSM orders'
  • module_fieldservice_agreement Boolean
    string='Manage Agreements'
  • module_fieldservice_distribution Boolean
    string='Manage Distribution'
  • module_fieldservice_maintenance Boolean
    string='Link FSM orders to maintenance requests'
  • module_fieldservice_recurring Boolean
    string='Manage Recurring Orders'
  • module_fieldservice_repair Boolean
    string='Link FSM orders to MRP Repair orders'
  • module_fieldservice_sale Boolean
    string='Sell Field Service Orders'
  • module_fieldservice_skill Boolean
    string='Manage Skills'
  • module_fieldservice_stock Boolean
    string='Use Odoo Logistics'
  • module_fieldservice_substatus Boolean
    string='Manage Sub-Statuses'
  • module_fieldservice_vehicle Boolean
    string='Manage Vehicles'
Public methods (0)

No public methods.

New fields (1)
  • territory_id Many2one → fsm.territory
    string='Territory' args: 'fsm.territory'
Public methods (0)

No public methods.

New fields (1)
  • territory_id Many2one → fsm.territory
    string='Territory' args: 'fsm.territory'
Public methods (0)

No public methods.

New fields (3)
  • fsm_location Boolean
    args: 'Is a FS Location'
  • fsm_person Boolean
    args: 'Is a FS Worker'
  • service_location_id Many2one → fsm.location
    string='Primary Service Location' args: 'fsm.location'
Public methods (0)

No public methods.