Skip to main content
iVentureTeam

open_match_line_widget

A cell whose only job is to open the matching line it sits on. Model and method are both written into the widget, which makes it precise and completely non-portable.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 28, 20264 min read
Technical nameopen_match_line_widget
Field typesany
Viewslist, form
Modulepurchase, the Purchase app
Used in core1 occurrence, the bill matching screen in purchase
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. The model and method it calls are fixed in the source
Alternativesmany2one, open_move_widget, line_open_move_widget

What the match line opener does

Matching vendor bills to purchase orders produces a working list of candidate pairs, and the natural next step from any row is to open the thing it refers to. That target is not always the row's own record, and working out which action to run belongs on the server rather than in a view.

This widget is that step. It renders a control on the row and, when used, calls a named method on the matching model through Odoo's action button mechanism, letting the server return whatever action is appropriate.

It is deliberately narrow. There is nothing configurable, no options and no reading of the field it is attached to beyond the record's identifier, because the widget exists for one screen.

What this means for your team

Bill matching is one of the highest-volume reconciliation tasks in an accounts payable process, and the value of a screen like this is measured in how few clicks a match takes to verify. A control that opens the right thing directly from the row removes a search step from an action performed dozens of times a day.

The design point worth borrowing is that the destination is decided server side. That keeps the routing logic where the matching rules already live, and it means the widget does not have to know what a match is or where it should lead.

Working examples

The usual usage

<field name="any_field"
       widget="open_match_line_widget"/>

The field it sits on is a placeholder; the widget uses only the record's identifier.

What it calls

# through the action button mechanism
purchase.bill.line.match.action_open_line(record)

The server returns the action, so the destination can vary per row.

The generic equivalent

<button name="action_open_line" type="object"
        string="Open"/>

An ordinary row button does the same thing without a widget, at the cost of the widget's specific rendering.

Letting the server choose the destination

The component is twenty lines. It takes the action service and exposes one method that calls a server action button with four fixed pieces: the type, the record's identifier, the method name and the model.

Using the action button mechanism rather than constructing a window action is the decision worth recording. It means the standard button pipeline applies, including saving the edited row first, and it lets the server decide what to return: a form, a different record, or nothing at all.

The model being hardcoded alongside the method is what makes the widget single-purpose. It does not read the record's own model, so placing it on a row of anything else would call the wrong model with the wrong identifier.

Nothing about the field it is attached to matters, which is why the widget declares no supported types. In practice it is placed on whatever column the screen wants the control to appear in.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Byte-identical to Odoo 19 on the development branch.
Odoo 19.0VerifiedVerified against the shipped source. Byte-identical to Odoo 18.
Odoo 18.0VerifiedFirst version, with the bill matching screen.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. The widget arrived in Odoo 18 with the bill matching screen and is unchanged in Odoo 19, so nothing needs attention on upgrade.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable and this may still change; we re-verify this page after the release.

Byte-identical. The file on the development branch matches Odoo 19 exactly, including the hardcoded model and method.

Common problems and fixes

SymptomCause and fix
Nothing opensThe server method returned no action for that row. Check the matching record; the destination is decided server side.
An error about the wrong modelThe widget was used outside the matching screen, and the model is hardcoded. Use it only there, or copy the widget with your own model and method.
Options are ignoredThe registration has no extractor. Nothing to configure here.
The row saves before openingThe action button mechanism saves the edited row first. Expected, and usually what you want on a matching screen.
The control renders on an odd columnThe widget ignores the field it is placed on. Place it on whichever column should carry the control.
Missing widget errorThe purchase module is not installed in that database. Install Purchase, or use an ordinary row button.

Match line opener vs the alternatives

WidgetBest forKey difference
open_match_line_widgetOpening a bill match line from its rowCalls a hardcoded server method and lets the server choose the destination
many2oneOpening a related recordA link from a real relation, with no server call
open_move_widgetOpening a journal entry from a lineThe accounting equivalent, with its own hardcoded target
line_open_move_widgetOpening a move line's documentAnother single-purpose opener in the same family

An ordinary row button calls the same method with no widget at all, and is the right choice unless the specific rendering matters. Where the destination is a relation rather than a computed action, a relation widget gives a link for free.

Frequently asked questions

What does the control open?+
Whatever the server returns. The widget calls a named method on the matching model through the action button mechanism, so the destination can differ per row.
Can I use it on another model?+
No. Both the model and the method name are written into the widget, so it would call the wrong model with the wrong identifier.
Does it take options?+
None. The registration provides a component only, with no options, no extractor and no supported types.
Why does the row save when I use it?+
Because the action button mechanism saves the edited row before executing, which is the standard behavior for row buttons.
Could a plain button do the same?+
Yes. An ordinary row button calling the same method behaves identically; the widget exists for its specific rendering.

Bill matching that takes seconds, not sessions

Three-way matching, tolerances and the screens that surface exceptions decide how much of accounts payable is manual. We configure Odoo Purchase and Accounting to match automatically where it safely can.

Book a free consultation

How this page was produced

The action button call, its four fixed pieces and the absence of options or supported types were read from open_match_line_widget.js on the Odoo 19.0 branch. Version coverage comes from the absence of the file on 16.0 and 17.0 and byte comparisons against 18.0 and the public development branch. Spotted an error? Tell us and we will correct the page.