---
id: ATS-ACC-BAT-003
scope: CAP-ACC-BAT-003
product_area: accounting
module: batches
revision: 2
status: proposed
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  rhythm-v2-docs: 37405d50d1465ea0571a66095d98ebec4db04175
scenarios:
  - id: ATS-ACC-BAT-003-01
    title: Details cannot set status
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-01
    preconditions: The batch is Open.
    steps: Submit Closed through the details editor.
    expected: The request returns 400 and leaves the batch Open.
    negative: true
    data_needs: Provide no fixtures beyond the stated setup.
    bound_to:
      - TST-ACC-BAT-060
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a PATCH naming the status 400: a status changes only through the batch’s
      actions
    category: validation
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
        a PATCH naming the status 400: a status changes only through the batch’s
        actions
  - id: ATS-ACC-BAT-003-02
    title: Ownership cannot move
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-02
      - INV-DOM-ACC-BAT-001-02
    preconditions: A recurring batch owns the selected batch.
    steps: Try changing its unit and its recurring-batch reference separately.
    expected: Both changes fail and both references remain intact.
    negative: true
    data_needs: 'Provide two units, two recurring batches.'
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/batches/services/rules/batch-rules.ts:BATCH_FROZEN_FIELDS
    category: invariant
    test_evidence: []
  - id: ATS-ACC-BAT-003-03
    title: Completed batches protect ordinary fields
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-03
    preconditions: 'The records include Posted, Downloaded and Archived batches.'
    steps: 'Change the posted date, downloaded name and archived description.'
    expected: >-
      Each request returns a field-specific 409; the posted fiscal context stays
      fixed and unarchive remains available.
    negative: true
    data_needs: Provide batches in each status.
    bound_to:
      - TST-ACC-BAT-085
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      moving the date of a posted batch, and the batch keeps its date and fiscal
      period (DEF-ACT-0502)
    category: transition
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        moving the date of a posted batch, and the batch keeps its date and
        fiscal period (DEF-ACT-0502)
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        renaming a downloaded batch
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        editing the description of an archived batch
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#still
        unarchives an archived batch: its named status action is not an edit
  - id: ATS-ACC-BAT-003-04
    title: Recent posting work blocks edits
    level: unit
    proves:
      - BR-CAP-ACC-BAT-003-04
    preconditions: One posting batch changed two minutes ago and another ten minutes ago.
    steps: Rename each batch.
    expected: The recent batch refuses the edit; the stale posting batch accepts it.
    negative: true
    data_needs: Provide no fixtures beyond the stated setup.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/batches/services/rules/batch-rules.ts:assertBatchChangesAllowed
    category: boundary
    test_evidence: []
  - id: ATS-ACC-BAT-003-05
    title: Date edits recalculate fiscal placement
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-05
    preconditions: An October batch is Open; September is closed and November open.
    steps: Move its date into November and then September.
    expected: November updates the period; September refuses the change.
    negative: true
    data_needs: Provide fiscal periods in each status.
    bound_to:
      - TST-ACC-BAT-085
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      moving an open batch’s date into a closed period (journey 0516/0520
      setups: the rule stands)
    category: rule
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#writes
        the fields given and moves the fiscal period with the date
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        moving an open batch’s date into a closed period (journey 0516/0520
        setups: the rule stands)
  - id: ATS-ACC-BAT-003-06
    title: Renames preserve unit uniqueness
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-06
    preconditions: Two batches share a unit.
    steps: 'Rename one to the other’s name, then change an unrelated field.'
    expected: >-
      The duplicate name returns 409; the unrelated update succeeds without
      renaming.
    negative: true
    data_needs: Provide no fixtures beyond the stated setup.
    bound_to:
      - TST-ACC-BAT-085
      - TST-ACC-BAT-055
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a rename to a name another batch of the unit has 409, name_in_use (D14)
    category: validation
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        a rename to a name another batch of the unit has 409, name_in_use (D14)
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#keeps
        its own name through a change of another field
      - >-
        services-accounting:modules/batches/tests/e2e/batch-actions.e2e.spec.js#refuses
        a rename to a name another batch of the unit has 409, name_in_use
  - id: ATS-ACC-BAT-003-07
    title: Submitted stale versions fail
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-07
    preconditions: Another editor has changed a batch since version one was read.
    steps: Save with that earlier version.
    expected: A stale-object conflict returns 409.
    negative: true
    data_needs: Provide no fixtures beyond the stated setup.
    bound_to:
      - TST-ACC-BAT-085
      - TST-ACC-BAT-060
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a change at a version the batch has moved on from
    category: concurrency
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        a change at a version the batch has moved on from
      - >-
        services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#renames
        it at the version read
  - id: ATS-ACC-BAT-003-08
    title: Unlocking is a separate update
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-08
    preconditions: Updates are locked on the batch.
    steps: 'Try editing, editing while unlocking, and unlocking alone before editing.'
    expected: >-
      The combined attempts fail; the standalone unlock preserves the external
      reference and permits the later edit.
    negative: true
    data_needs: Provide no fixtures beyond the stated setup.
    bound_to:
      - TST-ACC-BAT-085
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      an edit sent with the lock’s release
    category: edge
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        an edit of a locked batch
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        an edit sent with the lock’s release
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#releases
        the lock with {sys_locked: null}, keeping the external id, and the batch
        can then be edited and archived
  - id: ATS-ACC-BAT-003-09
    title: Type edits cannot create system batches
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-09
    preconditions: An ordinary batch is Open.
    steps: Request a deferred-revenue type through the details editor.
    expected: The system-batch refusal leaves the record intact.
    negative: true
    data_needs: Provide no fixtures beyond the stated setup.
    bound_to:
      - TST-ACC-BAT-074
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/close/system-batch-guard.integration.spec.js#refuses
      changing an ordinary batch’s type to a system type, the batch unchanged
    category: validation
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/close/system-batch-guard.integration.spec.js#refuses
        changing an ordinary batch’s type to a system type, the batch unchanged
  - id: ATS-ACC-BAT-003-10
    title: Update access controls the editor
    level: browser
    proves:
      - BR-CAP-ACC-BAT-003-10
    preconditions: The personas include a reader and a staff updater.
    steps: >-
      Inspect the read-only batch controls and submit a permitted details edit
      as staff.
    expected: >-
      The reader has no Edit Details action; staff can save an allowed details
      change.
    negative: true
    data_needs: Provide the acceptance personas.
    bound_to:
      - TST-ACC-BAT-027
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0540.spec.ts#ACT-ACC-0540
    category: permission
    test_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0540.spec.ts#ACT-ACC-0540
  - id: ATS-ACC-BAT-003-11
    title: A renamed collection remains findable
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-01
      - BR-CAP-ACC-BAT-003-06
    exercises:
      - CAP-ACC-BAT-003
      - CAP-ACC-BAT-001
    workflows:
      - WF-ACC-BAT-001
    preconditions: Daily exists in an open October period.
    steps: >-
      Create Daily, rename it to Morning, then retrieve it by its original
      reference.
    expected: The reference is unchanged and the name is Morning.
    negative: false
    data_needs: >-
      An isolated workspace with the stated business-unit calendar, documents
      and configuration.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a create naming the status 400: a new batch is always open;
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a rename to a name another batch of the unit has 409, name_in_use (D14)
  - id: ATS-ACC-BAT-003-12
    title: Archive protection ends through Unarchive
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-03
      - BR-CAP-ACC-BAT-004-05
    exercises:
      - CAP-ACC-BAT-003
      - CAP-ACC-BAT-004
    workflows:
      - WF-ACC-BAT-001
    preconditions: Morning starts Open with description First.
    steps: >-
      Archive Morning, try to change its description, unarchive it and save
      Second.
    expected: >-
      The archived save returns 409; the final read is Open with description
      Second.
    negative: true
    data_needs: >-
      An isolated workspace with the stated business-unit calendar, documents
      and configuration.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/batches/services/persistence/batches.ts:changeBatch;
      services-accounting:modules/batches/services/rules/batch-rules.ts:assertBatchChangesAllowed;
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#archives
      an open batch and a closed one, and unarchives to open
  - id: ATS-ACC-BAT-003-13
    title: Removing the close time cancels delivery
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BAT-003-01
      - BR-CAP-ACC-BAT-005-05
    exercises:
      - CAP-ACC-BAT-003
      - CAP-ACC-BAT-005
    workflows:
      - WF-ACC-BAT-001
    preconditions: Morning is Open with a future close occurrence.
    steps: >-
      Clear its close time through details editing and inspect the saved batch
      and schedule.
    expected: Morning stays Open without its former close schedule.
    negative: false
    data_needs: >-
      An isolated workspace with the stated business-unit calendar, documents
      and configuration.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/batches/aws/api/batches.schemas.ts:batchPatchSchema;
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#removes
      the schedule and the time when the batch is closed
evidence:
  - services-accounting at f47cb263: 'Inspected references: scenario-bound tests in modules/batches/tests.'
  - react-console at baf6dae3: >-
      Inspected references:
      acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0540.spec.ts.
  - >-
    Pinned design objects, state models and workflows identify invariant and
    interaction obligations; scenario test anchors remain in test_evidence.
product_intent: proposed
coverage:
  rule: covered
  transition: not-applicable
  validation: covered
  permission: 'gap: FND-ACC-BAT-057'
  edge: covered
  failure: 'gap: FND-ACC-BAT-057'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  failure: >-
    Edit failures after fiscal recalculation and exact five-minute posting
    thresholds remain unproved; optional-version omission also needs a focused
    comparison.
  transition: >-
    This capability has no independent lifecycle transition; state changes
    belong to the related lifecycle, posting or fiscal capability.
rule_coverage:
  - rule: BR-CAP-ACC-BAT-003-01
    scenarios:
      - ATS-ACC-BAT-003-01
      - ATS-ACC-BAT-003-13
    provenance: proposed
    source: >-
      services-accounting:modules/batches/aws/api/batches.schemas.ts:batchPatchSchema
  - rule: BR-CAP-ACC-BAT-003-02
    scenarios:
      - ATS-ACC-BAT-003-02
    provenance: proposed
    source: >-
      services-accounting:modules/batches/services/rules/batch-rules.ts:BATCH_FROZEN_FIELDS
  - rule: BR-CAP-ACC-BAT-003-03
    scenarios:
      - ATS-ACC-BAT-003-03
      - ATS-ACC-BAT-003-12
    provenance: proposed
    source: >-
      services-accounting:modules/batches/services/persistence/batches.ts:changeBatch;
      services-accounting:modules/batches/services/rules/batch-rules.ts:assertBatchChangesAllowed
  - rule: BR-CAP-ACC-BAT-003-04
    scenarios:
      - ATS-ACC-BAT-003-04
    provenance: proposed
    source: >-
      services-accounting:modules/batches/services/rules/batch-rules.ts:assertBatchChangesAllowed
  - rule: BR-CAP-ACC-BAT-003-05
    scenarios:
      - ATS-ACC-BAT-003-05
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      moving an open batch’s date into a closed period (journey 0516/0520
      setups: the rule stands)
  - rule: BR-CAP-ACC-BAT-003-06
    scenarios:
      - ATS-ACC-BAT-003-06
      - ATS-ACC-BAT-003-11
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a rename to a name another batch of the unit has 409, name_in_use (D14)
  - rule: BR-CAP-ACC-BAT-003-07
    scenarios:
      - ATS-ACC-BAT-003-07
    provenance: proposed
    source: >-
      services-accounting:modules/batches/aws/api/batches.schemas.ts:batchPatchSchema;
      services-accounting:modules/batches/services/persistence/batches.ts:changeBatch
  - rule: BR-CAP-ACC-BAT-003-08
    scenarios:
      - ATS-ACC-BAT-003-08
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      an edit sent with the lock’s release
  - rule: BR-CAP-ACC-BAT-003-09
    scenarios:
      - ATS-ACC-BAT-003-09
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/close/system-batch-guard.integration.spec.js#refuses
      changing an ordinary batch’s type to a system type, the batch unchanged
  - rule: BR-CAP-ACC-BAT-003-10
    scenarios:
      - ATS-ACC-BAT-003-10
    provenance: proposed
    source: >-
      react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0540.spec.ts#ACT-ACC-0540
transition_coverage: []
permission_coverage:
  - key: accounting.batches.update
    surface: api
    scenarios:
      - ATS-ACC-BAT-003-10
    gap: FND-ACC-BAT-057
    provenance: unknown
    source: FND-ACC-BAT-057
    note: >-
      An aggregate persona check does not establish exhaustive allow and deny
      proof for every named surface.
  - key: accounting.batches.update
    surface: console
    scenarios:
      - ATS-ACC-BAT-003-10
    gap: FND-ACC-BAT-057
    provenance: unknown
    source: FND-ACC-BAT-057
    note: >-
      An aggregate persona check does not establish exhaustive allow and deny
      proof for every named surface.
executable_coverage:
  bound_scenarios: 8
  unbound_scenarios:
    - ATS-ACC-BAT-003-02
    - ATS-ACC-BAT-003-04
    - ATS-ACC-BAT-003-11
    - ATS-ACC-BAT-003-12
    - ATS-ACC-BAT-003-13
  gap: FND-ACC-BAT-057
---

# Correct batch details before posting: Capability Test Specification

## Coverage

The scenarios define focused checks for this outcome. The coverage map distinguishes specified checks from unresolved proof; executable bindings identify inspected assertions and carry no execution result.

| Rule | Proof Specification or Gap |
|---|---|
| `BR-CAP-ACC-BAT-003-01` | `ATS-ACC-BAT-003-01`, `ATS-ACC-BAT-003-13` |
| `BR-CAP-ACC-BAT-003-02` | `ATS-ACC-BAT-003-02` |
| `BR-CAP-ACC-BAT-003-03` | `ATS-ACC-BAT-003-03`, `ATS-ACC-BAT-003-12` |
| `BR-CAP-ACC-BAT-003-04` | `ATS-ACC-BAT-003-04` |
| `BR-CAP-ACC-BAT-003-05` | `ATS-ACC-BAT-003-05` |
| `BR-CAP-ACC-BAT-003-06` | `ATS-ACC-BAT-003-06`, `ATS-ACC-BAT-003-11` |
| `BR-CAP-ACC-BAT-003-07` | `ATS-ACC-BAT-003-07` |
| `BR-CAP-ACC-BAT-003-08` | `ATS-ACC-BAT-003-08` |
| `BR-CAP-ACC-BAT-003-09` | `ATS-ACC-BAT-003-09` |
| `BR-CAP-ACC-BAT-003-10` | `ATS-ACC-BAT-003-10` |

## Interactions With Related Capabilities

A renamed collection remains findable. Archive protection ends through Unarchive. Removing the close time cancels delivery. These checks use the related capability’s outcome as part of the setup or verification. Unbound interactions remain proposed until a suite executes the complete chain.
