TIP: You can type at any time to perform a new search.
Return Merchandise Authorization Management
rma · OCA/rma
- Repository
- OCA/rma · module folder · Try on Runboat
- Module version
- 2.7.1
- Category
- RMA
- Folder size
- 1.23 MB
- License
- AGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://github.com/OCA/rma
- Last tracking update
- 2026-08-07 08:42:51
- Authors
- Odoo Community Association (OCA), Tecnativa
- Maintainers
- Odoo Community Association (OCA), Tecnativa
- Committers
- sbejaoui, Víctor Martínez, Jan Suhr, Weblate, OCA-git-bot, oca-ci, eduezerouali-tecnativa
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- rma_batch, rma_delivery, rma_lot, rma_reason, rma_repair, rma_sale
- 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 ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 | form | Inherits base.res_config_settings_view_form | |
rma_finalization_form |
rma | form | 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 | form | Inherits base.view_partner_form |
view_picking_form |
stock.picking.form | stock.picking | form | 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 | form | Inherits stock.view_stock_return_picking_form |
view_warehouse_inherit_mrp |
Stock Warehouse Inherit MRP | stock.warehouse | Inherits stock.view_warehouse |
HTTP endpoints (3)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/my/rmas/<int:rma_id> |
PortalRma.portal_my_rma_detail |
public | http | ALL | website |
/my/rma/picking/pdf/<int:rma_id>/<int:picking_id> |
PortalRma.portal_my_rma_picking_report |
public | http | ALL | sudo website |
/my/rmas, /my/rmas/page/<int:page> |
PortalRma.portal_my_rmas |
user | http | ALL | website |
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_idMany2one → rmacomodel_name='rma'string='RMA'
No public methods.
New fields (8)
-
rma_mail_confirmation_template_idMany2one → mail.templatecomodel_name='mail.template'default=_default_rma_mail_confirmation_templatedomain="[('model', '=', 'rma')]"help='Email sent to the customer once the RMA is confirmed.'string='Email Template confirmation for RMA' -
rma_mail_draft_confirmation_template_idMany2one → mail.templatecomodel_name='mail.template'default=_default_rma_mail_draft_templatedomain="[('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_idMany2one → mail.templatecomodel_name='mail.template'default=_default_rma_mail_receipt_templatedomain="[('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_rmaBooleanhelp='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_groupingBooleandefault=Truestring='Group RMA returns by customer address and warehouse' -
send_rma_confirmationBooleanhelp='When the delivery is confirmed, send a confirmation email to the customer.'string='Send RMA Confirmation' -
send_rma_draft_confirmationBooleanhelp='When a customer places an RMA, send a notification with it'string='Send RMA draft Confirmation' -
send_rma_receipt_confirmationBooleanhelp='When the RMA receipt is confirmed, send a confirmation email to the customer.'string='Send RMA Receipt Confirmation'
-
create(self, vals_list)@api.model_create_multi -
create_rma_index(self)
New fields (9)
-
group_rma_manual_finalizationBooleanhelp='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_idMany2onedomain="[('model', '=', 'rma')]"readonly=Falserelated='company_id.rma_mail_confirmation_template_id' -
rma_mail_draft_confirmation_template_idMany2onedomain="[('model', '=', 'rma')]"readonly=Falserelated='company_id.rma_mail_draft_confirmation_template_id' -
rma_mail_receipt_confirmation_template_idMany2onedomain="[('model', '=', 'rma')]"readonly=Falserelated='company_id.rma_mail_receipt_confirmation_template_id' -
rma_new_rma_button_from_rmaBooleanreadonly=Falserelated='company_id.rma_new_rma_button_from_rma' -
rma_return_groupingBooleanreadonly=Falserelated='company_id.rma_return_grouping' -
send_rma_confirmationBooleanreadonly=Falserelated='company_id.send_rma_confirmation' -
send_rma_draft_confirmationBooleanreadonly=Falserelated='company_id.send_rma_draft_confirmation' -
send_rma_receipt_confirmationBooleanreadonly=Falserelated='company_id.send_rma_receipt_confirmation'
No public methods.
New fields (2)
-
rma_countIntegercompute='_compute_rma_count'string='RMA count' -
rma_idsOne2many → rmacomodel_name='rma'inverse_name='partner_id'string='RMAs'
-
action_view_rma(self)
New fields (1)
-
rma_team_idMany2one → rma.teamcomodel_name='rma.team'help='RMA Team the user is member of.'string='RMA Team'
No public methods.
New fields (50)
-
can_be_finishedBooleancompute='_compute_can_be_finished' -
can_be_lockedBooleancompute='_compute_can_be_locked' -
can_be_new_rmaBooleancompute='_compute_can_be_new_rma'compute_sudo=True -
can_be_refundedBooleancompute='_compute_can_be_refunded' -
can_be_replacedBooleancompute='_compute_can_be_replaced' -
can_be_returnedBooleancompute='_compute_can_be_returned' -
can_be_splitBooleancompute='_compute_can_be_split' -
commercial_partner_idMany2one → res.partnercomodel_name='res.partner'related='partner_id.commercial_partner_id' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr> -
dateDatetimedefault=fields.Datetime.nowindex=Truerequired=True -
deadlineDate -
delivered_qtyFloatcompute='_compute_delivered_qty'digits='Product Unit of Measure'store=True -
delivery_move_idsOne2many → stock.movecomodel_name='stock.move'copy=Falseinverse_name='rma_id'string='Delivery reservation' -
delivery_picking_countIntegercompute='_compute_delivery_picking_count'string='Delivery count' -
descriptionHtml -
different_return_productBooleanrelated='operation_id.different_return_product' -
finalization_idMany2one → rma.finalizationcomodel_name='rma.finalization'copy=Falsedomain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"string='Finalization Reason'tracking=True -
location_idMany2one → stock.locationcomodel_name='stock.location'compute='_compute_location_id'domain=_domain_location_idreadonly=Falsestore=True -
manual_finish_allowedBooleancompute='_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_idMany2one → stock.movecomodel_name='stock.move'compute='_compute_move_id'domain="[ ('picking_id', '=', picking_id), ('picking_id', '!=', False)]"readonly=Falsestore=Truestring='Origin move' -
nameCharcopy=Falsedefault=<expr>index=True -
operation_idMany2one → rma.operationcomodel_name='rma.operation'string='Requested operation'tracking=True -
originCharhelp='Reference of the document that generated this RMA.'string='Source Document' -
origin_split_rma_idMany2one → rmacomodel_name='rma'copy=Falsestring='Extracted from' -
partner_idMany2one → res.partnercomodel_name='res.partner'index=Truestring='Customer'tracking=True -
partner_invoice_idMany2one → res.partnercomodel_name='res.partner'compute='_compute_partner_invoice_id'domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"help='Refund address for current RMA.'readonly=Falsestore=Truestring='Invoice Address' -
partner_shipping_idMany2one → res.partnercomodel_name='res.partner'compute='_compute_partner_shipping_id'help='Shipping address for current RMA.'readonly=Falsestore=Truestring='Shipping Address' -
picking_idMany2one → stock.pickingcomodel_name='stock.picking'domain="[ ('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing'), ('partner_id', 'child_of', commercial_partner_id),]"string='Origin Delivery' -
prioritySelectiondefault='1'selection=PROCUREMENT_PRIORITIES -
procurement_group_idMany2one → procurement.groupcomodel_name='procurement.group'string='Procurement group' -
product_idMany2one → product.productcomodel_name='product.product'compute='_compute_product_id'domain=[('type', 'in', ['consu', 'product'])]readonly=Falsestore=True -
product_uomMany2one → uom.uomcomodel_name='uom.uom'compute='_compute_product_uom'default=<expr>readonly=Falserequired=Truestore=Truestring='UoM' -
product_uom_qtyFloatcompute='_compute_product_uom_qty'default=1.0digits='Product Unit of Measure'readonly=Falserequired=Truestore=Truestring='Quantity' -
reception_move_idMany2one → stock.movecomodel_name='stock.move'copy=Falsestring='Reception move' -
refund_idMany2one → account.movecomodel_name='account.move'copy=False -
refund_line_idMany2one → account.move.linecomodel_name='account.move.line'copy=False -
remaining_qtyFloatcompute='_compute_remaining_qty'digits='Product Unit of Measure'string='Remaining delivered qty' -
return_product_idMany2one → product.producthelp="Product to be returned if it's different from the originally delivered item." args: 'product.product' -
rma_countIntegercompute='_compute_rma_count'compute_sudo=Truestring='RMA count' -
sentBoolean -
show_create_receiptBooleancompute='_compute_show_create_receipt'string='Show Create Receipt Button' -
show_create_refundBooleancompute='_compute_show_refund_replace'string='Show Create refund Button' -
show_create_replaceBooleancompute='_compute_show_create_replace'string='Show Create replace Button' -
show_create_returnBooleancompute='_compute_show_create_return'string='Show Create Return Button' -
stateSelectioncopy=Falsedefault='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_idsMany2many → rma.tagcomodel_name='rma.tag'string='Tags' -
team_idMany2one → rma.teamcomodel_name='rma.team'compute='_compute_team_id'index=Truestore=Truestring='RMA team' -
uom_category_idMany2onerelated='product_id.uom_id.category_id'string='Category UoM' -
user_idMany2one → res.userscomodel_name='res.users'index=Truestring='Responsible'tracking=True -
warehouse_idMany2one → stock.warehousecomodel_name='stock.warehouse'compute='_compute_warehouse_id'store=True
-
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_idMany2one → res.companycomodel_name='res.company'string='Company' -
product_idMany2one → product.productcomodel_name='product.product'string='Replace Product' -
product_uomMany2one → uom.uomcomodel_name='uom.uom'string='Unit of measure' -
product_uom_qtyFloatdigits='Product Unit of Measure'string='Product qty' -
rma_countInteger -
rma_return_groupingBooleandefault=<expr>string='Group RMA returns by customer address and warehouse' -
scheduled_dateDatetimedefault=fields.Datetime.nowrequired=True -
typeSelectionrequired=Trueselection=[('replace', 'Replace'), ('return', 'Return to customer')] -
uom_category_idMany2onerelated='product_id.uom_id.category_id' -
warehouse_idMany2one → stock.warehousecomodel_name='stock.warehouse'domain="[('company_id', '=', company_id)]"required=Truestring='Warehouse'
-
action_deliver(self) -
default_get(self, fields_list)@api.model
New fields (3)
-
activeBooleandefault=True -
company_idMany2one → res.companycomodel_name='res.company' -
nameCharcopy=Falserequired=Truestring='Reason Name'translate=True
No public methods.
New fields (1)
-
finalization_idMany2one → rma.finalizationcomodel_name='rma.finalization'required=Truestring='Reason'
-
action_finish(self)
New fields (12)
-
action_create_deliverySelectiondefault='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_receiptSelectiondefault='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_refundSelectiondefault='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')] -
activeBooleandefault=True -
auto_confirm_receptionBooleanhelp='Enable this option to automatically confirm the reception when the RMA is confirmed.' -
colorInteger -
count_rma_awaiting_actionIntegercompute='_compute_count_rma' -
count_rma_draftIntegercompute='_compute_count_rma' -
count_rma_processedIntegercompute='_compute_count_rma' -
different_return_productBooleanhelp='If checked, allows the return of a product different from the one originally ordered. Used if the delivery is created automatically' -
nameCharrequired=Truetranslate=True -
prevent_delivery_groupingBooleanhelp='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'
-
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_idMany2one → rma.operationcomodel_name='rma.operation'required=Truestring='Requested operation' -
rma_idMany2one → rmacomodel_name='rma'default=<expr>
-
create_and_open_rma(self) -
create_rma(self) -
default_get(self, fields_list)@api.model
New fields (3)
-
product_uomMany2one → uom.uomcomodel_name='uom.uom'required=Truestring='Unit of measure' -
product_uom_qtyFloatdigits='Product Unit of Measure'help='Quantity to extract to a new RMA.'required=Truestring='Quantity to extract' -
rma_idMany2one → rmacomodel_name='rma'string='RMA'
-
action_split(self) -
default_get(self, fields_list)@api.model -
fields_get(self, allfields=None, attributes=None)@api.model
New fields (5)
-
activeBooleandefault=Truehelp='The active field allows you to hide the category without removing it.' -
colorIntegerstring='Color Index' -
is_publicBooleanhelp='The tag is visible in the portal view'string='Public Tag' -
nameCharcopy=Falserequired=Truestring='Tag Name'translate=True -
rma_idsMany2many → rmacomodel_name='rma'
No public methods.
New fields (6)
-
activeBooleandefault=Truehelp='If the active field is set to false, it will allow you to hide the RMA Team without removing it.' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>string='Company' -
member_idsOne2many → res.userscomodel_name='res.users'inverse_name='rma_team_id'string='Team Members' -
nameCharrequired=Truetranslate=True -
sequenceInteger -
user_idMany2one → res.userscomodel_name='res.users'default=<expr>domain=[('share', '=', False)]string='Team Leader'
-
copy(self, default=None)
New fields (3)
-
rma_idMany2one → rmacomodel_name='rma'copy=Falseindex=Truestring='RMA return' -
rma_idsOne2many → rmacomodel_name='rma'copy=Falseinverse_name='move_id'string='RMAs' -
rma_receiver_idsOne2many → rmacomodel_name='rma'copy=Falseinverse_name='reception_move_id'string='RMA receivers'
-
unlink(self)
New fields (1)
-
rma_countIntegercompute='_compute_rma_count'string='RMA count'
-
action_view_rma(self)
New fields (3)
-
create_rmaBooleanstring='Create RMAs' -
picking_type_codeSelectionrelated='picking_id.picking_type_id.code' -
rma_operation_idMany2one → rma.operationcomodel_name='rma.operation'string='Requested operation'
-
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_productBooleanrelated='rma_operation_id.different_return_product' -
return_product_idMany2one → product.producthelp="Product to be returned if it's different from the originally delivered item." args: 'product.product' -
rma_operation_idMany2one → rma.operationcomodel_name='rma.operation'compute='_compute_rma_operation_id'readonly=Falsestore=Truestring='Operation'
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (7)
-
rmaBooleandefault=Truehelp='RMA related products can be stored in this warehouse.' args: 'RMA' -
rma_in_route_idMany2one → stock.routecopy=Falseondelete='restrict' args: 'stock.route', 'RMA in Route' -
rma_in_type_idMany2one → stock.picking.typecheck_company=Truecomodel_name='stock.picking.type'copy=Falsestring='RMA In Type' -
rma_loc_idMany2one → stock.locationcheck_company=Truecomodel_name='stock.location'string='RMA Location' -
rma_out_replace_route_idMany2one → stock.routeargs: 'stock.route', 'RMA out Replace Route' -
rma_out_route_idMany2one → stock.routecopy=Falseondelete='restrict' args: 'stock.route', 'RMA out Route' -
rma_out_type_idMany2one → stock.picking.typecheck_company=Truecomodel_name='stock.picking.type'copy=Falsestring='RMA Out Type'
-
get_rules_dict(self)
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
- Status
- Open migration PR — not merged yet for this version
- CI status
- checks failing
- Open since
- 9 days ago
- Last activity
- 1 day ago
- Repository
- OCA/rma
- Pull request
- [19.0][MIG] rma: Migration from 18.0 to 19.0 (#616)