Return Merchandise Authorization Management

rma
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/18.0/rma
VERSION
VERSION 2.5.1
CATEGORY
CATEGORYRMA
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSsbejaoui, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, eduezerouali-tecnativa
WEBSITE
WEBSITEhttps://github.com/OCA/rma
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows you to manage [Return Merchandise Authorization
(RMA)](https://en.wikipedia.org/wiki/Return_merchandise_authorization).
RMA documents can be created from scratch, from a delivery order or from
an incoming email. Product receptions and returning delivery operations
of the RMA module are fully integrated with the Receipts and Deliveries
Operations of Odoo inventory core module. It also allows you to generate
refunds in the same way as Odoo generates it. Besides, you have full
integration of the RMA documents in the customer portal.

Code Analysis

Views touched (33)
XML IDNameModelTypeStatus
portal_my_home_menu_rma Portal layout : RMA menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_rma Portal My Home : RMA entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_rmas My RMA Orders ir.ui.view qweb New
portal_rma_page My RMA ir.ui.view qweb New
report_rma report_rma ir.ui.view qweb New
report_rma_document report_rma_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings xpath Inherits base.res_config_settings_view_form
rma_finalization_form rma xpath Inherits rma.rma_view_form
rma_finalization_view_search rma.finalization search New
rma_finalization_wizard_view_form rma.finalization.wizard form New
rma_operation_form_view rma.operation form New
rma_operation_kanban rma.operation.kanban rma.operation kanban New
rma_operation_search_view rma.operation search New
rma_operation_tree_view rma.operation list New
rma_redelivery_wizard_view_form rma.delivery.wizard.form rma.delivery.wizard form New
rma_rma_wizard_form_view rma.rma.wizard.form rma.rma.wizard form New
rma_split_wizard_view_form2 rma.split.wizard.form rma.split.wizard form New
rma_tag_view_search rma.tag search New
rma_team_view_form rma.team.view.form rma.team form New
rma_team_view_tree rma.team list New
rma_view_calendar rma.calendar rma calendar New
rma_view_form rma.view.form rma form New
rma_view_pivot rma.pivot rma pivot New
rma_view_search rma.view.search rma search New
rma_view_tree rma.view.tree rma list New
view_partner_form res.partner.form res.partner div Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking div Inherits stock.view_picking_form
view_rma_finalization_form Rma Finalization Reasons rma.finalization form New
view_rma_finalization_list RMA Finalization Reasons rma.finalization list New
view_rma_tag_form Tags rma.tag form New
view_rma_tag_list Tags rma.tag list New
view_stock_return_picking_form Return lines inherit RMA stock.return.picking xpath Inherits stock.view_stock_return_picking_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
Models touched (21)

New fields (0)

No new fields.

Public methods (2)
  • action_post(self)
    Avoids to validate a refund with less quantity of product than quantity in the linked RMA.
  • unlink(self)

New fields (1)
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (0)

No public methods.

New fields (8)
  • rma_mail_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_confirmation_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA is confirmed.' string='Email Template confirmation for RMA'
  • rma_mail_draft_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_draft_template domain="[('model', '=', 'rma')]" help='Email sent to the customer when they place an RMA from the portal' string='Email Template draft notification for RMA'
  • rma_mail_receipt_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_receipt_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA products are received.' string='Email Template receipt confirmation for RMA'
  • rma_new_rma_button_from_rma Boolean
    help='If an RMA has been delivered (returned or replaced), a button will appear that allows you to create a new RMA to manage the delivered items' string='Button to create a new RMA from another one'
  • rma_return_grouping Boolean
    default=True string='Group RMA returns by customer address and warehouse'
  • send_rma_confirmation Boolean
    help='When the delivery is confirmed, send a confirmation email to the customer.' string='Send RMA Confirmation'
  • send_rma_draft_confirmation Boolean
    help='When a customer places an RMA, send a notification with it' string='Send RMA draft Confirmation'
  • send_rma_receipt_confirmation Boolean
    help='When the RMA receipt is confirmed, send a confirmation email to the customer.' string='Send RMA Receipt Confirmation'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • create_rma_index(self)

New fields (9)
  • group_rma_manual_finalization Boolean
    help='Allow to finish an RMA without returning back a product or refunding' implied_group='rma.group_rma_manual_finalization' string='Finish RMA manually choosing a reason'
  • rma_mail_confirmation_template_id Many2one
    domain="[('model', '=', 'rma')]" readonly=False related='company_id.rma_mail_confirmation_template_id'
  • rma_mail_draft_confirmation_template_id Many2one
    domain="[('model', '=', 'rma')]" readonly=False related='company_id.rma_mail_draft_confirmation_template_id'
  • rma_mail_receipt_confirmation_template_id Many2one
    domain="[('model', '=', 'rma')]" readonly=False related='company_id.rma_mail_receipt_confirmation_template_id'
  • rma_new_rma_button_from_rma Boolean
    readonly=False related='company_id.rma_new_rma_button_from_rma'
  • rma_return_grouping Boolean
    readonly=False related='company_id.rma_return_grouping'
  • send_rma_confirmation Boolean
    readonly=False related='company_id.send_rma_confirmation'
  • send_rma_draft_confirmation Boolean
    readonly=False related='company_id.send_rma_draft_confirmation'
  • send_rma_receipt_confirmation Boolean
    readonly=False related='company_id.send_rma_receipt_confirmation'
Public methods (0)

No public methods.

New fields (2)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
  • rma_ids One2many → rma
    comodel_name='rma' inverse_name='partner_id' string='RMAs'
Public methods (1)
  • action_view_rma(self)

New fields (1)
  • rma_team_id Many2one → rma.team
    comodel_name='rma.team' help='RMA Team the user is member of.' string='RMA Team'
Public methods (0)

No public methods.

New fields (50)
  • can_be_finished Boolean
    compute='_compute_can_be_finished'
  • can_be_locked Boolean
    compute='_compute_can_be_locked'
  • can_be_new_rma Boolean
    compute='_compute_can_be_new_rma' compute_sudo=True
  • can_be_refunded Boolean
    compute='_compute_can_be_refunded'
  • can_be_replaced Boolean
    compute='_compute_can_be_replaced'
  • can_be_returned Boolean
    compute='_compute_can_be_returned'
  • can_be_split Boolean
    compute='_compute_can_be_split'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr>
  • date Datetime
    default=fields.Datetime.now index=True required=True
  • deadline Date
  • delivered_qty Float
    compute='_compute_delivered_qty' digits='Product Unit of Measure' store=True
  • delivery_move_ids One2many → stock.move
    comodel_name='stock.move' copy=False inverse_name='rma_id' string='Delivery reservation'
  • delivery_picking_count Integer
    compute='_compute_delivery_picking_count' string='Delivery count'
  • description Html
  • different_return_product Boolean
    related='operation_id.different_return_product'
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Finalization Reason' tracking=True
  • location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_location_id' domain=_domain_location_id readonly=False store=True
  • manual_finish_allowed Boolean
    compute='_compute_manual_finish_allowed' help='Indicates whether this RMA can be manually finished, without requiring further processing such as a receipt, delivery, or refund.'
  • move_id Many2one → stock.move
    comodel_name='stock.move' compute='_compute_move_id' domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]" readonly=False store=True string='Origin move'
  • name Char
    copy=False default=<expr> index=True
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation' tracking=True
  • origin Char
    help='Reference of the document that generated this RMA.' string='Source Document'
  • origin_split_rma_id Many2one → rma
    comodel_name='rma' copy=False string='Extracted from'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True string='Customer' tracking=True
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_invoice_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Refund address for current RMA.' readonly=False store=True string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_shipping_id' help='Shipping address for current RMA.' readonly=False store=True string='Shipping Address'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]" string='Origin Delivery'
  • priority Selection
    default='1' selection=PROCUREMENT_PRIORITIES
  • procurement_group_id Many2one → procurement.group
    comodel_name='procurement.group' string='Procurement group'
  • product_id Many2one → product.product
    comodel_name='product.product' compute='_compute_product_id' domain=[('type', 'in', ['consu', 'product'])] readonly=False store=True
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_product_uom' default=<expr> readonly=False required=True store=True string='UoM'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' default=1.0 digits='Product Unit of Measure' readonly=False required=True store=True string='Quantity'
  • reception_move_id Many2one → stock.move
    comodel_name='stock.move' copy=False string='Reception move'
  • refund_id Many2one → account.move
    comodel_name='account.move' copy=False
  • refund_line_id Many2one → account.move.line
    comodel_name='account.move.line' copy=False
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty'
  • return_product_id Many2one → product.product
    help="Product to be returned if it's different from the originally delivered item." args: 'product.product'
  • rma_count Integer
    compute='_compute_rma_count' compute_sudo=True string='RMA count'
  • sent Boolean
  • show_create_receipt Boolean
    compute='_compute_show_create_receipt' string='Show Create Receipt Button'
  • show_create_refund Boolean
    compute='_compute_show_refund_replace' string='Show Create refund Button'
  • show_create_replace Boolean
    compute='_compute_show_create_replace' string='Show Create replace Button'
  • show_create_return Boolean
    compute='_compute_show_create_return' string='Show Create Return Button'
  • state Selection
    copy=False default='draft' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('received', 'Received'), ('waiting_return', 'Waiting for return'), ('waiting_replacement', 'Waiting for replacement'), ('refunded', 'Refunded/Not invoiceable'), ('returned', 'Returned'), ('replaced', 'Replaced'), ('finished', 'Finished'), ('locked', 'Locked'), ('cancelled', 'Canceled')]
  • tag_ids Many2many → rma.tag
    comodel_name='rma.tag' string='Tags'
  • team_id Many2one → rma.team
    comodel_name='rma.team' compute='_compute_team_id' index=True store=True string='RMA team'
  • uom_category_id Many2one
    related='product_id.uom_id.category_id' string='Category UoM'
  • user_id Many2one → res.users
    comodel_name='res.users' index=True string='Responsible' tracking=True
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' compute='_compute_warehouse_id' store=True
Public methods (30)
  • action_cancel(self)
    Invoked when 'Cancel' button in rma form view is clicked.
  • action_confirm(self)
    Invoked when 'Confirm' button in rma form view is clicked.
  • action_create_receipt(self)
  • action_create_rma(self)
  • action_draft(self)
  • action_finish(self)
    Invoked when a user wants to manually finalize the RMA
  • action_lock(self)
    Invoked when 'Lock' button in rma form view is clicked.
  • action_preview(self)
    Invoked when 'Preview' button in rma form view is clicked.
  • action_refund(self)
    Invoked when 'Refund' button in rma form view is clicked and 'rma_refund_action_server' server action is run.
  • action_replace(self)
    Invoked when 'Replace' button in rma form view is clicked.
  • action_return(self)
    Invoked when 'Return to customer' button in rma form view is clicked.
  • action_rma_send(self)
  • action_split(self)
    Invoked when 'Split' button in rma form view is clicked.
  • action_unlock(self)
    Invoked when 'Unlock' button in rma form view is clicked.
  • action_view_delivery(self)
    Invoked when 'Delivery' smart button in rma form view is clicked.
  • action_view_receipt(self)
    Invoked when 'Receipt' smart button in rma form view is clicked.
  • action_view_refund(self)
    Invoked when 'Refund' smart button in rma form view is clicked.
  • action_view_rma(self)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_replace(self, scheduled_date, warehouse, product, qty, uom)
    Intended to be invoked by the delivery wizard
  • create_return(self, scheduled_date, qty=None, uom=None)
    Intended to be invoked by the delivery wizard
  • extract_quantity(self, qty, uom)
  • message_new(self, msg_dict, custom_values=None)
    Extract the needed values from an incoming rma emails data-set to be used to create an RMA.
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
    Set 'sent' field to True when an email is sent from rma form view. This field (sent) is used to set the appropriate style to the 'Send by Email' button in the rma form view.
  • unlink(self)
  • update_received_state(self)
    Invoked by: [stock.move].unlink [stock.move]._action_cancel
  • update_received_state_on_reception(self)
    Invoked by: [stock.move]._action_done Here we can attach methods to trigger when the customer products are received on the RMA location, such as automatic notifications
  • update_replaced_state(self)
    Invoked by: [stock.move]._action_done [stock.move].unlink [stock.move]._action_cancel
  • update_returned_state(self)
    Invoked by [stock.move]._action_done

New fields (10)
  • company_id Many2one → res.company
    comodel_name='res.company' string='Company'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Replace Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' string='Product qty'
  • rma_count Integer
  • rma_return_grouping Boolean
    default=<expr> string='Group RMA returns by customer address and warehouse'
  • scheduled_date Datetime
    default=fields.Datetime.now required=True
  • type Selection
    required=True selection=[('replace', 'Replace'), ('return', 'Return to customer')]
  • uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' domain="[('company_id', '=', company_id)]" required=True string='Warehouse'
Public methods (2)
  • action_deliver(self)
  • default_get(self, fields_list)
    @api.model

New fields (3)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    comodel_name='res.company'
  • name Char
    copy=False required=True string='Reason Name' translate=True
Public methods (0)

No public methods.

New fields (1)
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' required=True string='Reason'
Public methods (1)
  • action_finish(self)

New fields (12)
  • action_create_delivery Selection
    default='manual_after_receipt' help='Define how the delivery action should be handled.' string='Delivery Action' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm'), ('manual_after_receipt', 'Manually After Receipt'), ('automatic_after_receipt', 'Automatically After Receipt')]
  • action_create_receipt Selection
    default='automatic_on_confirm' help='Define how the receipt action should be handled.' string='Create Receipt' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm')]
  • action_create_refund Selection
    default='manual_after_receipt' help='Define how the refund action should be handled.' string='Refund Action' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm'), ('manual_after_receipt', 'Manually After Receipt'), ('automatic_after_receipt', 'Automatically After Receipt'), ('update_quantity', 'Update Quantities')]
  • active Boolean
    default=True
  • auto_confirm_reception Boolean
    help='Enable this option to automatically confirm the reception when the RMA is confirmed.'
  • color Integer
  • count_rma_awaiting_action Integer
    compute='_compute_count_rma'
  • count_rma_draft Integer
    compute='_compute_count_rma'
  • count_rma_processed Integer
    compute='_compute_count_rma'
  • different_return_product Boolean
    help='If checked, allows the return of a product different from the one originally ordered. Used if the delivery is created automatically'
  • name Char
    required=True translate=True
  • prevent_delivery_grouping Boolean
    help='If enabled, RMAs using this operation will NOT be grouped into a single delivery picking, even if the company setting allows grouping.' string='Do not group deliveries'
Public methods (5)
  • copy(self, default=None)
  • get_action_all_rma(self)
  • get_action_rma_tree_awaiting_action(self)
  • get_action_rma_tree_draft(self)
  • get_action_rma_tree_processed(self)

New fields (2)
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' required=True string='Requested operation'
  • rma_id Many2one → rma
    comodel_name='rma' default=<expr>
Public methods (3)
  • create_and_open_rma(self)
  • create_rma(self)
  • default_get(self, fields_list)
    @api.model

New fields (3)
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' required=True string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' help='Quantity to extract to a new RMA.' required=True string='Quantity to extract'
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (3)
  • action_split(self)
  • default_get(self, fields_list)
    @api.model
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (5)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • color Integer
    string='Color Index'
  • is_public Boolean
    help='The tag is visible in the portal view' string='Public Tag'
  • name Char
    copy=False required=True string='Tag Name' translate=True
  • rma_ids Many2many → rma
    comodel_name='rma'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the RMA Team without removing it.'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • member_ids One2many → res.users
    comodel_name='res.users' inverse_name='rma_team_id' string='Team Members'
  • name Char
    required=True translate=True
  • sequence Integer
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=[('share', '=', False)] string='Team Leader'
Public methods (1)
  • copy(self, default=None)

New fields (3)
  • rma_id Many2one → rma
    comodel_name='rma' copy=False index=True string='RMA return'
  • rma_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='move_id' string='RMAs'
  • rma_receiver_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='reception_move_id' string='RMA receivers'
Public methods (1)
  • unlink(self)

New fields (1)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
Public methods (1)
  • action_view_rma(self)

New fields (3)
  • create_rma Boolean
    string='Create RMAs'
  • picking_type_code Selection
    related='picking_id.picking_type_id.code'
  • rma_operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
Public methods (1)
  • action_create_returns(self)
    Override create_returns method for creating one or more 'confirmed' RMAs after return a delivery picking in case 'Create RMAs' checkbox is checked in this wizard. New RMAs will be linked to the delivery picking as the origin delivery and also RMAs will be linked to the returned picking as the 'Receipt'.

New fields (3)
  • different_return_product Boolean
    related='rma_operation_id.different_return_product'
  • return_product_id Many2one → product.product
    help="Product to be returned if it's different from the originally delivered item." args: 'product.product'
  • rma_operation_id Many2one → rma.operation
    comodel_name='rma.operation' compute='_compute_rma_operation_id' readonly=False store=True string='Operation'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • rma Boolean
    default=True help='RMA related products can be stored in this warehouse.' args: 'RMA'
  • rma_in_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'RMA in Route'
  • rma_in_type_id Many2one → stock.picking.type
    check_company=True comodel_name='stock.picking.type' copy=False string='RMA In Type'
  • rma_loc_id Many2one → stock.location
    check_company=True comodel_name='stock.location' string='RMA Location'
  • rma_out_replace_route_id Many2one → stock.route
    args: 'stock.route', 'RMA out Replace Route'
  • rma_out_route_id Many2one → stock.route
    copy=False ondelete='restrict' args: 'stock.route', 'RMA out Route'
  • rma_out_type_id Many2one → stock.picking.type
    check_company=True comodel_name='stock.picking.type' copy=False string='RMA Out Type'
Public methods (1)
  • get_rules_dict(self)
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/17.0/rma
VERSION
VERSION 3.3.3
CATEGORY
CATEGORYRMA
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSsbejaoui, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Joshua Lauer, Antoni Marroig Campomar, Juan Alberto Raja, giovannigd
WEBSITE
WEBSITEhttps://github.com/OCA/rma
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows you to manage [Return Merchandise Authorization
(RMA)](https://en.wikipedia.org/wiki/Return_merchandise_authorization).
RMA documents can be created from scratch, from a delivery order or from
an incoming email. Product receptions and returning delivery operations
of the RMA module are fully integrated with the Receipts and Deliveries
Operations of Odoo inventory core module. It also allows you to generate
refunds in the same way as Odoo generates it. Besides, you have full
integration of the RMA documents in the customer portal.

Code Analysis

Views touched (32)
XML IDNameModelTypeStatus
portal_my_home_menu_rma Portal layout : RMA menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_rma Portal My Home : RMA entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_rmas My RMA Orders ir.ui.view qweb New
portal_rma_page My RMA ir.ui.view qweb New
report_rma report_rma ir.ui.view qweb New
report_rma_document report_rma_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings xpath Inherits base.res_config_settings_view_form
rma_finalization_form rma xpath Inherits rma.rma_view_form
rma_finalization_view_search rma.finalization search New
rma_finalization_wizard_view_form rma.finalization.wizard form New
rma_operation_form_view rma.operation form New
rma_operation_kanban rma.operation kanban New
rma_operation_search_view rma.operation search New
rma_operation_tree_view rma.operation tree New
rma_redelivery_wizard_view_form rma.delivery.wizard.form rma.delivery.wizard form New
rma_split_wizard_view_form2 rma.split.wizard.form rma.split.wizard form New
rma_tag_view_search rma.tag search New
rma_team_view_form rma.team.view.form rma.team form New
rma_team_view_tree rma.team tree New
rma_view_calendar rma.calendar rma calendar New
rma_view_form rma.view.form rma form New
rma_view_pivot rma.pivot rma pivot New
rma_view_search rma.view.search rma search New
rma_view_tree rma.view.tree rma tree New
view_partner_form res.partner.form res.partner div Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking div Inherits stock.view_picking_form
view_rma_finalization_form Rma Finalization Reasons rma.finalization form New
view_rma_finalization_list RMA Finalization Reasons rma.finalization tree New
view_rma_tag_form Rma Tags rma.tag form New
view_rma_tag_list RMA Tags rma.tag tree New
view_stock_return_picking_form Return lines inherit RMA stock.return.picking xpath Inherits stock.view_stock_return_picking_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
Models touched (20)

New fields (0)

No new fields.

Public methods (2)
  • action_post(self)
    Avoids to validate a refund with less quantity of product than quantity in the linked RMA.
  • unlink(self)

New fields (1)
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (0)

No public methods.

New fields (7)
  • rma_mail_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_confirmation_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA is confirmed.' string='Email Template confirmation for RMA'
  • rma_mail_draft_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_draft_template domain="[('model', '=', 'rma')]" help='Email sent to the customer when they place an RMA from the portal' string='Email Template draft notification for RMA'
  • rma_mail_receipt_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_receipt_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA products are received.' string='Email Template receipt confirmation for RMA'
  • rma_return_grouping Boolean
    default=True string='Group RMA returns by customer address and warehouse'
  • send_rma_confirmation Boolean
    help='When the delivery is confirmed, send a confirmation email to the customer.' string='Send RMA Confirmation'
  • send_rma_draft_confirmation Boolean
    help='When a customer places an RMA, send a notification with it' string='Send RMA draft Confirmation'
  • send_rma_receipt_confirmation Boolean
    help='When the RMA receipt is confirmed, send a confirmation email to the customer.' string='Send RMA Receipt Confirmation'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • create_rma_index(self)

New fields (8)
  • group_rma_manual_finalization Boolean
    help='Allow to finish an RMA without returning back a product or refunding' implied_group='rma.group_rma_manual_finalization' string='Finish RMA manually choosing a reason'
  • rma_mail_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_confirmation_template_id'
  • rma_mail_draft_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_draft_confirmation_template_id'
  • rma_mail_receipt_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_receipt_confirmation_template_id'
  • rma_return_grouping Boolean
    readonly=False related='company_id.rma_return_grouping'
  • send_rma_confirmation Boolean
    readonly=False related='company_id.send_rma_confirmation'
  • send_rma_draft_confirmation Boolean
    readonly=False related='company_id.send_rma_draft_confirmation'
  • send_rma_receipt_confirmation Boolean
    readonly=False related='company_id.send_rma_receipt_confirmation'
Public methods (0)

No public methods.

New fields (2)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
  • rma_ids One2many → rma
    comodel_name='rma' inverse_name='partner_id' string='RMAs'
Public methods (1)
  • action_view_rma(self)

New fields (1)
  • rma_team_id Many2one → rma.team
    comodel_name='rma.team' help='RMA Team the user is member of.' string='RMA Team'
Public methods (0)

No public methods.

New fields (48)
  • can_be_finished Boolean
    compute='_compute_can_be_finished'
  • can_be_locked Boolean
    compute='_compute_can_be_locked'
  • can_be_refunded Boolean
    compute='_compute_can_be_refunded'
  • can_be_replaced Boolean
    compute='_compute_can_be_replaced'
  • can_be_returned Boolean
    compute='_compute_can_be_returned'
  • can_be_split Boolean
    compute='_compute_can_be_split'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr>
  • date Datetime
    default=fields.Datetime.now index=True required=True
  • deadline Date
  • delivered_qty Float
    compute='_compute_delivered_qty' digits='Product Unit of Measure' store=True
  • delivery_move_ids One2many → stock.move
    comodel_name='stock.move' copy=False inverse_name='rma_id' string='Delivery reservation'
  • delivery_picking_count Integer
    compute='_compute_delivery_picking_count' string='Delivery count'
  • description Html
  • different_return_product Boolean
    related='operation_id.different_return_product'
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Finalization Reason' tracking=True
  • location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_location_id' domain=_domain_location_id readonly=False store=True
  • manual_finish_allowed Boolean
    compute='_compute_manual_finish_allowed' help='Indicates whether this RMA can be manually finished, without requiring further processing such as a receipt, delivery, or refund.'
  • move_id Many2one → stock.move
    comodel_name='stock.move' compute='_compute_move_id' domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]" readonly=False store=True string='Origin move'
  • name Char
    copy=False default=<expr> index=True
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
  • origin Char
    help='Reference of the document that generated this RMA.' string='Source Document'
  • origin_split_rma_id Many2one → rma
    comodel_name='rma' copy=False string='Extracted from'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True string='Customer' tracking=True
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_invoice_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Refund address for current RMA.' readonly=False store=True string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_shipping_id' help='Shipping address for current RMA.' readonly=False store=True string='Shipping Address'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]" string='Origin Delivery'
  • priority Selection
    default='1' selection=PROCUREMENT_PRIORITIES
  • procurement_group_id Many2one → procurement.group
    comodel_name='procurement.group' string='Procurement group'
  • product_id Many2one → product.product
    comodel_name='product.product' compute='_compute_product_id' domain=[('type', 'in', ['consu', 'product'])] readonly=False store=True
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_product_uom' default=<expr> readonly=False required=True store=True string='UoM'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' default=1.0 digits='Product Unit of Measure' readonly=False required=True store=True string='Quantity'
  • reception_move_id Many2one → stock.move
    comodel_name='stock.move' copy=False string='Reception move'
  • refund_id Many2one → account.move
    comodel_name='account.move' copy=False
  • refund_line_id Many2one → account.move.line
    comodel_name='account.move.line' copy=False
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty'
  • return_product_id Many2one → product.product
    help="Product to be returned if it's different from the originally delivered item." args: 'product.product'
  • sent Boolean
  • show_create_receipt Boolean
    compute='_compute_show_create_receipt' string='Show Create Receipt Button'
  • show_create_refund Boolean
    compute='_compute_show_refund_replace' string='Show Create refund Button'
  • show_create_replace Boolean
    compute='_compute_show_create_replace' string='Show Create replace Button'
  • show_create_return Boolean
    compute='_compute_show_create_return' string='Show Create Return Button'
  • state Selection
    copy=False default='draft' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('received', 'Received'), ('waiting_return', 'Waiting for return'), ('waiting_replacement', 'Waiting for replacement'), ('refunded', 'Refunded'), ('returned', 'Returned'), ('replaced', 'Replaced'), ('finished', 'Finished'), ('locked', 'Locked'), ('cancelled', 'Canceled')]
  • tag_ids Many2many → rma.tag
    comodel_name='rma.tag' string='Tags'
  • team_id Many2one → rma.team
    comodel_name='rma.team' compute='_compute_team_id' index=True store=True string='RMA team'
  • uom_category_id Many2one
    related='product_id.uom_id.category_id' string='Category UoM'
  • user_id Many2one → res.users
    comodel_name='res.users' index=True string='Responsible' tracking=True
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' compute='_compute_warehouse_id' store=True
Public methods (28)
  • action_cancel(self)
    Invoked when 'Cancel' button in rma form view is clicked.
  • action_confirm(self)
    Invoked when 'Confirm' button in rma form view is clicked.
  • action_create_receipt(self)
  • action_draft(self)
  • action_finish(self)
    Invoked when a user wants to manually finalize the RMA
  • action_lock(self)
    Invoked when 'Lock' button in rma form view is clicked.
  • action_preview(self)
    Invoked when 'Preview' button in rma form view is clicked.
  • action_refund(self)
    Invoked when 'Refund' button in rma form view is clicked and 'rma_refund_action_server' server action is run.
  • action_replace(self)
    Invoked when 'Replace' button in rma form view is clicked.
  • action_return(self)
    Invoked when 'Return to customer' button in rma form view is clicked.
  • action_rma_send(self)
  • action_split(self)
    Invoked when 'Split' button in rma form view is clicked.
  • action_unlock(self)
    Invoked when 'Unlock' button in rma form view is clicked.
  • action_view_delivery(self)
    Invoked when 'Delivery' smart button in rma form view is clicked.
  • action_view_receipt(self)
    Invoked when 'Receipt' smart button in rma form view is clicked.
  • action_view_refund(self)
    Invoked when 'Refund' smart button in rma form view is clicked.
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_replace(self, scheduled_date, warehouse, product, qty, uom)
    Intended to be invoked by the delivery wizard
  • create_return(self, scheduled_date, qty=None, uom=None)
    Intended to be invoked by the delivery wizard
  • extract_quantity(self, qty, uom)
  • message_new(self, msg_dict, custom_values=None)
    Extract the needed values from an incoming rma emails data-set to be used to create an RMA.
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
    Set 'sent' field to True when an email is sent from rma form view. This field (sent) is used to set the appropriate style to the 'Send by Email' button in the rma form view.
  • unlink(self)
  • update_received_state(self)
    Invoked by: [stock.move].unlink [stock.move]._action_cancel
  • update_received_state_on_reception(self)
    Invoked by: [stock.move]._action_done Here we can attach methods to trigger when the customer products are received on the RMA location, such as automatic notifications
  • update_replaced_state(self)
    Invoked by: [stock.move]._action_done [stock.move].unlink [stock.move]._action_cancel
  • update_returned_state(self)
    Invoked by [stock.move]._action_done

New fields (9)
  • product_id Many2one → product.product
    comodel_name='product.product' string='Replace Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' string='Product qty'
  • rma_count Integer
  • rma_return_grouping Boolean
    default=<expr> string='Group RMA returns by customer address and warehouse'
  • scheduled_date Datetime
    default=fields.Datetime.now required=True
  • type Selection
    required=True selection=[('replace', 'Replace'), ('return', 'Return to customer')]
  • uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' required=True string='Warehouse'
Public methods (2)
  • action_deliver(self)
  • default_get(self, fields_list)
    @api.model

New fields (3)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    comodel_name='res.company'
  • name Char
    copy=False required=True string='Reason Name' translate=True
Public methods (0)

No public methods.

New fields (1)
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' required=True string='Reason'
Public methods (1)
  • action_finish(self)

New fields (12)
  • action_create_delivery Selection
    default='manual_after_receipt' help='Define how the delivery action should be handled.' string='Delivery Action' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm'), ('manual_after_receipt', 'Manually After Receipt'), ('automatic_after_receipt', 'Automatically After Receipt')]
  • action_create_receipt Selection
    default='automatic_on_confirm' help='Define how the receipt action should be handled.' string='Create Receipt' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm')]
  • action_create_refund Selection
    default='manual_after_receipt' help='Define how the refund action should be handled.' string='Refund Action' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm'), ('manual_after_receipt', 'Manually After Receipt'), ('automatic_after_receipt', 'Automatically After Receipt'), ('update_quantity', 'Update Quantities')]
  • active Boolean
    default=True
  • auto_confirm_reception Boolean
    help='Enable this option to automatically confirm the reception when the RMA is confirmed.'
  • color Integer
  • count_rma_awaiting_action Integer
    compute='_compute_count_rma'
  • count_rma_draft Integer
    compute='_compute_count_rma'
  • count_rma_processed Integer
    compute='_compute_count_rma'
  • different_return_product Boolean
    help='If checked, allows the return of a product different from the one originally ordered. Used if the delivery is created automatically'
  • name Char
    required=True translate=True
  • prevent_delivery_grouping Boolean
    help='If enabled, RMAs using this operation will NOT be grouped into a single delivery picking, even if the company setting allows grouping.' string='Do not group deliveries'
Public methods (4)
  • get_action_all_rma(self)
  • get_action_rma_tree_awaiting_action(self)
  • get_action_rma_tree_draft(self)
  • get_action_rma_tree_processed(self)

New fields (3)
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' required=True string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' help='Quantity to extract to a new RMA.' required=True string='Quantity to extract'
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (3)
  • action_split(self)
  • default_get(self, fields_list)
    @api.model
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (5)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • color Integer
    string='Color Index'
  • is_public Boolean
    help='The tag is visible in the portal view' string='Public Tag'
  • name Char
    copy=False required=True string='Tag Name' translate=True
  • rma_ids Many2many → rma
    comodel_name='rma'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the RMA Team without removing it.'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • member_ids One2many → res.users
    comodel_name='res.users' inverse_name='rma_team_id' string='Team Members'
  • name Char
    required=True translate=True
  • sequence Integer
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=[('share', '=', False)] string='Team Leader'
Public methods (1)
  • copy(self, default=None)

New fields (3)
  • rma_id Many2one → rma
    comodel_name='rma' copy=False index=True string='RMA return'
  • rma_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='move_id' string='RMAs'
  • rma_receiver_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='reception_move_id' string='RMA receivers'
Public methods (1)
  • unlink(self)

New fields (1)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
Public methods (2)
  • action_view_rma(self)
  • copy(self, default=None)

New fields (5)
  • create_rma Boolean
    string='Create RMAs'
  • location_id Many2one
    domain="create_rma and [('id', 'child_of', rma_location_ids)]or ['|', ('id', '=', original_location_id), '|', '&', ('return_location', '=', True), ('company_id', '=', False), '&', ('return_location', '=', True), ('company_id', '=', company_id)]"
  • picking_type_code Selection
    related='picking_id.picking_type_id.code'
  • rma_location_ids Many2many → stock.location
    comodel_name='stock.location' compute='_compute_rma_location_id'
  • rma_operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
Public methods (1)
  • create_returns(self)
    Override create_returns method for creating one or more 'confirmed' RMAs after return a delivery picking in case 'Create RMAs' checkbox is checked in this wizard. New RMAs will be linked to the delivery picking as the origin delivery and also RMAs will be linked to the returned picking as the 'Receipt'.

New fields (3)
  • different_return_product Boolean
    related='rma_operation_id.different_return_product'
  • return_product_id Many2one → product.product
    help="Product to be returned if it's different from the originally delivered item." args: 'product.product'
  • rma_operation_id Many2one → rma.operation
    comodel_name='rma.operation' compute='_compute_rma_operation_id' readonly=False store=True string='Operation'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • rma Boolean
    default=True help='RMA related products can be stored in this warehouse.' args: 'RMA'
  • rma_in_route_id Many2one → stock.route
    args: 'stock.route', 'RMA in Route'
  • rma_in_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA In Type'
  • rma_loc_id Many2one → stock.location
    comodel_name='stock.location' string='RMA Location'
  • rma_out_replace_route_id Many2one → stock.route
    args: 'stock.route', 'RMA out Replace Route'
  • rma_out_route_id Many2one → stock.route
    args: 'stock.route', 'RMA out Route'
  • rma_out_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA Out Type'
Public methods (1)
  • get_rules_dict(self)
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/16.0/rma
VERSION
VERSION 5.3.6
CATEGORY
CATEGORYRMA
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, sbejaoui, Miquel Raïch, Víctor Martínez, Weblate, OCA-git-bot, David, oca-ci, Joshua Lauer
WEBSITE
WEBSITEhttps://github.com/OCA/rma
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:56
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (32)
XML IDNameModelTypeStatus
portal_my_home_menu_rma Portal layout : RMA menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_rma Portal My Home : RMA entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_rmas My RMA Orders ir.ui.view qweb New
portal_rma_page My RMA ir.ui.view qweb New
report_rma report_rma ir.ui.view qweb New
report_rma_document report_rma_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings xpath Inherits base.res_config_settings_view_form
rma_finalization_form rma xpath Inherits rma.rma_view_form
rma_finalization_view_search rma.finalization search New
rma_finalization_wizard_view_form rma.finalization.wizard form New
rma_operation_form_view rma.operation form New
rma_operation_kanban rma.operation kanban New
rma_operation_search_view rma.operation search New
rma_operation_tree_view rma.operation tree New
rma_redelivery_wizard_view_form rma.delivery.wizard.form rma.delivery.wizard form New
rma_split_wizard_view_form2 rma.split.wizard.form rma.split.wizard form New
rma_tag_view_search rma.tag search New
rma_team_view_form rma.team.view.form rma.team form New
rma_team_view_tree rma.team tree New
rma_view_calendar rma.calendar rma calendar New
rma_view_form rma.view.form rma form New
rma_view_pivot rma.pivot rma pivot New
rma_view_search rma.view.search rma search New
rma_view_tree rma.view.tree rma tree New
view_partner_form res.partner.form res.partner div Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking div Inherits stock.view_picking_form
view_rma_finalization_form Rma Finalization Reasons rma.finalization form New
view_rma_finalization_list RMA Finalization Reasons rma.finalization tree New
view_rma_tag_form Rma Tags rma.tag form New
view_rma_tag_list RMA Tags rma.tag tree New
view_stock_return_picking_form Return lines inherit RMA stock.return.picking xpath Inherits stock.view_stock_return_picking_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
Models touched (20)

New fields (0)

No new fields.

Public methods (2)
  • action_post(self)
    Avoids to validate a refund with less quantity of product than quantity in the linked RMA.
  • unlink(self)

New fields (1)
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (0)

No public methods.

New fields (7)
  • rma_mail_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_confirmation_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA is confirmed.' string='Email Template confirmation for RMA'
  • rma_mail_draft_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_draft_template domain="[('model', '=', 'rma')]" help='Email sent to the customer when they place an RMA from the portal' string='Email Template draft notification for RMA'
  • rma_mail_receipt_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_receipt_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA products are received.' string='Email Template receipt confirmation for RMA'
  • rma_return_grouping Boolean
    default=True string='Group RMA returns by customer address and warehouse'
  • send_rma_confirmation Boolean
    help='When the delivery is confirmed, send a confirmation email to the customer.' string='Send RMA Confirmation'
  • send_rma_draft_confirmation Boolean
    help='When a customer places an RMA, send a notification with it' string='Send RMA draft Confirmation'
  • send_rma_receipt_confirmation Boolean
    help='When the RMA receipt is confirmed, send a confirmation email to the customer.' string='Send RMA Receipt Confirmation'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • create_rma_index(self)

New fields (8)
  • group_rma_manual_finalization Boolean
    help='Allow to finish an RMA without returning back a product or refunding' implied_group='rma.group_rma_manual_finalization' string='Finish RMA manually choosing a reason'
  • rma_mail_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_confirmation_template_id'
  • rma_mail_draft_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_draft_confirmation_template_id'
  • rma_mail_receipt_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_receipt_confirmation_template_id'
  • rma_return_grouping Boolean
    readonly=False related='company_id.rma_return_grouping'
  • send_rma_confirmation Boolean
    readonly=False related='company_id.send_rma_confirmation'
  • send_rma_draft_confirmation Boolean
    readonly=False related='company_id.send_rma_draft_confirmation'
  • send_rma_receipt_confirmation Boolean
    readonly=False related='company_id.send_rma_receipt_confirmation'
Public methods (0)

No public methods.

New fields (2)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
  • rma_ids One2many → rma
    comodel_name='rma' inverse_name='partner_id' string='RMAs'
Public methods (1)
  • action_view_rma(self)

New fields (1)
  • rma_team_id Many2one → rma.team
    comodel_name='rma.team' help='RMA Team the user is member of.' string='RMA Team'
Public methods (0)

No public methods.

New fields (50)
  • can_be_finished Boolean
    compute='_compute_can_be_finished'
  • can_be_locked Boolean
    compute='_compute_can_be_locked'
  • can_be_refunded Boolean
    compute='_compute_can_be_refunded'
  • can_be_replaced Boolean
    compute='_compute_can_be_replaced'
  • can_be_returned Boolean
    compute='_compute_can_be_returned'
  • can_be_split Boolean
    compute='_compute_can_be_split'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • date Datetime
    default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)]}
  • deadline Date
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • delivered_qty Float
    compute='_compute_delivered_qty' digits='Product Unit of Measure' store=True
  • delivered_qty_done Float
    compute='_compute_delivered_qty' compute_sudo=True digits='Product Unit of Measure'
  • delivery_move_ids One2many → stock.move
    comodel_name='stock.move' copy=False inverse_name='rma_id' readonly=True string='Delivery reservation'
  • delivery_picking_count Integer
    compute='_compute_delivery_picking_count' string='Delivery count'
  • description Html
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • different_return_product Boolean
    related='operation_id.different_return_product'
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True string='Finalization Reason' tracking=True
  • location_id Many2one → stock.location
    comodel_name='stock.location' compute='_compute_location_id' domain=_domain_location_id readonly=False store=True
  • manual_finish_allowed Boolean
    compute='_compute_manual_finish_allowed' help='Indicates whether this RMA can be manually finished, without requiring further processing such as a receipt, delivery, or refund.'
  • move_id Many2one → stock.move
    comodel_name='stock.move' compute='_compute_move_id' domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]" readonly=False store=True string='Origin move'
  • name Char
    copy=False default=<expr> index=True readonly=True states={'draft': [('readonly', False)]}
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
  • origin Char
    help='Reference of the document that generated this RMA.' states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Source Document'
  • origin_split_rma_id Many2one → rma
    comodel_name='rma' copy=False readonly=True string='Extracted from'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True readonly=True states={'draft': [('readonly', False)]} string='Customer' tracking=True
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_invoice_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Refund address for current RMA.' readonly=False store=True string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' compute='_compute_partner_shipping_id' help='Shipping address for current RMA.' readonly=False store=True string='Shipping Address'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]" readonly=True states={'draft': [('readonly', False)]} string='Origin Delivery'
  • priority Selection
    default='1' readonly=True selection=PROCUREMENT_PRIORITIES states={'draft': [('readonly', False)]}
  • procurement_group_id Many2one → procurement.group
    comodel_name='procurement.group' readonly=True states={'draft': [('readonly', False)], 'confirmed': [('readonly', False)], 'received': [('readonly', False)]} string='Procurement group'
  • product_id Many2one → product.product
    comodel_name='product.product' compute='_compute_product_id' domain=[('type', 'in', ['consu', 'product'])] readonly=False store=True
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' compute='_compute_product_uom' default=<expr> readonly=False required=True store=True string='UoM'
  • product_uom_qty Float
    compute='_compute_product_uom_qty' default=1.0 digits='Product Unit of Measure' readonly=False required=True store=True string='Quantity'
  • reception_move_id Many2one → stock.move
    comodel_name='stock.move' copy=False string='Reception move'
  • refund_id Many2one → account.move
    comodel_name='account.move' copy=False readonly=True
  • refund_line_id Many2one → account.move.line
    comodel_name='account.move.line' copy=False readonly=True
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty'
  • remaining_qty_to_done Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty to done'
  • return_product_id Many2one → product.product
    help="Product to be returned if it's different from the originally delivered item." args: 'product.product'
  • sent Boolean
  • show_create_receipt Boolean
    compute='_compute_show_create_receipt' string='Show Create Receipt Button'
  • show_create_refund Boolean
    compute='_compute_show_refund_replace' string='Show Create refund Button'
  • show_create_replace Boolean
    compute='_compute_show_create_replace' string='Show Create replace Button'
  • show_create_return Boolean
    compute='_compute_show_create_return' string='Show Create Return Button'
  • state Selection
    copy=False default='draft' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('received', 'Received'), ('waiting_return', 'Waiting for return'), ('waiting_replacement', 'Waiting for replacement'), ('refunded', 'Refunded'), ('returned', 'Returned'), ('replaced', 'Replaced'), ('finished', 'Finished'), ('locked', 'Locked'), ('cancelled', 'Canceled')]
  • tag_ids Many2many → rma.tag
    comodel_name='rma.tag' string='Tags'
  • team_id Many2one → rma.team
    comodel_name='rma.team' compute='_compute_team_id' index=True readonly=False states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} store=True string='RMA team'
  • uom_category_id Many2one
    related='product_id.uom_id.category_id' string='Category UoM'
  • user_id Many2one → res.users
    comodel_name='res.users' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Responsible' tracking=True
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' compute='_compute_warehouse_id' store=True
Public methods (28)
  • action_cancel(self)
    Invoked when 'Cancel' button in rma form view is clicked.
  • action_confirm(self)
    Invoked when 'Confirm' button in rma form view is clicked.
  • action_create_receipt(self)
  • action_draft(self)
  • action_finish(self)
    Invoked when a user wants to manually finalize the RMA
  • action_lock(self)
    Invoked when 'Lock' button in rma form view is clicked.
  • action_preview(self)
    Invoked when 'Preview' button in rma form view is clicked.
  • action_refund(self)
    Invoked when 'Refund' button in rma form view is clicked and 'rma_refund_action_server' server action is run.
  • action_replace(self)
    Invoked when 'Replace' button in rma form view is clicked.
  • action_return(self)
    Invoked when 'Return to customer' button in rma form view is clicked.
  • action_rma_send(self)
  • action_split(self)
    Invoked when 'Split' button in rma form view is clicked.
  • action_unlock(self)
    Invoked when 'Unlock' button in rma form view is clicked.
  • action_view_delivery(self)
    Invoked when 'Delivery' smart button in rma form view is clicked.
  • action_view_receipt(self)
    Invoked when 'Receipt' smart button in rma form view is clicked.
  • action_view_refund(self)
    Invoked when 'Refund' smart button in rma form view is clicked.
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_replace(self, scheduled_date, warehouse, product, qty, uom)
    Intended to be invoked by the delivery wizard
  • create_return(self, scheduled_date, qty=None, uom=None)
    Intended to be invoked by the delivery wizard
  • extract_quantity(self, qty, uom)
  • message_new(self, msg_dict, custom_values=None)
    Extract the needed values from an incoming rma emails data-set to be used to create an RMA.
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
    Set 'sent' field to True when an email is sent from rma form view. This field (sent) is used to set the appropriate style to the 'Send by Email' button in the rma form view.
  • unlink(self)
  • update_received_state(self)
    Invoked by: [stock.move].unlink [stock.move]._action_cancel
  • update_received_state_on_reception(self)
    Invoked by: [stock.move]._action_done Here we can attach methods to trigger when the customer products are received on the RMA location, such as automatic notifications
  • update_replaced_state(self)
    Invoked by: [stock.move]._action_done [stock.move].unlink [stock.move]._action_cancel
  • update_returned_state(self)
    Invoked by [stock.move]._action_done

New fields (9)
  • product_id Many2one → product.product
    comodel_name='product.product' string='Replace Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' string='Product qty'
  • rma_count Integer
  • rma_return_grouping Boolean
    default=<expr> string='Group RMA returns by customer address and warehouse'
  • scheduled_date Datetime
    default=fields.Datetime.now required=True
  • type Selection
    required=True selection=[('replace', 'Replace'), ('return', 'Return to customer')]
  • uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' required=True string='Warehouse'
Public methods (2)
  • action_deliver(self)
  • default_get(self, fields_list)
    @api.model

New fields (3)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    comodel_name='res.company'
  • name Char
    copy=False required=True string='Reason Name' translate=True
Public methods (0)

No public methods.

New fields (1)
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' required=True string='Reason'
Public methods (1)
  • action_finish(self)

New fields (12)
  • action_create_delivery Selection
    default='manual_after_receipt' help='Define how the delivery action should be handled.' string='Delivery Action' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm'), ('manual_after_receipt', 'Manually After Receipt'), ('automatic_after_receipt', 'Automatically After Receipt')]
  • action_create_receipt Selection
    default='automatic_on_confirm' help='Define how the receipt action should be handled.' string='Create Receipt' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm')]
  • action_create_refund Selection
    default='manual_after_receipt' help='Define how the refund action should be handled.' string='Refund Action' args: [('manual_on_confirm', 'Manually on Confirm'), ('automatic_on_confirm', 'Automatically on Confirm'), ('manual_after_receipt', 'Manually After Receipt'), ('automatic_after_receipt', 'Automatically After Receipt'), ('update_quantity', 'Update Quantities')]
  • active Boolean
    default=True
  • auto_confirm_reception Boolean
    help='Enable this option to automatically confirm the reception when the RMA is confirmed.'
  • color Integer
  • count_rma_awaiting_action Integer
    compute='_compute_count_rma'
  • count_rma_draft Integer
    compute='_compute_count_rma'
  • count_rma_processed Integer
    compute='_compute_count_rma'
  • different_return_product Boolean
    help='If checked, allows the return of a product different from the one originally ordered. Used if the delivery is created automatically'
  • name Char
    required=True translate=True
  • prevent_delivery_grouping Boolean
    help='If enabled, RMAs using this operation will NOT be grouped into a single delivery picking, even if the company setting allows grouping.' string='Do not group deliveries'
Public methods (4)
  • get_action_all_rma(self)
  • get_action_rma_tree_awaiting_action(self)
  • get_action_rma_tree_draft(self)
  • get_action_rma_tree_processed(self)

New fields (3)
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' required=True string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' help='Quantity to extract to a new RMA.' required=True string='Quantity to extract'
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (3)
  • action_split(self)
  • default_get(self, fields_list)
    @api.model
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (5)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • color Integer
    string='Color Index'
  • is_public Boolean
    help='The tag is visible in the portal view' string='Public Tag'
  • name Char
    copy=False required=True string='Tag Name' translate=True
  • rma_ids Many2many → rma
    comodel_name='rma'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the RMA Team without removing it.'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • member_ids One2many → res.users
    comodel_name='res.users' inverse_name='rma_team_id' string='Team Members'
  • name Char
    required=True translate=True
  • sequence Integer
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=[('share', '=', False)] string='Team Leader'
Public methods (1)
  • copy(self, default=None)

New fields (3)
  • rma_id Many2one → rma
    comodel_name='rma' copy=False index=True string='RMA return'
  • rma_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='move_id' string='RMAs'
  • rma_receiver_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='reception_move_id' string='RMA receivers'
Public methods (1)
  • unlink(self)

New fields (1)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
Public methods (2)
  • action_view_rma(self)
  • copy(self, default=None)

New fields (5)
  • create_rma Boolean
    string='Create RMAs'
  • location_id Many2one
    domain="create_rma and [('id', 'child_of', rma_location_ids)]or ['|', ('id', '=', original_location_id), '|', '&', ('return_location', '=', True), ('company_id', '=', False), '&', ('return_location', '=', True), ('company_id', '=', company_id)]"
  • picking_type_code Selection
    related='picking_id.picking_type_id.code'
  • rma_location_ids Many2many → stock.location
    comodel_name='stock.location' compute='_compute_rma_location_id'
  • rma_operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
Public methods (1)
  • create_returns(self)
    Override create_returns method for creating one or more 'confirmed' RMAs after return a delivery picking in case 'Create RMAs' checkbox is checked in this wizard. New RMAs will be linked to the delivery picking as the origin delivery and also RMAs will be linked to the returned picking as the 'Receipt'.

New fields (3)
  • different_return_product Boolean
    related='rma_operation_id.different_return_product'
  • return_product_id Many2one → product.product
    help="Product to be returned if it's different from the originally delivered item." args: 'product.product'
  • rma_operation_id Many2one → rma.operation
    comodel_name='rma.operation' compute='_compute_rma_operation_id' readonly=False store=True string='Operation'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • rma Boolean
    default=True help='RMA related products can be stored in this warehouse.' args: 'RMA'
  • rma_in_route_id Many2one → stock.route
    args: 'stock.route', 'RMA in Route'
  • rma_in_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA In Type'
  • rma_loc_id Many2one → stock.location
    comodel_name='stock.location' string='RMA Location'
  • rma_out_replace_route_id Many2one → stock.route
    args: 'stock.route', 'RMA out Replace Route'
  • rma_out_route_id Many2one → stock.route
    args: 'stock.route', 'RMA out Route'
  • rma_out_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA Out Type'
Public methods (1)
  • get_rules_dict(self)
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/15.0/rma
VERSION
VERSION 1.3.2
CATEGORY
CATEGORYRMA
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSOCA Transbot, Miquel Raïch, Víctor Martínez, Weblate, OCA-git-bot, David, oca-ci, Joshua Lauer, Nikolaus Weingartmair
WEBSITE
WEBSITEhttps://github.com/OCA/rma
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
portal_my_home_menu_rma Portal layout : RMA menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_rma Portal My Home : RMA entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_rmas My RMA Orders ir.ui.view qweb New
portal_rma_page My RMA ir.ui.view qweb New
report_rma report_rma ir.ui.view qweb New
report_rma_document report_rma_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings xpath Inherits stock.res_config_settings_view_form
rma_finalization_form rma xpath Inherits rma.rma_view_form
rma_finalization_view_search rma.finalization search New
rma_finalization_wizard_view_form rma.finalization.wizard form New
rma_redelivery_wizard_view_form rma.delivery.wizard.form rma.delivery.wizard form New
rma_split_wizard_view_form2 rma.split.wizard.form rma.split.wizard form New
rma_tag_view_search rma.tag search New
rma_team_view_form rma.team.view.form rma.team form New
rma_team_view_tree rma.team tree New
rma_view_calendar rma.calendar rma calendar New
rma_view_form rma.view.form rma form New
rma_view_pivot rma.pivot rma pivot New
rma_view_search rma.view.search rma search New
rma_view_tree rma.view.tree rma tree New
view_partner_form res.partner.form res.partner div Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking div Inherits stock.view_picking_form
view_rma_finalization_form Rma Finalization Reasons rma.finalization form New
view_rma_finalization_list RMA Finalization Reasons rma.finalization tree New
view_rma_tag_form Rma Tags rma.tag form New
view_rma_tag_list RMA Tags rma.tag tree New
view_stock_return_picking_form Return lines inherit RMA stock.return.picking xpath Inherits stock.view_stock_return_picking_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
Models touched (19)

New fields (0)

No new fields.

Public methods (2)
  • action_post(self)
    Avoids to validate a refund with less quantity of product than quantity in the linked RMA.
  • unlink(self)

New fields (1)
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (0)

No public methods.

New fields (7)
  • rma_mail_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_confirmation_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA is confirmed.' string='Email Template confirmation for RMA'
  • rma_mail_draft_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_draft_template domain="[('model', '=', 'rma')]" help='Email sent to the customer when they place an RMA from the portal' string='Email Template draft notification for RMA'
  • rma_mail_receipt_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_receipt_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA products are received.' string='Email Template receipt confirmation for RMA'
  • rma_return_grouping Boolean
    default=True string='Group RMA returns by customer address and warehouse'
  • send_rma_confirmation Boolean
    help='When the delivery is confirmed, send a confirmation email to the customer.' string='Send RMA Confirmation'
  • send_rma_draft_confirmation Boolean
    help='When a customer places an RMA, send a notification with it' string='Send RMA draft Confirmation'
  • send_rma_receipt_confirmation Boolean
    help='When the RMA receipt is confirmed, send a confirmation email to the customer.' string='Send RMA Receipt Confirmation'
Public methods (2)
  • create(self, vals)
    @api.model
  • create_rma_index(self)

New fields (8)
  • group_rma_manual_finalization Boolean
    help='Allow to finish an RMA without returning back a product or refunding' implied_group='rma.group_rma_manual_finalization' string='Finish RMA manually choosing a reason'
  • rma_mail_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_confirmation_template_id'
  • rma_mail_draft_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_draft_confirmation_template_id'
  • rma_mail_receipt_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_receipt_confirmation_template_id'
  • rma_return_grouping Boolean
    readonly=False related='company_id.rma_return_grouping'
  • send_rma_confirmation Boolean
    readonly=False related='company_id.send_rma_confirmation'
  • send_rma_draft_confirmation Boolean
    readonly=False related='company_id.send_rma_draft_confirmation'
  • send_rma_receipt_confirmation Boolean
    readonly=False related='company_id.send_rma_receipt_confirmation'
Public methods (0)

No public methods.

New fields (2)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
  • rma_ids One2many → rma
    comodel_name='rma' inverse_name='partner_id' string='RMAs'
Public methods (1)
  • action_view_rma(self)

New fields (1)
  • rma_team_id Many2one → rma.team
    comodel_name='rma.team' help='RMA Team the user is member of.' string='RMA Team'
Public methods (0)

No public methods.

New fields (43)
  • can_be_finished Boolean
    compute='_compute_can_be_finished'
  • can_be_locked Boolean
    compute='_compute_can_be_locked'
  • can_be_refunded Boolean
    compute='_compute_can_be_refunded'
  • can_be_replaced Boolean
    compute='_compute_can_be_replaced'
  • can_be_returned Boolean
    compute='_compute_can_be_returned'
  • can_be_split Boolean
    compute='_compute_can_be_split'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • date Datetime
    default=fields.Datetime.now index=True readonly=True required=True states={'draft': [('readonly', False)]}
  • deadline Date
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • delivered_qty Float
    compute='_compute_delivered_qty' digits='Product Unit of Measure' store=True
  • delivered_qty_done Float
    compute='_compute_delivered_qty' compute_sudo=True digits='Product Unit of Measure'
  • delivery_move_ids One2many → stock.move
    comodel_name='stock.move' copy=False inverse_name='rma_id' readonly=True string='Delivery reservation'
  • delivery_picking_count Integer
    compute='_compute_delivery_picking_count' string='Delivery count'
  • description Html
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True string='Finalization Reason' tracking=True
  • location_id Many2one → stock.location
    comodel_name='stock.location' domain=_domain_location_id readonly=True states={'draft': [('readonly', False)]}
  • move_id Many2one → stock.move
    comodel_name='stock.move' domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]" readonly=True states={'draft': [('readonly', False)]} string='Origin move'
  • name Char
    copy=False default=<expr> index=True readonly=True states={'draft': [('readonly', False)]}
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
  • origin Char
    help='Reference of the document that generated this RMA.' states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Source Document'
  • origin_split_rma_id Many2one → rma
    comodel_name='rma' copy=False readonly=True string='Extracted from'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True readonly=True states={'draft': [('readonly', False)]} string='Customer' tracking=True
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Refund address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' help='Shipping address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Shipping Address'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]" readonly=True states={'draft': [('readonly', False)]} string='Origin Delivery'
  • priority Selection
    default='1' readonly=True selection=PROCUREMENT_PRIORITIES states={'draft': [('readonly', False)]}
  • procurement_group_id Many2one → procurement.group
    comodel_name='procurement.group' readonly=True states={'draft': [('readonly', False)], 'confirmed': [('readonly', False)], 'received': [('readonly', False)]} string='Procurement group'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', ['consu', 'product'])]
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} string='UoM'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' readonly=True required=True states={'draft': [('readonly', False)]} string='Quantity'
  • reception_move_id Many2one → stock.move
    comodel_name='stock.move' copy=False string='Reception move'
  • refund_id Many2one → account.move
    comodel_name='account.move' copy=False readonly=True
  • refund_line_id Many2one → account.move.line
    comodel_name='account.move.line' copy=False readonly=True
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty'
  • remaining_qty_to_done Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty to done'
  • sent Boolean
  • state Selection
    copy=False default='draft' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('received', 'Received'), ('waiting_return', 'Waiting for return'), ('waiting_replacement', 'Waiting for replacement'), ('refunded', 'Refunded'), ('returned', 'Returned'), ('replaced', 'Replaced'), ('finished', 'Finished'), ('locked', 'Locked'), ('cancelled', 'Canceled')]
  • tag_ids Many2many → rma.tag
    comodel_name='rma.tag' string='Tags'
  • team_id Many2one → rma.team
    comodel_name='rma.team' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='RMA team'
  • uom_category_id Many2one
    related='product_id.uom_id.category_id' string='Category UoM'
  • user_id Many2one → res.users
    comodel_name='res.users' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Responsible' tracking=True
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' compute='_compute_warehouse_id' store=True
Public methods (27)
  • action_cancel(self)
    Invoked when 'Cancel' button in rma form view is clicked.
  • action_confirm(self)
    Invoked when 'Confirm' button in rma form view is clicked.
  • action_draft(self)
  • action_finish(self)
    Invoked when a user wants to manually finalize the RMA
  • action_lock(self)
    Invoked when 'Lock' button in rma form view is clicked.
  • action_preview(self)
    Invoked when 'Preview' button in rma form view is clicked.
  • action_refund(self)
    Invoked when 'Refund' button in rma form view is clicked and 'rma_refund_action_server' server action is run.
  • action_replace(self)
    Invoked when 'Replace' button in rma form view is clicked.
  • action_return(self)
    Invoked when 'Return to customer' button in rma form view is clicked.
  • action_rma_send(self)
  • action_split(self)
    Invoked when 'Split' button in rma form view is clicked.
  • action_unlock(self)
    Invoked when 'Unlock' button in rma form view is clicked.
  • action_view_delivery(self)
    Invoked when 'Delivery' smart button in rma form view is clicked.
  • action_view_receipt(self)
    Invoked when 'Receipt' smart button in rma form view is clicked.
  • action_view_refund(self)
    Invoked when 'Refund' smart button in rma form view is clicked.
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_replace(self, scheduled_date, warehouse, product, qty, uom)
    Intended to be invoked by the delivery wizard
  • create_return(self, scheduled_date, qty=None, uom=None)
    Intended to be invoked by the delivery wizard
  • extract_quantity(self, qty, uom)
  • message_new(self, msg_dict, custom_values=None)
    Extract the needed values from an incoming rma emails data-set to be used to create an RMA.
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
    Set 'sent' field to True when an email is sent from rma form view. This field (sent) is used to set the appropriate style to the 'Send by Email' button in the rma form view.
  • unlink(self)
  • update_received_state(self)
    Invoked by: [stock.move].unlink [stock.move]._action_cancel
  • update_received_state_on_reception(self)
    Invoked by: [stock.move]._action_done Here we can attach methods to trigger when the customer products are received on the RMA location, such as automatic notifications
  • update_replaced_state(self)
    Invoked by: [stock.move]._action_done [stock.move].unlink [stock.move]._action_cancel
  • update_returned_state(self)
    Invoked by [stock.move]._action_done

New fields (9)
  • product_id Many2one → product.product
    comodel_name='product.product' string='Replace Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' string='Product qty'
  • rma_count Integer
  • rma_return_grouping Boolean
    default=<expr> string='Group RMA returns by customer address and warehouse'
  • scheduled_date Datetime
    default=fields.Datetime.now required=True
  • type Selection
    required=True selection=[('replace', 'Replace'), ('return', 'Return to customer')]
  • uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' required=True string='Warehouse'
Public methods (2)
  • action_deliver(self)
  • default_get(self, fields_list)
    @api.model

New fields (3)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    comodel_name='res.company'
  • name Char
    copy=False required=True string='Reason Name' translate=True
Public methods (0)

No public methods.

New fields (1)
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' required=True string='Reason'
Public methods (1)
  • action_finish(self)

New fields (2)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (3)
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' required=True string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' help='Quantity to extract to a new RMA.' required=True string='Quantity to extract'
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (3)
  • action_split(self)
  • default_get(self, fields_list)
    @api.model
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (5)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • color Integer
    string='Color Index'
  • is_public Boolean
    help='The tag is visible in the portal view' string='Public Tag'
  • name Char
    copy=False required=True string='Tag Name' translate=True
  • rma_ids Many2many → rma
    comodel_name='rma'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the RMA Team without removing it.'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • member_ids One2many → res.users
    comodel_name='res.users' inverse_name='rma_team_id' string='Team Members'
  • name Char
    required=True translate=True
  • sequence Integer
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=[('share', '=', False)] string='Team Leader'
Public methods (1)
  • copy(self, default=None)

New fields (3)
  • rma_id Many2one → rma
    comodel_name='rma' copy=False string='RMA return'
  • rma_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='move_id' string='RMAs'
  • rma_receiver_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='reception_move_id' string='RMA receivers'
Public methods (1)
  • unlink(self)

New fields (1)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
Public methods (2)
  • action_view_rma(self)
  • copy(self, default=None)

New fields (2)
  • create_rma Boolean
    string='Create RMAs'
  • picking_type_code Selection
    related='picking_id.picking_type_id.code'
Public methods (1)
  • create_returns(self)
    Override create_returns method for creating one or more 'confirmed' RMAs after return a delivery picking in case 'Create RMAs' checkbox is checked in this wizard. New RMAs will be linked to the delivery picking as the origin delivery and also RMAs will be linked to the returned picking as the 'Receipt'.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • rma Boolean
    default=True help='RMA related products can be stored in this warehouse.' args: 'RMA'
  • rma_in_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA In Type'
  • rma_loc_id Many2one → stock.location
    comodel_name='stock.location' string='RMA Location'
  • rma_out_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA Out Type'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    To create an RMA location and link it with a new warehouse, this method is overridden instead of '_get_locations_values' method because the locations that are created with the values ​​returned by that method are forced to be children of view_location_id, and we don't want that.
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/14.0/rma
VERSION
VERSION 3.3.0
CATEGORY
CATEGORYRMA
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, david, OCA Transbot, Miquel Raïch, Víctor Martínez, Florian da Costa, oca-travis, Weblate, OCA-git-bot, Chafique, David, oca-ci, Giovanni, Patrick Wilson, oca-git-bot, Kev-Roche, Joshua Lauer, Freni Patel, FrankC013
WEBSITE
WEBSITEhttps://github.com/OCA/rma
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
portal_my_home_menu_rma Portal layout : RMA menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_rma Portal My Home : RMA entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_rmas My RMA Orders ir.ui.view qweb New
portal_rma_page My RMA ir.ui.view qweb New
report_rma report_rma ir.ui.view qweb New
report_rma_document report_rma_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings xpath Inherits stock.res_config_settings_view_form
rma_finalization_form rma xpath Inherits rma.rma_view_form
rma_finalization_view_search rma.finalization search New
rma_finalization_wizard_view_form rma.finalization.wizard form New
rma_redelivery_wizard_view_form rma.delivery.wizard.form rma.delivery.wizard form New
rma_split_wizard_view_form2 rma.split.wizard.form rma.split.wizard form New
rma_tag_view_search rma.tag search New
rma_team_view_form rma.team.view.form rma.team form New
rma_team_view_tree rma.team tree New
rma_view_calendar rma.calendar rma calendar New
rma_view_form rma.view.form rma form New
rma_view_pivot rma.pivot rma pivot New
rma_view_search rma.view.search rma search New
rma_view_tree rma.view.tree rma tree New
view_partner_form res.partner.form res.partner div Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking div Inherits stock.view_picking_form
view_rma_finalization_form Rma Finalization Reasons rma.finalization form New
view_rma_finalization_list RMA Finalization Reasons rma.finalization tree New
view_rma_tag_form Rma Tags rma.tag form New
view_rma_tag_list RMA Tags rma.tag tree New
view_stock_return_picking_form Return lines inherit RMA stock.return.picking xpath Inherits stock.view_stock_return_picking_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
Models touched (19)

New fields (0)

No new fields.

Public methods (2)
  • action_post(self)
    Avoids to validate a refund with less quantity of product than quantity in the linked RMA.
  • unlink(self)

New fields (1)
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (0)

No public methods.

New fields (7)
  • rma_mail_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_confirmation_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA is confirmed.' string='Email Template confirmation for RMA'
  • rma_mail_draft_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_draft_template domain="[('model', '=', 'rma')]" help='Email sent to the customer when they place an RMA from the portal' string='Email Template draft notification for RMA'
  • rma_mail_receipt_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_receipt_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA products are received.' string='Email Template receipt confirmation for RMA'
  • rma_return_grouping Boolean
    default=True string='Group RMA returns by customer address and warehouse'
  • send_rma_confirmation Boolean
    help='When the delivery is confirmed, send a confirmation email to the customer.' string='Send RMA Confirmation'
  • send_rma_draft_confirmation Boolean
    help='When a customer places an RMA, send a notification with it' string='Send RMA draft Confirmation'
  • send_rma_receipt_confirmation Boolean
    help='When the RMA receipt is confirmed, send a confirmation email to the customer.' string='Send RMA Receipt Confirmation'
Public methods (2)
  • create(self, vals)
    @api.model
  • create_rma_index(self)

New fields (8)
  • group_rma_manual_finalization Boolean
    help='Allow to finish an RMA without returning back a product or refunding' implied_group='rma.group_rma_manual_finalization' string='Finish RMA manually choosing a reason'
  • rma_mail_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_confirmation_template_id'
  • rma_mail_draft_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_draft_confirmation_template_id'
  • rma_mail_receipt_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_receipt_confirmation_template_id'
  • rma_return_grouping Boolean
    readonly=False related='company_id.rma_return_grouping'
  • send_rma_confirmation Boolean
    readonly=False related='company_id.send_rma_confirmation'
  • send_rma_draft_confirmation Boolean
    readonly=False related='company_id.send_rma_draft_confirmation'
  • send_rma_receipt_confirmation Boolean
    readonly=False related='company_id.send_rma_receipt_confirmation'
Public methods (0)

No public methods.

New fields (2)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
  • rma_ids One2many → rma
    comodel_name='rma' inverse_name='partner_id' string='RMAs'
Public methods (1)
  • action_view_rma(self)

New fields (1)
  • rma_team_id Many2one → rma.team
    comodel_name='rma.team' help='RMA Team the user is member of.' string='RMA Team'
Public methods (0)

No public methods.

New fields (43)
  • can_be_finished Boolean
    compute='_compute_can_be_finished'
  • can_be_locked Boolean
    compute='_compute_can_be_locked'
  • can_be_refunded Boolean
    compute='_compute_can_be_refunded'
  • can_be_replaced Boolean
    compute='_compute_can_be_replaced'
  • can_be_returned Boolean
    compute='_compute_can_be_returned'
  • can_be_split Boolean
    compute='_compute_can_be_split'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • date Datetime
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]}
  • deadline Date
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • delivered_qty Float
    compute='_compute_delivered_qty' digits='Product Unit of Measure' store=True string='Delivered qty'
  • delivered_qty_done Float
    compute='_compute_delivered_qty' compute_sudo=True digits='Product Unit of Measure' string='Delivered qty done'
  • delivery_move_ids One2many → stock.move
    comodel_name='stock.move' copy=False inverse_name='rma_id' readonly=True string='Delivery reservation'
  • delivery_picking_count Integer
    compute='_compute_delivery_picking_count' string='Delivery count'
  • description Html
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True string='Finalization Reason' tracking=True
  • location_id Many2one → stock.location
    comodel_name='stock.location' domain=_domain_location_id readonly=True states={'draft': [('readonly', False)]}
  • move_id Many2one → stock.move
    comodel_name='stock.move' domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]" readonly=True states={'draft': [('readonly', False)]} string='Origin move'
  • name Char
    copy=False default=<expr> index=True readonly=True states={'draft': [('readonly', False)]} string='Name'
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
  • origin Char
    help='Reference of the document that generated this RMA.' states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Source Document'
  • origin_split_rma_id Many2one → rma
    comodel_name='rma' copy=False readonly=True string='Extracted from'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True readonly=True states={'draft': [('readonly', False)]} string='Customer' tracking=True
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Refund address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' help='Shipping address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Shipping Address'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]" readonly=True states={'draft': [('readonly', False)]} string='Origin Delivery'
  • priority Selection
    default='1' readonly=True selection=PROCUREMENT_PRIORITIES states={'draft': [('readonly', False)]} string='Priority'
  • procurement_group_id Many2one → procurement.group
    comodel_name='procurement.group' readonly=True states={'draft': [('readonly', False)], 'confirmed': [('readonly', False)], 'received': [('readonly', False)]} string='Procurement group'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', ['consu', 'product'])]
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} string='UoM'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' readonly=True required=True states={'draft': [('readonly', False)]} string='Quantity'
  • reception_move_id Many2one → stock.move
    comodel_name='stock.move' copy=False string='Reception move'
  • refund_id Many2one → account.move
    comodel_name='account.move' copy=False readonly=True string='Refund'
  • refund_line_id Many2one → account.move.line
    comodel_name='account.move.line' copy=False readonly=True string='Refund line'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty'
  • remaining_qty_to_done Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty to done'
  • sent Boolean
  • state Selection
    copy=False default='draft' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('received', 'Received'), ('waiting_return', 'Waiting for return'), ('waiting_replacement', 'Waiting for replacement'), ('refunded', 'Refunded'), ('returned', 'Returned'), ('replaced', 'Replaced'), ('finished', 'Finished'), ('locked', 'Locked'), ('cancelled', 'Canceled')]
  • tag_ids Many2many → rma.tag
    comodel_name='rma.tag' string='Tags'
  • team_id Many2one → rma.team
    comodel_name='rma.team' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='RMA team'
  • uom_category_id Many2one
    related='product_id.uom_id.category_id' string='Category UoM'
  • user_id Many2one → res.users
    comodel_name='res.users' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Responsible' tracking=True
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' compute='_compute_warehouse_id' store=True
Public methods (27)
  • action_cancel(self)
    Invoked when 'Cancel' button in rma form view is clicked.
  • action_confirm(self)
    Invoked when 'Confirm' button in rma form view is clicked.
  • action_draft(self)
  • action_finish(self)
    Invoked when a user wants to manually finalize the RMA
  • action_lock(self)
    Invoked when 'Lock' button in rma form view is clicked.
  • action_preview(self)
    Invoked when 'Preview' button in rma form view is clicked.
  • action_refund(self)
    Invoked when 'Refund' button in rma form view is clicked and 'rma_refund_action_server' server action is run.
  • action_replace(self)
    Invoked when 'Replace' button in rma form view is clicked.
  • action_return(self)
    Invoked when 'Return to customer' button in rma form view is clicked.
  • action_rma_send(self)
  • action_split(self)
    Invoked when 'Split' button in rma form view is clicked.
  • action_unlock(self)
    Invoked when 'Unlock' button in rma form view is clicked.
  • action_view_delivery(self)
    Invoked when 'Delivery' smart button in rma form view is clicked.
  • action_view_receipt(self)
    Invoked when 'Receipt' smart button in rma form view is clicked.
  • action_view_refund(self)
    Invoked when 'Refund' smart button in rma form view is clicked.
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_replace(self, scheduled_date, warehouse, product, qty, uom)
    Intended to be invoked by the delivery wizard
  • create_return(self, scheduled_date, qty=None, uom=None)
    Intended to be invoked by the delivery wizard
  • extract_quantity(self, qty, uom)
  • message_new(self, msg_dict, custom_values=None)
    Extract the needed values from an incoming rma emails data-set to be used to create an RMA.
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
    Set 'sent' field to True when an email is sent from rma form view. This field (sent) is used to set the appropriate style to the 'Send by Email' button in the rma form view.
  • unlink(self)
  • update_received_state(self)
    Invoked by: [stock.move].unlink [stock.move]._action_cancel
  • update_received_state_on_reception(self)
    Invoked by: [stock.move]._action_done Here we can attach methods to trigger when the customer products are received on the RMA location, such as automatic notifications
  • update_replaced_state(self)
    Invoked by: [stock.move]._action_done [stock.move].unlink [stock.move]._action_cancel
  • update_returned_state(self)
    Invoked by [stock.move]._action_done

New fields (9)
  • product_id Many2one → product.product
    comodel_name='product.product' string='Replace Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' string='Product qty'
  • rma_count Integer
  • rma_return_grouping Boolean
    default=<expr> string='Group RMA returns by customer address and warehouse'
  • scheduled_date Datetime
    default=fields.Datetime.now() required=True
  • type Selection
    required=True selection=[('replace', 'Replace'), ('return', 'Return to customer')] string='Type'
  • uom_category_id Many2one
    related='product_id.uom_id.category_id'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' required=True string='Warehouse'
Public methods (2)
  • action_deliver(self)
  • default_get(self, fields_list)
    @api.model

New fields (3)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    comodel_name='res.company'
  • name Char
    copy=False required=True string='Reason Name' translate=True
Public methods (0)

No public methods.

New fields (1)
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' required=True string='Reason'
Public methods (1)
  • action_finish(self)

New fields (2)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (3)
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' required=True string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' help='Quantity to extract to a new RMA.' required=True string='Quantity to extract'
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (3)
  • action_split(self)
  • default_get(self, fields_list)
    @api.model
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (5)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • color Integer
    string='Color Index'
  • is_public Boolean
    help='The tag is visible in the portal view' string='Public Tag'
  • name Char
    copy=False required=True string='Tag Name' translate=True
  • rma_ids Many2many → rma
    comodel_name='rma'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the RMA Team without removing it.'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • member_ids One2many → res.users
    comodel_name='res.users' inverse_name='rma_team_id' string='Team Members'
  • name Char
    required=True translate=True
  • sequence Integer
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=[('share', '=', False)] string='Team Leader'
Public methods (1)
  • copy(self, default=None)

New fields (3)
  • rma_id Many2one → rma
    comodel_name='rma' copy=False string='RMA return'
  • rma_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='move_id' string='RMAs'
  • rma_receiver_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='reception_move_id' string='RMA receivers'
Public methods (1)
  • unlink(self)

New fields (1)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
Public methods (2)
  • action_view_rma(self)
  • copy(self, default=None)

New fields (2)
  • create_rma Boolean
    string='Create RMAs'
  • picking_type_code Selection
    related='picking_id.picking_type_id.code'
Public methods (1)
  • create_returns(self)
    Override create_returns method for creating one or more 'confirmed' RMAs after return a delivery picking in case 'Create RMAs' checkbox is checked in this wizard. New RMAs will be linked to the delivery picking as the origin delivery and also RMAs will be linked to the returned picking as the 'Receipt'.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • rma Boolean
    default=True help='RMA related products can be stored in this warehouse.' args: 'RMA'
  • rma_in_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA In Type'
  • rma_loc_id Many2one → stock.location
    comodel_name='stock.location' string='RMA Location'
  • rma_out_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA Out Type'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    To create an RMA location and link it with a new warehouse, this method is overridden instead of '_get_locations_values' method because the locations that are created with the values ​​returned by that method are forced to be children of view_location_id, and we don't want that.
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/13.0/rma
VERSION
VERSION 2.7.4
CATEGORY
CATEGORYRMA
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, david, OCA Transbot, Víctor Martínez, Ernesto Tejeda, oca-travis, Weblate, OCA-git-bot, David
WEBSITE
WEBSITEhttps://github.com/OCA/rma
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
portal_my_home_menu_rma Portal layout : RMA menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_rma Portal My Home : RMA entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_rmas My RMA Orders ir.ui.view qweb New
portal_rma_page My RMA ir.ui.view qweb New
report_rma report_rma ir.ui.view qweb New
report_rma_document report_rma_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings xpath Inherits stock.res_config_settings_view_form
rma_finalization_form rma xpath Inherits rma.rma_view_form
rma_finalization_view_search rma.finalization search New
rma_finalization_wizard_view_form rma.finalization.wizard form New
rma_redelivery_wizard_view_form rma.delivery.wizard.form rma.delivery.wizard form New
rma_split_wizard_view_form2 rma.split.wizard.form rma.split.wizard form New
rma_tag_view_search rma.tag search New
rma_team_view_form rma.team.view.form rma.team form New
rma_team_view_tree rma.team tree New
rma_view_calendar rma.calendar rma calendar New
rma_view_form rma.view.form rma form New
rma_view_pivot rma.pivot rma pivot New
rma_view_search rma.view.search rma search New
rma_view_tree rma.view.tree rma tree New
view_partner_form res.partner.form res.partner div Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking div Inherits stock.view_picking_form
view_rma_finalization_form Rma Finalization Reasons rma.finalization form New
view_rma_finalization_list RMA Finalization Reasons rma.finalization tree New
view_rma_tag_form Rma Tags rma.tag form New
view_rma_tag_list RMA Tags rma.tag tree New
view_stock_return_picking_form Return lines inherit RMA stock.return.picking xpath Inherits stock.view_stock_return_picking_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
Models touched (19)

New fields (0)

No new fields.

Public methods (2)
  • post(self)
    Avoids to validate a refund with less quantity of product than quantity in the linked RMA.
  • unlink(self)

New fields (1)
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (0)

No public methods.

New fields (7)
  • rma_mail_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_confirmation_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA is confirmed.' string='Email Template confirmation for RMA'
  • rma_mail_draft_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_draft_template domain="[('model', '=', 'rma')]" help='Email sent to the customer when they place an RMA from the portal' string='Email Template draft notification for RMA'
  • rma_mail_receipt_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_receipt_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA products are received.' string='Email Template receipt confirmation for RMA'
  • rma_return_grouping Boolean
    default=True string='Group RMA returns by customer address and warehouse'
  • send_rma_confirmation Boolean
    help='When the delivery is confirmed, send a confirmation email to the customer.' string='Send RMA Confirmation'
  • send_rma_draft_confirmation Boolean
    help='When a customer places an RMA, send a notification with it' string='Send RMA draft Confirmation'
  • send_rma_receipt_confirmation Boolean
    help='When the RMA receipt is confirmed, send a confirmation email to the customer.' string='Send RMA Receipt Confirmation'
Public methods (2)
  • create(self, vals)
    @api.model
  • create_rma_index(self)

New fields (8)
  • group_rma_manual_finalization Boolean
    help='Allow to finish an RMA without returning back a product or refunding' implied_group='rma.group_rma_manual_finalization' string='Finish RMA manually choosing a reason'
  • rma_mail_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_confirmation_template_id'
  • rma_mail_draft_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_draft_confirmation_template_id'
  • rma_mail_receipt_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_receipt_confirmation_template_id'
  • rma_return_grouping Boolean
    readonly=False related='company_id.rma_return_grouping'
  • send_rma_confirmation Boolean
    readonly=False related='company_id.send_rma_confirmation'
  • send_rma_draft_confirmation Boolean
    readonly=False related='company_id.send_rma_draft_confirmation'
  • send_rma_receipt_confirmation Boolean
    readonly=False related='company_id.send_rma_receipt_confirmation'
Public methods (0)

No public methods.

New fields (2)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
  • rma_ids One2many → rma
    comodel_name='rma' inverse_name='partner_id' string='RMAs'
Public methods (1)
  • action_view_rma(self)

New fields (1)
  • rma_team_id Many2one → rma.team
    comodel_name='rma.team' help='RMA Team the user is member of.' string='RMA Team'
Public methods (0)

No public methods.

New fields (42)
  • can_be_finished Boolean
    compute='_compute_can_be_finished'
  • can_be_locked Boolean
    compute='_compute_can_be_locked'
  • can_be_refunded Boolean
    compute='_compute_can_be_refunded'
  • can_be_replaced Boolean
    compute='_compute_can_be_replaced'
  • can_be_returned Boolean
    compute='_compute_can_be_returned'
  • can_be_split Boolean
    compute='_compute_can_be_split'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • date Datetime
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]}
  • deadline Date
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • delivered_qty Float
    compute='_compute_delivered_qty' digits='Product Unit of Measure' store=True string='Delivered qty'
  • delivered_qty_done Float
    compute='_compute_delivered_qty' compute_sudo=True digits='Product Unit of Measure' string='Delivered qty done'
  • delivery_move_ids One2many → stock.move
    comodel_name='stock.move' copy=False inverse_name='rma_id' readonly=True string='Delivery reservation'
  • delivery_picking_count Integer
    compute='_compute_delivery_picking_count' string='Delivery count'
  • description Html
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=True string='Finalization Reason' tracking=True
  • location_id Many2one → stock.location
    comodel_name='stock.location' domain=_domain_location_id readonly=True states={'draft': [('readonly', False)]}
  • move_id Many2one → stock.move
    comodel_name='stock.move' domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]" readonly=True states={'draft': [('readonly', False)]} string='Origin move'
  • name Char
    copy=False default=<expr> index=True readonly=True states={'draft': [('readonly', False)]} string='Name'
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
  • origin Char
    help='Reference of the document that generated this RMA.' states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Source Document'
  • origin_split_rma_id Many2one → rma
    comodel_name='rma' copy=False readonly=True string='Extracted from'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True readonly=True states={'draft': [('readonly', False)]} string='Customer' tracking=True
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Refund address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' help='Shipping address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Shipping Address'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]" readonly=True states={'draft': [('readonly', False)]} string='Origin Delivery'
  • priority Selection
    default='1' readonly=True selection=PROCUREMENT_PRIORITIES states={'draft': [('readonly', False)]} string='Priority'
  • procurement_group_id Many2one → procurement.group
    comodel_name='procurement.group' readonly=True states={'draft': [('readonly', False)], 'confirmed': [('readonly', False)], 'received': [('readonly', False)]} string='Procurement group'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', ['consu', 'product'])]
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} string='UoM'
  • product_uom_qty Float
    default=1.0 digits='Product Unit of Measure' readonly=True required=True states={'draft': [('readonly', False)]} string='Quantity'
  • reception_move_id Many2one → stock.move
    comodel_name='stock.move' copy=False string='Reception move'
  • refund_id Many2one → account.move
    comodel_name='account.move' copy=False readonly=True string='Refund'
  • refund_line_id Many2one → account.move.line
    comodel_name='account.move.line' copy=False readonly=True string='Refund line'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty'
  • remaining_qty_to_done Float
    compute='_compute_remaining_qty' digits='Product Unit of Measure' string='Remaining delivered qty to done'
  • sent Boolean
  • state Selection
    copy=False default='draft' tracking=True args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('received', 'Received'), ('waiting_return', 'Waiting for return'), ('waiting_replacement', 'Waiting for replacement'), ('refunded', 'Refunded'), ('returned', 'Returned'), ('replaced', 'Replaced'), ('finished', 'Finished'), ('locked', 'Locked'), ('cancelled', 'Canceled')]
  • tag_ids Many2many → rma.tag
    comodel_name='rma.tag' string='Tags'
  • team_id Many2one → rma.team
    comodel_name='rma.team' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='RMA team'
  • user_id Many2one → res.users
    comodel_name='res.users' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Responsible' tracking=True
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' compute='_compute_warehouse_id' store=True
Public methods (27)
  • action_cancel(self)
    Invoked when 'Cancel' button in rma form view is clicked.
  • action_confirm(self)
    Invoked when 'Confirm' button in rma form view is clicked.
  • action_draft(self)
  • action_finish(self)
    Invoked when a user wants to manually finalize the RMA
  • action_lock(self)
    Invoked when 'Lock' button in rma form view is clicked.
  • action_preview(self)
    Invoked when 'Preview' button in rma form view is clicked.
  • action_refund(self)
    Invoked when 'Refund' button in rma form view is clicked and 'rma_refund_action_server' server action is run.
  • action_replace(self)
    Invoked when 'Replace' button in rma form view is clicked.
  • action_return(self)
    Invoked when 'Return to customer' button in rma form view is clicked.
  • action_rma_send(self)
  • action_split(self)
    Invoked when 'Split' button in rma form view is clicked.
  • action_unlock(self)
    Invoked when 'Unlock' button in rma form view is clicked.
  • action_view_delivery(self)
    Invoked when 'Delivery' smart button in rma form view is clicked.
  • action_view_receipt(self)
    Invoked when 'Receipt' smart button in rma form view is clicked.
  • action_view_refund(self)
    Invoked when 'Refund' smart button in rma form view is clicked.
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_replace(self, scheduled_date, warehouse, product, qty, uom)
    Intended to be invoked by the delivery wizard
  • create_return(self, scheduled_date, qty=None, uom=None)
    Intended to be invoked by the delivery wizard
  • extract_quantity(self, qty, uom)
  • message_new(self, msg_dict, custom_values=None)
    Extract the needed values from an incoming rma emails data-set to be used to create an RMA.
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
    Set 'sent' field to True when an email is sent from rma form view. This field (sent) is used to set the appropriate style to the 'Send by Email' button in the rma form view.
  • unlink(self)
  • update_received_state(self)
    Invoked by: [stock.move].unlink [stock.move]._action_cancel
  • update_received_state_on_reception(self)
    Invoked by: [stock.move]._action_done Here we can attach methods to trigger when the customer products are received on the RMA location, such as automatic notifications
  • update_replaced_state(self)
    Invoked by: [stock.move]._action_done [stock.move].unlink [stock.move]._action_cancel
  • update_returned_state(self)
    Invoked by [stock.move]._action_done

New fields (8)
  • product_id Many2one → product.product
    comodel_name='product.product' string='Replace Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' string='Product qty'
  • rma_count Integer
  • rma_return_grouping Boolean
    default=<expr> string='Group RMA returns by customer address and warehouse'
  • scheduled_date Datetime
    default=fields.Datetime.now() required=True
  • type Selection
    required=True selection=[('replace', 'Replace'), ('return', 'Return to customer')] string='Type'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' required=True string='Warehouse'
Public methods (2)
  • action_deliver(self)
  • default_get(self, fields_list)
    @api.model

New fields (3)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    comodel_name='res.company'
  • name Char
    copy=False required=True string='Reason Name' translate=True
Public methods (0)

No public methods.

New fields (1)
  • finalization_id Many2one → rma.finalization
    comodel_name='rma.finalization' required=True string='Reason'
Public methods (1)
  • action_finish(self)

New fields (2)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (3)
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' required=True string='Unit of measure'
  • product_uom_qty Float
    digits='Product Unit of Measure' help='Quantity to extract to a new RMA.' required=True string='Quantity to extract'
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (3)
  • action_split(self)
  • default_get(self, fields_list)
    @api.model
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (5)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • color Integer
    string='Color Index'
  • is_public Boolean
    help='The tag is visible in the portal view' string='Public Tag'
  • name Char
    copy=False required=True string='Tag Name' translate=True
  • rma_ids Many2many → rma
    comodel_name='rma'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the RMA Team without removing it.'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • member_ids One2many → res.users
    comodel_name='res.users' inverse_name='rma_team_id' string='Team Members'
  • name Char
    required=True translate=True
  • sequence Integer
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=[('share', '=', False)] string='Team Leader'
Public methods (3)
  • copy(self, default=None)
  • get_alias_model_name(self, vals)
  • get_alias_values(self)

New fields (3)
  • rma_id Many2one → rma
    comodel_name='rma' copy=False string='RMA return'
  • rma_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='move_id' string='RMAs'
  • rma_receiver_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='reception_move_id' string='RMA receivers'
Public methods (1)
  • unlink(self)

New fields (1)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
Public methods (2)
  • action_view_rma(self)
  • copy(self, default=None)

New fields (2)
  • create_rma Boolean
    string='Create RMAs'
  • picking_type_code Selection
    readonly=True related='picking_id.picking_type_id.code' selection=[('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')] store=True
Public methods (1)
  • create_returns(self)
    Override create_returns method for creating one or more 'confirmed' RMAs after return a delivery picking in case 'Create RMAs' checkbox is checked in this wizard. New RMAs will be linked to the delivery picking as the origin delivery and also RMAs will be linked to the returned picking as the 'Receipt'.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • rma Boolean
    default=True help='RMA related products can be stored in this warehouse.' args: 'RMA'
  • rma_in_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA In Type'
  • rma_loc_id Many2one → stock.location
    comodel_name='stock.location' string='RMA Location'
  • rma_out_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA Out Type'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    To create an RMA location and link it with a new warehouse, this method is overridden instead of '_get_locations_values' method because the locations that are created with the values ​​returned by that method are forced to be children of view_location_id, and we don't want that.
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/12.0/rma
VERSION
VERSION 2.6.0
CATEGORY
CATEGORYRMA
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, david, OCA Transbot, Ernesto Tejeda, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/rma
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - account
    - base_setup
    - base
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - http_routing
    - digest
    - stock
    - barcodes
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
portal_my_home_menu_rma Portal layout : RMA menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home_rma Portal My Home : RMA entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_rmas My RMA Orders ir.ui.view qweb New
portal_rma_page My RMA ir.ui.view qweb New
report_rma report_rma ir.ui.view qweb New
report_rma_document report_rma_document ir.ui.view qweb New
res_config_settings_view_form res.config.settings xpath Inherits stock.res_config_settings_view_form
rma_redelivery_wizard_view_form rma.delivery.wizard.form rma.delivery.wizard form New
rma_split_wizard_view_form2 rma.split.wizard.form rma.split.wizard form New
rma_tag_view_search rma.tag search New
rma_team_view_form rma.team.view.form rma.team form New
rma_team_view_tree rma.team tree New
rma_view_calendar rma.calendar rma calendar New
rma_view_form rma.view.form rma form New
rma_view_pivot rma.pivot rma pivot New
rma_view_search rma.view.search rma search New
rma_view_tree rma.view.tree rma tree New
view_partner_form res.partner.form res.partner div Inherits base.view_partner_form
view_picking_form stock.picking.form stock.picking div Inherits stock.view_picking_form
view_rma_tag_form Rma Tags rma.tag form New
view_rma_tag_list RMA Tags rma.tag tree New
view_stock_return_picking_form Return lines inherit RMA stock.return.picking xpath Inherits stock.view_stock_return_picking_form
view_warehouse_inherit_mrp Stock Warehouse Inherit MRP stock.warehouse xpath Inherits stock.view_warehouse
Models touched (17)

New fields (0)

No new fields.

Public methods (2)
  • action_invoice_open(self)
    Avoids to validate a refund with less quantity of product than quantity in the linked RMA.
  • unlink(self)

New fields (1)
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (0)

No public methods.

New fields (6)
  • rma_mail_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_confirmation_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA is confirmed.' string='Email Template confirmation for RMA'
  • rma_mail_draft_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_draft_template domain="[('model', '=', 'rma')]" help='Email sent to the customer when they place an RMA from the portal' string='Email Template draft notification for RMA'
  • rma_mail_receipt_confirmation_template_id Many2one → mail.template
    comodel_name='mail.template' default=_default_rma_mail_receipt_template domain="[('model', '=', 'rma')]" help='Email sent to the customer once the RMA products are received.' string='Email Template receipt confirmation for RMA'
  • send_rma_confirmation Boolean
    help='When the delivery is confirmed, send a confirmation email to the customer.' string='Send RMA Confirmation'
  • send_rma_draft_confirmation Boolean
    help='When a customer places an RMA, send a notification with it' string='Send RMA draft Confirmation'
  • send_rma_receipt_confirmation Boolean
    help='When the RMA receipt is confirmed, send a confirmation email to the customer.' string='Send RMA Receipt Confirmation'
Public methods (2)
  • create(self, vals)
    @api.model
  • create_rma_index(self)

New fields (6)
  • rma_mail_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_confirmation_template_id'
  • rma_mail_draft_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_draft_confirmation_template_id'
  • rma_mail_receipt_confirmation_template_id Many2one
    readonly=False related='company_id.rma_mail_receipt_confirmation_template_id'
  • send_rma_confirmation Boolean
    readonly=False related='company_id.send_rma_confirmation'
  • send_rma_draft_confirmation Boolean
    readonly=False related='company_id.send_rma_draft_confirmation'
  • send_rma_receipt_confirmation Boolean
    readonly=False related='company_id.send_rma_receipt_confirmation'
Public methods (0)

No public methods.

New fields (2)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
  • rma_ids One2many → rma
    comodel_name='rma' inverse_name='partner_id' string='RMAs'
Public methods (1)
  • action_view_rma(self)

New fields (1)
  • rma_team_id Many2one → rma.team
    comodel_name='rma.team' help='RMA Team the user is member of.' string='RMA Team'
Public methods (0)

No public methods.

New fields (40)
  • can_be_locked Boolean
    compute='_compute_can_be_locked'
  • can_be_refunded Boolean
    compute='_compute_can_be_refunded'
  • can_be_replaced Boolean
    compute='_compute_can_be_replaced'
  • can_be_returned Boolean
    compute='_compute_can_be_returned'
  • can_be_split Boolean
    compute='_compute_can_be_split'
  • commercial_partner_id Many2one → res.partner
    comodel_name='res.partner' related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • date Datetime
    default=<expr> index=True readonly=True required=True states={'draft': [('readonly', False)]}
  • deadline Date
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • delivered_qty Float
    compute='_compute_delivered_qty' digits=dp.get_precision('Product Unit of Measure') store=True string='Delivered qty'
  • delivered_qty_done Float
    compute='_compute_delivered_qty' digits=dp.get_precision('Product Unit of Measure') string='Delivered qty done'
  • delivery_move_ids One2many → stock.move
    comodel_name='stock.move' copy=False inverse_name='rma_id' readonly=True string='Delivery reservation'
  • delivery_picking_count Integer
    compute='_compute_delivery_picking_count' string='Delivery count'
  • description Html
    states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]}
  • location_id Many2one → stock.location
    comodel_name='stock.location' domain=_domain_location_id readonly=True states={'draft': [('readonly', False)]}
  • move_id Many2one → stock.move
    comodel_name='stock.move' domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]" readonly=True states={'draft': [('readonly', False)]} string='Origin move'
  • name Char
    copy=False default=<expr> index=True readonly=True states={'draft': [('readonly', False)]} string='Name'
  • operation_id Many2one → rma.operation
    comodel_name='rma.operation' string='Requested operation'
  • origin Char
    help='Reference of the document that generated this RMA.' states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Source Document'
  • origin_split_rma_id Many2one → rma
    comodel_name='rma' copy=False readonly=True string='Extracted from'
  • partner_id Many2one → res.partner
    comodel_name='res.partner' index=True readonly=True states={'draft': [('readonly', False)]} string='Customer' track_visibility='always'
  • partner_invoice_id Many2one → res.partner
    comodel_name='res.partner' domain=[('customer', '=', True)] help='Refund address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Invoice Address'
  • partner_shipping_id Many2one → res.partner
    comodel_name='res.partner' help='Shipping address for current RMA.' readonly=True states={'draft': [('readonly', False)]} string='Shipping Address'
  • picking_id Many2one → stock.picking
    comodel_name='stock.picking' domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]" readonly=True states={'draft': [('readonly', False)]} string='Origin Delivery'
  • priority Selection
    default='1' readonly=True selection=PROCUREMENT_PRIORITIES states={'draft': [('readonly', False)]} string='Priority'
  • procurement_group_id Many2one → procurement.group
    comodel_name='procurement.group' readonly=True states={'draft': [('readonly', False)], 'confirmed': [('readonly', False)], 'received': [('readonly', False)]} string='Procurement group'
  • product_id Many2one → product.product
    comodel_name='product.product' domain=[('type', 'in', ['consu', 'product'])]
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} string='UoM'
  • product_uom_qty Float
    default=1.0 digits=dp.get_precision('Product Unit of Measure') readonly=True required=True states={'draft': [('readonly', False)]} string='Quantity'
  • reception_move_id Many2one → stock.move
    comodel_name='stock.move' copy=False string='Reception move'
  • refund_id Many2one → account.invoice
    comodel_name='account.invoice' copy=False readonly=True string='Refund'
  • refund_line_id Many2one → account.invoice.line
    comodel_name='account.invoice.line' copy=False readonly=True string='Refund line'
  • remaining_qty Float
    compute='_compute_remaining_qty' digits=dp.get_precision('Product Unit of Measure') string='Remaining delivered qty'
  • remaining_qty_to_done Float
    compute='_compute_remaining_qty' digits=dp.get_precision('Product Unit of Measure') string='Remaining delivered qty to done'
  • sent Boolean
  • state Selection
    copy=False default='draft' track_visibility='onchange' args: [('draft', 'Draft'), ('confirmed', 'Confirmed'), ('received', 'Received'), ('waiting_return', 'Waiting for return'), ('waiting_replacement', 'Waiting for replacement'), ('refunded', 'Refunded'), ('returned', 'Returned'), ('replaced', 'Replaced'), ('locked', 'Locked'), ('cancelled', 'Canceled')]
  • tag_ids Many2many → rma.tag
    comodel_name='rma.tag' string='Tags'
  • team_id Many2one → rma.team
    comodel_name='rma.team' index=True states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='RMA team'
  • user_id Many2one → res.users
    comodel_name='res.users' states={'locked': [('readonly', True)], 'cancelled': [('readonly', True)]} string='Responsible' track_visibility='always'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' compute='_compute_warehouse_id' store=True
Public methods (27)
  • action_cancel(self)
    Invoked when 'Cancel' button in rma form view is clicked.
  • action_confirm(self)
    Invoked when 'Confirm' button in rma form view is clicked.
  • action_draft(self)
  • action_lock(self)
    Invoked when 'Lock' button in rma form view is clicked.
  • action_preview(self)
    Invoked when 'Preview' button in rma form view is clicked.
  • action_refund(self)
    Invoked when 'Refund' button in rma form view is clicked and 'rma_refund_action_server' server action is run.
  • action_replace(self)
    Invoked when 'Replace' button in rma form view is clicked.
  • action_return(self)
    Invoked when 'Return to customer' button in rma form view is clicked.
  • action_rma_send(self)
  • action_split(self)
    Invoked when 'Split' button in rma form view is clicked.
  • action_unlock(self)
    Invoked when 'Unlock' button in rma form view is clicked.
  • action_view_delivery(self)
    Invoked when 'Delivery' smart button in rma form view is clicked.
  • action_view_receipt(self)
    Invoked when 'Receipt' smart button in rma form view is clicked.
  • action_view_refund(self)
    Invoked when 'Refund' smart button in rma form view is clicked.
  • copy(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • create_replace(self, scheduled_date, warehouse, product, qty, uom)
    Intended to be invoked by the delivery wizard
  • create_return(self, scheduled_date, qty=None, uom=None)
    Intended to be invoked by the delivery wizard
  • extract_quantity(self, qty, uom)
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg_dict, custom_values=None)
    Extract the needed values from an incoming rma emails data-set to be used to create an RMA.
  • message_post(self, **kwargs)
    @api.returns('mail.message', <expr>)
    Set 'sent' field to True when an email is sent from rma form view. This field (sent) is used to set the appropriate style to the 'Send by Email' button in the rma form view.
  • unlink(self)
  • update_received_state(self)
    Invoked by: [stock.move].unlink [stock.move]._action_cancel
  • update_received_state_on_reception(self)
    Invoked by: [stock.move]._action_done Here we can attach methods to trigger when the customer products are received on the RMA location, such as automatic notifications
  • update_replaced_state(self)
    Invoked by: [stock.move]._action_done [stock.move].unlink [stock.move]._action_cancel
  • update_returned_state(self)
    Invoked by [stock.move]._action_done

New fields (7)
  • product_id Many2one → product.product
    comodel_name='product.product' string='Replace Product'
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' string='Unit of measure'
  • product_uom_qty Float
    digits=dp.get_precision('Product Unit of Measure') string='Product qty'
  • rma_count Integer
  • scheduled_date Datetime
    default=fields.Datetime.now() required=True
  • type Selection
    required=True selection=[('replace', 'Replace'), ('return', 'Return to customer')] string='Type'
  • warehouse_id Many2one → stock.warehouse
    comodel_name='stock.warehouse' required=True string='Warehouse'
Public methods (2)
  • action_deliver(self)
  • default_get(self, fields_list)
    @api.model

New fields (2)
  • active Boolean
    default=True
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (3)
  • product_uom Many2one → uom.uom
    comodel_name='uom.uom' required=True string='Unit of measure'
  • product_uom_qty Float
    digits=dp.get_precision('Product Unit of Measure') help='Quantity to extract to a new RMA.' required=True string='Quantity to extract'
  • rma_id Many2one → rma
    comodel_name='rma' string='RMA'
Public methods (3)
  • action_split(self)
  • default_get(self, fields_list)
    @api.model
  • fields_get(self, allfields=None, attributes=None)
    @api.model

New fields (5)
  • active Boolean
    default=True help='The active field allows you to hide the category without removing it.'
  • color Integer
    string='Color Index'
  • is_public Boolean
    help='The tag is visible in the portal view' string='Public Tag'
  • name Char
    copy=False required=True string='Tag Name' translate=True
  • rma_ids Many2many → rma
    comodel_name='rma'
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the RMA Team without removing it.'
  • company_id Many2one → res.company
    comodel_name='res.company' default=<expr> string='Company'
  • member_ids One2many → res.users
    comodel_name='res.users' inverse_name='rma_team_id' string='Team Members'
  • name Char
    required=True translate=True
  • sequence Integer
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> domain=[('share', '=', False)] string='Team Leader'
Public methods (3)
  • copy(self, default=None)
    @api.multi
  • get_alias_model_name(self, vals)
  • get_alias_values(self)

New fields (3)
  • rma_id Many2one → rma
    comodel_name='rma' copy=False string='RMA return'
  • rma_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='move_id' string='RMAs'
  • rma_receiver_ids One2many → rma
    comodel_name='rma' copy=False inverse_name='reception_move_id' string='RMA receivers'
Public methods (1)
  • unlink(self)

New fields (1)
  • rma_count Integer
    compute='_compute_rma_count' string='RMA count'
Public methods (2)
  • action_view_rma(self)
  • copy(self, default=None)
    @api.multi

New fields (2)
  • create_rma Boolean
    string='Create RMAs'
  • picking_type_code Selection
    readonly=True related='picking_id.picking_type_id.code' selection=[('incoming', 'Vendors'), ('outgoing', 'Customers'), ('internal', 'Internal')] store=True
Public methods (1)
  • create_returns(self)
    Override create_returns method for creating one or more 'confirmed' RMAs after return a delivery picking in case 'Create RMAs' checkbox is checked in this wizard. New RMAs will be linked to the delivery picking as the origin delivery and also RMAs will be linked to the returned picking as the 'Receipt'.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • rma Boolean
    default=True help='RMA related products can be stored in this warehouse.' args: 'RMA'
  • rma_in_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA In Type'
  • rma_loc_id Many2one → stock.location
    comodel_name='stock.location' string='RMA Location'
  • rma_out_type_id Many2one → stock.picking.type
    comodel_name='stock.picking.type' string='RMA Out Type'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    To create an RMA location and link it with a new warehouse, this method is overridden instead of '_get_locations_values' method because the locations that are created with the values ​​returned by that method are forced to be children of view_location_id, and we don't want that.
REPOSITORY
REPOSITORYOCA/rma
GIT
GIThttps://github.com/OCA/rma.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/rma/tree/8.0/rma
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYGeneric Modules/CRM & SRM
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Vauxoo
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Vauxoo
COMMITTERS
COMMITTERSoca-travis, OCA-git-bot, Nhomar Hernández [Vauxoo]
WEBSITE
WEBSITEhttp://www.vauxoo.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:26
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/crm:
    - crm_claim_type
    - crm_claim_code
OCA/rma:
    - crm_rma_location
    - crm_rma_prodlot_invoice
    - crm_rma_prodlot_supplier
    - crm_rma_lot_mass_return
    - crm_claim_rma
    - crm_claim_rma_code
    - product_warranty
    - crm_rma_stock_location
    - crm_claim_product_supplier
    - crm_rma_claim_make_claim
    - crm_rma_advance_warranty
OCA/stock-logistics-workflow:
    - product_unique_serial
    - stock_no_negative
odoo/odoo:
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - report
    - procurement
    - board
    - web_kanban_gauge
    - web_kanban_sparkline
    - crm_claim
    - crm
    - base_action_rule
    - resource
    - sales_team
    - email_template
    - calendar
    - web_calendar
    - fetchmail
    - sale
    - account_voucher
    - account
    - analytic
    - edi
    - sale_stock
    - stock_account
    - purchase
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (0)

No views found for this module.

Models touched (0)

No models found for this module.