---
id: STATE-ACC-PRD-005
title: Special-price handover
object: DOM-ACC-PRD-002
product_area: accounting
module: products
revision: 3
status: draft
design_intent: proposed
implementation_evidence: partially-observed
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
states:
- name: handed over
  meaning: The migration has kept a local-audience price and handover; the documented consumer needs Commerce
    to establish the audience.
- name: realised
  meaning: The intended completed handover has a Commerce audience, eligibility binding and realization timestamp.
- name: removed
  meaning: The owning product's deletion has cascade-removed the handover.
transitions:
- from: handed over
  to: realised
  trigger: The intended Commerce consumer creates its audience and stamps completion.
  guard: Available sources establish neither the worker nor its invocation and completion conditions.
  side_effects:
  - Add the intended audience to Commerce vocabulary
  - Enable qualified pricing when Commerce implements realization
  who: Commerce according to the documented boundary
  provenance: unknown
  source: FND-ACC-PRD-046
- from: handed over
  to: removed
  trigger: Delete the handover's product.
  guard: Normal product delete checks must pass.
  side_effects:
  - Cascade-delete the handover
  who: A permitted product deleter
  provenance: observed
  source: services-accounting:modules/products/db/pricing-audience-handovers.table.ts:pricingAudienceHandovers
- from: realised
  to: removed
  trigger: Delete the product after intended realization.
  guard: Normal product delete checks must pass.
  side_effects:
  - Cascade-delete the handover
  who: A permitted product deleter
  provenance: observed
  source: services-accounting:modules/products/db/pricing-audience-handovers.table.ts:pricingAudienceHandovers
invalid:
- from: realised
  to: handed over
  why: Accounting has no realization-reset operation, and the available Commerce evidence establishes no reverse
    transition.
concurrency: Accounting declares no realization worker. With a Commerce register present, HTTP saving requires
  active migrated audiences; the domain admission checks differ. Completion and consumer concurrency remain
  unverified.
invariants:
- INV-DOM-ACC-PRD-002-07
- INV-DOM-ACC-PRD-002-10
evidence:
- 'services-accounting at f47cb263: modules/products/db/pricing-audience-handovers.table.ts; services/persistence/pricing-audiences.ts;
  docs/migrations/accounting-modernization/products-a12-a13/README.md (The special-price migration, Decisions
  taken in the session 2, Open items).'
- 'services-accounting at f47cb263: tests/integration/db/special-prices-a12-migration.integration.spec.js.'
---

# Special-price handover

## The Lifecycle

```mermaid
stateDiagram-v2
  [*] --> handed_over: preserve migrated special price
  handed_over --> realised: intended Commerce completion, unverified
  handed_over --> removed: delete owning product
  realised --> removed: delete owning product
  removed --> [*]
```

## Transitions Explained

Migration leaves an audience-based cell and handover context for each former special price. The documented completion belongs to Commerce, which must create the audience and eligibility binding and record realization. The handover schema provides a timestamp for that outcome, but does not establish an implemented consumer.

## What Cannot Happen

Accounting offers no command to edit or realize handovers. Deleting a product cascades to its handovers. The examined sources establish no Commerce operation for undoing realization.

## Concurrency and Timing

Completion timing, retry behavior and consumer concurrency remain unknown. Once Commerce's register exists, an HTTP edit resubmitting a migrated cell requires an active audience there. The domain function applies different admission checks; Product must settle editing during that transition.
