---
id: TST-ACC-PRD-039
title: Selling configuration and confirmation persistence
kind: integration
product_area: accounting
module: products
revision: 1
status: draft
product_intent: proposed
implementation_evidence: observed
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
repository: services-accounting
files:
  - modules/products/tests/integration/services/persistence/products.features.integration.spec.js
implements:
  - ATS-ACC-PRD-002-09
  - ATS-ACC-PRD-004-02
  - ATS-ACC-PRD-006-07
  - ATS-ACC-PRD-010-01
  - ATS-ACC-PRD-010-02
  - ATS-ACC-PRD-012-01
  - ATS-ACC-PRD-013-01
  - ATS-ACC-PRD-013-02
  - ATS-ACC-PRD-013-03
  - ATS-ACC-PRD-013-04
  - ATS-ACC-PRD-014-01
  - ATS-ACC-PRD-014-02
  - ATS-ACC-PRD-014-03
  - ATS-ACC-PRD-014-04
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 3
estimation_note: Planning estimate; no runtime measurement is claimed.
isolation: 'Suite-named local workspaces, isolated fixture records and explicit cleanup or rollback.'
evidence:
  - >-
    services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
assertion_bindings:
  - scenario: ATS-ACC-PRD-002-09
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a cancellation fee on a Legacy Product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        bulk pricing rules on a Legacy Product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a purchase limit on a Legacy Product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        tasks to generate on a Legacy Product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a confirmation e-mail on a Legacy Product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a restocking fee on a Legacy Product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        bulk pricing on a Donation Product
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#accepts
        the other features on a Donation Product
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-004-02
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
        the confirmation e-mail and its template
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#answers
        the new features, each list replaced as a whole and the template merged
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-006-07
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#leaves
        the delete standing when Platform cannot clear the template
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#is
        cleared after the product is deleted
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-010-01
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a percentage above 100
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-010-02
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        overlapping bulk pricing ranges, naming the rows
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-012-01
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a purchase limit of zero by the database’s check
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        an all-time purchase limit with a window
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a rolling purchase limit without its window
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-013-01
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
        a task type and a queue that became inactive while the product held them
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a task type the tenant does not have
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a queue the tenant does not have
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        an inactive task type newly assigned
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        an inactive queue newly assigned
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        another tenant’s task type, which reads as absent
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-013-02
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        an assignee that is not a Platform user id by the database’s check
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-013-03
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        more than 20 tasks to generate
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-013-04
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#answers
        every feature as written, the lists in the order sent
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-014-01
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a product’s OWN template named as a shared one
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a template id Platform does not have
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a template of another purpose
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        another tenant’s template
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#names
        a shared template of the purpose
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-014-02
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        content Platform refuses, naming the property, and writes nothing
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#rolls
        the product back when Platform cannot save the template
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#refuses
        a first template without a reply-to address, as Platform does
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#saved
        its own template in Platform, owned by the product, once
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
        one template, as its new version
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-014-03
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#clears
        the product’s own template when it switches to a shared one
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#archives
        the product’s own template in Platform
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
  - scenario: ATS-ACC-PRD-014-04
    assertions:
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#asks
        Platform for nothing
      - >-
        services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js#keeps
        the confirmation e-mail and its template
    provenance: test
    source: >-
      services-accounting:modules/products/tests/integration/services/persistence/products.features.integration.spec.js
coverage_note: Scenario references name existing assertion evidence; broader unexecuted variants remain findings.
---

# Selling configuration and confirmation persistence

## Verification Boundary

The suite exercises real PostgreSQL and Accounting persistence or database functions with isolated local workspace fixtures.

## What This Suite Proves

Product persistence validates and replaces selling settings, reads CRM and Platform references and tests local rollback around the doubled communications port.

## What It Does Not Prove

Local execution does not prove deployed infrastructure, downstream purchase behavior, real domain extension completion or atomic remote-template recovery.

## Real Dependencies and Test Doubles

PostgreSQL, transaction context, constraints, foreign keys and Accounting persistence are real. The test owns its workspace fixtures and clock. Platform communications or shared-template tables use local stand-ins; CRM reference tables are local test fixtures.

## Must Not Be Doubled

Do not double PostgreSQL, row-level security, transaction boundaries, constraints or the persistence implementation when claiming these local guarantees.
