Maintenance

maintenance
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYSupply Chain/Maintenance
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Arnold Moyaux, Julien Castiaux, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, JF Aubert, Renaud Thiry, Louis Wicket (wil), Adrien Widart (awt), Victor Piryns (pivi), Djamel Touati, Dylan Kiss (dyki), Nguyễn Đại Dương, Paul Stroobant, nihp-odoo, yagp-odoo, dhha-odoo, gteboul, Pierre Pulinckx, Bastien PIERRE, chha-odoo, Krzysztof Magusiak (krma), Basioni (basm), rare-odoo, srap-odoo, saurabh, chpa-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/maintenance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Track equipment and maintenance requests

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.list maintenance.equipment.category list New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.list maintenance.request list New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.list maintenance.stage list New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.list maintenance.equipment list New
maintenance_request_view_activity maintenance.request.view.activity maintenance.request activity New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.list maintenance.team list New
res_config_settings_view_form res.config.settings.view.form.inherit.maintenance res.config.settings xpath Inherits base.res_config_settings_view_form
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (7)

New fields (16)
  • active Boolean
    default=True
  • assign_date Date
    tracking=True args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' index='btree_not_null' string='Equipment Category' tracking=True args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • cost Float
    args: 'Cost'
  • equipment_properties Properties
    copy=True definition='category_id.equipment_properties_definition' args: 'Properties'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • note Html
    args: 'Note'
  • owner_user_id Many2one → res.users
    index='btree_not_null' string='Owner' tracking=True args: 'res.users'
  • partner_id Many2one → res.partner
    check_company=True string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • warranty_date Date
    args: 'Warranty Expiration Date'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (12)
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment Count'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipment' args: 'maintenance.equipment', 'category_id'
  • equipment_properties_definition PropertiesDefinition
    args: 'Equipment Properties'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' string='Current Maintenance'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Html
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (12)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • effective_date Date
    default=fields.Date.context_today help='This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • estimated_next_failure Date
    compute='_compute_maintenance_request' help='Computed as Latest Failure Date + MTBF' string='Estimated time before next failure (in days)'
  • expected_mtbf Integer
    help='Expected Mean Time Between Failure' string='Expected MTBF'
  • latest_failure_date Date
    compute='_compute_maintenance_request' string='Latest Failure Date'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    check_company=True compute='_compute_maintenance_team_id' index='btree_not_null' readonly=False store=True string='Maintenance Team' args: 'maintenance.team'
  • mtbf Integer
    compute='_compute_maintenance_request' help='Mean Time Between Failure, computed based on done corrective maintenances.' string='MTBF'
  • mttr Integer
    compute='_compute_maintenance_request' help='Mean Time To Repair' string='MTTR'
  • technician_user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
Public methods (0)

No public methods.

New fields (29)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    index='btree_not_null' readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • description Html
    args: 'Description'
  • done Boolean
    related='stage_id.done'
  • duration Float
    compute='_compute_duration' help='Duration in hours.' store=True
  • equipment_id Many2one → maintenance.equipment
    check_company=True index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • instruction_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • instruction_pdf Binary
    args: 'PDF'
  • instruction_text Html
    args: 'Text'
  • instruction_type Selection
    default='text' string='Instruction' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
  • kanban_state Selection
    default='normal' required=True string='Kanban State' tracking=True args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    check_company=True compute='_compute_maintenance_team_id' default=_get_default_team_id index=True readonly=False required=True store=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • recurring_maintenance Boolean
    compute='_compute_recurring_maintenance' readonly=False store=True string='Recurrent'
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    default='week' args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' tracking=True args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • schedule_end Datetime
    compute='_compute_schedule_end' help='Expected completion date and time of the maintenance request.' readonly=False store=True string='Scheduled End'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' tracking=True args: 'maintenance.stage'
  • user_id Many2one → res.users
    compute='_compute_user_id' readonly=False store=True string='Technician' tracking=True args: 'res.users'
Public methods (5)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
  • create(self, vals_list)
    @api.model_create_multi
  • reset_equipment_request(self)
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (14)
  • active Boolean
    default=True
  • alias_id Many2one
    help='Email alias for this maintenance team.'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    domain="[('company_ids', 'in', company_id)]" string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True args: 'Team Name'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

New fields (1)
  • module_maintenance_worksheet Boolean
    string='Custom Maintenance Worksheets'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYManufacturing/Maintenance
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Christophe Simonis, Aaron Bohy, GitHub, Odoo Online, Jorge Pinna Puissant, William Henrotin, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Louis Wicket (wil), Adrien Widart (awt), Pierre-Yves Dufays, clesgow, Djamel Touati, Dylan Kiss (dyki), Nguyễn Đại Dương, Noe Antoine, omra-odoo, Paul Stroobant, Maryam Kia, aath-odoo, Louis (wil), dhha-odoo, gteboul, Pierre Pulinckx (PIPU), Pierre Pulinckx (pipu), Bastien PIERRE, kusi-odoo, Krzysztof Magusiak (krma), bsra-odoo, rare-odoo, saurabh
WEBSITE
WEBSITEhttps://www.odoo.com/app/maintenance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Track equipment and maintenance requests

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.list maintenance.equipment.category list New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.list maintenance.request list New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.list maintenance.stage list New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.list maintenance.equipment list New
maintenance_request_view_activity maintenance.request.view.activity maintenance.request activity New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.list maintenance.team list New
res_config_settings_view_form res.config.settings.view.form.inherit.maintenance res.config.settings xpath Inherits base.res_config_settings_view_form
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (7)

New fields (18)
  • active Boolean
    default=True
  • assign_date Date
    tracking=True args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' tracking=True args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • cost Float
    args: 'Cost'
  • equipment_properties Properties
    copy=True definition='category_id.equipment_properties_definition' args: 'Properties'
  • location Char
    args: 'Location'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • match_serial Boolean
    compute='_compute_match_serial'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • note Html
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' tracking=True args: 'res.users'
  • partner_id Many2one → res.partner
    check_company=True string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • warranty_date Date
    args: 'Warranty Expiration Date'
Public methods (3)
  • action_open_matched_serial(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (13)
  • alias_id Many2one
    help='Email alias for this equipment category. New emails will automatically create a new equipment under this category.'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment Count'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipment' args: 'maintenance.equipment', 'category_id'
  • equipment_properties_definition PropertiesDefinition
    args: 'Equipment Properties'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' string='Current Maintenance'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Html
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (12)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • effective_date Date
    default=fields.Date.context_today help='This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • estimated_next_failure Date
    compute='_compute_maintenance_request' help='Computed as Latest Failure Date + MTBF' string='Estimated time before next failure (in days)'
  • expected_mtbf Integer
    help='Expected Mean Time Between Failure' string='Expected MTBF'
  • latest_failure_date Date
    compute='_compute_maintenance_request' string='Latest Failure Date'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    check_company=True compute='_compute_maintenance_team_id' readonly=False store=True string='Maintenance Team' args: 'maintenance.team'
  • mtbf Integer
    compute='_compute_maintenance_request' help='Mean Time Between Failure, computed based on done corrective maintenances.' string='MTBF'
  • mttr Integer
    compute='_compute_maintenance_request' help='Mean Time To Repair' string='MTTR'
  • technician_user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
Public methods (0)

No public methods.

New fields (28)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • description Html
    args: 'Description'
  • done Boolean
    related='stage_id.done'
  • duration Float
    help='Duration in hours.'
  • equipment_id Many2one → maintenance.equipment
    check_company=True index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • instruction_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • instruction_pdf Binary
    args: 'PDF'
  • instruction_text Html
    args: 'Text'
  • instruction_type Selection
    default='text' string='Instruction' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
  • kanban_state Selection
    default='normal' required=True string='Kanban State' tracking=True args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    check_company=True compute='_compute_maintenance_team_id' default=_get_default_team_id readonly=False required=True store=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • recurring_maintenance Boolean
    compute='_compute_recurring_maintenance' readonly=False store=True string='Recurrent'
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    default='week' args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' tracking=True args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' tracking=True args: 'maintenance.stage'
  • user_id Many2one → res.users
    compute='_compute_user_id' readonly=False store=True string='Technician' tracking=True args: 'res.users'
Public methods (5)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
  • create(self, vals_list)
    @api.model_create_multi
  • reset_equipment_request(self)
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    domain="[('company_ids', 'in', company_id)]" string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True args: 'Team Name'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

New fields (1)
  • module_maintenance_worksheet Boolean
    string='Custom Maintenance Worksheets'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYManufacturing/Maintenance
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Aaron Bohy, GitHub, Damien Bouvy, Odoo Online, Adrien Dieudonne, Jorge Pinna Puissant, Arnold Moyaux, William Henrotin, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, JF Aubert, niyasraphy, Thomas Lefebvre (thle), Louis Wicket (wil), Mahamadasif Ansari, Pierre-Yves Dufays, clesgow, Djamel Touati, Dylan Kiss (dyki), Bruno Boi, Brieuc-brd, Nguyễn Đại Dương, Paul Stroobant, aath-odoo, Louis (wil), dhha-odoo, gteboul, bsra-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/maintenance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Track equipment and maintenance requests

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_request_view_activity maintenance.request.view.activity maintenance.request activity New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
res_config_settings_view_form res.config.settings.view.form.inherit.maintenance res.config.settings xpath Inherits base.res_config_settings_view_form
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (7)

New fields (16)
  • active Boolean
    default=True
  • assign_date Date
    tracking=True args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' tracking=True args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • cost Float
    args: 'Cost'
  • location Char
    args: 'Location'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • note Html
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' tracking=True args: 'res.users'
  • partner_id Many2one → res.partner
    check_company=True string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • warranty_date Date
    args: 'Warranty Expiration Date'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (12)
  • alias_id Many2one
    help='Email alias for this equipment category. New emails will automatically create a new equipment under this category.'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment Count'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipment' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' string='Current Maintenance'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Html
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (12)
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • effective_date Date
    default=fields.Date.context_today help='This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • estimated_next_failure Date
    compute='_compute_maintenance_request' help='Computed as Latest Failure Date + MTBF' string='Estimated time before next failure (in days)'
  • expected_mtbf Integer
    help='Expected Mean Time Between Failure' string='Expected MTBF'
  • latest_failure_date Date
    compute='_compute_maintenance_request' string='Latest Failure Date'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    check_company=True compute='_compute_maintenance_team_id' readonly=False store=True string='Maintenance Team' args: 'maintenance.team'
  • mtbf Integer
    compute='_compute_maintenance_request' help='Mean Time Between Failure, computed based on done corrective maintenances.' string='MTBF'
  • mttr Integer
    compute='_compute_maintenance_request' help='Mean Time To Repair' string='MTTR'
  • technician_user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
Public methods (0)

No public methods.

New fields (28)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • description Html
    args: 'Description'
  • done Boolean
    related='stage_id.done'
  • duration Float
    help='Duration in hours.'
  • equipment_id Many2one → maintenance.equipment
    check_company=True index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • instruction_google_slide Char
    help='Paste the url of your Google Slide. Make sure the access to the document is public.' args: 'Google Slide'
  • instruction_pdf Binary
    args: 'PDF'
  • instruction_text Html
    args: 'Text'
  • instruction_type Selection
    default='text' string='Instruction' args: [('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')]
  • kanban_state Selection
    default='normal' required=True string='Kanban State' tracking=True args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    check_company=True compute='_compute_maintenance_team_id' default=_get_default_team_id readonly=False required=True store=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • recurring_maintenance Boolean
    compute='_compute_recurring_maintenance' readonly=False store=True string='Recurrent'
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    default='week' args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' tracking=True args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' tracking=True args: 'maintenance.stage'
  • user_id Many2one → res.users
    compute='_compute_user_id' readonly=False store=True string='Technician' tracking=True args: 'res.users'
Public methods (5)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
  • create(self, vals_list)
    @api.model_create_multi
  • reset_equipment_request(self)
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    domain="[('company_ids', 'in', company_id)]" string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True args: 'Team Name'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

New fields (1)
  • module_maintenance_worksheet Boolean
    string='Custom Maintenance Worksheets'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYManufacturing/Maintenance
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Aaron Bohy, Damien Bouvy, Yannick Tivisse, Arnold Moyaux, Romeo Fragomeli, Victor Feyens, William Henrotin, Alvaro Fuentes, Pierre Paridans, tranngocson1996, Louis Wicket (wil), Mahamadasif Ansari, Sébastien Geelen (sge), Bruno Boi, Brieuc-brd, Martin Trigaux (mat), aath-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/maintenance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:51
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        Track equipments and maintenance requests

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (5)

New fields (25)
  • active Boolean
    default=True
  • assign_date Date
    tracking=True args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' tracking=True args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • cost Float
    args: 'Cost'
  • effective_date Date
    default=fields.Date.context_today help='Date at which the equipment became effective. This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • location Char
    args: 'Location'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_duration Float
    help='Maintenance Duration in hours.'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    check_company=True ondelete='restrict' string='Maintenance Team' args: 'maintenance.team'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • next_action_date Date
    compute='_compute_next_maintenance' store=True string='Date of the next preventive maintenance'
  • note Html
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' tracking=True args: 'res.users'
  • partner_id Many2one → res.partner
    check_company=True string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • period Integer
    args: 'Days between each preventive maintenance'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • technician_user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
  • warranty_date Date
    args: 'Warranty Expiration Date'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
  • write(self, vals)

New fields (11)
  • alias_id Many2one → mail.alias
    help='Email alias for this equipment category. New emails will automatically create a new equipment under this category.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipments' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Html
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (19)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • description Html
    args: 'Description'
  • done Boolean
    related='stage_id.done'
  • duration Float
    help='Duration in hours.'
  • equipment_id Many2one → maintenance.equipment
    check_company=True index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • kanban_state Selection
    default='normal' required=True string='Kanban State' tracking=True args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    check_company=True default=_get_default_team_id required=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' tracking=True args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' tracking=True args: 'maintenance.stage'
  • user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
Public methods (7)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_category_id(self)
    @api.onchange('category_id')
  • onchange_equipment_id(self)
    @api.onchange('equipment_id')
  • reset_equipment_request(self)
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    domain="[('company_ids', 'in', company_id)]" string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True args: 'Team Name'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYManufacturing/Maintenance
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, Xavier Morel, Xavier-Do, Enric Tobella, Julien Mougenot, Alvaro Fuentes, tranngocson1996, Michael Mattiello (mcm), dht-odoo, Mahamadasif Ansari, Sébastien Geelen (sge), Cao Đình Trung
WEBSITE
WEBSITEhttps://www.odoo.com/app/maintenance
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        Track equipments and maintenance requests

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (5)

New fields (25)
  • active Boolean
    default=True
  • assign_date Date
    tracking=True args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' tracking=True args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • cost Float
    args: 'Cost'
  • effective_date Date
    default=fields.Date.context_today help='Date at which the equipment became effective. This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • location Char
    args: 'Location'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_duration Float
    help='Maintenance Duration in hours.'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    check_company=True ondelete='restrict' string='Maintenance Team' args: 'maintenance.team'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • next_action_date Date
    compute='_compute_next_maintenance' store=True string='Date of the next preventive maintenance'
  • note Html
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' tracking=True args: 'res.users'
  • partner_id Many2one → res.partner
    check_company=True string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • period Integer
    args: 'Days between each preventive maintenance'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • technician_user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
  • warranty_date Date
    args: 'Warranty Expiration Date'
Public methods (3)
  • create(self, vals)
    @api.model
  • name_get(self)
  • write(self, vals)

New fields (11)
  • alias_id Many2one → mail.alias
    help='Email alias for this equipment category. New emails will automatically create a new equipment under this category.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipments' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Html
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (0)

No public methods.

New fields (19)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • description Html
    args: 'Description'
  • done Boolean
    related='stage_id.done'
  • duration Float
    help='Duration in hours.'
  • equipment_id Many2one → maintenance.equipment
    check_company=True index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • kanban_state Selection
    default='normal' required=True string='Kanban State' tracking=True args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    check_company=True default=_get_default_team_id required=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' tracking=True args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' tracking=True args: 'maintenance.stage'
  • user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
Public methods (7)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
  • create(self, vals)
    @api.model
  • onchange_category_id(self)
    @api.onchange('category_id')
  • onchange_equipment_id(self)
    @api.onchange('equipment_id')
  • reset_equipment_request(self)
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    domain="[('company_ids', 'in', company_id)]" string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True args: 'Team Name'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYManufacturing/Maintenance
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Mohammed Shekha, Nicolas Martinelli, Aaron Bohy, Barad Mahendra, Yannick Tivisse, Julien Castiaux, Xavier-Do, Victor Feyens, Enric Tobella, Sébastien Theys, fw-bot, svs-odoo, Alvaro Fuentes, Mathieu Duckerts-Antoine, David Alonso, Kevin Baptiste, tranngocson1996, Mahamadasif Ansari, Cao Đình Trung
WEBSITE
WEBSITEhttps://www.odoo.com/page/tpm-maintenance-software
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        Track equipments and maintenance requests

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
assets_backend maintenance assets ir.ui.view qweb Inherits web.assets_backend
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (5)

New fields (25)
  • active Boolean
    default=True
  • assign_date Date
    tracking=True args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' tracking=True args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • cost Float
    args: 'Cost'
  • effective_date Date
    default=fields.Date.context_today help='Date at which the equipment became effective. This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • location Char
    args: 'Location'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_duration Float
    help='Maintenance Duration in hours.'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    check_company=True ondelete='restrict' string='Maintenance Team' args: 'maintenance.team'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • next_action_date Date
    compute='_compute_next_maintenance' store=True string='Date of the next preventive maintenance'
  • note Text
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' tracking=True args: 'res.users'
  • partner_id Many2one → res.partner
    check_company=True string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • period Integer
    args: 'Days between each preventive maintenance'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • technician_user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
  • warranty_date Date
    args: 'Warranty Expiration Date'
Public methods (3)
  • create(self, vals)
    @api.model
  • name_get(self)
  • write(self, vals)

New fields (11)
  • alias_id Many2one → mail.alias
    help='Email alias for this equipment category. New emails will automatically create a new equipment under this category.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipments' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Text
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (1)
  • unlink(self)

New fields (19)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • description Text
    args: 'Description'
  • done Boolean
    related='stage_id.done'
  • duration Float
    help='Duration in hours.'
  • equipment_id Many2one → maintenance.equipment
    check_company=True index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • kanban_state Selection
    default='normal' required=True string='Kanban State' tracking=True args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    check_company=True default=_get_default_team_id required=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' tracking=True args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' tracking=True args: 'maintenance.stage'
  • user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
Public methods (7)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
  • create(self, vals)
    @api.model
  • onchange_category_id(self)
    @api.onchange('category_id')
  • onchange_equipment_id(self)
    @api.onchange('equipment_id')
  • reset_equipment_request(self)
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    domain="[('company_ids', 'in', company_id)]" string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True args: 'Team Name'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYOperations/Maintenance
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, Simon Lejeune, Nicolas Martinelli, Damien Bouvy, Yannick Tivisse, Martin Geubelle, Odoo Online, Jigar Patel, Adrien Dieudonne, RomainLibert, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, Arnold Moyaux, Adrian Torres, Xavier-Do, Sébastien Theys, fw-bot, svs-odoo, Alvaro Fuentes, David Alonso, Kevin Baptiste
WEBSITE
WEBSITEhttps://www.odoo.com/page/tpm-maintenance-software
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        Track equipments and maintenance requests

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
assets_backend maintenance assets ir.ui.view qweb Inherits web.assets_backend
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (5)

New fields (25)
  • active Boolean
    default=True
  • assign_date Date
    tracking=True args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' tracking=True args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • cost Float
    args: 'Cost'
  • effective_date Date
    default=fields.Date.context_today help='Date at which the equipment became effective. This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • location Char
    args: 'Location'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_duration Float
    help='Maintenance Duration in hours.'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    check_company=True string='Maintenance Team' args: 'maintenance.team'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • next_action_date Date
    compute='_compute_next_maintenance' store=True string='Date of the next preventive maintenance'
  • note Text
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' tracking=True args: 'res.users'
  • partner_id Many2one → res.partner
    check_company=True string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • period Integer
    args: 'Days between each preventive maintenance'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • technician_user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
  • warranty_date Date
    args: 'Warranty Expiration Date'
Public methods (3)
  • create(self, vals)
    @api.model
  • name_get(self)
  • write(self, vals)

New fields (11)
  • alias_id Many2one → mail.alias
    help='Email alias for this equipment category. New emails will automatically create a new equipment under this category.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipments' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Text
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (4)
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • unlink(self)

New fields (19)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • description Text
    args: 'Description'
  • done Boolean
    related='stage_id.done'
  • duration Float
    help='Duration in hours.'
  • equipment_id Many2one → maintenance.equipment
    check_company=True index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • kanban_state Selection
    default='normal' required=True string='Kanban State' tracking=True args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    check_company=True default=_get_default_team_id required=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' tracking=True args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' tracking=True args: 'maintenance.stage'
  • user_id Many2one → res.users
    string='Technician' tracking=True args: 'res.users'
Public methods (7)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
  • create(self, vals)
    @api.model
  • onchange_category_id(self)
    @api.onchange('category_id')
  • onchange_equipment_id(self)
    @api.onchange('equipment_id')
  • reset_equipment_request(self)
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    domain="[('company_ids', 'in', company_id)]" string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True args: 'Team Name'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Martin Geubelle, Pierre Masereel, Arnold Moyaux, Priyanka Kakadiya, Xavier-Do, Andrea Grazioso (agr-odoo), Kinjal Mehta, snd, Yennifer Santiago, David Alonso
WEBSITE
WEBSITEhttps://www.odoo.com/page/tpm-maintenance-software
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        Track equipments and maintenance requests

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
assets_backend maintenance assets ir.ui.view qweb Inherits web.assets_backend
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_search maintenance.team.search maintenance.team search New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (5)

New fields (25)
  • active Boolean
    default=True
  • assign_date Date
    track_visibility='onchange' args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' track_visibility='onchange' args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • cost Float
    args: 'Cost'
  • effective_date Date
    default=fields.Date.context_today help='Date at which the equipment became effective. This date will be used to compute the Mean Time Between Failure.' required=True args: 'Effective Date'
  • location Char
    args: 'Location'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance Count'
  • maintenance_duration Float
    help='Maintenance Duration in hours.'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    string='Maintenance Team' args: 'maintenance.team'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • next_action_date Date
    compute='_compute_next_maintenance' store=True string='Date of the next preventive maintenance'
  • note Text
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' track_visibility='onchange' args: 'res.users'
  • partner_id Many2one → res.partner
    domain="[('supplier', '=', 1)]" string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • period Integer
    args: 'Days between each preventive maintenance'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • technician_user_id Many2one → res.users
    oldname='user_id' string='Technician' track_visibility='onchange' args: 'res.users'
  • warranty_date Date
    oldname='warranty' args: 'Warranty Expiration Date'
Public methods (3)
  • create(self, vals)
    @api.model
  • name_get(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (11)
  • alias_id Many2one → mail.alias
    help='Email alias for this equipment category. New emails will automatically create a new equipment under this category.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipments' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance Count'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Text
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> oldname='user_id' track_visibility='onchange' args: 'res.users', 'Responsible'
Public methods (4)
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • unlink(self)
    @api.multi

New fields (18)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • description Text
    args: 'Description'
  • duration Float
    help='Duration in hours and minutes.'
  • equipment_id Many2one → maintenance.equipment
    index=True ondelete='restrict' string='Equipment' args: 'maintenance.equipment'
  • kanban_state Selection
    default='normal' required=True string='Kanban State' track_visibility='onchange' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    default=_get_default_team_id required=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by User' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' track_visibility='onchange' args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    copy=False default=_default_stage group_expand='_read_group_stage_ids' ondelete='restrict' string='Stage' track_visibility='onchange' args: 'maintenance.stage'
  • user_id Many2one → res.users
    oldname='technician_user_id' string='Technician' track_visibility='onchange' args: 'res.users'
Public methods (7)
  • activity_update(self)
    Update maintenance activities based on current record set state. It reschedule, unlink or create maintenance request activities.
  • archive_equipment_request(self)
    @api.multi
  • create(self, vals)
    @api.model
  • onchange_category_id(self)
    @api.onchange('category_id')
  • onchange_equipment_id(self)
    @api.onchange('equipment_id')
  • reset_equipment_request(self)
    @api.multi
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)
    @api.multi

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (13)
  • active Boolean
    default=True
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Simon Lejeune, xmo-odoo, Aaron Bohy, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Pierre Masereel, DVE, Adrien Dieudonne
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        Track equipment and manage maintenance requests.

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
assets_backend maintenance assets ir.ui.view qweb Inherits web.assets_backend
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_kanban equipment.stage.kanban maintenance.stage kanban New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
view_maintenance_equipment_category_kanban maintenance.equipment.category.kanban maintenance.equipment.category kanban New
Models touched (5)

New fields (23)
  • active Boolean
    default=True
  • assign_date Date
    track_visibility='onchange' args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' track_visibility='onchange' args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • cost Float
    args: 'Cost'
  • location Char
    args: 'Location'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance'
  • maintenance_duration Float
    help='Maintenance Duration in hours.'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    string='Maintenance Team' args: 'maintenance.team'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • next_action_date Date
    compute='_compute_next_maintenance' store=True string='Date of the next preventive maintenance'
  • note Text
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' track_visibility='onchange' args: 'res.users'
  • partner_id Many2one → res.partner
    domain="[('supplier', '=', 1)]" string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • period Integer
    args: 'Days between each preventive maintenance'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • technician_user_id Many2one → res.users
    oldname='user_id' string='Technician' track_visibility='onchange' args: 'res.users'
  • warranty Date
    args: 'Warranty'
Public methods (4)
  • create(self, vals)
    @api.model
  • name_get(self)
    @api.multi
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • write(self, vals)
    @api.multi

New fields (10)
  • alias_id Many2one → mail.alias
    help='Email alias for this equipment category. New emails will automatically create new maintenance request for this equipment category.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • color Integer
    args: 'Color Index'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipments' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Text
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> oldname='user_id' track_visibility='onchange' args: 'res.users', 'Responsible'
Public methods (4)
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • unlink(self)
    @api.multi

New fields (17)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • description Text
    args: 'Description'
  • duration Float
    help='Duration in minutes and seconds.'
  • equipment_id Many2one → maintenance.equipment
    index=True string='Equipment' args: 'maintenance.equipment'
  • kanban_state Selection
    default='normal' required=True string='Kanban State' track_visibility='onchange' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    default=_get_default_team_id required=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' track_visibility='onchange' args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    default=_default_stage group_expand='_read_group_stage_ids' string='Stage' track_visibility='onchange' args: 'maintenance.stage'
  • technician_user_id Many2one → res.users
    oldname='user_id' string='Owner' track_visibility='onchange' args: 'res.users'
Public methods (6)
  • archive_equipment_request(self)
    @api.multi
  • create(self, vals)
    @api.model
  • onchange_category_id(self)
    @api.onchange('category_id')
  • onchange_equipment_id(self)
    @api.onchange('equipment_id')
  • reset_equipment_request(self)
    @api.multi
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)
    @api.multi

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (11)
  • color Integer
    default=0 args: 'Color Index'
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • member_ids Many2many → res.users
    string='Team Members' args: 'res.users', 'maintenance_team_users_rel'
  • name Char
    required=True translate=True
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests' string='Number of Requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests' string='Number of Requests Blocked'
  • todo_request_count_date Integer
    compute='_compute_todo_requests' string='Number of Requests Scheduled'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests' string='Number of Requests in High Priority'
  • todo_request_count_unscheduled Integer
    compute='_compute_todo_requests' string='Number of Requests Unscheduled'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False string='Requests' args: 'maintenance.request'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/maintenance
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Josse Colpaert, Christophe Simonis, Nicolas Martinelli, qsm-odoo, Pierre Masereel, Adrian Torres
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
        Track equipment and manage maintenance requests.

Code Analysis

Views touched (20)
XML IDNameModelTypeStatus
assets_backend maintenance assets ir.ui.view qweb Inherits web.assets_backend
hr_equipment_category_view_form equipment.category.form maintenance.equipment.category form New
hr_equipment_category_view_search equipment.category.search maintenance.equipment.category search New
hr_equipment_category_view_tree equipment.category.tree maintenance.equipment.category tree New
hr_equipment_request_view_form equipment.request.form maintenance.request form New
hr_equipment_request_view_graph equipment.request.graph maintenance.request graph New
hr_equipment_request_view_kanban equipment.request.kanban maintenance.request kanban New
hr_equipment_request_view_pivot equipment.request.pivot maintenance.request pivot New
hr_equipment_request_view_search equipment.request.search maintenance.request search New
hr_equipment_request_view_tree equipment.request.tree maintenance.request tree New
hr_equipment_stage_view_search equipment.stage.search maintenance.stage search New
hr_equipment_stage_view_tree equipment.stage.tree maintenance.stage tree New
hr_equipment_view_calendar equipment.request.calendar maintenance.request calendar New
hr_equipment_view_form equipment.form maintenance.equipment form New
hr_equipment_view_kanban equipment.kanban maintenance.equipment kanban New
hr_equipment_view_search equipment.search maintenance.equipment search New
hr_equipment_view_tree equipment.tree maintenance.equipment tree New
maintenance_team_kanban maintenance.team.kanban maintenance.team kanban New
maintenance_team_view_form maintenance.team.form maintenance.team form New
maintenance_team_view_tree maintenance.team.tree maintenance.team tree New
Models touched (5)

New fields (23)
  • active Boolean
    default=True
  • assign_date Date
    track_visibility='onchange' args: 'Assigned Date'
  • category_id Many2one → maintenance.equipment.category
    group_expand='_read_group_category_ids' string='Equipment Category' track_visibility='onchange' args: 'maintenance.equipment.category'
  • color Integer
    args: 'Color Index'
  • cost Float
    args: 'Cost'
  • location Char
    args: 'Location'
  • maintenance_count Integer
    compute='_compute_maintenance_count' store=True string='Maintenance'
  • maintenance_duration Float
    help='Maintenance Duration in minutes and seconds.'
  • maintenance_ids One2many → maintenance.request
    args: 'maintenance.request', 'equipment_id'
  • maintenance_open_count Integer
    compute='_compute_maintenance_count' store=True string='Current Maintenance'
  • maintenance_team_id Many2one → maintenance.team
    string='Maintenance Team' args: 'maintenance.team'
  • model Char
    args: 'Model'
  • name Char
    required=True translate=True args: 'Equipment Name'
  • next_action_date Date
    compute='_compute_next_maintenance' store=True string='Date of the next preventive maintenance'
  • note Text
    args: 'Note'
  • owner_user_id Many2one → res.users
    string='Owner' track_visibility='onchange' args: 'res.users'
  • partner_id Many2one → res.partner
    domain="[('supplier', '=', 1)]" string='Vendor' args: 'res.partner'
  • partner_ref Char
    args: 'Vendor Reference'
  • period Integer
    args: 'Days between each preventive maintenance'
  • scrap_date Date
    args: 'Scrap Date'
  • serial_no Char
    copy=False args: 'Serial Number'
  • technician_user_id Many2one → res.users
    oldname='user_id' string='Technician' track_visibility='onchange' args: 'res.users'
  • warranty Date
    args: 'Warranty'
Public methods (4)
  • create(self, vals)
    @api.model
  • name_get(self)
    @api.multi
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • write(self, vals)
    @api.multi

New fields (10)
  • alias_id Many2one → mail.alias
    help='Email alias for this equipment category. New emails will automatically create new maintenance request for this equipment category.' ondelete='cascade' required=True args: 'mail.alias', 'Alias'
  • color Integer
    args: 'Color Index'
  • equipment_count Integer
    compute='_compute_equipment_count' string='Equipment'
  • equipment_ids One2many → maintenance.equipment
    copy=False string='Equipments' args: 'maintenance.equipment', 'category_id'
  • fold Boolean
    compute='_compute_fold' store=True string='Folded in Maintenance Pipe'
  • maintenance_count Integer
    compute='_compute_maintenance_count' string='Maintenance'
  • maintenance_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'category_id'
  • name Char
    required=True translate=True args: 'Category Name'
  • note Text
    translate=True args: 'Comments'
  • technician_user_id Many2one → res.users
    default=<expr> oldname='user_id' track_visibility='onchange' args: 'res.users', 'Responsible'
Public methods (4)
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • unlink(self)
    @api.multi

New fields (17)
  • archive Boolean
    default=False help='Set archive to true to hide the maintenance request without deleting it.'
  • category_id Many2one → maintenance.equipment.category
    readonly=True related='equipment_id.category_id' store=True string='Category' args: 'maintenance.equipment.category'
  • close_date Date
    help='Date the maintenance was finished. ' args: 'Close Date'
  • color Integer
    args: 'Color Index'
  • description Text
    args: 'Description'
  • duration Float
    help='Duration in minutes and seconds.'
  • equipment_id Many2one → maintenance.equipment
    index=True string='Equipment' args: 'maintenance.equipment'
  • kanban_state Selection
    default='normal' required=True string='Kanban State' track_visibility='onchange' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • maintenance_team_id Many2one → maintenance.team
    default=_get_default_team_id required=True string='Team' args: 'maintenance.team'
  • maintenance_type Selection
    default='corrective' string='Maintenance Type' args: [('corrective', 'Corrective'), ('preventive', 'Preventive')]
  • name Char
    required=True args: 'Subjects'
  • owner_user_id Many2one → res.users
    default=<expr> string='Created by' args: 'res.users'
  • priority Selection
    string='Priority' args: [('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')]
  • request_date Date
    default=fields.Date.context_today help='Date requested for the maintenance to happen' track_visibility='onchange' args: 'Request Date'
  • schedule_date Datetime
    help='Date the maintenance team plans the maintenance. It should not differ much from the Request Date. ' args: 'Scheduled Date'
  • stage_id Many2one → maintenance.stage
    default=_default_stage group_expand='_read_group_stage_ids' string='Stage' track_visibility='onchange' args: 'maintenance.stage'
  • technician_user_id Many2one → res.users
    oldname='user_id' string='Owner' track_visibility='onchange' args: 'res.users'
Public methods (6)
  • archive_equipment_request(self)
    @api.multi
  • create(self, vals)
    @api.model
  • onchange_category_id(self)
    @api.onchange('category_id')
  • onchange_equipment_id(self)
    @api.onchange('equipment_id')
  • reset_equipment_request(self)
    @api.multi
    Reinsert the maintenance request into the maintenance pipe in the first stage
  • write(self, vals)
    @api.multi

New fields (4)
  • done Boolean
    args: 'Request Done'
  • fold Boolean
    args: 'Folded in Maintenance Pipe'
  • name Char
    required=True translate=True args: 'Name'
  • sequence Integer
    default=20 args: 'Sequence'
Public methods (0)

No public methods.

New fields (10)
  • color Integer
    default=0
  • equipment_ids One2many → maintenance.equipment
    copy=False args: 'maintenance.equipment', 'maintenance_team_id'
  • name Char
    required=True
  • partner_id Many2one → res.partner
    string='Subcontracting Partner' args: 'res.partner'
  • request_ids One2many → maintenance.request
    copy=False args: 'maintenance.request', 'maintenance_team_id'
  • todo_request_count Integer
    compute='_compute_todo_requests'
  • todo_request_count_block Integer
    compute='_compute_todo_requests'
  • todo_request_count_date Integer
    compute='_compute_todo_requests'
  • todo_request_count_high_priority Integer
    compute='_compute_todo_requests'
  • todo_request_ids One2many → maintenance.request
    compute='_compute_todo_requests' copy=False args: 'maintenance.request'
Public methods (0)

No public methods.