Repository
odoo/odoo · module folder
Module version
1.0
Category
Supply Chain/Inventory
Folder size
3.77 MB
License
LGPL-3
Application
Yes
Auto-installable
No
Website
None
Last tracking update
2026-08-15 22:44:18
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Raphael Collet, Christophe Simonis, Thibault Delavallée, Odoo Translation Bot, GitHub, Arnold Moyaux, Julien Castiaux, Victor Feyens, William Henrotin, svs-odoo, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, JF Aubert, Renaud Thiry, François Honoré, Louis Wicket (wil), Adrien Widart (awt), Victor Piryns (pivi), Djamel Touati, Pieter Claeys (clpi), clesgow, 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), Iván Todorovich, 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, lase, chpa-odoo, Youssef
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
fieldservice_repair, l10n_din5008_repair, maintenance_request_repair, mgmtsystem_nonconformity_repair, mrp_repair, mrp_repair_order, mrp_subcontracting_repair, pos_repair, purchase_repair, repair_security
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

Code Analysis

Views touched (20)
XML IDNameModelTypeStatus
product_view_search_catalog product.view.search.catalog.inherit.repair product.product search 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 form Inherits stock.view_picking_form
repair_view_picking_type_form stock.picking.type.inherit.repair stock.picking.type form 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 form Inherits stock.view_production_lot_form
stock_repair_type_kanban stock.picking.type.kanban stock.picking.type kanban Inherits stock.stock_picking_type_kanban
stock_warn_insufficient_qty_repair_form_view stock.warn.insufficient.qty.repair stock.warn.insufficient.qty.repair form Inherits stock.stock_warn_insufficient_qty_form_view
view_product_template_form_inherit_repair product.template.form.inherit.repair product.template form 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 form Inherits sale.view_order_form
view_warehouse_inherit_repair Stock Warehouse Inherit Repair stock.warehouse Inherits stock.view_warehouse
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (16)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • product_catalog_product_is_in_repair Boolean
    compute='_compute_product_is_in_repair' search='_search_product_is_in_repair'
Public methods (0)

No public methods.

New fields (1)
  • service_tracking Selection
    ondelete={'repair': 'set default'} selection_add=[('repair', 'Repair Order')]
Public methods (0)

No public methods.

New fields (43)
  • 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
    args: 'Internal Notes'
  • 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'
Public methods (20)
  • 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)
    Creates stock move for final product of repair order. Writes move_id and move_ids state to 'done'. Writes repair order state to 'Repaired'. @return: True
  • action_repair_end(self)
    Checks before action_repair_done. @return: True
  • action_repair_start(self)
    Writes repair order state to 'Under Repair'
  • action_unreserve(self)
  • action_validate(self)
  • action_view_sale_order(self)
  • compute_lot_id(self)
    @api.depends('product_id', 'lot_id', 'lot_id.product_id', 'picking_id')
  • compute_product_uom(self)
    @api.depends('product_id', 'product_id.uom_id')
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • message_post(self, **kwargs)
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • print_repair_order(self)
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (1)
  • action_show_repair(self)

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • has_valued_move_ids(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • 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'
Public methods (2)
  • action_lot_open_repairs(self)
  • action_view_ro(self)

New fields (2)
  • 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'
Public methods (6)
  • action_add_from_catalog_repair(self)
  • action_show_details(self)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • nbr_repairs Integer
    compute='_compute_nbr_repairs' args: 'Number of repairs linked to this picking'
  • repair_ids One2many → repair.order
    args: 'repair.order', 'picking_id'
Public methods (3)
  • action_repair_return(self)
  • action_view_repairs(self)
  • get_action_click_graph(self)
    @api.model

New fields (10)
  • 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
    args: 'Repair Properties'
Public methods (1)
  • get_repair_stock_picking_action_picking_type(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • 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'
Public methods (0)

No public methods.

New fields (1)
  • repair_id Many2one → repair.order
    string='Repair' args: 'repair.order'
Public methods (1)
  • action_done(self)

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…