User Journey: Set up a currency pair
Table of Contents
This page documents a user journey: A reference data administrator sets up a currency pair with its quoting convention, settlement calendars and classification on one screen.
A user journey describes what one person is trying to do, before anything is built. It is a design document that outlives any sprint, so it names the screens, the entity fields each screen shows, and the operations and messages each step needs.
1. Goal
"I want this pair to quote, display and settle the way the desk trades it." The journey is done when the pair, its convention and its settlement calendars read correctly on one screen.
2. Actor and trigger
The actor is the tenant administrator: an account with the TenantAdmin role,
acting inside their own tenant. The Operations role holds only the
convention calendar permissions, so it cannot run this journey. The trigger is
a pair the desk starts to trade, a market that changes its quoting precision, or
a settlement date that came out wrong. The journey starts at the pair list, or
at a link from a currency, and ends when the person leaves the pair.
3. Steps
- Find the pair. The person opens Currency pairs. The system lists the pairs: the pair code, the base and quote currencies, and the classification. The person filters, or chooses Add pair.
- Name the pair. For a new pair, the person picks the base and the quote
currency. The system builds the pair code as
BASE/QUOTE. If the quote currency has the higher base precedence, the system offers to swap the legs. Base-precedence order is the stored convention, and this screen enforces it; the server does not (see What is missing). The person picks the classification: major, minor or exotic. - Set the convention. The person sets the quoting convention on the same screen: the pip factor, the tick size in pips, the decimal places for display, the business day convention, whether forward dates count from spot, and whether the end-of-month rule applies. The system shows a sample rate at the chosen precision, so the person sees what the desk will see.
- Save the pair. The person states a change reason and saves. The system
writes the pair first and then its convention, because the convention
refers to the pair. A new pair is written with
must_not_exist; a change is written withmust_match_version. - Set the settlement calendars. The person adds or removes the calendars
that advance the pair's spot and maturity dates, usually one per leg. The
system writes or deletes one
currency_pair_convention_calendarrow each time. A calendar name links to Keep a holiday calendar right, which can show the two calendars side by side. - Check the history. The person opens the history of the pair or of its convention. The system shows every version with the field-level difference from the one before. The person can revert to an older version, which the system writes as a new version.
- Leave. The person goes back to the list.
No step waits on the server after its reply, and the journey keeps no state. Step 4 makes two writes; see What is missing.
4. Screens and wireframes
One screen. The pair and its convention are one record to the person, so they share one form with one Save. The settlement calendars sit below as a plain list, because no operation reads their history.
Figure 1: Currency pair: the pair and its convention in one form, the settlement calendars, and the history.
4.1. Each step, and the shape that serves it
The screen pipeline judges a journey before its prototype: a step is a CRUD variation that the Record screen standard already draws, a kind's own action, a view no rule draws yet, a missing server operation, or a step that keeps state across a reply and needs a workflow under the Workflows menu. Judged on 2026-10-25, against the screen the web draws today, by the screen pipeline runbook.
| Step | Shape on the screen | Judgement |
|---|---|---|
| 1 Find the pair | The record list: pair code, base, quote, classification | Standard list; the filter by currency or classification is a server gap |
| 2 Name the pair | The create dialog: base and quote pickers, the code derived, the swap offered, the classification picker | A create with a derived key (RS-WRITE-07) and a rule across fields (RS-WRITE-08); standard once the dialog is the shared record dialog |
| 3 Set the convention | The same dialog, the convention's fields with a sample rate | The pair and its convention are one form of two groups (RS-WRITE-09), the sample rate as a line of help (RS-WRITE-12). Today the screen builds a dialog of its own, against RS-WRITE-31; the prototype draws it as the shared dialog |
| 4 Save the pair | Add in the footer; two writes | Standard create; the two writes are the server's gap, not the screen's shape |
| 5 Set the settlement calendars | The Calendars tab, a link panel | Standard links |
| 6 Check the history | The History tab, the pair and its convention | Standard history: the convention is a part of the pair, so RS-HIST-01 carries it in the pair's story, named Convention |
| 7 Leave | The breadcrumb | Standard |
The journey is a CRUD variation of the standard record screen whose create dialog has two groups and a derived key; no own action, no workflow.
5. Prototype
Currencies, desk groups and pairs prototype, under
doc/prototypes/currencies/, draws every state of this journey's screens at
an address, and its design note cites the rule identifiers each state follows
and names what it leaves to the server.
6. Entities composed
| Entity | What it contributes | Model |
|---|---|---|
currency_pair |
The pair code, the two legs and the classification | ores.refdata.currency_pair |
currency_pair_convention |
The quoting and date convention, one per pair | ores.refdata.currency_pair_convention |
currency_pair_convention_calendar |
The settlement calendars panel rows | ores.refdata.currency_pair_convention_calendar |
currency |
The base and quote pickers, and the base precedence | ores.refdata.currency |
currency_pair_classification |
The classification picker | ores.refdata.currency_pair_classification |
business_day_convention_type |
The business day convention picker | ores.refdata.business_day_convention_type |
calendar |
The names in the calendars panel and its picker | ores.refdata.calendar |
7. Operations and messages
| Step | Operation | Subject | Status |
|---|---|---|---|
| Find the pair | List the pairs | refdata.v1.currency_pairs.list |
partial |
| Find the pair | Read one pair | refdata.v1.currency_pairs.get |
exists |
| Find the pair | Read its convention | refdata.v1.currency_pair_conventions.get |
exists |
| Name the pair | Fill the currency pickers | refdata.v1.currencies.list |
exists |
| Name the pair | Fill the classification picker | refdata.v1.currency_pair_classifications.list |
exists |
| Set the convention | Fill the business day convention picker | refdata.v1.business_day_convention_types.list |
exists |
| Save the pair | Offer the change reasons | dq.v1.change_reasons.list |
exists |
| Save the pair | Write the pair | refdata.v1.currency_pairs.put |
partial |
| Save the pair | Write the convention | refdata.v1.currency_pair_conventions.put |
partial |
| Set the settlement calendars | List the pair's calendars | refdata.v1.currency_pair_convention_calendars.list_by_pair_code |
exists |
| Set the settlement calendars | Fill the calendar picker | refdata.v1.calendars.list |
exists |
| Set the settlement calendars | Add or remove a calendar | refdata.v1.currency_pair_convention_calendars.put, .delete |
exists |
| Check the history | Read every version with its diff | refdata.v1.history.get |
exists |
| Check the history | Revert by writing the old values | the entity's put |
exists |
The history request is the generic one, with entity_type
ores.refdata.currency_pair or ores.refdata.currency_pair_convention; both
register a history provider.
8. What is missing
- The pair and its convention are not written together. Captured as Write a currency pair and its convention together, and check the pair code. They are two writes, and the convention refers to the pair. If the second write fails, the pair exists without the convention it is meant to have one of. The candidate is one operation that writes both in one transaction. Until then the screen writes the pair, then the convention, and if the second write fails it says so and keeps the convention form open for a retry. A pair found later without a convention opens with an empty convention form and a notice that the convention is missing, so the half-written pair can be completed from Find the pair.
- The pair code is not checked against its legs. Captured with the write above. The insert validates that
the base, the quote and the classification exist, but not that the pair code
is
BASE/QUOTE, that the legs differ, or that they are in base-precedence order. The candidate is to derive the pair code on the server, or to check it there. Until then the screen derives it and never lets the person type it. - The pair list cannot be filtered by currency or classification. The filter takes pair codes only. Showing "the pairs of this currency" means paging through every pair. The candidate is a filter on the base and quote currencies and on the classification.
- The convention model names the wrong table. The
business_day_conventionnote on the convention model says it refers to a trading table; the insert validates against the refdatabusiness_day_convention_typelist. The model text is out of date; the behaviour is right. - Only a tenant administrator can run this journey. Captured as No role below the tenant administrator can maintain reference data.
Operationsholds the convention calendar permissions but not the pair or convention ones, and no read on the lists the pickers need.
9. Related journeys
- Add or correct a currency — each leg opens its currency
- Keep a holiday calendar right — each settlement calendar opens there
- Group currencies for the desk — the desk groups the legs belong to
- Maintain a classification list — correct the pair classifications or business day conventions the pickers offer