Skip to content

CAP-ACC-PRD-008Configure prices by audience, period and currency

Markdown

CAP-ACC-PRD-008

Configure prices by audience, period and currency

Markdown
  • DocumentDraft
  • Product intentProposed
  • ImplementationObserved

KindCapabilityProduct areaAccountingModuleProductsRevision4

Read atservices-accounting f47cb263react-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
The grid supplies pricing configuration for eligible audiences.
Surfaces
consoleapi
Intent sources
services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D4services-accounting:docs/migrations/accounting-modernization/products-a12-a13/README.md#Provenance

Controls

22 controls apply, from the corpus control catalogue.

TC-IAM-001 TC-IAM-002 TC-IAM-004 TC-IAM-005 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-AZ-005 TC-AZ-006 TC-TEN-001 TC-TEN-002 TC-TEN-003 TC-TEN-004 TC-DAT-001 TC-LOG-001 TC-LOG-002 TC-LOG-003 TC-LOG-004 TC-PI-001 TC-PI-003 TC-PI-005

Permissions

KeyChecked atScope
accounting.products.createapitenant
accounting.products.updateapitenant

Business Rules

15 rules, 11 to be proved before approval. A rule's product intent is derived from its origin: 0 confirmed by a product decision, the rest inheriting this capability's proposed.

IdRuleKindEnforced atProvenance
01must prove
Proposed
A fixed-priced product requires a manually set standard price in its business unit’s base currency.
validationservice, consoletest
services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses an Accounting Product without a standard price in the base currency
02must prove
Proposed
A giver-priced product rejects price rows because the purchaser supplies the amount.
validationservice, consoletest
03must prove
Proposed
Price currencies must belong to the unit, and supported foreign currencies require multicurrency to be enabled.
validationservice, databasetest
services-accounting:modules/products/tests/unit/rules/product-rules.spec.js#refuses a supported currency when the unit has Enable Multicurrency off (1.0: off is a single-currency unit)
04must prove
Proposed
Each price cell selects an amount, a percentage of standard, conversion or prohibition and supplies only the values that mode requires, with percentages from zero to one hundred and at most two decimals.
validationapi, service, databasetest
05must prove
Proposed
Conversion and prohibition modes cannot apply to the base currency.
validationservicetest
06must prove
Proposed
A percentage price cannot target the standard audience and requires a set standard price in the same currency from its own period or the always period.
✓ A member price can be set to eighty percent of the standard euro price.✗ The member percentage has no basis when the corresponding standard euro price is absent.
calculationservice, databasetest
services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses a percentage cell on the standard audience, and one with no standard price to be a percentage of
07must prove
Proposed
A converted price requires its own audience’s set or percentage base-currency price from the same period or the always period.
calculationservicetest
services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses a calculated cell in the base currency, and one whose audience has no base-currency price to convert
08must prove
Proposed
Validation uses backing rows from the matching or always period and never another named period; Commerce owns actual price selection.
calculationserviceobserved
09must prove
Proposed
Rows sharing audience, currency and period cannot overlap in time, with opening instants included and closing instants excluded.
invariantservice, databasetest
services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses a dated price beside one that applies always, in the same audience and currency
10must prove
Proposed
Known audiences are standard, member and active Commerce audiences in the workspace; before that vocabulary exists, previously held audiences are also accepted.
validationservicetest
11
Proposed
Price amounts use nonnegative integer minor units of their currency.
validationapi, databasetest
12must prove
Proposed
Each product accepts up to five hundred price cells and replaces the entire grid on creation or replacement.
validationapi, servicetest
13
Proposed
Documented pricing responsibility assigns missing foreign-currency cells to unit defaults and conversion with frozen rates to Commerce.
policydocumented
services-accounting:docs/accounting/products.md#Prices (the grid: A12 and A13, 2026-10-17)
14
Proposed
The product API retains the deprecated audience alias in responses and accepts it instead of the current audience field.
policyapi, servicetest
services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#accepts the deprecated alias audience in place of audience_id, answering both
15
Proposed
The console fills an empty standard foreign-currency cell with prohibition unless the unit default supplies conversion.
policyconsoleobserved

Scenarios

IdGivenWhenThenProvenance
01A US-dollar product also supports euro and Canadian-dollar pricing.Staff set a dollar amount, member percentage, euro conversion and Canadian-dollar prohibition.The saved grid contains those choices in minor units at the initial version.test

Edge Cases

IdGivenWhenThenProvenance
02A standard dollar row has no date boundaries.An administrator adds another standard dollar row starting in January.The overlapping applicability rejects the save.test
services-accounting:modules/products/tests/integration/services/persistence/products.integration.spec.js#refuses a dated price beside one that applies always, in the same audience and currency

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.