---
id: ATS-ACC-BKS-012
scope: CAP-ACC-BKS-012
product_area: accounting
module: books
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-BKS-012-01
    title: Keep method behaviour immutable
    level: api
    proves:
      - BR-CAP-ACC-BKS-012-01
      - INV-DOM-ACC-BKS-006-01
    preconditions: System and customer-defined methods exist.
    steps: Change behaviour through the service and direct database writes.
    expected: Both enforcement paths refuse the change.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-057
      - TST-ACC-BKS-093
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/payment-methods.e2e.spec.js#answers
      409 payment_method_behaviour_immutable to another behaviour
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/payment-methods.e2e.spec.js#answers
        409 payment_method_behaviour_immutable to another behaviour
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        another behaviour, 409 payment_method_behaviour_immutable, leaving the
        method unchanged
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        a change of behaviour (the write-once trigger, RHF01)
  - id: ATS-ACC-BKS-012-02
    title: Preserve the protected initial methods
    level: api
    proves:
      - BR-CAP-ACC-BKS-012-02
      - INV-DOM-ACC-BKS-006-01
    preconditions: The workspace has been provisioned.
    steps: >-
      Rename and configure a system method, then deactivate it or alter deposit
      handling.
    expected: Permitted edits succeed; prohibited changes conflict.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-093
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#renames
      and reconfigures within the rules: name, description, sort order, prompt,
      label, availability and may_bounce
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#renames
        and reconfigures within the rules: name, description, sort order,
        prompt, label, availability and may_bounce
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        to be deactivated, 409 payment_method_system
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        a change of deposit handling, 409 payment_method_system
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        an inactive system method (payment_methods_system_active_check)
  - id: ATS-ACC-BKS-012-03
    title: Offer methods on eligible channels
    level: api
    proves:
      - BR-CAP-ACC-BKS-012-03
      - INV-DOM-ACC-BKS-006-02
    preconditions: No prior method is needed.
    steps: >-
      Create each behaviour with defaults and invalid offline-portal and
      empty-channel cases.
    expected: Behaviour defaults apply; invalid availability fails.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-093
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#defaults
      an offline method to the console, no reference, no bounce, direct deposit,
      active
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#defaults
        an offline method to the console, no reference, no bounce, direct
        deposit, active
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#defaults
        a card method to every channel
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        an offline method offered in the portal, naming the rule
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        a method offered nowhere
  - id: ATS-ACC-BKS-012-04
    title: Apply offline and reference constraints
    level: unit
    proves:
      - BR-CAP-ACC-BKS-012-04
      - BR-CAP-ACC-BKS-012-05
      - INV-DOM-ACC-BKS-006-02
    preconditions: No prior method is needed.
    steps: >-
      Validate a bouncing card, undeposited card, unlabelled prompt and label
      without prompt.
    expected: All incompatible configurations are refused.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-174
      - TST-ACC-BKS-093
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/rules/payment-method-rules.spec.js#refuses
      may_bounce and undeposited funds on a processor behaviour
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/unit/rules/payment-method-rules.spec.js#refuses
        may_bounce and undeposited funds on a processor behaviour
      - >-
        services-accounting:modules/books/tests/unit/rules/payment-method-rules.spec.js#refuses
        a label without a prompt and a prompt without a label
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        a prompted reference without its label
  - id: ATS-ACC-BKS-012-05
    title: Preserve migrated method vocabulary
    level: api
    proves:
      - BR-CAP-ACC-BKS-012-07
    preconditions: The workspace is migrated from the earlier product.
    steps: Run migration method seeding twice.
    expected: >-
      Five additional non-system methods appear once, with the two retired
      legacy methods inactive.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-093
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#writes
      the five extra methods once
    category: transition
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#writes
        the five extra methods once
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#writes
        cashier’s check, money order and offline card active, and the two legacy
        methods inactive, none a system method
  - id: ATS-ACC-BKS-012-06
    title: Exercise the grants for configure the methods used to receive money
    category: permission
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-01
    preconditions: >-
      An application-authorized reader and administrator share the run-owned
      setup. A third principal lacks the relevant resource grant.
    steps: >-
      Read the relevant configuration as the reader, attempt each supported
      mutation, then repeat with the matching administrator grants. Repeat the
      reads without their resource grants.
    expected: >-
      The permission outcomes match the cited authorization rule, and refused
      mutations leave every configured value unchanged.
    negative: true
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
      refused the create 403 permission_missing
    permissions_exercised:
      - accounting.payment-methods.read
      - accounting.payment-methods.create
      - accounting.payment-methods.update
    binding_evidence: []
    supporting_tests: []
  - id: ATS-ACC-BKS-012-07
    title: Channel membership endpoints
    category: boundary
    level: api
    proves:
      - BR-CAP-ACC-BKS-012-03
    preconditions: >-
      An isolated workspace has records needed for both eligible and ineligible
      examples.
    steps: 'Submit a single eligible channel, an empty set and a duplicate channel.'
    expected: The eligible member saves and both malformed collections are refused.
    negative: true
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      an offline method offered in the portal, naming the rule
    binding_evidence: []
  - id: ATS-ACC-BKS-012-08
    title: Refuse the second replacement of a shared read version
    category: concurrency
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-05
    preconditions: >-
      Two administrators read the same version of the relevant mutable record.
      Each prepares a different otherwise valid replacement.
    steps: >-
      Release both replacement requests from a barrier. Read the record again
      and retry the losing payload at its original version.
    expected: >-
      One replacement commits, the other is stale, and repeating the stale
      request preserves the winning values.
    negative: true
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 naming is_active to a replacement that leaves it out
    interaction_with:
      - CAP-ACC-BKS-016
    binding_evidence: []
  - id: ATS-ACC-BKS-012-09
    title: Provisioning retry preserves a renamed method
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-012-02
      - BR-CAP-ACC-BKS-019-01
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Provision the workspace, rename a system method through ordinary
      configuration, provision again and read all methods.
    expected: >-
      Retry neither duplicates the system set nor replaces the permitted renamed
      presentation.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to:
      - TST-ACC-BKS-093
    provenance: test
    source:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
        to be deactivated, 409 payment_method_system
      - >-
        services-accounting:modules/maintenance/tests/integration/services/participants/configuration-participant.integration.spec.js#answers
        provision done, having written the tenant’s five system payment methods
        (WP-01)
    exercises:
      - CAP-ACC-BKS-012
      - CAP-ACC-BKS-019
    workflows:
      - WF-ACC-BKS-009
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#keeps
        a method the tenant renamed
  - id: ATS-ACC-BKS-012-10
    title: Method behavior determines the tender fee
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-012-01
      - BR-CAP-ACC-BKS-003-06
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Evaluate the same configured fee against card, bank-debit and offline
      method behaviors with the bank-debit switch off and on.
    expected: >-
      The results follow the fee applicability rule while saved method behavior
      remains unchanged.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to:
      - TST-ACC-BKS-171
    provenance: test
    source:
      - >-
        services-accounting:modules/books/tests/e2e/payment-methods.e2e.spec.js#answers
        409 payment_method_behaviour_immutable to another behaviour
      - >-
        services-accounting:modules/books/tests/unit/rules/card-fee-rules.spec.js#charges
        a card behaviour always, a bank debit only when the rule says so, and
        never an offline method or without a rule
    exercises:
      - CAP-ACC-BKS-012
      - CAP-ACC-BKS-003
    workflows: []
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/unit/rules/card-fee-rules.spec.js#charges
        a card behaviour always, a bank debit only when the rule says so, and
        never an offline method or without a rule
evidence:
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/payment-methods.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/unit/rules/payment-method-rules.spec.js
product_intent: proposed
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-BKS-073'
  failure: 'gap: FND-ACC-BKS-073'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-012-02
    provenance: documented
    source:
      - ATS-ACC-BKS-012-02
  transition:
    scenarios:
      - ATS-ACC-BKS-012-05
    provenance: documented
    source:
      - ATS-ACC-BKS-012-05
  validation:
    scenarios:
      - ATS-ACC-BKS-012-03
      - ATS-ACC-BKS-012-04
    provenance: documented
    source:
      - ATS-ACC-BKS-012-03
      - ATS-ACC-BKS-012-04
  permission:
    scenarios:
      - ATS-ACC-BKS-012-06
    provenance: documented
    source:
      - ATS-ACC-BKS-012-06
  edge:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-073
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-073
  failure:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-073
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-073
  boundary:
    scenarios:
      - ATS-ACC-BKS-012-07
    provenance: documented
    source:
      - ATS-ACC-BKS-012-07
  concurrency:
    scenarios:
      - ATS-ACC-BKS-012-08
    provenance: documented
    source:
      - ATS-ACC-BKS-012-08
  invariant:
    scenarios:
      - ATS-ACC-BKS-012-01
    provenance: documented
    source:
      - ATS-ACC-BKS-012-01
  interaction:
    scenarios:
      - ATS-ACC-BKS-012-09
      - ATS-ACC-BKS-012-10
    provenance: documented
    source:
      - ATS-ACC-BKS-012-09
      - ATS-ACC-BKS-012-10
rule_coverage:
  - rule: BR-CAP-ACC-BKS-012-01
    scenarios:
      - ATS-ACC-BKS-012-01
      - ATS-ACC-BKS-012-10
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/payment-methods.e2e.spec.js#answers
      409 payment_method_behaviour_immutable to another behaviour
  - rule: BR-CAP-ACC-BKS-012-02
    scenarios:
      - ATS-ACC-BKS-012-02
      - ATS-ACC-BKS-012-09
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      to be deactivated, 409 payment_method_system
  - rule: BR-CAP-ACC-BKS-012-03
    scenarios:
      - ATS-ACC-BKS-012-03
      - ATS-ACC-BKS-012-07
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      an offline method offered in the portal, naming the rule
  - rule: BR-CAP-ACC-BKS-012-04
    scenarios:
      - ATS-ACC-BKS-012-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      a card method that may bounce
  - rule: BR-CAP-ACC-BKS-012-05
    scenarios:
      - ATS-ACC-BKS-012-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      a prompted reference without its label
  - rule: BR-CAP-ACC-BKS-012-07
    scenarios:
      - ATS-ACC-BKS-012-05
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#writes
      cashier’s check, money order and offline card active, and the two legacy
      methods inactive, none a system method
related_coverage:
  - capability: CAP-ACC-BKS-019
    scenarios:
      - ATS-ACC-BKS-012-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-012-name-the-ways-the-customer-receives-money.md
  - capability: CAP-ACC-BKS-003
    scenarios:
      - ATS-ACC-BKS-012-10
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-012-name-the-ways-the-customer-receives-money.md
workflow_coverage:
  - workflow: WF-ACC-BKS-009
    interactions:
      - ATS-ACC-BKS-012-09
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-009-provision-accounting-for-a-new-workspace.md
    gap: FND-ACC-BKS-073
coverage_interpretation: >-
  Covered means a specified scenario exists. Proposed scenarios and registered
  bindings do not establish a passed run or verified conformance.
invariant_coverage:
  - invariant: INV-DOM-ACC-BKS-006-01
    scenarios:
      - ATS-ACC-BKS-012-01
      - ATS-ACC-BKS-012-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      to be deactivated, 409 payment_method_system
  - invariant: INV-DOM-ACC-BKS-006-02
    scenarios:
      - ATS-ACC-BKS-012-03
      - ATS-ACC-BKS-012-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      an offline method offered in the portal, naming the rule
  - invariant: INV-DOM-ACC-BKS-006-03
    scenarios:
      - ATS-ACC-BKS-011-03
      - ATS-ACC-BKS-013-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/tax-classes.integration.spec.js#translates
      the refusal of each restrict foreign key to a tax class into a 409 naming
      it, the invoice lines among them
  - invariant: INV-DOM-ACC-BKS-006-04
    scenarios:
      - ATS-ACC-BKS-017-01
    provenance: documented
    source: >-
      services-accounting:modules/books/db/settings.table.ts:settings_template_references_trigger
  - invariant: INV-DOM-ACC-BKS-006-05
    scenarios:
      - ATS-ACC-BKS-018-10
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/db/schedules.table.ts;
      services-accounting:modules/maintenance/aws/lambda/CONSUMER.ts:handler;
      services-accounting:package-lock.json
  - invariant: INV-DOM-ACC-BKS-006-06
    scenarios:
      - ATS-ACC-BKS-018-05
      - ATS-ACC-BKS-018-07
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/integration/services/scheduling/schedules-end-to-end.integration.spec.js#pauses
      the schedule after the fifth failure in a row
  - invariant: INV-DOM-ACC-BKS-006-07
    scenarios:
      - ATS-ACC-BKS-019-04
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/integration/db/declaration-completeness.integration.spec.js#leaves
      no tenant-keyed table undeclared
  - invariant: INV-DOM-ACC-BKS-006-08
    scenarios:
      - ATS-ACC-BKS-019-05
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/integration/services/exports/seed-everything.integration.spec.js#stops
      a batch whose record carries a Stripe secret’s shape, blocked with nothing
      staged
  - invariant: INV-DOM-ACC-BKS-006-09
    scenarios:
      - ATS-ACC-BKS-019-06
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/unit/lifecycle/tenant-availability.spec.js#serves
      only an active tenant that is not disabled, and refuses every other
      combination
permission_coverage:
  - key: accounting.payment-methods.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-012-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-012-name-the-ways-the-customer-receives-money.md
    execution_gap: FND-ACC-BKS-073
  - key: accounting.payment-methods.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-012-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-012-name-the-ways-the-customer-receives-money.md
    execution_gap: FND-ACC-BKS-073
  - key: accounting.payment-methods.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-012-06
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-012-name-the-ways-the-customer-receives-money.md
    execution_gap: FND-ACC-BKS-073
reviewed_at: '2026-10-23'
---

# Configure the methods used to receive money: Capability Test Specification

## Coverage

- Keep method behaviour immutable.
- Preserve the protected initial methods.
- Offer methods on eligible channels.
- Apply offline and reference constraints.
- Apply offline and reference constraints.
- Preserve migrated method vocabulary.

The structured coverage map distinguishes specified examples from remaining findings. Proposed examples require executable proof before qualification.

## Interactions With Related Capabilities

- Provisioning retry preserves a renamed method.
- Method behavior determines the tender fee.

Related-capability and workflow references identify the seams each scenario exercises. The lifecycle coverage record retains transitions that still need individual proof.

## Binding Review

The pinned service and browser assertions support the registered bindings. Original test references remain beside each scenario so partial evidence and unresolved conformance remain reviewable.
