Skip to main content
iVentureTeam

account_move_statusbar_secured

A padlock next to Posted, green when the entry is hash-secured and orange when it is not. One inherited status bar, three template edits, and an audit story you can see at a glance.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 27, 20266 min read
Technical nameaccount_move_statusbar_secured
Field typesselection
Viewsform
Moduleaccount, present wherever Invoicing or Accounting is installed
Used in core1 occurrence, the journal entry form in account
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. Studio offers the plain status bar; this variant is set in view XML
Alternativesstatusbar, status_with_color, badge, web_ribbon

What the secured status bar does

In several countries an accounting system has to be able to prove that a posted entry was never altered afterwards. Odoo does that by hashing entries in sequence, so any later edit breaks the chain. An entry that carries such a hash is called secured.

The problem is visibility. Whether an entry is secured is a boolean that nobody looks at, on a form full of amounts and dates. This widget puts it where people already look: a padlock beside the Posted stage in the status bar, closed and green when the entry is secured, open and orange when it is not.

Everything else is the ordinary status bar. The same stages, the same clicking between them, the same visible-stage list. The widget inherits the standard component and edits its templates in three places so the lock appears next to the Posted label wherever that label is drawn: in the bar itself, in the dropdown on small screens, and in the current-value display.

What this means for your team

Data inalterability is an audit conversation, and audit conversations go better with evidence a non-specialist can see. A finance lead who can open any entry and see a closed green padlock has an answer for the auditor that does not require a report or a developer.

The orange open lock is just as useful, because it is normal. Entries are secured in batches, so a recently posted entry legitimately shows an open lock until the securing runs. The distinction to explain internally is that orange means not yet secured, not tampered with.

The group gating matters commercially too. Core shows this widget only to users in the secured-entries group and the plain status bar to everyone else, which means the lock is deliberately not part of the everyday invoicing interface. If your client operates under one of the inalterability regimes, making sure the right people are in that group is part of the setup, not an afterthought.

Supported options in Odoo 19

The widget spreads the status bar descriptor, so it inherits that widget's options and attributes and declares none of its own. The controls people actually use are listed below, read from the status bar field and this widget's source, Odoo 19.0.

OptionTypeWhat it does
securedfield on the recordRead literally to choose the lock icon and color. Not declared as a dependency, so the form must load it.
statusbar_visiblestring (attribute)Inherited from the status bar. Comma-separated list of stages always shown in the bar. Core uses draft,posted here.
clickablebooleanInherited from the status bar. Allows moving between stages by clicking them.
fold_fieldfieldInherited from the status bar. Names the field that decides which stages are folded into the dropdown.

The lock is driven by a field named secured, read literally. The widget declares no dependency on it, so the form has to load it. In core it is present on the journal entry form; a custom form that omits it renders the status bar with no lock at all and no warning.

Working examples

The core usage

<field name="state" widget="statusbar"
       statusbar_visible="draft,posted"
       groups="!account.group_account_secured"/>
<field name="state" widget="account_move_statusbar_secured"
       statusbar_visible="draft,posted"
       groups="account.group_account_secured"/>

Two declarations of the same field, mutually exclusive by group. Only users who care about securing see the lock.

The field the lock reads

<field name="secured" invisible="1"/>

Required on any custom form, since the widget declares no dependency on it.

With a clickable stage list

<field name="state" widget="account_move_statusbar_secured"
       statusbar_visible="draft,posted,cancel"
       options="{'clickable': '1'}"/>

Inherited from the status bar. The lock only ever decorates the posted stage, whatever else is visible.

Three places the label is drawn, three substitutions

The class is eleven lines. It adds a getter for the secured flag and a getter for the currently selected item, and points at a replacement template. All the work is in that template, and it is a good example of how to extend a component whose label is drawn in several places.

A small named block renders a label plus, when the item's value is the posted stage, the padlock with its color chosen from the secured flag. The template then substitutes that block into three positions in the inherited status bar: the item labels in the bar itself, the labels inside the dropdown that small screens use, and the current-value display, which is replaced by first setting the item to the selected one and then calling the same block. Without that third substitution the lock would vanish exactly when the entry is posted and the bar collapses to a single value.

The comparison is against the literal posted value, so the widget is bound to the journal entry state selection rather than being a generic decorator. There is no option to move the lock to another stage.

The version detail worth recording is a small bug. In Odoo 18 the descriptor declared its supported type as state, which is not one of Odoo's field types. Supported types are what the framework uses when a widget is applied to a field of the wrong type and what developer tooling reads, so an invalid entry there means the widget was effectively unclassified. Odoo 19 corrects it to selection. Neither version prevents the widget from working when it is named explicitly in a view, which is why it survived a release.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Byte-identical to Odoo 19 on the development branch.
Odoo 19.0VerifiedVerified against the shipped source. The descriptor's supported type is corrected to selection.
Odoo 18.0VerifiedFirst version. Renders identically, but the descriptor declared a supported type of state, which is not a real field type.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. Nothing in view XML changes between Odoo 18 and Odoo 19. The only difference is the corrected supported type in the descriptor, which affects tooling rather than rendering. The widget does not exist before Odoo 18, so a database coming from Odoo 17 gains the lock along with the securing feature itself.

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

Byte-identical. The widget file on the development branch matches Odoo 19 exactly, including the corrected supported type. The lock, the colors, the group gating and the template substitutions are all unchanged.

Common problems and fixes

SymptomCause and fix
No padlock appears at allThe form does not load the secured field, which the widget reads literally and does not declare. Add the field to the form, invisible is enough.
Ordinary users do not see the lockIntended. Core gates this widget on the secured-entries group and shows the plain status bar to everyone else. Add the relevant users to that group if they need to see securing state.
The lock is orange on a posted entryThe entry is posted but not yet secured. Securing runs separately from posting. Expected. Run or wait for the securing process; orange does not mean altered.
The lock disappears when the bar collapsesA custom template override dropped the substitution in the current-value display. Keep all three template substitutions when patching the widget.
The lock shows on the wrong stageThe comparison is against the literal posted value of the journal entry state. The stage cannot be changed from XML; use a different indicator widget for other models.
Developer tooling does not offer the widgetOn Odoo 18 the declared supported type is not a real field type. Name the widget explicitly in view XML; it renders correctly regardless.

Secured status bar vs the alternatives

WidgetBest forKey difference
account_move_statusbar_securedShowing at a glance whether a posted journal entry is hash-securedThe standard status bar with a color-coded padlock injected into the posted stage
statusbarAny ordinary workflow status barNo lock and no dependency on an accounting securing flag
status_with_colorState shown as a colored indicatorColor-driven rather than icon-driven, and not tied to a specific stage
badgeState shown inline in lists and formsA pill next to the data rather than a header bar
web_ribbonAn unmissable corner bannerA view element with no field behind it

Use the plain statusbar widget on every other model; this variant only understands the journal entry's posted stage. If you want a state indicator with a color rather than an icon, the status-with-color and badge widgets are the general-purpose options, and neither requires the entry to be an accounting document.

Frequently asked questions

What does the padlock next to Posted mean?+
Closed and green means the journal entry carries an inalterability hash, so any later change would break the chain. Open and orange means it has not been secured yet, which is normal for a recently posted entry.
Why do only some users see the lock?+
Core declares the state field twice on the journal entry form, once with the plain status bar for users outside the secured-entries group and once with this widget for users inside it.
Why is my padlock missing entirely?+
The widget reads a field named secured literally and declares no dependency on it. A custom form that does not load that field renders the status bar with no lock and no warning.
Can I put the lock on a different stage?+
No. The template compares the item's value against the literal posted value, and there is no option to change it.
Did anything change between Odoo 18 and 19?+
Only the descriptor. Odoo 18 declared a supported type of state, which is not a real Odoo field type; Odoo 19 corrects it to selection. Rendering is identical.

Does your accounting stand up to an inalterability audit?

Hash chains, secured entries and country-specific reporting rules are configuration decisions with legal weight, and they are hard to retrofit. We set up Odoo Accounting for regulated environments on versions 16 through 19, including localization packages.

Book a free consultation

How this page was produced

The lock rendering, the color rule, the three template substitutions and the literal posted comparison were read from account_move_statusbar_secured.js and its template on the Odoo 19.0 branch, with the group-gated usage read from account/views/account_move_views.xml. The Odoo 18 supported-type difference comes from the same file on that branch, and the Odoo 20 statement from a byte comparison against the public development branch. Spotted an error? Tell us and we will correct the page.