Files
vmall/openspec/specs/currency/spec.md
T
james 2136a48fbe chore(openspec): archive the mock-migration waves and green the spec set
Archive the three completed changes behind replace-mock-api-wave-1/2/3. Each
merge applied cleanly to the main specs:

- catalog gains the Public product browse requirement (subtree filtering and
  price sort)
- frontend-mall picks up the per-domain adapter, the pinned home page, the
  discovery-page changes, the live auth panels and the live transaction flows
- cart's Server-side cart requirement now documents the shop and stock carried
  by every line

Also replace the TBD Purpose placeholder in all eleven specs with a one-line
description of what each capability covers. Those placeholders predate this
work and were the only reason `openspec validate --all --strict` reported
0 passed / 11 failed; it now reports 11 passed / 0 failed.
2026-09-17 16:36:10 +00:00

965 B

currency Specification

Purpose

The currency registry and integer-minor-unit conversion between currencies.

Requirements

Requirement: Currency registry

The system SHALL maintain a currencies table: ISO code, localized name, symbol, exponent (minor units), enabled flag, and rate_to_base (NUMERIC). Exactly one currency is the base.

Scenario: seeded currencies

  • WHEN migrations finish
  • THEN USD exists as base with rate 1, and CNY/EUR/JPY exist with positive rates

Requirement: Amount conversion

GET /api/currencies/convert SHALL convert integer minor units between enabled currencies via base rates, rounding half-up to the target exponent.

Scenario: USD to JPY

  • WHEN converting 1000 minor USD (=$10.00) to JPY with rate 150
  • THEN the result is 1500 minor JPY (¥1500), an integer

Scenario: disabled currency rejected

  • WHEN converting to a disabled or unknown currency
  • THEN the API returns 400