Task: Drop deliverable/settlement_currency/fixing_source from currency_pair (deliverability needs a real model)
This page documents a task in the Currency pair support in reference data story. It captures the goal, current status, acceptance, and any notes or results.
Goal
Started as: rename currency_pair.deliverable to non_deliverable
(inverted sense, matching the idiomatic FX term "non-deliverable
forward"/NDF). Implemented, then reconsidered per FpML research
(FpML models this via a settlementType enum — Cash/Physical — not a
boolean, precisely because a pair can have more than one settlement
type, sometimes business-centre dependent) — see the design pivot in
* Plan below. Ended as: drop non_deliverable, settlement_currency,
and fixing_source from currency_pair entirely; deliverability
needs a dedicated settlement-convention junction model, captured
separately for a future story.
Acceptance
currency_pairno longer carriesnon_deliverable,settlement_currency, orfixing_sourcein SQL (schema, DQ artefact table, seed/populate, publish-from-DQ), C++ domain/ repository/generator, or Qt (columns, detail fields, badges).- Badge Catalogue has no leftover
currency_pair_non_deliverable=/ =currency_pair_deliverableentry. - A capture exists in the backlog inbox describing the proper settlement-convention model for a future story.
Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Currency pair support in reference data |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-07-08 |
Plan
Scope decision (with user): only currency_pair.deliverable —
currency.deliverable (a separate, semantically-identical field:
whether the currency itself forces any pair to be NDF) stays as-is,
out of scope for this task.
Round 1 (rename): codegen-driven — edited the field definition in
ores.refdata.currency_pair.org (name, label, default, badge_key),
regenerated SQL/domain/Qt, hand-fixed what codegen doesn't own
(seed/populate SQL, badge-system population row, paste blocks
referencing the field). Badge colour sense was first inverted (Yes=NDF
= gray/"special case"), then reverted back to plain Yes=green — user
feedback: Yes should always read as the affirmative/green case
regardless of what the field means, consistent with every other
Yes/No badge in the app.
Round 2 (drop): mid-implementation, asked "how does FpML model
this?" — FpML uses settlementType (Cash/Physical enum) plus a
conditional settlementCurrency, not a boolean, precisely because
real FX conventions allow multiple settlement types per pair
(sometimes business-centre dependent) — a plain boolean/optional-
currency pair can't express that. Decision: drop non_deliverable,
settlement_currency, and (same NDF-related concept)
fixing_source from currency_pair entirely, and capture the proper
settlement-convention model
(Model FX settlement type per currency pair, referencing
FX Settlement Market Convention Data Model) for a future story
rather than build it now.
Also fixed along the way (pre-existing bug from a concurrent merge on
main, unrelated to this task but blocking manual testing):
RegulatoryBookTypeController was missing :has_export_macro: true,
so its symbols were hidden from libores.qt.refdata.so's dynamic
symbol table — libores.qt.trading.so references it and failed to
resolve the symbol at load time, silently killing the client right
after party selection. Root-caused via gdb + nm -D comparison
against a working controller (BookController, which does carry the
flag).
Files:
projects/ores.refdata/modeling/ores.refdata.currency_pair.org— field defs removed; paste-block bodies simplified to just pair_code derivation + base≠quote validation.- Regenerated: SQL create/drop, domain struct, repository/mapper/generator, Qt Columns/Detail/Model/Dialog/MdiWindow/HistoryDialog files.
- Hand-fixed:
refdata_currency_pairs_seed_populate.sql,dq_currency_pairs_artefact_create.sql,refdata_publish_from_dq_create.sql,dq_badge_system_populate.sql. projects/ores.refdata/modeling/ores.refdata.regulatory_book_type.org— added the missing export-macro flag (unrelated fix, bundled in this PR since it blocked testing).- Docs: Badge Catalogue — removed the
currency_pair_non_deliverableentry. - New: FX Settlement Market Convention Data Model (Gemini analysis, committed with an org-roam ID), Model FX settlement type per currency pair (backlog capture referencing it).
Notes
PRs
| PR | Title |
|---|---|
| #1480 | [refdata,qt,sql] Drop deliverable/settlement_currency/fixing_source |
Review
| Comment summary | File | Decision | Notes |
|---|---|---|---|
Result
Shipped: dropped non_deliverable, settlement_currency, and
fixing_source from currency_pair entirely (SQL, domain, Qt),
after a design pivot from a straight rename once it became clear a
boolean/optional-currency pair can't express real FX settlement
conventions. Filed a capture with a structural analysis for the
proper future model. Also fixed a pre-existing, unrelated
cross-plugin symbol-visibility bug that was silently killing the
client on party selection.
CI initially red on canary (RLS_002 on
ores_variability_system_settings_tbl, pre-existing on main,
unrelated to this PR) — added to the established ignore-list stopgap
pattern. Merged with --force per explicit instruction once CI was
green.