Repairs

repair
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYSupply Chain/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, 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 UPDATE2026-07-06 01:51:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - 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

Code Analysis

Views touched (20)
XML IDNameModelTypeStatus
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
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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael 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 UPDATE2026-07-06 01:25:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - 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

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
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
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)
  • create_repair Boolean
    groups='stock.group_stock_user' help='Create a linked Repair Order on Sale Order confirmation of this product.' args: 'Create Repair'
Public methods (1)
  • copy_data(self, default=None)

New fields (43)
  • 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
    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'
  • 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'
Public methods (18)
  • 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)
    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.category_id', 'product_uom.category_id')
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • 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 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 (3)
  • 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
    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 (12)
  • 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
    args: 'Repair Properties'
  • return_type_of_ids One2many → stock.picking.type
    args: 'stock.picking.type', 'return_picking_type_id'
Public methods (2)
  • action_repair_overview(self)
  • 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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, 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 UPDATE2026-07-06 01:02:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - 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

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
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
Models touched (17)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • create_repair Boolean
    groups='stock.group_stock_user' help='Create a linked Repair Order on Sale Order confirmation of this product.' args: 'Create Repair'
Public methods (1)
  • copy_data(self, default=None)

New fields (39)
  • company_id Many2one → res.company
    default=<expr> index=True readonly=True required=True args: 'res.company', 'Company'
  • 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'
  • 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'
Public methods (18)
  • action_assign(self)
  • action_create_sale_order(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')
  • compute_picking_product_ids(self)
    @api.depends('picking_id')
  • compute_product_uom(self)
    @api.depends('product_id', 'product_id.uom_id.category_id', 'product_uom.category_id')
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields_list)
    @api.model
  • 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 (1)
  • repair_ids Many2many → repair.order
    string='Repair Orders' args: 'repair.order'
Public methods (1)
  • action_validate(self)

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_list)

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 ondelete='cascade' args: 'repair.order'
  • repair_line_type Selection
    index=True store=True args: [('add', 'Add'), ('remove', 'Remove'), ('recycle', 'Recycle')], 'Type'
Public methods (5)
  • 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 (3)
  • 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
    args: 'repair.order', 'picking_id'
Public methods (2)
  • action_repair_return(self)
  • action_view_repairs(self)

New fields (8)
  • 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
    args: 'stock.picking.type', 'return_picking_type_id'
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 (1)
  • 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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, 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 UPDATE2026-07-06 00:40:51
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - mail
    - 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

Code Analysis

Views touched (16)
XML IDNameModelTypeStatus
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
Models touched (15)

New fields (1)
  • repair_ids One2many → repair.order
    copy=False readonly=True args: 'repair.order', 'invoice_id'
Public methods (1)
  • unlink(self)

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

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (14)
  • 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'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.
  • write(self, vals)

New fields (21)
  • 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'
Public methods (2)
  • onchange_operation_type(self)
    @api.onchange('type')
    On change of operation type it sets source location, destination location and to invoice field. @param product: Changed operation type. @param guarantee_limit: Guarantee limit of current record. @return: Dictionary of values.
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (39)
  • 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
    args: 'Repair Description'
  • 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
    args: 'Internal Notes'
  • 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
    args: 'Quotation Notes'
  • 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
    args: 'Scheduled 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'
Public methods (17)
  • action_created_invoice(self)
  • action_repair_cancel(self)
  • action_repair_cancel_draft(self)
  • action_repair_confirm(self)
    Repair order state is set to 'To be invoiced' when invoice method is 'Before repair' else state becomes 'Confirmed'. @param *arg: Arguments @return: True
  • action_repair_done(self)
    Creates stock move for operation and stock move for final product of repair order. @return: Move ids of final products
  • action_repair_end(self)
    Writes repair order state to 'To be invoiced' if invoice method is After repair else state is set to 'Ready'. @return: True
  • action_repair_invoice_create(self)
  • action_repair_ready(self)
  • action_repair_start(self)
    Writes repair order state to 'Under Repair' @return: True
  • action_send_mail(self)
  • action_validate(self)
  • button_dummy(self)
  • create(self, vals_list)
    @api.model_create_multi
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • print_repair_order(self)

New fields (1)
  • group Boolean
    args: 'Group by partner invoice address'
Public methods (1)
  • make_invoices(self)

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_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'
Public methods (1)
  • action_view_ro(self)

New fields (1)
  • repair_id Many2one → repair.order
    check_company=True args: 'repair.order'
Public methods (0)

No public methods.

New fields (3)
  • 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
    args: 'repair.order', 'picking_id'
Public methods (2)
  • action_repair_return(self)
  • action_view_repairs(self)

New fields (2)
  • 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
    args: 'stock.picking.type', 'return_picking_type_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael 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 UPDATE2026-07-06 00:25:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - mail
    - 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

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
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
Models touched (13)

New fields (1)
  • repair_ids One2many → repair.order
    copy=False readonly=True args: 'repair.order', 'invoice_id'
Public methods (1)
  • unlink(self)

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

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (14)
  • 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'
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (21)
  • 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'
Public methods (2)
  • onchange_operation_type(self)
    @api.onchange('type')
    On change of operation type it sets source location, destination location and to invoice field. @param product: Changed operation type. @param guarantee_limit: Guarantee limit of current record. @return: Dictionary of values.
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (36)
  • 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
    args: 'Repair Description'
  • 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
    args: 'Internal Notes'
  • 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
    args: 'Quotation Notes'
  • 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
    args: 'Scheduled 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'
Public methods (17)
  • action_created_invoice(self)
  • action_repair_cancel(self)
  • action_repair_cancel_draft(self)
  • action_repair_confirm(self)
    Repair order state is set to 'To be invoiced' when invoice method is 'Before repair' else state becomes 'Confirmed'. @param *arg: Arguments @return: True
  • action_repair_done(self)
    Creates stock move for operation and stock move for final product of repair order. @return: Move ids of final products
  • action_repair_end(self)
    Writes repair order state to 'To be invoiced' if invoice method is After repair else state is set to 'Ready'. @return: True
  • action_repair_invoice_create(self)
  • action_repair_ready(self)
  • action_repair_start(self)
    Writes repair order state to 'Under Repair' @return: True
  • action_send_mail(self)
  • action_validate(self)
  • button_dummy(self)
  • create(self, vals)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • print_repair_order(self)

New fields (1)
  • group Boolean
    args: 'Group by partner invoice address'
Public methods (1)
  • make_invoices(self)

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 (1)
  • repair_id Many2one → repair.order
    check_company=True args: 'repair.order'
Public methods (0)

No public methods.

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

New fields (0)

No new fields.

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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYInventory/Inventory
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, 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 UPDATE2026-07-06 00:14:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - mail
    - 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

Code Analysis

Views touched (13)
XML IDNameModelTypeStatus
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
Models touched (11)

New fields (1)
  • repair_ids One2many → repair.order
    copy=False readonly=True args: 'repair.order', 'invoice_id'
Public methods (1)
  • unlink(self)

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

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (14)
  • 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'
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (20)
  • 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'
Public methods (2)
  • onchange_operation_type(self)
    @api.onchange('type')
    On change of operation type it sets source location, destination location and to invoice field. @param product: Changed operation type. @param guarantee_limit: Guarantee limit of current record. @return: Dictionary of values.
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (32)
  • 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
    args: 'Internal Notes'
  • 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
    args: 'Quotation Notes'
  • 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'
Public methods (18)
  • action_created_invoice(self)
  • action_repair_cancel(self)
  • action_repair_cancel_draft(self)
  • action_repair_confirm(self)
    Repair order state is set to 'To be invoiced' when invoice method is 'Before repair' else state becomes 'Confirmed'. @param *arg: Arguments @return: True
  • action_repair_done(self)
    Creates stock move for operation and stock move for final product of repair order. @return: Move ids of final products
  • action_repair_end(self)
    Writes repair order state to 'To be invoiced' if invoice method is After repair else state is set to 'Ready'. @return: True
  • action_repair_invoice_create(self)
  • action_repair_ready(self)
  • action_repair_start(self)
    Writes repair order state to 'Under Repair' @return: True
  • action_send_mail(self)
  • action_validate(self)
  • button_dummy(self)
  • create(self, vals)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • print_repair_order(self)
  • unlink(self)

New fields (1)
  • group Boolean
    args: 'Group by partner invoice address'
Public methods (1)
  • make_invoices(self)

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 (1)
  • repair_id Many2one → repair.order
    check_company=True args: 'repair.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYManufacturing/Manufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, 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 UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - mail
    - 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

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
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
Models touched (11)

New fields (1)
  • repair_ids One2many → repair.order
    copy=False readonly=True args: 'repair.order', 'invoice_id'
Public methods (0)

No public methods.

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

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • cancel_repair(self)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model

New fields (12)
  • 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
    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
    args: 'account.tax', 'repair_fee_line_tax', 'repair_fee_line_id', 'tax_id', 'Taxes'
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (18)
  • 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
    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
    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
    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'
Public methods (3)
  • constrain_lot_id(self)
    @api.constrains('lot_id', 'product_id')
  • onchange_operation_type(self)
    @api.onchange('type', 'repair_id')
    On change of operation type it sets source location, destination location and to invoice field. @param product: Changed operation type. @param guarantee_limit: Guarantee limit of current record. @return: Dictionary of values.
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (30)
  • 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
    args: 'Internal Notes'
  • 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
    args: 'res.partner', 'Invoicing Address'
  • 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
    args: 'Quotation Notes'
  • 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'
Public methods (17)
  • action_created_invoice(self)
  • action_repair_cancel(self)
  • action_repair_cancel_draft(self)
  • action_repair_confirm(self)
    Repair order state is set to 'To be invoiced' when invoice method is 'Before repair' else state becomes 'Confirmed'. @param *arg: Arguments @return: True
  • action_repair_done(self)
    Creates stock move for operation and stock move for final product of repair order. @return: Move ids of final products
  • action_repair_end(self)
    Writes repair order state to 'To be invoiced' if invoice method is After repair else state is set to 'Ready'. @return: True
  • action_repair_invoice_create(self)
  • action_repair_ready(self)
  • action_repair_start(self)
    Writes repair order state to 'Under Repair' @return: True
  • action_send_mail(self)
  • action_validate(self)
  • button_dummy(self)
  • create(self, vals)
    @api.model
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • print_repair_order(self)

New fields (1)
  • group Boolean
    args: 'Group by partner invoice address'
Public methods (1)
  • make_invoices(self)

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

No public methods.

New fields (1)
  • repair_id Many2one → repair.order
    args: 'repair.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

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)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/repair
VERSION
VERSION 1.0
CATEGORY
CATEGORYManufacturing
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael 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 UPDATE2026-07-05 23:57:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - 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

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
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
Models touched (8)

New fields (0)

No new fields.

Public methods (2)
  • cancel_repair(self)
    @api.multi
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model

New fields (10)
  • 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
    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' required=True args: 'repair.order', 'Repair Order Reference'
  • tax_id Many2many → account.tax
    args: 'account.tax', 'repair_fee_line_tax', 'repair_fee_line_id', 'tax_id', 'Taxes'
Public methods (1)
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (16)
  • 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
    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_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
    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'
Public methods (3)
  • constrain_lot_id(self)
    @api.constrains('lot_id', 'product_id')
  • onchange_operation_type(self)
    @api.onchange('type', 'repair_id')
    On change of operation type it sets source location, destination location and to invoice field. @param product: Changed operation type. @param guarantee_limit: Guarantee limit of current record. @return: Dictionary of values.
  • onchange_product_id(self)
    @api.onchange('repair_id', 'product_id', 'product_uom_qty')
    On change of product it sets product quantity, tax account, name, uom of product, unit price and price subtotal.

New fields (27)
  • 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
    args: 'Internal Notes'
  • 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
    args: 'res.partner', 'Invoicing Address'
  • 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
    args: 'Quotation Notes'
  • 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'
Public methods (17)
  • action_created_invoice(self)
    @api.multi
  • action_invoice_create(self, group=False)
    @api.multi
    Creates invoice(s) for repair order. @param group: It is set to true when group invoice is to be generated. @return: Invoice Ids.
  • action_repair_cancel(self)
    @api.multi
  • action_repair_cancel_draft(self)
    @api.multi
  • action_repair_confirm(self)
    @api.multi
    Repair order state is set to 'To be invoiced' when invoice method is 'Before repair' else state becomes 'Confirmed'. @param *arg: Arguments @return: True
  • action_repair_done(self)
    @api.multi
    Creates stock move for operation and stock move for final product of repair order. @return: Move ids of final products
  • action_repair_end(self)
    @api.multi
    Writes repair order state to 'To be invoiced' if invoice method is After repair else state is set to 'Ready'. @return: True
  • action_repair_invoice_create(self)
  • action_repair_ready(self)
  • action_repair_start(self)
    @api.multi
    Writes repair order state to 'Under Repair' @return: True
  • action_send_mail(self)
    @api.multi
  • action_validate(self)
  • button_dummy(self)
    @api.multi
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_product_id(self)
    @api.onchange('product_id')
  • onchange_product_uom(self)
    @api.onchange('product_uom')
  • print_repair_order(self)
    @api.multi

New fields (1)
  • group Boolean
    args: 'Group by partner invoice address'
Public methods (1)
  • make_invoices(self)
    @api.multi

New fields (1)
  • repair_id Many2one → repair.order
    args: 'repair.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

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)