Skip to main content
iVentureTeam

account_pick_currency_date

A date picker beside an invoice's exchange rate. Pick a date, and the rate for that date is fetched from the server and saved.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated August 27, 20264 min read
Technical nameaccount_pick_currency_date
Viewsform (view widget, <widget> element)
Moduleaccount, the Invoicing and Accounting apps
Used in coreThe exchange rate area on the invoice form in account
VersionsOdoo 20.0, Odoo 19.0
No-code setupNo. It is set in view XML and depends on module-specific data
Alternativesmonetary, daterange, account_document_state

What the currency rate date does

A foreign currency invoice carries a rate, and by default that rate comes from the invoice date. Sometimes it should not: a contract may fix the rate at the order date, or an accountant may need to match a bank statement that converted on a different day.

This widget makes that a two-click operation. It puts a date picker beside the rate; picking a date asks the server for the rate that applied then, using the invoice's own company and currency, and writes the answer onto the invoice.

It then saves the record, so the change is committed rather than left pending.

What this means for your team

Rate disputes are one of the more tedious categories of month-end query, and most of them come down to which date the rate was taken from. Making that an explicit choice on the invoice, rather than an implicit consequence of the invoice date, removes the ambiguity.

Worth deciding as policy: which date your business considers authoritative. The widget makes any date available, so without a rule it becomes a judgment call per invoice, which is the opposite of what you want in a reconciliation.

Supported options in Odoo 19

The widget declares no options. It takes the standard view widget props plus an optional record, and the arguments it sends to the server are listed below. Read from the pick currency rate source, Odoo 19.0.

OptionTypeWhat it does
company_idfield read from the recordSent to the rate lookup, because rate tables are per company.(since Odoo 19.0)
currency_idfield read from the recordSent to the rate lookup as the currency whose rate is wanted.(since Odoo 19.0)
invoice_currency_ratefield written on applyReceives the returned rate before the record is saved.(since Odoo 19.0)
the picker typefixed to dateThe picker has no time component, because rates are defined per day.(default: date)(since Odoo 19.0)

It saves for you. Applying a date writes the rate and then saves the record. That is convenient and also means there is no chance to reconsider before the change is committed.

Working examples

Placing it

<widget name="account_pick_currency_date"/>

No attributes. It reads the company and currency from the record.

What is sent to the server

get_currency_rate(
  record id, company id, currency id, chosen date
)

The date is sent as a plain date, without time.

Then

# the returned rate is written and the record saved

No separate save step.

Why the company identifier is in the call

The picker is configured as date only. That is a deliberate narrowing, because an exchange rate in Odoo is defined per day and a time component would be meaningless.

What is sent to the server is worth reading closely: the record identifier, the company identifier and the currency identifier, all taken from the invoice, plus the chosen date. Passing the company matters in a multi-company database, because rate tables are per company and the correct answer depends on whose books the invoice belongs to.

The apply handler is asynchronous end to end. It awaits the server call, writes the returned rate to the invoice's rate field, then awaits the save. Because the write and the save are chained, an error in either leaves the form in a state the user can see rather than silently half-applied.

The props declaration adds an optional record on top of the standard set, which is unusual for a view widget and reflects that the component guards against being rendered without one.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Substantially rewritten on the development branch.
Odoo 19.0VerifiedFirst version. Verified against the shipped source.
Odoo 18.0Not availableWidget does not exist.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. The widget is new in Odoo 19. On earlier versions the rate was edited directly or recomputed from the invoice date, so an upgrade adds the picker with the standard views and nothing needs migrating.

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.

Substantially rewritten. The development branch reworks the component with a large diff. The concept, a date picker that fetches and applies a rate, is what to expect to survive; the mechanics are being reshaped.

Common problems and fixes

SymptomCause and fix
The rate does not changeNo rate exists for the chosen date in that company's rate table. Add the rate, or pick a date that has one.
The wrong rate appears in a multi-company databaseRate tables are per company and the invoice's company is used. Check the invoice's company is the one you expect.
The record saves unexpectedlyApplying a date writes the rate and saves immediately. Expected. There is no pending state to review.
The picker offers a timeIt should not; the picker is configured as date only. Check no customization overrode the picker props.
Nothing happens on applyThe record has no company or currency set yet. Fill those first; both are sent to the lookup.
The widget is missingThe invoice form in use does not include the widget element. Add it, or use the standard invoice form.

Currency rate date vs the alternatives

WidgetBest forKey difference
account_pick_currency_dateSetting an invoice's exchange rate from a specific dateFetches the rate for a chosen date using the invoice's own company, then saves immediately
monetaryShowing an amount with its currencyDisplays rather than sets a rate
daterangePicking a periodTwo dates rather than a rate lookup
account_document_stateShowing an accounting document's statusA status rather than a rate action

Editing the rate field directly is the alternative, and it is right when the rate comes from a contract rather than from a rate table. The difference is auditability: a picked date has a defensible source, a typed rate does not.

Frequently asked questions

Why is the company sent to the server?+
Because exchange rate tables are per company, so in a multi-company database the correct rate depends on whose books the invoice belongs to.
Does it save the invoice?+
Yes. Applying a date writes the rate and then saves the record, so there is no pending state to review before it is committed.
Can I pick a time as well as a date?+
No. The picker is configured as date only, because an Odoo exchange rate is defined per day.
What if there is no rate for that date?+
The server returns whatever its rate table gives, so a date with no rate produces no useful change. Add the rate or pick a covered date.
Which versions have it?+
Odoo 19 onwards. The development branch rewrites it substantially, though the concept is the same.

Multi-currency accounting that reconciles first time

Rate sources, revaluation and the dates behind them decide whether month-end is a review or an investigation. We implement Odoo Accounting for multi-currency operations, on versions 16 through 19.

Book a free consultation

How this page was produced

The date only picker configuration, the four arguments sent to the rate lookup, the write followed by an immediate save and the optional record prop were read from the pick currency rate source on the Odoo 19.0 branch. Version coverage comes from the absence of the file on 16.0, 17.0 and 18.0, and a comparison against the public development branch. Spotted an error? Tell us and we will correct the page.