TIP: You can type at any time to perform a new search.
Purchase Return
purchase_return · OCA/purchase-workflow
Security findings
Migration considerations
purchase_return_order_form— For a target of Odoo 17.0+: view 'purchase_return_order_form' uses `attrs=`/`states=`, which are no longer supported. Convert modifiers to direct Python boolean expressions in `invisible`/`readonly`/`required`; preserve the original AND/OR logic. migration-view-attrs-states · sourcepurchase_return_order_line_form2— For a target of Odoo 17.0+: view 'purchase_return_order_line_form2' uses `attrs=`/`states=`, which are no longer supported. Convert modifiers to direct Python boolean expressions in `invisible`/`readonly`/`required`; preserve the original AND/OR logic. migration-view-attrs-states · sourceview_move_form_inherit_repair_vendor_refund— For a target of Odoo 17.0+: view 'view_move_form_inherit_repair_vendor_refund' uses `attrs=`/`states=`, which are no longer supported. Convert modifiers to direct Python boolean expressions in `invisible`/`readonly`/`required`; preserve the original AND/OR logic. migration-view-attrs-states · sourcepurchase_return_order_line_tree— View 'purchase_return_order_line_tree' is defined with a `<tree>` root tag: renamed to `<list>` in Odoo 18.0. migration-view-tree-tag · sourcepurchase_return_order_tree— View 'purchase_return_order_tree' is defined with a `<tree>` root tag: renamed to `<list>` in Odoo 18.0. migration-view-tree-tag · sourcepurchase_return_order_view_tree— View 'purchase_return_order_view_tree' is defined with a `<tree>` root tag: renamed to `<list>` in Odoo 18.0. migration-view-tree-tag · source
Migration review checklist, not a compatibility verdict. No target version is selected: apply version-specific advice only when migrating to that version or later.
- Repository
- OCA/purchase-workflow · module folder · Try on Runboat
- Module version
- 1.0.4
- Category
- Purchases
- Folder size
- 0.26 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- No
- Website
- https://github.com/OCA/purchase-workflow
- Last tracking update
- 2026-08-07 08:09:24
- Authors
- Odoo Community Association (OCA), ForgeFlow
- Maintainers
- Odoo Community Association (OCA), ForgeFlow
- Committers
- Weblate, OCA-git-bot, oca-ci, AlexPForgeFlow, PauBForgeFlow, ChanGuaZzz
Code Analysis
Views touched (19)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_template_form_view |
product.template.form.inherit | product.template | form | Inherits account.product_template_form_view |
purchase_return_order_form |
purchase.return.order.form | purchase.return.order | form | New |
purchase_return_order_graph |
purchase.return.order.graph | purchase.return.order | graph | New |
purchase_return_order_line_form2 |
purchase.return.order.line.form2 | purchase.return.order.line | form | New |
purchase_return_order_line_search |
purchase.return.order.line.search | purchase.return.order.line | search | New |
purchase_return_order_line_tree |
purchase.return.order.line.tree | purchase.return.order.line | tree | New |
purchase_return_order_pivot |
purchase.return.order.pivot | purchase.return.order | pivot | New |
purchase_return_order_tree |
purchase.return.order.tree | purchase.return.order | tree | New |
purchase_return_order_view_activity |
purchase.return.order.activity | purchase.return.order | activity | New |
purchase_return_order_view_search |
purchase.return.order.select | purchase.return.order | search | New |
purchase_return_order_view_tree |
purchase.return.order.view.tree | purchase.return.order | tree | New |
report_purchasereturnorder |
report_purchasereturnorder | ir.ui.view | qweb | New |
report_purchasereturnorder_document |
report_purchasereturnorder_document | ir.ui.view | qweb | New |
track_po_line_qty_received_template |
track_po_line_qty_received_template | ir.ui.view | qweb | New |
track_po_line_template |
track_po_line_template | ir.ui.view | qweb | New |
view_category_property_form |
product.category.property.form.inherit | product.category | form | Inherits account.view_category_property_form |
view_move_form_inherit_repair_vendor_refund |
account.move.inherit.repair.vendor.refund | account.move | form | Inherits account.view_move_form |
view_purchase_return_order_filter |
purchase.return.draft.select | purchase.return.order | search | New |
view_purchase_return_order_kanban |
purchase.return.order.kanban | purchase.return.order | kanban | New |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (6)
New fields (1)
-
purchase_return_idMany2one → purchase.return.ordercopy=Falsehelp='Auto-complete from a past purchase return order.'readonly=Truestates={'draft': [('readonly', False)]}store=Falsestring='Purchase Return Order' args: 'purchase.return.order'
-
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (2)
-
purchase_return_line_idMany2one → purchase.return.order.linecopy=Falseindex=Trueondelete='set null' args: 'purchase.return.order.line', 'Purchase Return Order Line' -
purchase_return_order_idMany2one → purchase.return.ordercopy=Falsereadonly=Truerelated='purchase_return_line_id.order_id' args: 'purchase.return.order', 'Purchase Return Order'
No public methods.
New fields (1)
-
property_account_vendor_return_categ_idMany2one → account.accountcompany_dependent=Truedomain=ACCOUNT_DOMAINhelp='Keep this field empty to use the default value from the product category.'string='Purchase Returns Account' args: 'account.account'
No public methods.
New fields (1)
-
property_account_vendor_return_idMany2one → account.accountcompany_dependent=Truedomain=ACCOUNT_DOMAINhelp='Keep this field empty to use the default value from the product category.'string='Purchase Returns Account' args: 'account.account'
No public methods.
New fields (25)
-
amount_taxMonetarycompute='_compute_amount_all'readonly=Truestore=Truestring='Taxes' -
amount_totalMonetarycompute='_compute_amount_all'readonly=Truestore=Truestring='Total' -
amount_untaxedMonetarycompute='_compute_amount_all'readonly=Truestore=Truestring='Untaxed Amount'tracking=True -
company_idMany2one → res.companydefault=<expr>index=Truerequired=Truestates=READONLY_STATES args: 'res.company', 'Company' -
currency_idMany2one → res.currencydefault=<expr>required=Truestates=READONLY_STATES args: 'res.currency', 'Currency' -
currency_rateFloatcompute='_compute_currency_rate'compute_sudo=Truehelp='Ratio between the purchase order currency and the company currency'readonly=Truestore=True args: 'Rate Currency' -
date_approveDatetimecopy=Falseindex=Truereadonly=1 args: 'Confirmation Date' -
date_orderDatetimecopy=Falsedefault=fields.Datetime.nowhelp='Depicts the date within which the Quotation should be confirmed and converted into a purchase order.'index=Truerequired=Truestates=READONLY_STATES args: 'Order Deadline' -
date_plannedDatetimecompute='_compute_date_planned'copy=Falsehelp='Delivery date to return to the vendor. This date is used to determine expected shipment of products.'index=Truereadonly=Falsestore=Truestring='Issue Date' -
dest_address_idMany2one → res.partnerdomain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"help='Put an address if you want to return directly from the customer to the vendor. Otherwise, keep empty to deliver from your own company.'states=READONLY_STATESstring='Drop Ship Address' args: 'res.partner' -
fiscal_position_idMany2one → account.fiscal.positiondomain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"string='Fiscal Position' args: 'account.fiscal.position' -
incoterm_idMany2one → account.incotermshelp='International Commercial Terms are a series of predefined commercial terms used in international transactions.'states={'done': [('readonly', True)]} args: 'account.incoterms', 'Incoterm' -
invoice_countIntegercompute='_compute_invoice'copy=Falsedefault=0store=Truestring='Bill Count' -
invoice_idsMany2many → account.movecompute='_compute_invoice'copy=Falsestore=Truestring='Bills' args: 'account.move' -
invoice_statusSelectioncompute='_compute_get_invoiced'copy=Falsedefault='no'readonly=Truestore=Truestring='Billing Status' args: [('no', 'Nothing to Refund'), ('to invoice', 'Waiting Refunds'), ('invoiced', 'Fully Refunded')] -
nameCharcopy=Falsedefault='New'index=Truerequired=True args: 'Order Reference' -
notesTextargs: 'Terms and Conditions' -
order_lineOne2many → purchase.return.order.linecopy=Truestates={'cancel': [('readonly', True)], 'done': [('readonly', True)]}string='Order Lines' args: 'purchase.return.order.line', 'order_id' -
originCharcopy=Falsehelp='Reference of the document that generated this purchase order request (e.g. a sales order)' args: 'Source Document' -
partner_idMany2one → res.partnerchange_default=Truedomain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"help='You can find a vendor by its Name, TIN, Email or Internal Reference.'required=Truestates=READONLY_STATESstring='Vendor'tracking=True args: 'res.partner' -
partner_refCharcopy=Falsehelp="Reference of the sales order or bid sent by the vendor. It's used to do the matching when you receive the products as this reference is usually written on the delivery order sent by your vendor." args: 'Vendor Reference' -
payment_term_idMany2one → account.payment.termdomain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'account.payment.term', 'Payment Terms' -
product_idMany2one → product.productreadonly=Falserelated='order_line.product_id'string='Product' args: 'product.product' -
stateSelectioncopy=Falsedefault='draft'index=Truereadonly=Truestring='Status'tracking=True args: [('draft', 'Draft'), ('sent', 'Sent'), ('to approve', 'To Approve'), ('purchase', 'Purchase Order Return'), ('done', 'Locked'), ('cancel', 'Cancelled')] -
user_idMany2one → res.userscheck_company=Truedefault=<expr>index=Truestring='Purchase Representative'tracking=True args: 'res.users'
-
action_create_refund(self)Create the refund associated to the PO. -
action_draft_send(self)This function opens a window to compose an email, with the edi purchase template message loaded by default -
action_view_invoice(self, invoices=False)This function returns an action that display existing vendor bills of given purchase order ids. When only one found, show the vendor bill immediately. -
button_approve(self, force=False) -
button_cancel(self) -
button_confirm(self) -
button_done(self) -
button_draft(self) -
button_unlock(self) -
copy(self, default=None) -
create(self, vals)@api.model -
message_post(self, **kwargs)@api.returns('mail.message', <expr>) -
name_get(self)@api.depends('name', 'partner_ref') -
onchange(self, values, field_name, field_onchange)Override onchange to NOT to update all date_planned on PO lines when date_planned on PO is updated by the change of date_planned on PO lines. -
onchange_date_planned(self)@api.onchange('date_planned') -
onchange_partner_id(self)@api.onchange('partner_id', 'company_id') -
print_return(self) -
unlink(self)
New fields (26)
-
account_analytic_idMany2one → account.analytic.accountreadonly=Falsestore=Truestring='Analytic Account' args: 'account.analytic.account' -
company_idMany2one → res.companyreadonly=Truerelated='order_id.company_id'store=Truestring='Company' args: 'res.company' -
currency_idMany2onereadonly=Truerelated='order_id.currency_id'store=Truestring='Currency' -
date_orderDatetimereadonly=Truerelated='order_id.date_order'string='Order Date' -
date_plannedDatetimehelp="Delivery date expected from vendor. This date respectively defaults to vendor pricelist lead time then today's date."string='Delivery Date' -
display_typeSelectiondefault=Falsehelp='Technical field for UX purpose.' args: [('line_section', 'Section'), ('line_note', 'Note')] -
invoice_linesOne2many → account.move.linecopy=Falsereadonly=Truestring='Bill Lines' args: 'account.move.line', 'purchase_return_line_id' -
nameTextrequired=Truestring='Description' -
order_idMany2one → purchase.return.orderindex=Trueondelete='cascade'required=Truestring='Order Reference' args: 'purchase.return.order' -
partner_idMany2one → res.partnerreadonly=Truerelated='order_id.partner_id'store=Truestring='Partner' args: 'res.partner' -
price_subtotalMonetarycompute='_compute_amount'store=Truestring='Subtotal' -
price_taxFloatcompute='_compute_amount'store=Truestring='Tax' -
price_totalMonetarycompute='_compute_amount'store=Truestring='Total' -
price_unitFloatdigits='Product Price'required=Truestring='Unit Price' -
product_idMany2one → product.productchange_default=Truedomain=[('purchase_ok', '=', True)]string='Product' args: 'product.product' -
product_qtyFloatdigits='Product Unit of Measure'required=Truestring='Quantity' -
product_typeSelectionreadonly=Truerelated='product_id.type' -
product_uomMany2one → uom.uomdomain="[('category_id', '=', product_uom_category_id)]"string='Unit of Measure' args: 'uom.uom' -
product_uom_category_idMany2onerelated='product_id.uom_id.category_id' -
product_uom_qtyFloatcompute='_compute_product_uom_qty'store=Truestring='Total Quantity' -
qty_invoicedFloatcompute='_compute_qty_invoiced'digits='Product Unit of Measure'store=Truestring='Refunded Qty' -
qty_to_invoiceFloatcompute='_compute_qty_invoiced'digits='Product Unit of Measure'readonly=Truestore=Truestring='To Invoice Quantity' -
refund_onlyBooleanstring='Refund only' -
sequenceIntegerdefault=10string='Sequence Line' -
stateSelectionreadonly=Falserelated='order_id.state'store=True -
taxes_idMany2many → account.taxdomain=['|', ('active', '=', False), ('active', '=', True)]string='Taxes' args: 'account.tax'
-
create(self, vals_list)@api.model_create_multi -
onchange_product_id(self)@api.onchange('product_id') -
onchange_product_id_warning(self)@api.onchange('product_id') -
unlink(self) -
write(self, values)
- Status
- Open migration PR — not merged yet for this version
- CI status
- checks failing
- Open since
- 306 days ago
- Last activity
- 279 days ago
- Repository
- OCA/purchase-workflow
- Pull request
- [18.0][MIG] purchase_return: Migration to 18.0 (#2902)