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.
24 lines
965 B
Markdown
24 lines
965 B
Markdown
# 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
|
|
|