Skip to main content
iVentureTeam

account_payment_register_html

The line of text in the Register Payment wizard that offers to pay just the installment instead. It is server-generated HTML with one clickable class, and Odoo 19 threw away the editor it used to run through.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 27, 20265 min read
Technical nameaccount_payment_register_html
Field typeshtml
Viewsform
Moduleaccount, present wherever Invoicing or Accounting is installed
Used in core1 occurrence, the Register Payment wizard in account
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. The message is generated on the server and the interaction is hardcoded
Alternativeshtml, account_batch_sending_summary, monetary, documentation_link

What the payment register panel does

When you register a payment against an invoice that has payment terms, Odoo needs to tell you something: the full amount is due eventually, but only part of it is due now. That message is computed on the server, because working out which installment applies needs the payment terms, the dates and what has already been paid.

The result is a small piece of HTML placed on the wizard, and this widget renders it. What makes it more than a text field is one link inside that message. Clicking it sets the payment amount to the installment amount, so the user can accept the suggestion without retyping a figure.

The mechanism is deliberately blunt. The widget listens for clicks anywhere in the message and acts only if the clicked element carries a specific class. Everything else in the message, including any other link the server might generate, does nothing.

What this means for your team

Partial payment against payment terms is where invoicing gets fiddly, and where a mistyped amount creates a reconciliation problem later. Offering the correct figure as a one-click choice removes the arithmetic from the person doing the data entry, which is worth more on a busy payment run than it sounds.

The design is also a good example of a pattern worth reusing: compute the message server side, where the business logic already lives, and give the client one narrow interaction rather than a general-purpose editor. The Odoo 19 rewrite made that explicit by dropping the rich editor the widget used to be built on.

Working examples

The core usage

<field name="payment_difference_note"
       widget="account_payment_register_html"
       nolabel="1"/>

No options. The message and the switch link are produced by the wizard's own computation.

The markup the handler reacts to

<a class="installments_switch_button">
  Pay the installment only
</a>

The class is what the click handler checks. An element without it, however it looks, is inert.

The companion field it writes from

# on the wizard model
installments_switch_amount = fields.Monetary(...)
# clicking the link copies it into `amount`

Both names are read literally from the root record, so a custom wizard must use the same ones.

From a rich editor to twenty lines

The Odoo 19 component is twenty lines: a getter that returns the field's value, and a click handler. The handler reads the clicked element from the event, tests its class list for the switch class, and if it matches, updates the wizard's amount from the companion field on the model root.

Two consequences follow from testing the clicked element itself rather than searching upwards. Clicking a nested element inside the link, for example a bold word or an icon, does not match, because the class sits on the parent. And the handler runs for every click anywhere in the message, which is cheap but means the interaction is entirely determined by the markup the server produced.

The update targets the model root rather than the field's own record, which on this wizard is the same object, but it is the reason the widget can change a different field from the one it is rendering.

The version story is the interesting part. In Odoo 18 this widget extended the rich HTML field from the editor module, which meant the whole editing stack was loaded to display a sentence with a link in it. Odoo 19 replaced that with a plain component that outputs the value, keeping the same click handling. The behavior a user sees is identical; the weight behind it is not.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Byte-identical to Odoo 19 on the development branch.
Odoo 19.0VerifiedVerified against the shipped source. Rewritten as a standalone component instead of an editor field.
Odoo 18.0VerifiedFirst version. Same behavior, but built on the rich HTML editor field.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. No view change is needed between Odoo 18 and Odoo 19, but the internals are entirely different: Odoo 18 extended the editor's HTML field, Odoo 19 is a standalone component. Any custom module that patched the Odoo 18 version, or relied on editor behavior such as inline editing of the message, has to be rewritten.

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 can still change; we re-verify the page after release.

Byte-identical. The file on the development branch matches Odoo 19 exactly, including the hardcoded class and field name. Any change to the message itself will come from the server-side computation.

Common problems and fixes

SymptomCause and fix
Clicking the link does nothingThe clicked element does not itself carry the switch class, for example because the click landed on a nested element inside it. Click the link text directly, or generate the class on the element users actually click.
The amount does not changeThe wizard has no field holding the installment amount under the name the widget reads. Provide that field on the model; the name is written into the widget.
The message does not appearThe server computed an empty value for the field. Check the invoice's payment terms and what has already been paid.
The message is not editableIntended in Odoo 19. The widget only outputs the value; the editor base was removed. Use a plain HTML field if the content genuinely has to be edited.
A customization stopped working after upgrading to Odoo 19The widget no longer extends the editor's HTML field. Rewrite the patch against the standalone component.
Options are ignoredThe registration has no extractor. Nothing to configure here.

Payment register panel vs the alternatives

WidgetBest forKey difference
account_payment_register_htmlA server-generated hint with exactly one clickable actionOutputs HTML and reacts to a single hardcoded class, writing another field on the record
htmlServer-generated content with no interactionRenders the markup and does nothing else
account_batch_sending_summaryA read-only wizard summary panelNo interaction at all, and a fixed structure rather than free markup
monetaryThe amount field the link writes toA currency-aware value input rather than a message
documentation_linkA link out of the formNavigates instead of writing a field

For a server-generated message with no interaction, a plain HTML field is simpler and needs no widget. For a message with several actions, a small custom component with explicit buttons is clearer than class-matching inside generated markup. This widget sits precisely in the middle: one message, one action.

Frequently asked questions

What is the clickable link in the Register Payment wizard?+
A switch that sets the payment amount to the installment amount. The widget listens for clicks on the message and acts only when the clicked element carries a specific hardcoded class.
Why does clicking sometimes not work?+
The handler tests the clicked element itself rather than searching upwards, so a click landing on a nested element inside the link does not match.
Can I configure it?+
No. The registration provides only a component, with no options, no extractor and no supported types. Both the class it reacts to and the amount field it reads are written into the source.
What changed in Odoo 19?+
The implementation. Odoo 18 built this on the rich HTML editor field; Odoo 19 replaced it with a plain component that outputs the value. The user-visible behavior is the same, but any patch against the old base has to be rewritten.
Can I edit the message from the interface?+
No. In Odoo 19 the widget only outputs the value. The message is generated by the wizard's server-side computation.

Payments that reconcile without a spreadsheet

Payment terms, installments and partial payments are where accounting teams lose hours to manual matching. We configure Odoo payments and reconciliation so the common cases resolve themselves, on versions 16 through 19.

Book a free consultation

How this page was produced

The click handling, the hardcoded class, the companion field name and the update targeting the model root were read from account_payment_register_html.js on the Odoo 19.0 branch, with the usage taken from the Register Payment wizard view in the same module. The change of base class was established by comparing the file on the 18.0 branch, and the Odoo 20 statement by a byte comparison against the public development branch. Spotted an error? Tell us and we will correct the page.