| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/19.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Supply Chain/Inventory |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo S.A. |
| MAINTAINERS | |
| MAINTAINERS | Odoo S.A. |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Thibault Delavallée, Christophe Simonis, Xavier Morel, GitHub, Arnold Moyaux, Julien Castiaux, Victor Feyens, William Henrotin, svs-odoo, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, JF Aubert, Renaud Thiry, Iván Todorovich, François Honoré, Louis Wicket (wil), Adrien Widart (awt), Victor Piryns (pivi), clesgow, Djamel Touati, Pieter Claeys (clpi), Dylan Kiss (dyki), Anita (anko), lase@odoo.com, Quentin Wolfs, reka-odoo, kcv-odoo, Louis Gobert, nihp-odoo, Agustin Castro Bugallo, manv-afk, yagp-odoo, Mohammad Abdulmoneim, Mathias Mathy (MAMA), pkgu-odoo, Mohammad Abdulmoneim (abdu), djameltouati, Shrey Mehta, plha-odoo, Krzysztof Magusiak (krma), Robin Engels (roen), pajo, kinhosz, Elijah Tay (elct), Lulu Grimalkin (lugr), adip-odoo, srap-odoo, saurabh, sako-odoo, chpa-odoo, Youssef |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 01:51:44 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - sale_stock - sale - sales_team - base - base_setup - web - bus - web_tour - html_editor - account_payment - account - onboarding - product - uom - analytic - portal - http_routing - auth_signup - digest - resource - payment - utm - stock_account - stock - barcodes_gs1_nomenclature - barcodes - sale_management |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_view_search_catalog |
product.view.search.catalog.inherit.repair | product.product | xpath | Inherits product.product_view_search_catalog |
repair_order_view_activity |
repair.order.view.activity | repair.order | activity | New |
repair_view_picking_form |
stock.picking.form.inherit.repair | stock.picking | xpath | Inherits stock.view_picking_form |
repair_view_picking_type_form |
stock.picking.type.inherit.repair | stock.picking.type | xpath | Inherits stock.view_picking_type_form |
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_production_lot_view_form |
stock.production.lot.view.form | stock.lot | xpath | Inherits stock.view_production_lot_form |
stock_repair_type_kanban |
stock.picking.type.kanban | stock.picking.type | xpath | Inherits stock.stock_picking_type_kanban |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_product_template_form_inherit_repair |
product.template.form.inherit.repair | product.template | field | Inherits sale.product_template_form_view |
view_repair_graph |
repair.graph | repair.order | graph | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.list | repair.order | list | New |
view_repair_pivot |
repair.pivot | repair.order | pivot | New |
view_repair_tag_search |
repair.tag.search | repair.tags | search | New |
view_repair_tag_tree |
repair.tag.list | repair.tags | list | New |
view_sale_order_form_inherit_repair |
sale.order.form.inherit.repair | sale.order | button | Inherits sale.view_order_form |
view_warehouse_inherit_repair |
Stock Warehouse Inherit Repair | stock.warehouse | xpath | Inherits stock.view_warehouse |
No new fields.
Public methods (0)No public methods.
product_catalog_product_is_in_repair
Boolean
compute='_compute_product_is_in_repair'
search='_search_product_is_in_repair'
No public methods.
service_tracking
Selection
ondelete={'repair': 'set default'}
selection_add=[('repair', 'Repair Order')]
No public methods.
allowed_lot_ids
One2many → stock.lot
compute='_compute_allowed_lot_ids'
args: 'stock.lot'
allowed_uom_ids
Many2many → uom.uom
compute='_compute_allowed_uom_ids'
args: 'uom.uom'
company_id
Many2one → res.company
default=<expr>
index=True
readonly=True
required=True
args: 'res.company', 'Company'
has_uncomplete_moves
Boolean
compute='_compute_has_uncomplete_moves'
internal_notes
Html
is_parts_available
Boolean
compute='_compute_availability_boolean'
default=False
store=True
args: 'All Parts are available'
is_parts_late
Boolean
compute='_compute_availability_boolean'
default=False
store=True
args: 'Any Part is late'
location_dest_id
Many2one → stock.location
check_company=True
depends=['picking_type_id']
help='This is the location where the repaired product is located.'
index=True
precompute=True
readonly=True
related='picking_type_id.default_location_dest_id'
required=True
store=True
args: 'stock.location', 'Added Parts Destination Location'
location_id
Many2one → stock.location
check_company=True
compute='_compute_location_id'
help='This is the location where the components of product to repair is located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Component Source Location'
lot_id
Many2one → stock.lot
check_company=True
compute='compute_lot_id'
domain="[('id', 'in', allowed_lot_ids)]"
help='Products repaired are all belonging to this lot'
store=True
args: 'stock.lot', 'Lot/Serial'
move_id
Many2one → stock.move
check_company=True
copy=False
readonly=True
tracking=True
args: 'stock.move', 'Inventory Move'
move_ids
One2many → stock.move
check_company=True
copy=True
domain=[('repair_line_type', '!=', False)]
args: 'stock.move', 'repair_id', 'Parts'
name
Char
copy=False
default=<expr>
index='trigram'
readonly=True
required=True
args: 'Repair Reference'
partner_id
Many2one → res.partner
change_default=True
check_company=True
compute='_compute_partner_id'
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
readonly=False
store=True
args: 'res.partner', 'Customer'
parts_availability
Char
compute='_compute_parts_availability'
help="Latest parts availability status for this RO. If green, then the RO's readiness status is ready."
string='Component Status'
parts_availability_state
Selection
compute='_compute_parts_availability'
args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
parts_location_id
Many2one → stock.location
check_company=True
depends=['picking_type_id']
help='This is the location where the repair parts are located.'
index=True
precompute=True
readonly=True
related='picking_type_id.default_remove_location_dest_id'
required=True
store=True
args: 'stock.location', 'Removed Parts Destination Location'
picking_id
Many2one → stock.picking
check_company=True
copy=False
domain="[('return_id', '!=', False), ('product_id', '=?', product_id)]"
help='Transfer from which the product to be repaired is picked'
index='btree_not_null'
args: 'stock.picking', 'Transfer'
picking_product_id
Many2one
related='picking_id.product_id'
picking_product_ids
One2many → product.product
compute='_compute_picking_product_ids'
args: 'product.product'
picking_type_id
Many2one → stock.picking.type
check_company=True
compute='_compute_picking_type_id'
copy=True
default=_default_picking_type_id
domain="[('code', '=', 'repair_operation'), ('company_id', '=', company_id)]"
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.picking.type', 'Operation Type'
picking_type_visible
Boolean
compute='_compute_picking_type_visible'
priority
Selection
default='0'
string='Priority'
args: [('0', 'Normal'), ('1', 'Urgent')]
product_id
Many2one → product.product
check_company=True
domain="[('type', '=', 'consu'), '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('id', 'in', picking_product_ids), ('id', '=?', picking_product_id)]"
string='Product to Repair'
args: 'product.product'
product_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_product_location_dest_id'
help='This is the location where the repaired product is located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Product Destination Location'
product_location_src_id
Many2one → stock.location
check_company=True
compute='_compute_product_location_src_id'
help='This is the location where the product to repair is located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Product Source Location'
product_qty
Float
compute='_compute_product_qty'
default=1.0
digits='Product Unit'
readonly=False
store=True
args: 'Product Quantity'
product_uom
Many2one → uom.uom
compute='compute_product_uom'
domain="[('id', 'in', allowed_uom_ids)]"
precompute=True
readonly=False
store=True
args: 'uom.uom', 'Unit'
recycle_location_id
Many2one → stock.location
check_company=True
compute='_compute_recycle_location_id'
help='This is the location where the repair parts are located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Recycled Parts Destination Location'
reference_ids
Many2many → stock.reference
copy=False
string='References'
args: 'stock.reference', 'stock_reference_repair_rel', 'repair_id', 'reference_id'
repair_properties
Properties
copy=True
definition='picking_type_id.repair_properties_definition'
args: 'Properties'
repair_request
Text
help='Sale Order Line Description.'
related='sale_order_line_id.name'
string='Repair Request'
reserve_visible
Boolean
compute='_compute_unreserve_visible'
help='Technical field to check when we can reserve quantities'
args: 'Allowed to Reserve Production'
sale_order_id
Many2one → sale.order
check_company=True
copy=False
help='Sale Order from which the Repair Order comes from.'
index='btree_not_null'
readonly=True
args: 'sale.order', 'Sale Order'
sale_order_line_id
Many2one → sale.order.line
check_company=True
copy=False
help='Sale Order Line from which the Repair Order comes from.'
readonly=True
args: 'sale.order.line'
schedule_date
Datetime
copy=False
default=fields.Datetime.now
index=True
required=True
args: 'Scheduled Date'
search_date_category
Selection
readonly=True
search='_search_date_category'
store=False
string='Date Category'
args: [('before', 'Before'), ('yesterday', 'Yesterday'), ('today', 'Today'), ('day_1', 'Tomorrow'), ('day_2', 'The day after tomorrow'), ('after', 'After')]
state
Selection
copy=False
default='draft'
help="* The 'New' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Under Repair' status is used when the repair is ongoing.\n* The 'Repaired' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
index=True
readonly=True
string='Status'
tracking=True
args: [('draft', 'New'), ('confirmed', 'Confirmed'), ('under_repair', 'Under Repair'), ('done', 'Repaired'), ('cancel', 'Cancelled')]
tag_ids
Many2many → repair.tags
string='Tags'
args: 'repair.tags'
tracking
Selection
readonly=False
related='product_id.tracking'
string='Product Tracking'
under_warranty
Boolean
help='If ticked, the sales price will be set to 0 for all products transferred from the repair order.'
args: 'Under Warranty'
unreserve_visible
Boolean
compute='_compute_unreserve_visible'
help='Technical field to check when we can unreserve'
args: 'Allowed to Unreserve Production'
user_id
Many2one → res.users
check_company=True
default=<expr>
string='Responsible'
args: 'res.users'
action_add_from_catalog(self)
action_assign(self)
action_create_sale_order(self)
action_generate_serial(self)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_done(self)
action_repair_end(self)
action_repair_start(self)
action_unreserve(self)
action_validate(self)
action_view_sale_order(self)
compute_lot_id(self)
compute_product_uom(self)
create(self, vals_list)
default_get(self, fields)
message_post(self, **kwargs)
onchange_product_uom(self)
print_repair_order(self)
write(self, vals)
color
Integer
default=_get_default_color
string='Color Index'
name
Char
required=True
args: 'Tag Name'
No public methods.
repair_count
Integer
compute='_compute_repair_count'
groups='stock.group_stock_user'
args: 'Repair Order(s)'
repair_order_ids
One2many → repair.order
comodel_name='repair.order'
groups='stock.group_stock_user'
inverse_name='sale_order_id'
string='Repair Order'
action_show_repair(self)
No new fields.
Public methods (3)create(self, vals_list)
has_valued_move_ids(self)
write(self, vals)
No new fields.
Public methods (0)No public methods.
in_repair_count
Integer
compute='_compute_in_repair_count'
args: 'In repair count'
repair_line_ids
Many2many → repair.order
compute='_compute_repair_line_ids'
string='Repair Orders'
args: 'repair.order'
repair_part_count
Integer
compute='_compute_repair_line_ids'
args: 'Repair part count'
repaired_count
Integer
compute='_compute_repaired_count'
args: 'Repaired count'
action_lot_open_repairs(self)
action_view_ro(self)
repair_id
Many2one → repair.order
check_company=True
copy=False
index='btree_not_null'
ondelete='cascade'
args: 'repair.order'
repair_line_type
Selection
index=True
store=True
args: [('add', 'Add'), ('remove', 'Remove'), ('recycle', 'Recycle')], 'Type'
action_add_from_catalog_repair(self)
action_show_details(self)
copy_data(self, default=None)
create(self, vals_list)
unlink(self)
write(self, vals)
No new fields.
Public methods (0)No public methods.
nbr_repairs
Integer
compute='_compute_nbr_repairs'
args: 'Number of repairs linked to this picking'
repair_ids
One2many → repair.order
action_repair_return(self)
action_view_repairs(self)
get_action_click_graph(self)
code
Selection
ondelete={'repair_operation': 'cascade'}
selection_add=[('repair_operation', 'Repair')]
count_repair_confirmed
Integer
compute='_compute_count_repair'
string='Number of Repair Orders Confirmed'
count_repair_late
Integer
compute='_compute_count_repair'
string='Number of Late Repair Orders'
count_repair_ready
Integer
compute='_compute_count_repair'
string='Number of Repair Orders to Process'
count_repair_under_repair
Integer
compute='_compute_count_repair'
string='Number of Repair Orders Under Repair'
default_product_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_product_location_id'
help='This is the default destination location for the product to be repaired in repair orders with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Product Destination Location'
default_product_location_src_id
Many2one → stock.location
check_company=True
compute='_compute_default_product_location_id'
help='This is the default source location for the product to be repaired in repair orders with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Product Source Location'
default_recycle_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_recycle_location_dest_id'
help='This is the default recycle destination location when you create a repair order with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Recycle Destination Location'
default_remove_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_remove_location_dest_id'
help='This is the default remove destination location when you create a repair order with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Remove Destination Location'
repair_properties_definition
PropertiesDefinition
get_repair_stock_picking_action_picking_type(self)
No new fields.
Public methods (0)No public methods.
repair_mto_pull_id
Many2one → stock.rule
copy=False
args: 'stock.rule', 'Repair MTO Rule'
repair_type_id
Many2one → stock.picking.type
check_company=True
copy=False
args: 'stock.picking.type', 'Repair Operation Type'
No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/18.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Inventory/Inventory |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Christophe Simonis, Xavier Morel, qdp-odoo, GitHub, Odoo Online, Jorge Pinna Puissant, Arnold Moyaux, Victor Feyens, William Henrotin, svs-odoo, Prakash Prajapati, Tiffany Chang (tic), Gorash, snd, JF Aubert, Vincent Larcin, Louis Wicket (wil), Adrien Widart (awt), clesgow, Djamel Touati, Dylan Kiss (dyki), kir-odoo, Ahmed Khalaf, Anita (anko), Paweł Fertyk, Nguyễn Đại Dương, omra-odoo, OmarAbosamaha, Ethan Vincent, lase@odoo.com, Maryam Kia, reka-odoo, vava-odoo, kcv-odoo, adsh-odoo, Louis Gobert, Agustin Castro Bugallo, sami odoo, Louis (wil), mano-odoo, Hussein Ebrahim(hyhe), Mohammad Abdulmoneim, Mathias Mathy (MAMA), Jitendra Prajapat, pkgu-odoo, djameltouati, Bastien (bvdn), plha-odoo, bsra-odoo, kinhosz, Elijah Tay (elct), adip-odoo, Jeremy Lawson (jelaw) |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 01:25:57 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - sale_stock - sale - sales_team - base - base_setup - web - bus - web_tour - html_editor - account_payment - account - onboarding - product - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource - payment - utm - stock_account - stock - barcodes_gs1_nomenclature - barcodes - sale_management |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_view_search_catalog |
product.view.search.catalog.inherit.repair | product.product | xpath | Inherits product.product_view_search_catalog |
repair_order_view_activity |
repair.order.view.activity | repair.order | activity | New |
repair_view_picking_form |
stock.picking.form.inherit.repair | stock.picking | xpath | Inherits stock.view_picking_form |
repair_view_picking_type_form |
stock.picking.type.inherit.repair | stock.picking.type | xpath | Inherits stock.view_picking_type_form |
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_production_lot_view_form |
stock.production.lot.view.form | stock.lot | xpath | Inherits stock.view_production_lot_form |
stock_repair_type_kanban |
stock.picking.type.kanban | stock.picking.type | xpath | Inherits stock.stock_picking_type_kanban |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_product_template_form_inherit_repair |
product.template.form.inherit.repair | product.template | group | Inherits product.product_template_form_view |
view_repair_graph |
repair.graph | repair.order | graph | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.list | repair.order | list | New |
view_repair_pivot |
repair.pivot | repair.order | pivot | New |
view_repair_tag_form |
repair.tag.form | repair.tags | form | New |
view_repair_tag_search |
repair.tag.search | repair.tags | search | New |
view_repair_tag_tree |
repair.tag.list | repair.tags | list | New |
view_sale_order_form_inherit_repair |
sale.order.form.inherit.repair | sale.order | xpath | Inherits sale.view_order_form |
view_warehouse_inherit_repair |
Stock Warehouse Inherit Repair | stock.warehouse | xpath | Inherits stock.view_warehouse |
No new fields.
Public methods (0)No public methods.
product_catalog_product_is_in_repair
Boolean
compute='_compute_product_is_in_repair'
search='_search_product_is_in_repair'
No public methods.
create_repair
Boolean
groups='stock.group_stock_user'
help='Create a linked Repair Order on Sale Order confirmation of this product.'
args: 'Create Repair'
copy_data(self, default=None)
allowed_lot_ids
One2many → stock.lot
compute='_compute_allowed_lot_ids'
args: 'stock.lot'
company_id
Many2one → res.company
default=<expr>
index=True
readonly=True
required=True
args: 'res.company', 'Company'
has_uncomplete_moves
Boolean
compute='_compute_has_uncomplete_moves'
internal_notes
Html
is_parts_available
Boolean
compute='_compute_availability_boolean'
default=False
store=True
args: 'All Parts are available'
is_parts_late
Boolean
compute='_compute_availability_boolean'
default=False
store=True
args: 'Any Part is late'
is_returned
Boolean
compute='_compute_is_returned'
help="True if this repair is linked to a Return Order and the order is 'Done'. False otherwise."
args: 'Returned'
location_dest_id
Many2one → stock.location
check_company=True
depends=['picking_type_id']
help='This is the location where the repaired product is located.'
index=True
precompute=True
readonly=True
related='picking_type_id.default_location_dest_id'
required=True
store=True
args: 'stock.location', 'Added Parts Destination Location'
location_id
Many2one → stock.location
check_company=True
compute='_compute_location_id'
help='This is the location where the components of product to repair is located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Component Source Location'
lot_id
Many2one → stock.lot
check_company=True
compute='compute_lot_id'
domain="[('id', 'in', allowed_lot_ids)]"
help='Products repaired are all belonging to this lot'
store=True
args: 'stock.lot', 'Lot/Serial'
move_id
Many2one → stock.move
check_company=True
copy=False
readonly=True
tracking=True
args: 'stock.move', 'Inventory Move'
move_ids
One2many → stock.move
check_company=True
copy=True
domain=[('repair_line_type', '!=', False)]
args: 'stock.move', 'repair_id', 'Parts'
name
Char
copy=False
default=<expr>
index='trigram'
readonly=True
required=True
args: 'Repair Reference'
partner_id
Many2one → res.partner
change_default=True
check_company=True
compute='_compute_partner_id'
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
readonly=False
store=True
args: 'res.partner', 'Customer'
parts_availability
Char
compute='_compute_parts_availability'
help="Latest parts availability status for this RO. If green, then the RO's readiness status is ready."
string='Component Status'
parts_availability_state
Selection
compute='_compute_parts_availability'
args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
parts_location_id
Many2one → stock.location
check_company=True
depends=['picking_type_id']
help='This is the location where the repair parts are located.'
index=True
precompute=True
readonly=True
related='picking_type_id.default_remove_location_dest_id'
required=True
store=True
args: 'stock.location', 'Removed Parts Destination Location'
picking_id
Many2one → stock.picking
check_company=True
copy=False
domain="[('return_id', '!=', False), ('product_id', '=?', product_id)]"
help='Return Order from which the product to be repaired comes from.'
args: 'stock.picking', 'Return'
picking_product_id
Many2one
related='picking_id.product_id'
picking_product_ids
One2many → product.product
compute='_compute_picking_product_ids'
args: 'product.product'
picking_type_id
Many2one → stock.picking.type
check_company=True
compute='_compute_picking_type_id'
copy=True
default=_default_picking_type_id
domain="[('code', '=', 'repair_operation'), ('company_id', '=', company_id)]"
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.picking.type', 'Operation Type'
priority
Selection
default='0'
string='Priority'
args: [('0', 'Normal'), ('1', 'Urgent')]
procurement_group_id
Many2one → procurement.group
copy=False
args: 'procurement.group', 'Procurement Group'
product_id
Many2one → product.product
check_company=True
domain="[('type', '=', 'consu'), '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('id', 'in', picking_product_ids), ('id', '=?', picking_product_id)]"
string='Product to Repair'
args: 'product.product'
product_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_product_location_dest_id'
help='This is the location where the repaired product is located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Product Destination Location'
product_location_src_id
Many2one → stock.location
check_company=True
compute='_compute_product_location_src_id'
help='This is the location where the product to repair is located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Product Source Location'
product_qty
Float
compute='_compute_product_qty'
default=1.0
digits='Product Unit of Measure'
readonly=False
store=True
args: 'Product Quantity'
product_uom
Many2one → uom.uom
compute='compute_product_uom'
domain="[('category_id', '=', product_uom_category_id)]"
precompute=True
store=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
recycle_location_id
Many2one → stock.location
check_company=True
compute='_compute_recycle_location_id'
help='This is the location where the repair parts are located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Recycled Parts Destination Location'
repair_properties
Properties
copy=True
definition='picking_type_id.repair_properties_definition'
args: 'Properties'
repair_request
Text
help='Sale Order Line Description.'
related='sale_order_line_id.name'
string='Repair Request'
reserve_visible
Boolean
compute='_compute_unreserve_visible'
help='Technical field to check when we can reserve quantities'
args: 'Allowed to Reserve Production'
sale_order_id
Many2one → sale.order
check_company=True
copy=False
help='Sale Order from which the Repair Order comes from.'
readonly=True
args: 'sale.order', 'Sale Order'
sale_order_line_id
Many2one → sale.order.line
check_company=True
copy=False
help='Sale Order Line from which the Repair Order comes from.'
readonly=True
args: 'sale.order.line'
schedule_date
Datetime
copy=False
default=fields.Datetime.now
index=True
required=True
args: 'Scheduled Date'
search_date_category
Selection
readonly=True
search='_search_date_category'
store=False
string='Date Category'
args: [('before', 'Before'), ('yesterday', 'Yesterday'), ('today', 'Today'), ('day_1', 'Tomorrow'), ('day_2', 'The day after tomorrow'), ('after', 'After')]
state
Selection
copy=False
default='draft'
help="* The 'New' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Under Repair' status is used when the repair is ongoing.\n* The 'Repaired' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
index=True
readonly=True
string='Status'
tracking=True
args: [('draft', 'New'), ('confirmed', 'Confirmed'), ('under_repair', 'Under Repair'), ('done', 'Repaired'), ('cancel', 'Cancelled')]
tag_ids
Many2many → repair.tags
string='Tags'
args: 'repair.tags'
tracking
Selection
readonly=False
related='product_id.tracking'
string='Product Tracking'
under_warranty
Boolean
help='If ticked, the sales price will be set to 0 for all products transferred from the repair order.'
args: 'Under Warranty'
unreserve_visible
Boolean
compute='_compute_unreserve_visible'
help='Technical field to check when we can unreserve'
args: 'Allowed to Unreserve Production'
user_id
Many2one → res.users
check_company=True
default=<expr>
string='Responsible'
args: 'res.users'
action_add_from_catalog(self)
action_assign(self)
action_create_sale_order(self)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_done(self)
action_repair_end(self)
action_repair_start(self)
action_unreserve(self)
action_validate(self)
action_view_sale_order(self)
compute_lot_id(self)
compute_product_uom(self)
create(self, vals_list)
default_get(self, fields_list)
onchange_product_uom(self)
print_repair_order(self)
write(self, vals)
color
Integer
default=_get_default_color
string='Color Index'
name
Char
required=True
args: 'Tag Name'
No public methods.
repair_count
Integer
compute='_compute_repair_count'
groups='stock.group_stock_user'
args: 'Repair Order(s)'
repair_order_ids
One2many → repair.order
comodel_name='repair.order'
groups='stock.group_stock_user'
inverse_name='sale_order_id'
string='Repair Order'
action_show_repair(self)
No new fields.
Public methods (3)create(self, vals_list)
has_valued_move_ids(self)
write(self, vals)
No new fields.
Public methods (0)No public methods.
in_repair_count
Integer
compute='_compute_in_repair_count'
args: 'In repair count'
repair_line_ids
Many2many → repair.order
compute='_compute_repair_line_ids'
string='Repair Orders'
args: 'repair.order'
repair_part_count
Integer
compute='_compute_repair_line_ids'
args: 'Repair part count'
repaired_count
Integer
compute='_compute_repaired_count'
args: 'Repaired count'
action_lot_open_repairs(self)
action_view_ro(self)
repair_id
Many2one → repair.order
check_company=True
copy=False
ondelete='cascade'
args: 'repair.order'
repair_line_type
Selection
index=True
store=True
args: [('add', 'Add'), ('remove', 'Remove'), ('recycle', 'Recycle')], 'Type'
action_add_from_catalog_repair(self)
action_show_details(self)
copy_data(self, default=None)
create(self, vals_list)
unlink(self)
write(self, vals)
No new fields.
Public methods (0)No public methods.
is_repairable
Boolean
compute='_compute_is_repairable'
nbr_repairs
Integer
compute='_compute_nbr_repairs'
args: 'Number of repairs linked to this picking'
repair_ids
One2many → repair.order
action_repair_return(self)
action_view_repairs(self)
get_action_click_graph(self)
code
Selection
ondelete={'repair_operation': 'cascade'}
selection_add=[('repair_operation', 'Repair')]
count_repair_confirmed
Integer
compute='_compute_count_repair'
string='Number of Repair Orders Confirmed'
count_repair_late
Integer
compute='_compute_count_repair'
string='Number of Late Repair Orders'
count_repair_ready
Integer
compute='_compute_count_repair'
string='Number of Repair Orders to Process'
count_repair_under_repair
Integer
compute='_compute_count_repair'
string='Number of Repair Orders Under Repair'
default_product_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_product_location_id'
help='This is the default destination location for the product to be repaired in repair orders with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Product Destination Location'
default_product_location_src_id
Many2one → stock.location
check_company=True
compute='_compute_default_product_location_id'
help='This is the default source location for the product to be repaired in repair orders with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Product Source Location'
default_recycle_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_recycle_location_dest_id'
help='This is the default recycle destination location when you create a repair order with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Recycle Destination Location'
default_remove_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_remove_location_dest_id'
help='This is the default remove destination location when you create a repair order with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Remove Destination Location'
is_repairable
Boolean
compute='_compute_is_repairable'
default=False
help='If ticked, you will be able to directly create repair orders from a return.'
readonly=False
store=True
args: 'Create Repair Orders from Returns'
repair_properties_definition
PropertiesDefinition
return_type_of_ids
One2many → stock.picking.type
action_repair_overview(self)
get_repair_stock_picking_action_picking_type(self)
No new fields.
Public methods (0)No public methods.
repair_mto_pull_id
Many2one → stock.rule
copy=False
args: 'stock.rule', 'Repair MTO Rule'
repair_type_id
Many2one → stock.picking.type
check_company=True
copy=False
args: 'stock.picking.type', 'Repair Operation Type'
No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/17.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Inventory/Inventory |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, qdp-odoo, GitHub, Odoo Online, Adrien Dieudonne, Arnold Moyaux, Victor Feyens, William Henrotin, svs-odoo, Touati Djamel (otd), Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, snd, abd-msyukyu-odoo, William Braeckman, william-andre, JF Aubert, Demesmaeker, niyasraphy, Louis Wicket (wil), Adrien Widart (awt), Maximilien (malb), Pierre-Yves Dufays, clesgow, Djamel Touati, Pieter Claeys (clpi), Dylan Kiss (dyki), Ahmed Khalaf, Brieuc-brd, Nguyễn Đại Dương, Mahdi Cheikh Rouhou (macr), OmarAbosamaha, Ethan Vincent, lase@odoo.com, Julien Carion (juca), adsh-odoo, Louis Gobert, Louis (wil), Hussein Ebrahim(hyhe), Mohammad Abdulmoneim, Mathias Mathy (MAMA), pkgu-odoo, djameltouati, plha-odoo, Ajit Singh, bsra-odoo, kinhosz, Jeremy Lawson (jelaw) |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 01:02:08 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - sale_stock - sale - sales_team - base - base_setup - web - bus - web_tour - account_payment - account - onboarding - product - uom - analytic - portal - web_editor - http_routing - auth_signup - digest - resource - payment - utm - stock_account - stock - barcodes_gs1_nomenclature - barcodes - sale_management |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
repair_order_view_activity |
repair.order.view.activity | repair.order | activity | New |
repair_view_picking_form |
stock.picking.form.inherit.repair | stock.picking | xpath | Inherits stock.view_picking_form |
repair_view_picking_type_form |
stock.picking.type.inherit.repair | stock.picking.type | xpath | Inherits stock.view_picking_type_form |
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_production_lot_view_form |
stock.production.lot.view.form | stock.lot | xpath | Inherits stock.view_production_lot_form |
stock_repair_type_kanban |
stock.picking.type.kanban | stock.picking.type | field | Inherits stock.stock_picking_type_kanban |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_product_template_form_inherit_repair |
product.template.form.inherit.repair | product.template | xpath | Inherits product.product_template_form_view |
view_repair_graph |
repair.graph | repair.order | graph | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.tree | repair.order | tree | New |
view_repair_pivot |
repair.pivot | repair.order | pivot | New |
view_repair_tag_form |
repair.tag.form | repair.tags | form | New |
view_repair_tag_search |
repair.tag.search | repair.tags | search | New |
view_repair_tag_tree |
repair.tag.tree | repair.tags | tree | New |
view_repair_warn_uncomplete_move |
repair.warn.uncomplete.move.view.form | repair.warn.uncomplete.move | form | New |
view_sale_order_form_inherit_repair |
sale.order.form.inherit.repair | sale.order | xpath | Inherits sale.view_order_form |
view_warehouse_inherit_repair |
Stock Warehouse Inherit Repair | stock.warehouse | xpath | Inherits stock.view_warehouse |
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
create_repair
Boolean
groups='stock.group_stock_user'
help='Create a linked Repair Order on Sale Order confirmation of this product.'
args: 'Create Repair'
copy_data(self, default=None)
company_id
Many2one → res.company
default=<expr>
index=True
readonly=True
required=True
args: 'res.company', 'Company'
internal_notes
Html
is_parts_available
Boolean
compute='_compute_availability_boolean'
default=False
store=True
args: 'All Parts are available'
is_parts_late
Boolean
compute='_compute_availability_boolean'
default=False
store=True
args: 'Any Part is late'
is_returned
Boolean
compute='_compute_is_returned'
help="True if this repair is linked to a Return Order and the order is 'Done'. False otherwise."
args: 'Returned'
location_dest_id
Many2one → stock.location
check_company=True
depends=['picking_type_id']
help='This is the location where the repaired product is located.'
index=True
precompute=True
readonly=True
related='picking_type_id.default_location_dest_id'
required=True
store=True
args: 'stock.location', 'Added Parts Destination Location'
location_id
Many2one → stock.location
check_company=True
compute='_compute_location_id'
help='This is the location where the product to repair is located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Location'
lot_id
Many2one → stock.lot
check_company=True
compute='compute_lot_id'
domain="[('product_id','=', product_id), ('company_id', '=', company_id)]"
help='Products repaired are all belonging to this lot'
store=True
args: 'stock.lot', 'Lot/Serial'
move_id
Many2one → stock.move
check_company=True
copy=False
readonly=True
tracking=True
args: 'stock.move', 'Inventory Move'
move_ids
One2many → stock.move
check_company=True
copy=True
domain=[('repair_line_type', '!=', False)]
args: 'stock.move', 'repair_id', 'Parts'
name
Char
copy=False
default='New'
index='trigram'
readonly=True
required=True
args: 'Repair Reference'
partner_id
Many2one → res.partner
change_default=True
check_company=True
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
args: 'res.partner', 'Customer'
parts_availability
Char
compute='_compute_parts_availability'
help="Latest parts availability status for this RO. If green, then the RO's readiness status is ready."
string='Component Status'
parts_availability_state
Selection
compute='_compute_parts_availability'
args: [('available', 'Available'), ('expected', 'Expected'), ('late', 'Late')]
parts_location_id
Many2one → stock.location
check_company=True
depends=['picking_type_id']
help='This is the location where the repair parts are located.'
index=True
precompute=True
readonly=True
related='picking_type_id.default_remove_location_dest_id'
required=True
store=True
args: 'stock.location', 'Removed Parts Destination Location'
picking_id
Many2one → stock.picking
check_company=True
copy=False
domain="[('return_id', '!=', False), ('product_id', '=?', product_id)]"
help='Return Order from which the product to be repaired comes from.'
args: 'stock.picking', 'Return'
picking_product_id
Many2one
related='picking_id.product_id'
picking_product_ids
One2many → product.product
compute='compute_picking_product_ids'
args: 'product.product'
picking_type_id
Many2one → stock.picking.type
check_company=True
compute='_compute_picking_type_id'
copy=True
default=_default_picking_type_id
domain="[('code', '=', 'repair_operation'), ('company_id', '=', company_id)]"
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.picking.type', 'Operation Type'
priority
Selection
default='0'
string='Priority'
args: [('0', 'Normal'), ('1', 'Urgent')]
procurement_group_id
Many2one → procurement.group
copy=False
args: 'procurement.group', 'Procurement Group'
product_id
Many2one → product.product
check_company=True
domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('id', 'in', picking_product_ids), ('id', '=?', picking_product_id)]"
string='Product to Repair'
args: 'product.product'
product_qty
Float
default=1.0
digits='Product Unit of Measure'
args: 'Product Quantity'
product_uom
Many2one → uom.uom
compute='compute_product_uom'
domain="[('category_id', '=', product_uom_category_id)]"
precompute=True
store=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
recycle_location_id
Many2one → stock.location
check_company=True
compute='_compute_recycle_location_id'
help='This is the location where the repair parts are located.'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Recycled Parts Destination Location'
repair_request
Text
help='Sale Order Line Description.'
related='sale_order_line_id.name'
string='Repair Request'
reserve_visible
Boolean
compute='_compute_unreserve_visible'
help='Technical field to check when we can reserve quantities'
args: 'Allowed to Reserve Production'
sale_order_id
Many2one → sale.order
check_company=True
copy=False
help='Sale Order from which the Repair Order comes from.'
readonly=True
args: 'sale.order', 'Sale Order'
sale_order_line_id
Many2one → sale.order.line
check_company=True
copy=False
help='Sale Order Line from which the Repair Order comes from.'
readonly=True
args: 'sale.order.line'
schedule_date
Datetime
copy=False
default=fields.Datetime.now
index=True
required=True
args: 'Scheduled Date'
show_clear_qty_button
Boolean
compute='_compute_show_qty_button'
show_set_qty_button
Boolean
compute='_compute_show_qty_button'
state
Selection
copy=False
default='draft'
help="* The 'New' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Under Repair' status is used when the repair is ongoing.\n* The 'Repaired' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
index=True
readonly=True
string='Status'
tracking=True
args: [('draft', 'New'), ('confirmed', 'Confirmed'), ('under_repair', 'Under Repair'), ('done', 'Repaired'), ('cancel', 'Cancelled')]
tag_ids
Many2many → repair.tags
string='Tags'
args: 'repair.tags'
tracking
Selection
readonly=False
related='product_id.tracking'
string='Product Tracking'
under_warranty
Boolean
help='If ticked, the sales price will be set to 0 for all products transferred from the repair order.'
args: 'Under Warranty'
unreserve_visible
Boolean
compute='_compute_unreserve_visible'
help='Technical field to check when we can unreserve'
args: 'Allowed to Unreserve Production'
user_id
Many2one → res.users
check_company=True
default=<expr>
string='Responsible'
args: 'res.users'
action_assign(self)
action_create_sale_order(self)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_done(self)
action_repair_end(self)
action_repair_start(self)
action_unreserve(self)
action_validate(self)
action_view_sale_order(self)
compute_lot_id(self)
compute_picking_product_ids(self)
compute_product_uom(self)
create(self, vals_list)
default_get(self, fields_list)
onchange_product_uom(self)
print_repair_order(self)
write(self, vals)
color
Integer
default=_get_default_color
string='Color Index'
name
Char
required=True
args: 'Tag Name'
No public methods.
repair_ids
Many2many → repair.order
string='Repair Orders'
args: 'repair.order'
action_validate(self)
repair_count
Integer
compute='_compute_repair_count'
groups='stock.group_stock_user'
args: 'Repair Order(s)'
repair_order_ids
One2many → repair.order
comodel_name='repair.order'
groups='stock.group_stock_user'
inverse_name='sale_order_id'
string='Repair Order'
action_show_repair(self)
No new fields.
Public methods (3)create(self, vals_list)
has_valued_move_ids(self)
write(self, vals_list)
No new fields.
Public methods (0)No public methods.
in_repair_count
Integer
compute='_compute_in_repair_count'
args: 'In repair count'
repair_line_ids
Many2many → repair.order
compute='_compute_repair_line_ids'
string='Repair Orders'
args: 'repair.order'
repair_part_count
Integer
compute='_compute_repair_line_ids'
args: 'Repair part count'
repaired_count
Integer
compute='_compute_repaired_count'
args: 'Repaired count'
action_lot_open_repairs(self)
action_view_ro(self)
repair_id
Many2one → repair.order
check_company=True
ondelete='cascade'
args: 'repair.order'
repair_line_type
Selection
index=True
store=True
args: [('add', 'Add'), ('remove', 'Remove'), ('recycle', 'Recycle')], 'Type'
action_show_details(self)
copy_data(self, default=None)
create(self, vals_list)
unlink(self)
write(self, vals)
No new fields.
Public methods (0)No public methods.
is_repairable
Boolean
compute='_compute_is_repairable'
nbr_repairs
Integer
compute='_compute_nbr_repairs'
args: 'Number of repairs linked to this picking'
repair_ids
One2many → repair.order
action_repair_return(self)
action_view_repairs(self)
code
Selection
ondelete={'repair_operation': 'cascade'}
selection_add=[('repair_operation', 'Repair')]
count_repair_confirmed
Integer
compute='_compute_count_repair'
string='Number of Repair Orders Confirmed'
count_repair_ready
Integer
compute='_compute_count_repair'
string='Number of Repair Orders to Process'
count_repair_under_repair
Integer
compute='_compute_count_repair'
string='Number of Repair Orders Under Repair'
default_recycle_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_recycle_location_dest_id'
help='This is the default recycle destination location when you create a repair order with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Default Recycle Destination Location'
default_remove_location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_default_remove_location_dest_id'
help='This is the default remove destination location when you create a repair order with this operation type.'
precompute=True
readonly=False
store=True
args: 'stock.location', 'Default Remove Destination Location'
is_repairable
Boolean
compute='_compute_is_repairable'
default=False
help='If ticked, you will be able to directly create repair orders from a return.'
readonly=False
store=True
args: 'Create Repair Orders from Returns'
return_type_of_ids
One2many → stock.picking.type
get_repair_stock_picking_action_picking_type(self)
No new fields.
Public methods (0)No public methods.
repair_type_id
Many2one → stock.picking.type
check_company=True
copy=False
args: 'stock.picking.type', 'Repair Operation Type'
No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/16.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Inventory/Inventory |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Yannick Tivisse, Laurent Smet, Romeo Fragomeli, Victor Feyens, William Henrotin, svs-odoo, Adrien Widart, Touati Djamel (otd), Tiffany Chang (tic), Pierre Paridans, William Braeckman, Hubert Van de Walle (huvw), william-andre, MerlinGuillaume, yhu-odoo, Pouya Malekinejad, niyasraphy, Davor Bojkić, simonev, Louis Wicket (wil), Adrien Widart (awt), Djamel Touati, Ahmed Khalaf (ahkh), Mahdi Cheikh Rouhou (macr) |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:40:51 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - uom - barcodes_gs1_nomenclature - barcodes - digest - portal - web_editor - http_routing - auth_signup - resource - sale_management - sale - sales_team - account_payment - account - analytic - payment - utm |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Invoicing (products and/or services)
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
repair_view_picking_form |
stock.picking.form.inherit.repair | stock.picking | xpath | Inherits stock.view_picking_form |
repair_view_picking_type_form |
stock.picking.type.inherit.repair | stock.picking.type | xpath | Inherits stock.view_picking_type_form |
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_production_lot_view_form |
stock.production.lot.view.form | stock.lot | xpath | Inherits stock.view_production_lot_form |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_make_invoice |
Make Invoice | repair.order.make_invoice | form | New |
view_repair_graph |
repair.graph | repair.order | graph | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.tree | repair.order | tree | New |
view_repair_pivot |
repair.pivot | repair.order | pivot | New |
view_repair_tag_form |
repair.tag.form | repair.tags | form | New |
view_repair_tag_search |
repair.tag.search | repair.tags | search | New |
view_repair_tag_tree |
repair.tag.tree | repair.tags | tree | New |
repair_ids
One2many → repair.order
copy=False
readonly=True
args: 'repair.order', 'invoice_id'
unlink(self)
repair_fee_ids
One2many → repair.fee
copy=False
readonly=True
args: 'repair.fee', 'invoice_line_id'
repair_line_ids
One2many → repair.line
copy=False
readonly=True
args: 'repair.line', 'invoice_line_id'
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
company_id
Many2one
index=True
related='repair_id.company_id'
store=True
currency_id
Many2one
related='repair_id.currency_id'
invoice_line_id
Many2one → account.move.line
check_company=True
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
name
Text
index=True
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_total_and_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total_and_subtotal'
digits=0
store=True
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
check_company=True
domain="[('type', '=', 'service'), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
tax_id
Many2many → account.tax
check_company=True
domain="[('type_tax_use','=','sale'), ('company_id', '=', company_id)]"
args: 'account.tax', 'repair_fee_line_tax', 'repair_fee_line_id', 'tax_id', 'Taxes'
create(self, vals_list)
onchange_product_id(self)
write(self, vals)
company_id
Many2one
index=True
related='repair_id.company_id'
store=True
currency_id
Many2one
related='repair_id.currency_id'
invoice_line_id
Many2one → account.move.line
check_company=True
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_dest_id
Many2one → stock.location
check_company=True
compute='_compute_location_id'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Dest. Location'
location_id
Many2one → stock.location
check_company=True
compute='_compute_location_id'
index=True
precompute=True
readonly=False
required=True
store=True
args: 'stock.location', 'Source Location'
lot_id
Many2one → stock.lot
check_company=True
domain="[('product_id','=', product_id), ('company_id', '=', company_id)]"
args: 'stock.lot', 'Lot/Serial'
move_id
Many2one → stock.move
copy=False
readonly=True
args: 'stock.move', 'Inventory Move'
name
Text
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_total_and_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total_and_subtotal'
digits=0
store=True
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
check_company=True
domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
required=True
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
compute='_compute_product_uom'
domain="[('category_id', '=', product_uom_category_id)]"
precompute=True
readonly=False
required=True
store=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
check_company=True
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
state
Selection
copy=False
default='draft'
help='The status of a repair line is set automatically to the one of the linked repair order.'
readonly=True
required=True
args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'Status'
tax_id
Many2many → account.tax
check_company=True
domain="[('type_tax_use','=','sale'), ('company_id', '=', company_id)]"
args: 'account.tax', 'repair_operation_line_tax', 'repair_operation_line_id', 'tax_id', 'Taxes'
tracking
Selection
related='product_id.tracking'
string='Product Tracking'
type
Selection
default='add'
required=True
args: [('add', 'Add'), ('remove', 'Remove')], 'Type'
onchange_operation_type(self)
onchange_product_id(self)
address_id
Many2one → res.partner
check_company=True
domain="[('parent_id','=',partner_id)]"
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Delivery Address'
allowed_picking_type_ids
Many2many → stock.picking.type
compute='_compute_allowed_picking_type_ids'
args: 'stock.picking.type'
amount_tax
Float
compute='_amount_tax'
store=True
args: 'Taxes'
amount_total
Float
compute='_amount_total'
store=True
args: 'Total'
amount_untaxed
Float
compute='_amount_untaxed'
store=True
args: 'Untaxed Amount'
company_id
Many2one → res.company
default=<expr>
index=True
readonly=True
required=True
args: 'res.company', 'Company'
currency_id
Many2one
related='pricelist_id.currency_id'
default_address_id
Many2one → res.partner
compute='_compute_default_address_id'
args: 'res.partner'
description
Char
fees_lines
One2many → repair.fee
copy=True
readonly=False
args: 'repair.fee', 'repair_id', 'Operations'
guarantee_limit
Date
states={'confirmed': [('readonly', True)]}
args: 'Warranty Expiration'
internal_notes
Html
invoice_id
Many2one → account.move
copy=False
domain=[('move_type', '=', 'out_invoice')]
readonly=True
tracking=True
args: 'account.move', 'Invoice'
invoice_method
Selection
default='none'
help="Selecting 'Before Repair' or 'After Repair' will allow you to generate invoice before or after the repair is done respectively. 'No invoice' means you don't want to generate invoice for this repair order."
index=True
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Invoice Method'
args: [('none', 'No Invoice'), ('b4repair', 'Before Repair'), ('after_repair', 'After Repair')]
invoice_state
Selection
related='invoice_id.state'
string='Invoice State'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
is_returned
Boolean
compute='_compute_is_returned'
help="True if this repair is linked to a Return Order and the order is 'Done'. False otherwise."
args: 'Returned'
location_id
Many2one → stock.location
check_company=True
compute='_compute_location_id'
help='This is the location where the product to repair is located.'
index=True
precompute=True
readonly=True
required=True
states={'draft': [('readonly', False)], 'confirmed': [('readonly', True)]}
store=True
args: 'stock.location', 'Location'
lot_id
Many2one → stock.lot
check_company=True
domain="[('product_id','=', product_id), ('company_id', '=', company_id)]"
help='Products repaired are all belonging to this lot'
args: 'stock.lot', 'Lot/Serial'
move_id
Many2one → stock.move
check_company=True
copy=False
readonly=True
tracking=True
args: 'stock.move', 'Inventory Move'
name
Char
copy=False
default='New'
index='trigram'
readonly=True
required=True
args: 'Repair Reference'
operations
One2many → repair.line
copy=True
args: 'repair.line', 'repair_id', 'Parts'
partner_id
Many2one → res.partner
change_default=True
check_company=True
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Customer'
partner_invoice_id
Many2one → res.partner
check_company=True
args: 'res.partner', 'Invoicing Address'
picking_id
Many2one → stock.picking
check_company=True
copy=False
help='Return Order from which the product to be repaired comes from.'
args: 'stock.picking', 'Return'
pricelist_id
Many2one → product.pricelist
check_company=True
default=<expr>
help='Pricelist of the selected partner.'
args: 'product.pricelist', 'Pricelist'
priority
Selection
default='0'
string='Priority'
args: [('0', 'Normal'), ('1', 'Urgent')]
product_id
Many2one → product.product
check_company=True
domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Product to Repair'
args: 'product.product'
product_qty
Float
default=1.0
digits='Product Unit of Measure'
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'Product Quantity'
product_uom
Many2one → uom.uom
compute='_compute_product_uom'
domain="[('category_id', '=', product_uom_category_id)]"
precompute=True
readonly=True
required=True
states={'draft': [('readonly', False)]}
store=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
quotation_notes
Html
repaired
Boolean
copy=False
readonly=True
args: 'Repaired'
sale_order_id
Many2one → sale.order
check_company=True
copy=False
help='Sale Order from which the product to be repaired comes from.'
args: 'sale.order', 'Sale Order'
schedule_date
Date
state
Selection
copy=False
default='draft'
help="* The 'Draft' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Ready to Repair' status is used to start to repairing, user can start repairing only after repair order is confirmed.\n* The 'Under Repair' status is used when the repair is ongoing.\n* The 'To be Invoiced' status is used to generate the invoice before or after repairing done.\n* The 'Done' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
readonly=True
string='Status'
tracking=True
args: [('draft', 'Quotation'), ('confirmed', 'Confirmed'), ('ready', 'Ready to Repair'), ('under_repair', 'Under Repair'), ('2binvoiced', 'To be Invoiced'), ('done', 'Repaired'), ('cancel', 'Cancelled')]
tag_ids
Many2many → repair.tags
string='Tags'
args: 'repair.tags'
tracking
Selection
readonly=False
related='product_id.tracking'
string='Product Tracking'
user_id
Many2one → res.users
check_company=True
default=<expr>
string='Responsible'
args: 'res.users'
action_created_invoice(self)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_confirm(self)
action_repair_done(self)
action_repair_end(self)
action_repair_invoice_create(self)
action_repair_ready(self)
action_repair_start(self)
action_send_mail(self)
action_validate(self)
button_dummy(self)
create(self, vals_list)
onchange_partner_id(self)
onchange_product_id(self)
onchange_product_uom(self)
print_repair_order(self)
group
Boolean
make_invoices(self)
color
Integer
default=_get_default_color
string='Color Index'
name
Char
required=True
args: 'Tag Name'
No public methods.
repair_order_count
Integer
compute='_compute_repair_order_ids'
args: 'Repair order count'
repair_order_ids
Many2many → repair.order
compute='_compute_repair_order_ids'
string='Repair Orders'
args: 'repair.order'
action_view_ro(self)
repair_id
Many2one → repair.order
check_company=True
args: 'repair.order'
No public methods.
is_repairable
Boolean
related='picking_type_id.is_repairable'
nbr_repairs
Integer
compute='_compute_nbr_repairs'
args: 'Number of repairs linked to this picking'
repair_ids
One2many → repair.order
action_repair_return(self)
action_view_repairs(self)
is_repairable
Boolean
compute='_compute_is_repairable'
help='If ticked, you will be able to directly create repair orders from a return.'
readonly=False
store=True
args: 'Create Repair Orders from Returns'
return_type_of_ids
One2many → stock.picking.type
No public methods.
No new fields.
Public methods (0)No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/15.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Inventory/Inventory |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Goffin Simon, Nicolas Martinelli, Arnold Moyaux, wan, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), William Henrotin, svs-odoo, Adrien Widart, Touati Djamel (otd), Tiffany Chang (tic), Djamel (otd), Kevin Baptiste, Hubert Van de Walle (huvw), prro-odoo, Bruno-brsy, MerlinGuillaume, yhu-odoo, Swapnesh, Nicolas Bayet, dht-odoo, niyasraphy, Davor Bojkić, simonev, Djamel Touati, Nicolas Pierre, Mahdi Cheikh Rouhou (macr), Quentin Wolfs |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:25:28 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - uom - barcodes - digest - portal - web_editor - http_routing - auth_signup - resource - sale_management - sale - sales_team - payment - account - analytic - utm |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Invoicing (products and/or services)
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_production_lot_view_form |
stock.production.lot.view.form | stock.production.lot | xpath | Inherits stock.view_production_lot_form |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_make_invoice |
Make Invoice | repair.order.make_invoice | form | New |
view_repair_graph |
repair.graph | repair.order | graph | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.tree | repair.order | tree | New |
view_repair_pivot |
repair.pivot | repair.order | pivot | New |
view_repair_tag_form |
repair.tag.form | repair.tags | form | New |
view_repair_tag_search |
repair.tag.search | repair.tags | search | New |
view_repair_tag_tree |
repair.tag.tree | repair.tags | tree | New |
repair_ids
One2many → repair.order
copy=False
readonly=True
args: 'repair.order', 'invoice_id'
unlink(self)
repair_fee_ids
One2many → repair.fee
copy=False
readonly=True
args: 'repair.fee', 'invoice_line_id'
repair_line_ids
One2many → repair.line
copy=False
readonly=True
args: 'repair.line', 'invoice_line_id'
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
company_id
Many2one
index=True
related='repair_id.company_id'
store=True
currency_id
Many2one
related='repair_id.currency_id'
invoice_line_id
Many2one → account.move.line
check_company=True
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
name
Text
index=True
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total'
compute_sudo=True
digits=0
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
check_company=True
domain="[('type', '=', 'service'), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
tax_id
Many2many → account.tax
check_company=True
domain="[('type_tax_use','=','sale'), ('company_id', '=', company_id)]"
args: 'account.tax', 'repair_fee_line_tax', 'repair_fee_line_id', 'tax_id', 'Taxes'
onchange_product_id(self)
company_id
Many2one
index=True
related='repair_id.company_id'
store=True
currency_id
Many2one
related='repair_id.currency_id'
invoice_line_id
Many2one → account.move.line
check_company=True
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_dest_id
Many2one → stock.location
check_company=True
index=True
required=True
args: 'stock.location', 'Dest. Location'
location_id
Many2one → stock.location
check_company=True
index=True
required=True
args: 'stock.location', 'Source Location'
lot_id
Many2one → stock.production.lot
check_company=True
domain="[('product_id','=', product_id), ('company_id', '=', company_id)]"
args: 'stock.production.lot', 'Lot/Serial'
move_id
Many2one → stock.move
copy=False
readonly=True
args: 'stock.move', 'Inventory Move'
name
Text
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total'
compute_sudo=True
digits=0
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
check_company=True
domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
required=True
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
check_company=True
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
state
Selection
copy=False
default='draft'
help='The status of a repair line is set automatically to the one of the linked repair order.'
readonly=True
required=True
args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'Status'
tax_id
Many2many → account.tax
check_company=True
domain="[('type_tax_use','=','sale'), ('company_id', '=', company_id)]"
args: 'account.tax', 'repair_operation_line_tax', 'repair_operation_line_id', 'tax_id', 'Taxes'
tracking
Selection
related='product_id.tracking'
string='Product Tracking'
type
Selection
default='add'
required=True
args: [('add', 'Add'), ('remove', 'Remove')], 'Type'
onchange_operation_type(self)
onchange_product_id(self)
address_id
Many2one → res.partner
check_company=True
domain="[('parent_id','=',partner_id)]"
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Delivery Address'
amount_tax
Float
compute='_amount_tax'
store=True
args: 'Taxes'
amount_total
Float
compute='_amount_total'
store=True
args: 'Total'
amount_untaxed
Float
compute='_amount_untaxed'
store=True
args: 'Untaxed Amount'
company_id
Many2one → res.company
default=<expr>
index=True
readonly=True
required=True
args: 'res.company', 'Company'
currency_id
Many2one
related='pricelist_id.currency_id'
default_address_id
Many2one → res.partner
compute='_compute_default_address_id'
args: 'res.partner'
description
Char
fees_lines
One2many → repair.fee
copy=True
readonly=False
args: 'repair.fee', 'repair_id', 'Operations'
guarantee_limit
Date
states={'confirmed': [('readonly', True)]}
args: 'Warranty Expiration'
internal_notes
Html
invoice_id
Many2one → account.move
copy=False
domain=[('move_type', '=', 'out_invoice')]
readonly=True
tracking=True
args: 'account.move', 'Invoice'
invoice_method
Selection
default='none'
help="Selecting 'Before Repair' or 'After Repair' will allow you to generate invoice before or after the repair is done respectively. 'No invoice' means you don't want to generate invoice for this repair order."
index=True
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Invoice Method'
args: [('none', 'No Invoice'), ('b4repair', 'Before Repair'), ('after_repair', 'After Repair')]
invoice_state
Selection
related='invoice_id.state'
string='Invoice State'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_id
Many2one → stock.location
check_company=True
help='This is the location where the product to repair is located.'
index=True
readonly=True
required=True
states={'draft': [('readonly', False)], 'confirmed': [('readonly', True)]}
args: 'stock.location', 'Location'
lot_id
Many2one → stock.production.lot
check_company=True
domain="[('product_id','=', product_id), ('company_id', '=', company_id)]"
help='Products repaired are all belonging to this lot'
args: 'stock.production.lot', 'Lot/Serial'
move_id
Many2one → stock.move
check_company=True
copy=False
help='Move created by the repair order'
readonly=True
tracking=True
args: 'stock.move', 'Move'
name
Char
copy=False
default='New'
readonly=True
required=True
args: 'Repair Reference'
operations
One2many → repair.line
copy=True
args: 'repair.line', 'repair_id', 'Parts'
partner_id
Many2one → res.partner
change_default=True
check_company=True
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Customer'
partner_invoice_id
Many2one → res.partner
check_company=True
args: 'res.partner', 'Invoicing Address'
pricelist_id
Many2one → product.pricelist
check_company=True
default=<expr>
help='Pricelist of the selected partner.'
args: 'product.pricelist', 'Pricelist'
priority
Selection
default='0'
help='Important repair order'
string='Priority'
args: [('0', 'Normal'), ('1', 'Urgent')]
product_id
Many2one → product.product
check_company=True
domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Product to Repair'
args: 'product.product'
product_qty
Float
default=1.0
digits='Product Unit of Measure'
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'Product Quantity'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
quotation_notes
Html
repaired
Boolean
copy=False
readonly=True
args: 'Repaired'
sale_order_id
Many2one → sale.order
copy=False
help='Sale Order from which the product to be repaired comes from.'
args: 'sale.order', 'Sale Order'
schedule_date
Date
state
Selection
copy=False
default='draft'
help="* The 'Draft' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Ready to Repair' status is used to start to repairing, user can start repairing only after repair order is confirmed.\n* The 'Under Repair' status is used when the repair is ongoing.\n* The 'To be Invoiced' status is used to generate the invoice before or after repairing done.\n* The 'Done' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
readonly=True
string='Status'
tracking=True
args: [('draft', 'Quotation'), ('confirmed', 'Confirmed'), ('ready', 'Ready to Repair'), ('under_repair', 'Under Repair'), ('2binvoiced', 'To be Invoiced'), ('done', 'Repaired'), ('cancel', 'Cancelled')]
tag_ids
Many2many → repair.tags
string='Tags'
args: 'repair.tags'
tracking
Selection
readonly=False
related='product_id.tracking'
string='Product Tracking'
user_id
Many2one → res.users
check_company=True
default=<expr>
string='Responsible'
args: 'res.users'
action_created_invoice(self)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_confirm(self)
action_repair_done(self)
action_repair_end(self)
action_repair_invoice_create(self)
action_repair_ready(self)
action_repair_start(self)
action_send_mail(self)
action_validate(self)
button_dummy(self)
create(self, vals)
onchange_partner_id(self)
onchange_product_id(self)
onchange_product_uom(self)
print_repair_order(self)
group
Boolean
make_invoices(self)
color
Integer
default=_get_default_color
string='Color Index'
name
Char
required=True
args: 'Tag Name'
No public methods.
repair_id
Many2one → repair.order
check_company=True
args: 'repair.order'
No public methods.
repair_order_count
Integer
compute='_compute_repair_order_ids'
args: 'Repair order count'
repair_order_ids
Many2many → repair.order
compute='_compute_repair_order_ids'
string='Repair Orders'
args: 'repair.order'
action_view_ro(self)
No new fields.
Public methods (0)No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/14.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Inventory/Inventory |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Aaron Bohy, GitHub, Barad Mahendra, Yannick Tivisse, Laurent Smet, Arnold Moyaux, wan, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, Florent de Labarre, Anh Thao Pham (pta), svs-odoo, Adrien Widart, Touati Djamel (otd), Rémy Voet (ryv), Mathieu Duckerts-Antoine, Djamel (otd), Kevin Baptiste, Pratima Gupta, Hubert Van de Walle (huvw), prro-odoo, Jigar Vaghela, MerlinGuillaume, yhu-odoo, niyasraphy, Davor Bojkić, simonev |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:14:29 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - uom - barcodes - digest - portal - web_editor - http_routing - auth_signup - resource - sale_management - sale - sales_team - payment - account - analytic - utm |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Invoicing (products and/or services)
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_make_invoice |
Make Invoice | repair.order.make_invoice | form | New |
view_repair_graph |
repair.graph | repair.order | graph | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.tree | repair.order | tree | New |
view_repair_pivot |
repair.pivot | repair.order | pivot | New |
view_repair_tag_form |
repair.tag.form | repair.tags | form | New |
view_repair_tag_search |
repair.tag.search | repair.tags | search | New |
view_repair_tag_tree |
repair.tag.tree | repair.tags | tree | New |
repair_ids
One2many → repair.order
copy=False
readonly=True
args: 'repair.order', 'invoice_id'
unlink(self)
repair_fee_ids
One2many → repair.fee
copy=False
readonly=True
args: 'repair.fee', 'invoice_line_id'
repair_line_ids
One2many → repair.line
copy=False
readonly=True
args: 'repair.line', 'invoice_line_id'
No public methods.
No new fields.
Public methods (0)No public methods.
company_id
Many2one
index=True
related='repair_id.company_id'
store=True
currency_id
Many2one
related='repair_id.currency_id'
invoice_line_id
Many2one → account.move.line
check_company=True
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
name
Text
index=True
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total'
compute_sudo=True
digits=0
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
check_company=True
domain="[('type', '=', 'service'), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
tax_id
Many2many → account.tax
check_company=True
domain="[('type_tax_use','=','sale'), ('company_id', '=', company_id)]"
args: 'account.tax', 'repair_fee_line_tax', 'repair_fee_line_id', 'tax_id', 'Taxes'
onchange_product_id(self)
company_id
Many2one
index=True
related='repair_id.company_id'
store=True
currency_id
Many2one
related='repair_id.currency_id'
invoice_line_id
Many2one → account.move.line
check_company=True
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_dest_id
Many2one → stock.location
check_company=True
index=True
required=True
args: 'stock.location', 'Dest. Location'
location_id
Many2one → stock.location
check_company=True
index=True
required=True
args: 'stock.location', 'Source Location'
lot_id
Many2one → stock.production.lot
check_company=True
domain="[('product_id','=', product_id), ('company_id', '=', company_id)]"
args: 'stock.production.lot', 'Lot/Serial'
move_id
Many2one → stock.move
copy=False
readonly=True
args: 'stock.move', 'Inventory Move'
name
Text
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total'
compute_sudo=True
digits=0
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
check_company=True
domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
required=True
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
check_company=True
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
state
Selection
copy=False
default='draft'
help='The status of a repair line is set automatically to the one of the linked repair order.'
readonly=True
required=True
args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'Status'
tax_id
Many2many → account.tax
check_company=True
domain="[('type_tax_use','=','sale'), ('company_id', '=', company_id)]"
args: 'account.tax', 'repair_operation_line_tax', 'repair_operation_line_id', 'tax_id', 'Taxes'
type
Selection
default='add'
required=True
args: [('add', 'Add'), ('remove', 'Remove')], 'Type'
onchange_operation_type(self)
onchange_product_id(self)
address_id
Many2one → res.partner
check_company=True
domain="[('parent_id','=',partner_id)]"
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Delivery Address'
amount_tax
Float
compute='_amount_tax'
store=True
args: 'Taxes'
amount_total
Float
compute='_amount_total'
store=True
args: 'Total'
amount_untaxed
Float
compute='_amount_untaxed'
store=True
args: 'Untaxed Amount'
company_id
Many2one → res.company
default=<expr>
index=True
readonly=True
required=True
args: 'res.company', 'Company'
currency_id
Many2one
related='pricelist_id.currency_id'
default_address_id
Many2one → res.partner
compute='_compute_default_address_id'
args: 'res.partner'
fees_lines
One2many → repair.fee
copy=True
readonly=True
states={'draft': [('readonly', False)]}
args: 'repair.fee', 'repair_id', 'Operations'
guarantee_limit
Date
states={'confirmed': [('readonly', True)]}
args: 'Warranty Expiration'
internal_notes
Text
invoice_id
Many2one → account.move
copy=False
domain=[('move_type', '=', 'out_invoice')]
readonly=True
tracking=True
args: 'account.move', 'Invoice'
invoice_method
Selection
default='none'
help="Selecting 'Before Repair' or 'After Repair' will allow you to generate invoice before or after the repair is done respectively. 'No invoice' means you don't want to generate invoice for this repair order."
index=True
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Invoice Method'
args: [('none', 'No Invoice'), ('b4repair', 'Before Repair'), ('after_repair', 'After Repair')]
invoice_state
Selection
related='invoice_id.state'
string='Invoice State'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_id
Many2one → stock.location
check_company=True
help='This is the location where the product to repair is located.'
index=True
readonly=True
required=True
states={'draft': [('readonly', False)], 'confirmed': [('readonly', True)]}
args: 'stock.location', 'Location'
lot_id
Many2one → stock.production.lot
check_company=True
domain="[('product_id','=', product_id), ('company_id', '=', company_id)]"
help='Products repaired are all belonging to this lot'
args: 'stock.production.lot', 'Lot/Serial'
move_id
Many2one → stock.move
check_company=True
copy=False
help='Move created by the repair order'
readonly=True
tracking=True
args: 'stock.move', 'Move'
name
Char
copy=False
default='/'
required=True
states={'confirmed': [('readonly', True)]}
args: 'Repair Reference'
operations
One2many → repair.line
copy=True
readonly=True
states={'draft': [('readonly', False)]}
args: 'repair.line', 'repair_id', 'Parts'
partner_id
Many2one → res.partner
change_default=True
check_company=True
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Customer'
partner_invoice_id
Many2one → res.partner
check_company=True
args: 'res.partner', 'Invoicing Address'
pricelist_id
Many2one → product.pricelist
check_company=True
default=<expr>
help='Pricelist of the selected partner.'
args: 'product.pricelist', 'Pricelist'
product_id
Many2one → product.product
check_company=True
domain="[('type', 'in', ['product', 'consu']), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Product to Repair'
args: 'product.product'
product_qty
Float
default=1.0
digits='Product Unit of Measure'
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'Product Quantity'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
quotation_notes
Text
repaired
Boolean
copy=False
readonly=True
args: 'Repaired'
state
Selection
copy=False
default='draft'
help="* The 'Draft' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Ready to Repair' status is used to start to repairing, user can start repairing only after repair order is confirmed.\n* The 'To be Invoiced' status is used to generate the invoice before or after repairing done.\n* The 'Done' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
readonly=True
string='Status'
tracking=True
args: [('draft', 'Quotation'), ('confirmed', 'Confirmed'), ('under_repair', 'Under Repair'), ('ready', 'Ready to Repair'), ('2binvoiced', 'To be Invoiced'), ('invoice_except', 'Invoice Exception'), ('done', 'Repaired'), ('cancel', 'Cancelled')]
tag_ids
Many2many → repair.tags
string='Tags'
args: 'repair.tags'
tracking
Selection
readonly=False
related='product_id.tracking'
string='Product Tracking'
user_id
Many2one → res.users
check_company=True
default=<expr>
string='Responsible'
args: 'res.users'
action_created_invoice(self)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_confirm(self)
action_repair_done(self)
action_repair_end(self)
action_repair_invoice_create(self)
action_repair_ready(self)
action_repair_start(self)
action_send_mail(self)
action_validate(self)
button_dummy(self)
create(self, vals)
onchange_partner_id(self)
onchange_product_id(self)
onchange_product_uom(self)
print_repair_order(self)
unlink(self)
group
Boolean
make_invoices(self)
color
Integer
default=_get_default_color
string='Color Index'
name
Char
required=True
args: 'Tag Name'
No public methods.
repair_id
Many2one → repair.order
check_company=True
args: 'repair.order'
No public methods.
No new fields.
Public methods (0)No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/13.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Manufacturing/Manufacturing |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, qdp-odoo, Damien Bouvy, Barad Mahendra, Yannick Tivisse, Martin Geubelle, Alexandre Kühn, Arnold Moyaux, Adrian Torres, Antoine Prieels, Aurélien Warnon, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), William Henrotin, Anh Thao Pham (pta), svs-odoo, Adrien Widart, Prakash Prajapati, Rémy Voet (ryv), Jinal Patel, Kevin Baptiste, Arnaud Baes, Hubert Van de Walle (huvw), Hardik Prajapati, asa-odoo, Hetal Dhanak, MerlinGuillaume |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:06:43 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - stock - product - base - base_setup - web - bus - web_tour - uom - barcodes - sale_management - sale - sales_team - payment - account - analytic - portal - web_editor - http_routing - auth_signup - digest - resource - utm |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Invoicing (products and/or services)
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_cancel_repair |
Cancel Repair | repair.cancel | form | New |
view_make_invoice |
Make Invoice | repair.order.make_invoice | form | New |
view_repair_graph |
repair.graph | repair.order | graph | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.tree | repair.order | tree | New |
view_repair_pivot |
repair.pivot | repair.order | pivot | New |
view_repair_tag_form |
repair.tag.form | repair.tags | form | New |
view_repair_tag_search |
repair.tag.search | repair.tags | search | New |
view_repair_tag_tree |
repair.tag.tree | repair.tags | tree | New |
repair_ids
One2many → repair.order
copy=False
readonly=True
args: 'repair.order', 'invoice_id'
No public methods.
repair_fee_ids
One2many → repair.fee
copy=False
readonly=True
args: 'repair.fee', 'invoice_line_id'
repair_line_ids
One2many → repair.line
copy=False
readonly=True
args: 'repair.line', 'invoice_line_id'
No public methods.
No new fields.
Public methods (2)cancel_repair(self)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
invoice_line_id
Many2one → account.move.line
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
name
Text
index=True
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total'
compute_sudo=True
digits=0
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
tax_id
Many2many → account.tax
onchange_product_id(self)
invoice_line_id
Many2one → account.move.line
copy=False
readonly=True
args: 'account.move.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_dest_id
Many2one → stock.location
index=True
required=True
args: 'stock.location', 'Dest. Location'
location_id
Many2one → stock.location
index=True
required=True
args: 'stock.location', 'Source Location'
lot_id
Many2one → stock.production.lot
move_id
Many2one → stock.move
copy=False
readonly=True
args: 'stock.move', 'Inventory Move'
name
Text
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_total
Float
compute='_compute_price_total'
compute_sudo=True
digits=0
args: 'Total'
price_unit
Float
digits='Product Price'
required=True
args: 'Unit Price'
product_id
Many2one → product.product
required=True
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
product_uom_qty
Float
default=1.0
digits='Product Unit of Measure'
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
index=True
ondelete='cascade'
args: 'repair.order', 'Repair Order Reference'
state
Selection
copy=False
default='draft'
help='The status of a repair line is set automatically to the one of the linked repair order.'
readonly=True
required=True
args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'Status'
tax_id
Many2many → account.tax
type
Selection
default='add'
required=True
args: [('add', 'Add'), ('remove', 'Remove')], 'Type'
constrain_lot_id(self)
onchange_operation_type(self)
onchange_product_id(self)
address_id
Many2one → res.partner
domain="[('parent_id','=',partner_id)]"
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Delivery Address'
amount_tax
Float
compute='_amount_tax'
store=True
args: 'Taxes'
amount_total
Float
compute='_amount_total'
store=True
args: 'Total'
amount_untaxed
Float
compute='_amount_untaxed'
store=True
args: 'Untaxed Amount'
company_id
Many2one → res.company
default=<expr>
args: 'res.company', 'Company'
default_address_id
Many2one → res.partner
compute='_compute_default_address_id'
args: 'res.partner'
fees_lines
One2many → repair.fee
copy=True
readonly=True
states={'draft': [('readonly', False)]}
args: 'repair.fee', 'repair_id', 'Operations'
guarantee_limit
Date
states={'confirmed': [('readonly', True)]}
args: 'Warranty Expiration'
internal_notes
Text
invoice_id
Many2one → account.move
copy=False
domain=[('type', '=', 'out_invoice')]
readonly=True
tracking=True
args: 'account.move', 'Invoice'
invoice_method
Selection
default='none'
help="Selecting 'Before Repair' or 'After Repair' will allow you to generate invoice before or after the repair is done respectively. 'No invoice' means you don't want to generate invoice for this repair order."
index=True
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Invoice Method'
args: [('none', 'No Invoice'), ('b4repair', 'Before Repair'), ('after_repair', 'After Repair')]
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_id
Many2one → stock.location
default=_default_stock_location
help='This is the location where the product to repair is located.'
index=True
readonly=True
required=True
states={'draft': [('readonly', False)], 'confirmed': [('readonly', True)]}
args: 'stock.location', 'Location'
lot_id
Many2one → stock.production.lot
domain="[('product_id','=', product_id)]"
help='Products repaired are all belonging to this lot'
args: 'stock.production.lot', 'Lot/Serial'
move_id
Many2one → stock.move
copy=False
help='Move created by the repair order'
readonly=True
tracking=True
args: 'stock.move', 'Move'
name
Char
copy=False
default='/'
required=True
states={'confirmed': [('readonly', True)]}
args: 'Repair Reference'
operations
One2many → repair.line
copy=True
readonly=True
states={'draft': [('readonly', False)]}
args: 'repair.line', 'repair_id', 'Parts'
partner_id
Many2one → res.partner
change_default=True
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Customer'
partner_invoice_id
Many2one → res.partner
pricelist_id
Many2one → product.pricelist
default=<expr>
help='Pricelist of the selected partner.'
args: 'product.pricelist', 'Pricelist'
product_id
Many2one → product.product
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Product to Repair'
args: 'product.product'
product_qty
Float
default=1.0
digits='Product Unit of Measure'
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'Product Quantity'
product_uom
Many2one → uom.uom
domain="[('category_id', '=', product_uom_category_id)]"
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'uom.uom', 'Product Unit of Measure'
product_uom_category_id
Many2one
related='product_id.uom_id.category_id'
quotation_notes
Text
repaired
Boolean
copy=False
readonly=True
args: 'Repaired'
state
Selection
copy=False
default='draft'
help="* The 'Draft' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Ready to Repair' status is used to start to repairing, user can start repairing only after repair order is confirmed.\n* The 'To be Invoiced' status is used to generate the invoice before or after repairing done.\n* The 'Done' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
readonly=True
string='Status'
tracking=True
args: [('draft', 'Quotation'), ('cancel', 'Cancelled'), ('confirmed', 'Confirmed'), ('under_repair', 'Under Repair'), ('ready', 'Ready to Repair'), ('2binvoiced', 'To be Invoiced'), ('invoice_except', 'Invoice Exception'), ('done', 'Repaired')]
tag_ids
Many2many → repair.tags
string='Tags'
args: 'repair.tags'
tracking
Selection
readonly=False
related='product_id.tracking'
args: 'Product Tracking'
user_id
Many2one → res.users
default=<expr>
string='Responsible'
args: 'res.users'
action_created_invoice(self)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_confirm(self)
action_repair_done(self)
action_repair_end(self)
action_repair_invoice_create(self)
action_repair_ready(self)
action_repair_start(self)
action_send_mail(self)
action_validate(self)
button_dummy(self)
create(self, vals)
onchange_partner_id(self)
onchange_product_id(self)
onchange_product_uom(self)
print_repair_order(self)
group
Boolean
make_invoices(self)
color
Integer
string='Color Index'
name
Char
required=True
args: 'Tag Name'
No public methods.
repair_id
Many2one → repair.order
No public methods.
No new fields.
Public methods (0)No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/12.0/repair |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Manufacturing |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Goffin Simon, Simon Lejeune, Nicolas Martinelli, qdp-odoo, Géry Debongnie, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Christophe Monniez, Adrian Torres, XavierDo, Xavier-Do, Sébastien Theys, TWA |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-05 23:57:01 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - stock - product - base - decimal_precision - base_setup - web - bus - web_tour - uom - barcodes - sale_management - sale - sales_team - payment - account - analytic - portal - http_routing - digest |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION |
The aim is to have a complete module to manage all products repairs.
====================================================================
The following topics are covered by this module:
------------------------------------------------------
* Add/remove products in the reparation
* Impact for stocks
* Invoicing (products and/or services)
* Warranty concept
* Repair quotation report
* Notes for the technician and for the final customer
|
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
report_repairorder |
report_repairorder | ir.ui.view | qweb | New |
report_repairorder2 |
report_repairorder2 | ir.ui.view | qweb | New |
stock_warn_insufficient_qty_repair_form_view |
stock.warn.insufficient.qty.repair | stock.warn.insufficient.qty.repair | xpath | Inherits stock.stock_warn_insufficient_qty_form_view |
view_cancel_repair |
Cancel Repair | repair.cancel | form | New |
view_make_invoice |
Make Invoice | repair.order.make_invoice | form | New |
view_repair_kanban |
repair.kanban | repair.order | kanban | New |
view_repair_order_form |
repair.form | repair.order | form | New |
view_repair_order_form_filter |
repair.select | repair.order | search | New |
view_repair_order_tree |
repair.tree | repair.order | tree | New |
No new fields.
Public methods (2)cancel_repair(self)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
invoice_line_id
Many2one → account.invoice.line
copy=False
readonly=True
args: 'account.invoice.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
name
Text
index=True
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_unit
Float
required=True
args: 'Unit Price'
product_id
Many2one → product.product
product_uom
Many2one → uom.uom
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_qty
Float
default=1.0
digits=dp.get_precision('Product Unit of Measure')
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
index=True
ondelete='cascade'
required=True
args: 'repair.order', 'Repair Order Reference'
tax_id
Many2many → account.tax
onchange_product_id(self)
invoice_line_id
Many2one → account.invoice.line
copy=False
readonly=True
args: 'account.invoice.line', 'Invoice Line'
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_dest_id
Many2one → stock.location
index=True
required=True
args: 'stock.location', 'Dest. Location'
location_id
Many2one → stock.location
index=True
required=True
args: 'stock.location', 'Source Location'
lot_id
Many2one → stock.production.lot
move_id
Many2one → stock.move
copy=False
readonly=True
args: 'stock.move', 'Inventory Move'
name
Text
required=True
args: 'Description'
price_subtotal
Float
compute='_compute_price_subtotal'
digits=0
store=True
args: 'Subtotal'
price_unit
Float
digits=dp.get_precision('Product Price')
required=True
args: 'Unit Price'
product_id
Many2one → product.product
required=True
args: 'product.product', 'Product'
product_uom
Many2one → uom.uom
required=True
args: 'uom.uom', 'Product Unit of Measure'
product_uom_qty
Float
default=1.0
digits=dp.get_precision('Product Unit of Measure')
required=True
args: 'Quantity'
repair_id
Many2one → repair.order
index=True
ondelete='cascade'
args: 'repair.order', 'Repair Order Reference'
state
Selection
copy=False
default='draft'
help='The status of a repair line is set automatically to the one of the linked repair order.'
readonly=True
required=True
args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'Status'
tax_id
Many2many → account.tax
type
Selection
default='add'
required=True
args: [('add', 'Add'), ('remove', 'Remove')], 'Type'
constrain_lot_id(self)
onchange_operation_type(self)
onchange_product_id(self)
address_id
Many2one → res.partner
domain="[('parent_id','=',partner_id)]"
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Delivery Address'
amount_tax
Float
compute='_amount_tax'
store=True
args: 'Taxes'
amount_total
Float
compute='_amount_total'
store=True
args: 'Total'
amount_untaxed
Float
compute='_amount_untaxed'
store=True
args: 'Untaxed Amount'
company_id
Many2one → res.company
default=<expr>
args: 'res.company', 'Company'
default_address_id
Many2one → res.partner
compute='_compute_default_address_id'
args: 'res.partner'
fees_lines
One2many → repair.fee
copy=True
readonly=True
states={'draft': [('readonly', False)]}
args: 'repair.fee', 'repair_id', 'Operations'
guarantee_limit
Date
states={'confirmed': [('readonly', True)]}
args: 'Warranty Expiration'
internal_notes
Text
invoice_id
Many2one → account.invoice
copy=False
readonly=True
track_visibility='onchange'
args: 'account.invoice', 'Invoice'
invoice_method
Selection
default='none'
help="Selecting 'Before Repair' or 'After Repair' will allow you to generate invoice before or after the repair is done respectively. 'No invoice' means you don't want to generate invoice for this repair order."
index=True
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Invoice Method'
args: [('none', 'No Invoice'), ('b4repair', 'Before Repair'), ('after_repair', 'After Repair')]
invoiced
Boolean
copy=False
readonly=True
args: 'Invoiced'
location_id
Many2one → stock.location
default=_default_stock_location
help='This is the location where the product to repair is located.'
index=True
readonly=True
required=True
states={'draft': [('readonly', False)], 'confirmed': [('readonly', True)]}
args: 'stock.location', 'Location'
lot_id
Many2one → stock.production.lot
domain="[('product_id','=', product_id)]"
help='Products repaired are all belonging to this lot'
oldname='prodlot_id'
args: 'stock.production.lot', 'Lot/Serial'
move_id
Many2one → stock.move
copy=False
help='Move created by the repair order'
readonly=True
track_visibility='onchange'
args: 'stock.move', 'Move'
name
Char
copy=False
default=<expr>
required=True
states={'confirmed': [('readonly', True)]}
args: 'Repair Reference'
operations
One2many → repair.line
copy=True
readonly=True
states={'draft': [('readonly', False)]}
args: 'repair.line', 'repair_id', 'Parts'
partner_id
Many2one → res.partner
help='Choose partner for whom the order will be invoiced and delivered. You can find a partner by its Name, TIN, Email or Internal Reference.'
index=True
states={'confirmed': [('readonly', True)]}
args: 'res.partner', 'Customer'
partner_invoice_id
Many2one → res.partner
pricelist_id
Many2one → product.pricelist
default=<expr>
help='Pricelist of the selected partner.'
args: 'product.pricelist', 'Pricelist'
product_id
Many2one → product.product
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Product to Repair'
args: 'product.product'
product_qty
Float
default=1.0
digits=dp.get_precision('Product Unit of Measure')
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'Product Quantity'
product_uom
Many2one → uom.uom
readonly=True
required=True
states={'draft': [('readonly', False)]}
args: 'uom.uom', 'Product Unit of Measure'
quotation_notes
Text
repaired
Boolean
copy=False
readonly=True
args: 'Repaired'
state
Selection
copy=False
default='draft'
help="* The 'Draft' status is used when a user is encoding a new and unconfirmed repair order.\n* The 'Confirmed' status is used when a user confirms the repair order.\n* The 'Ready to Repair' status is used to start to repairing, user can start repairing only after repair order is confirmed.\n* The 'To be Invoiced' status is used to generate the invoice before or after repairing done.\n* The 'Done' status is set when repairing is completed.\n* The 'Cancelled' status is used when user cancel repair order."
readonly=True
string='Status'
track_visibility='onchange'
args: [('draft', 'Quotation'), ('cancel', 'Cancelled'), ('confirmed', 'Confirmed'), ('under_repair', 'Under Repair'), ('ready', 'Ready to Repair'), ('2binvoiced', 'To be Invoiced'), ('invoice_except', 'Invoice Exception'), ('done', 'Repaired')]
tracking
Selection
readonly=False
related='product_id.tracking'
args: 'Product Tracking'
action_created_invoice(self)
action_invoice_create(self, group=False)
action_repair_cancel(self)
action_repair_cancel_draft(self)
action_repair_confirm(self)
action_repair_done(self)
action_repair_end(self)
action_repair_invoice_create(self)
action_repair_ready(self)
action_repair_start(self)
action_send_mail(self)
action_validate(self)
button_dummy(self)
onchange_partner_id(self)
onchange_product_id(self)
onchange_product_uom(self)
print_repair_order(self)
group
Boolean
make_invoices(self)
repair_id
Many2one → repair.order
No public methods.
No new fields.
Public methods (0)No public methods.
repair_id
Many2one → repair.order
string='Repair'
args: 'repair.order'
action_done(self)