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

  1. 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.
  2. 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.
  3. 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.
  4. 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 with must_match_version.
  5. 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_calendar row each time. A calendar name links to Keep a holiday calendar right, which can show the two calendars side by side.
  6. 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.
  7. 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.

wireframe_set_up_a_currency_pair.png

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

  1. 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.
  2. 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.
  3. 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.
  4. The convention model names the wrong table. The business_day_convention note on the convention model says it refers to a trading table; the insert validates against the refdata business_day_convention_type list. The model text is out of date; the behaviour is right.
  5. Only a tenant administrator can run this journey. Captured as No role below the tenant administrator can maintain reference data. Operations holds the convention calendar permissions but not the pair or convention ones, and no read on the lists the pickers need.

9. Related journeys

10. Related knowledge

11. See also

Emacs 29.3 (Org mode 9.6.15)