Skip to content

feat(analytics): resolve a monetary measure's currency via field config + tenant default - #2121

Merged
xuyushun441-sys merged 2 commits into
mainfrom
phase1b-analytics-currency
Jun 21, 2026
Merged

xuyushun441-sys merged 2 commits into
mainfrom
phase1b-analytics-currency

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Collaborator

Phase 1b — analytics measure-currency chain

Builds on #2119 (ExecutionContext.currency). The dataset measure-currency enrichment honored only an explicit measure currency literal (the original #2102 behavior) — so a measure summing a currency field, or any measure on a tenant with a configured default currency, rendered symbol-less unless the author restated the code on every measure.

Now a monetary measure resolves through the documented chain:

explicit measure `currency`
  → source-field `currencyConfig.defaultCurrency`
  → tenant default (`ctx.currency`, from the localization setting wired in #2119)

A measure is monetary iff it declares a currency or aggregates a currency-type field — so count / avg-of-a-number measures never receive a (wrong) currency code.

Changes

  • analytics-service: AnalyticsServiceConfig.measureCurrency(object, field) → source-field { type, defaultCurrency }; the enrichment applies the chain, gated on monetary type.
  • plugin: wires measureCurrency from the data engine's getObject().fields — the same accessor the dimension label resolver already uses (no new dependency).

Tests

query-dataset → 15 passed (+4):

  • currency-field measure with no explicit currency → inherits field defaultCurrency
  • currency field with no default → falls back to ctx.currency
  • explicit measure currency wins over field default + tenant ctx
  • a non-currency field measure stays code-less even with a tenant default

Follow-ups

  • Template-engine ({{ x | currency }}) still hard-defaults to USD; threading ctx.currency there is a small separate change (different package).
  • Phase 2 (objectui): one shared resolver/formatter + a client context exposing the tenant default; replace the ~20 ad-hoc client sites.

🤖 Generated with Claude Code

os-zhuang and others added 2 commits June 21, 2026 17:44
…ig + tenant default

Phase 1b of unifying currency resolution (builds on ExecutionContext.currency).
The dataset measure-currency enrichment honored ONLY an explicit measure
`currency` literal — so a measure summing a currency field, or any measure on a
tenant with a configured default currency, rendered symbol-less unless the
author restated the code.

Now a MONETARY measure resolves its display currency through the documented
chain: explicit measure `currency` → source-field `currencyConfig.defaultCurrency`
→ tenant default (`ctx.currency`, from the localization setting wired in #2119).
A measure is monetary iff it declares a currency OR aggregates a `currency`-type
field — so count / avg-of-number measures never get a (wrong) currency code.

- analytics-service: `AnalyticsServiceConfig.measureCurrency(object, field)` →
  source-field `{ type, defaultCurrency }`; enrichment applies the chain, gated
  on monetary type.
- plugin: wires `measureCurrency` from the data engine's `getObject().fields`
  (same accessor the label resolver already uses).

Tests: query-dataset 15 passed (+4: field-default inheritance, tenant-ctx
fallback, explicit-override precedence, and non-currency measures staying
code-less).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 21, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 21, 2026 9:47am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/s labels Jun 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): packages/services.

5 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/guides/packages.mdx (via packages/services)
  • content/docs/guides/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/guides/runtime-services/index.mdx (via packages/services)
  • content/docs/guides/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/protocol/objectos/i18n-standard.mdx (via packages/services)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@xuyushun441-sys
xuyushun441-sys merged commit 70609af into main Jun 21, 2026
16 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the phase1b-analytics-currency branch June 21, 2026 09:55
xuyushun441-sys added a commit that referenced this pull request Jun 21, 2026
…ode; showcase demo (#2123)

* docs(currency): document the field→tenant resolution chain; fix currencyMode; showcase demo

Follows the currency-resolution work (#2102/#2119/#2121/#2122). Brings the
skills + showcase in line with the now-implemented chain.

- objectstack-ui SKILL: document `DatasetMeasure.currency` (ISO 4217) and its
  resolution order (measure → field `currencyConfig` → tenant default).
- objectstack-data field-types: FIX a real doc bug — `currencyMode` was
  documented as `'multi'/'single'`, the schema is `'fixed'/'dynamic'`; add a
  "Currency resolution (ADR-0053)" note (field default → tenant default → plain
  number, never a hardcoded `$`).
- objectstack-i18n SKILL: note the workspace regional defaults (timezone /
  locale / currency) — the `localization` settings, resolved onto ExecutionContext
  and exposed at `/auth/me/localization`.
- showcase: declare a fixed `currencyConfig.defaultCurrency` on field-zoo's
  currency field (demonstrates + smoke-covers the symbol path); refresh the
  chart-gallery `budget`/`spent` comment, which claimed an unspecified-currency
  amount "must not show a $" — now it falls back to the tenant default.

Verified: app-showcase builds (field + dataset parse); check:skill-docs in sync.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(showcase): currencyConfig requires precision (typecheck)

---------

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — bc9e1838 Deployed Jun 21, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants