---
id: ATS-ACC-BAT-001
scope: CAP-ACC-BAT-001
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-001-01
    title: Creation chooses Open
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-01
    preconditions: The unit’s current fiscal period accepts new batches.
    steps: Submit one creation request without status and another requesting Closed.
    expected: >-
      Only the first creates a record, in Open; the second returns 400 without
      saving.
    negative: true
    data_needs: Provide the e2e unit faa and its fiscal years.
    bound_to:
      - TST-ACC-BAT-060
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a create naming the status 400: a new batch is always open
    category: transition
    test_evidence:
      - >-
        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/e2e/batches.e2e.spec.js#creates
        the batch: 200, an id of faa’s prefix, the fiscal period of today, faa’s
        base currency, open
  - id: ATS-ACC-BAT-001-02
    title: Names are unique within a unit
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-02
      - INV-DOM-ACC-BAT-001-01
    preconditions: Daily already names a batch in the first unit.
    steps: Request Daily in that unit and in a second unit.
    expected: >-
      The existing name produces a 409 conflict in the first unit; creation
      succeeds in the second.
    negative: true
    data_needs: Provide two business units of one workspace.
    bound_to:
      - TST-ACC-BAT-085
      - TST-ACC-BAT-064
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a name another batch of the unit has 409, name_in_use, in 1.0’s sentence
      (D14)
    category: validation
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        a name another batch of the unit has 409, name_in_use, in 1.0’s sentence
        (D14)
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#creates
        a batch of another unit with a name the first unit uses
      - >-
        services-accounting:modules/batches/tests/integration/db/batch-names-migration.integration.spec.js#refuses
        a second batch of the unit with the name, whatever writes it (23505)
  - id: ATS-ACC-BAT-001-03
    title: Dates select the fiscal context
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-03
      - INV-DOM-ACC-BAT-001-03
    preconditions: The configured calendar covers only the two years beginning in 2026.
    steps: >-
      Request an October batch with a conflicting period, then request a date
      five years later.
    expected: >-
      October receives its calendar period; the uncovered date fails with the
      date and unit identified.
    negative: true
    data_needs: Provide fiscal years of the unit.
    bound_to:
      - TST-ACC-BAT-085
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a date no fiscal year of the unit holds
    category: boundary
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#takes
        the fiscal year and period of the date, the unit’s base currency, and
        opens a transaction batch
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        a date no fiscal year of the unit holds
  - id: ATS-ACC-BAT-001-04
    title: Closed periods reject creation
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-04
    preconditions: February’s fiscal period has closed.
    steps: Request a batch dated in a closed period through the creation API.
    expected: The request returns a period refusal and no batch is created.
    negative: true
    data_needs: Provide a closed period (the fiscal close of an earlier month).
    bound_to:
      - TST-ACC-BAT-085
      - TST-ACC-BAT-122
      - TST-ACC-BAT-006
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a date in a closed period
    category: validation
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        a date in a closed period
      - >-
        services-accounting:modules/batches/tests/unit/defects/fiscal-period-display-name.spec.js#says
        a new batch cannot be dated in the closed period, with the code
        period_not_open
      - >-
        react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0516.spec.ts#ACT-ACC-0516
  - id: ATS-ACC-BAT-001-05
    title: Currency follows the unit
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-05
    preconditions: The unit uses dollars as its base currency and also configures euros.
    steps: 'Request euros explicitly, then omit currency.'
    expected: Euros fail validation; omission selects dollars.
    negative: true
    data_needs: Provide a unit with two currencies.
    bound_to:
      - TST-ACC-BAT-085
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a currency other than the unit’s base currency
    category: rule
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        a currency other than the unit’s base currency
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#takes
        the fiscal year and period of the date, the unit’s base currency, and
        opens a transaction batch
  - id: ATS-ACC-BAT-001-06
    title: Names need visible text
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-06
    preconditions: No special setup is necessary.
    steps: Submit a creation request without a name.
    expected: The request returns 400 with a name-field error.
    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 create without a name 400, naming the field
    note: >-
      The retained test proves a missing name; whitespace-only input needs
      separate proof.
    category: validation
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
        a create without a name 400, naming the field
  - id: ATS-ACC-BAT-001-07
    title: References preserve the unit prefix
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-07
    preconditions: The unit reference is faa.
    steps: >-
      Let creation allocate a reference, then reuse a reference that already
      exists.
    expected: Allocation starts with faa-; reuse fails.
    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 id already in use
    category: edge
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#gives
        the batch an id of its unit’s prefix and a UUID
      - >-
        services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
        an id already in use
  - id: ATS-ACC-BAT-001-08
    title: Staff cannot create fiscal system batches
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-08
    preconditions: No special setup is necessary.
    steps: Request a deferred-revenue batch through ordinary creation.
    expected: A system-batch conflict returns 409 and saves nothing.
    negative: true
    data_needs: Provide no fixtures beyond the stated setup.
    bound_to:
      - TST-ACC-BAT-063
      - TST-ACC-BAT-134
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/e2e/system-batches.e2e.spec.js#refuses
      creating a batch of a system type 409 system_batch
    category: edge
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/e2e/system-batches.e2e.spec.js#refuses
        creating a batch of a system type 409 system_batch
      - >-
        services-accounting:modules/batches/tests/unit/rules/system-batch-rules.spec.js#refuses
        a create or an edit to a system type 409 system_batch
  - id: ATS-ACC-BAT-001-09
    title: Create permission controls entry
    level: browser
    proves:
      - BR-CAP-ACC-BAT-001-09
    preconditions: The personas include a reader and a staff creator.
    steps: 'As the reader, inspect New Batch; also submit creation without permission.'
    expected: >-
      The reader’s New Batch control is disabled and an unauthorized creation
      request returns 403.
    negative: true
    data_needs: Provide the acceptance personas.
    bound_to:
      - TST-ACC-BAT-060
      - TST-ACC-BAT-027
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a create to a caller without accounting.batches.create 403
    category: permission
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
        a create to a caller without accounting.batches.create 403
      - >-
        react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0540.spec.ts#ACT-ACC-0540
  - id: ATS-ACC-BAT-001-10
    title: Creation stays in the authorized workspace
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-10
    preconditions: Two separate workspaces are available.
    steps: Submit a body naming the workspace outside the caller’s authority.
    expected: The request returns 400 and neither workspace gains a batch.
    negative: true
    data_needs: Provide two acceptance workspaces.
    bound_to:
      - TST-ACC-BAT-060
      - TST-ACC-BAT-028
    provenance: test
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a create naming another tenant in the body 400
    category: boundary
    test_evidence:
      - >-
        services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
        a create naming another tenant in the body 400
      - >-
        react-console:acceptance/accounting/playwright/journeys/batches-posting/ACT-ACC-0541.spec.ts#ACT-ACC-0541
  - id: ATS-ACC-BAT-001-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-001
      - CAP-ACC-BAT-003
    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-001-12
    title: Creation supplies a scheduled close
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-01
      - BR-CAP-ACC-BAT-005-01
    exercises:
      - CAP-ACC-BAT-001
      - CAP-ACC-BAT-005
    workflows:
      - WF-ACC-BAT-001
    preconditions: Today is open and tomorrow has a future close time.
    steps: Create Morning with tomorrow’s close time and retrieve its schedule.
    expected: >-
      Morning is Open and its one scheduled occurrence identifies the created
      batch.
    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#keeps
      a one-occurrence schedule of the batch at that minute, in the tenant’s
      zone
  - id: ATS-ACC-BAT-001-13
    title: New intake does not start posting attention
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-01
      - BR-CAP-ACC-BAT-008-01
    exercises:
      - CAP-ACC-BAT-001
      - CAP-ACC-BAT-008
    workflows:
      - WF-ACC-BAT-001
    preconditions: Attention publication is enabled for the unit.
    steps: Create Morning without an automatic close and inspect its attention.
    expected: Morning is Open and has no waiting item.
    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/unit/attention/batches-awaiting-posting.spec.js#holds
      for a transaction batch in exactly closed, verified, posting and error
  - id: ATS-ACC-BAT-001-14
    title: Manual intake occupies a generated name
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BAT-001-02
      - BR-CAP-ACC-BAT-010-02
    exercises:
      - CAP-ACC-BAT-001
      - CAP-ACC-BAT-010
    workflows: []
    preconditions: An Open manual batch already has the rendered name Daily.
    steps: >-
      Roll the stream whose next rendered name is Daily and retrieve both
      batches.
    expected: The manual batch stays Daily and the generated batch is Daily (2).
    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/integration/services/persistence/batches.integration.spec.js#refuses
      a name another batch of the unit has 409, name_in_use, in 1.0’s sentence
      (D14);
      services-accounting:modules/batches/tests/integration/services/roll/batch-roller.integration.spec.js#names
      the new batch with the " (2)" suffix when the previous batch is kept and
      still holds the name
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-0516,
      0540, 0541).
  - >-
    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: covered
  validation: covered
  permission: 'gap: FND-ACC-BAT-055'
  edge: covered
  failure: 'gap: FND-ACC-BAT-055'
  boundary: covered
  concurrency: 'gap: FND-ACC-BAT-055'
  invariant: 'gap: FND-ACC-BAT-055'
  interaction: covered
coverage_notes:
  failure: >-
    Concurrent attempts for the same name, rollback after schedule creation,
    whitespace-only names, and the fiscal-calendar edges need focused proof.
  concurrency: >-
    Concurrent attempts for the same name, rollback after schedule creation,
    whitespace-only names, and the fiscal-calendar edges need focused proof.
  invariant: >-
    Concurrent attempts for the same name, rollback after schedule creation,
    whitespace-only names, and the fiscal-calendar edges need focused proof.
rule_coverage:
  - rule: BR-CAP-ACC-BAT-001-01
    scenarios:
      - ATS-ACC-BAT-001-01
      - ATS-ACC-BAT-001-11
      - ATS-ACC-BAT-001-12
      - ATS-ACC-BAT-001-13
    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
  - rule: BR-CAP-ACC-BAT-001-02
    scenarios:
      - ATS-ACC-BAT-001-02
      - ATS-ACC-BAT-001-14
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a name another batch of the unit has 409, name_in_use, in 1.0’s sentence
      (D14)
  - rule: BR-CAP-ACC-BAT-001-03
    scenarios:
      - ATS-ACC-BAT-001-03
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a date no fiscal year of the unit holds
  - rule: BR-CAP-ACC-BAT-001-04
    scenarios:
      - ATS-ACC-BAT-001-04
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a date in a closed period
  - rule: BR-CAP-ACC-BAT-001-05
    scenarios:
      - ATS-ACC-BAT-001-05
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      a currency other than the unit’s base currency
  - rule: BR-CAP-ACC-BAT-001-06
    scenarios:
      - ATS-ACC-BAT-001-06
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a create without a name 400, naming the field
  - rule: BR-CAP-ACC-BAT-001-07
    scenarios:
      - ATS-ACC-BAT-001-07
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/integration/services/persistence/batches.integration.spec.js#refuses
      an id already in use
  - rule: BR-CAP-ACC-BAT-001-08
    scenarios:
      - ATS-ACC-BAT-001-08
    provenance: proposed
    source: >-
      services-accounting:modules/batches/aws/api/batches.schemas.ts:batchRequestSchema;
      services-accounting:modules/batches/services/rules/batch-rules.ts:assertNotSystemType
  - rule: BR-CAP-ACC-BAT-001-09
    scenarios:
      - ATS-ACC-BAT-001-09
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a create to a caller without accounting.batches.create 403
  - rule: BR-CAP-ACC-BAT-001-10
    scenarios:
      - ATS-ACC-BAT-001-10
    provenance: proposed
    source: >-
      services-accounting:modules/batches/tests/e2e/batches.e2e.spec.js#refuses
      a create naming another tenant in the body 400
transition_coverage: []
permission_coverage:
  - key: accounting.batches.create
    surface: api
    scenarios:
      - ATS-ACC-BAT-001-09
    gap: FND-ACC-BAT-055
    provenance: unknown
    source: FND-ACC-BAT-055
    note: >-
      An aggregate persona check does not establish exhaustive allow and deny
      proof for every named surface.
executable_coverage:
  bound_scenarios: 10
  unbound_scenarios:
    - ATS-ACC-BAT-001-11
    - ATS-ACC-BAT-001-12
    - ATS-ACC-BAT-001-13
    - ATS-ACC-BAT-001-14
  gap: FND-ACC-BAT-055
---

# Collect a business unit’s documents in a new batch: 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-001-01` | `ATS-ACC-BAT-001-01`, `ATS-ACC-BAT-001-11`, `ATS-ACC-BAT-001-12`, `ATS-ACC-BAT-001-13` |
| `BR-CAP-ACC-BAT-001-02` | `ATS-ACC-BAT-001-02`, `ATS-ACC-BAT-001-14` |
| `BR-CAP-ACC-BAT-001-03` | `ATS-ACC-BAT-001-03` |
| `BR-CAP-ACC-BAT-001-04` | `ATS-ACC-BAT-001-04` |
| `BR-CAP-ACC-BAT-001-05` | `ATS-ACC-BAT-001-05` |
| `BR-CAP-ACC-BAT-001-06` | `ATS-ACC-BAT-001-06` |
| `BR-CAP-ACC-BAT-001-07` | `ATS-ACC-BAT-001-07` |
| `BR-CAP-ACC-BAT-001-08` | `ATS-ACC-BAT-001-08` |
| `BR-CAP-ACC-BAT-001-09` | `ATS-ACC-BAT-001-09` |
| `BR-CAP-ACC-BAT-001-10` | `ATS-ACC-BAT-001-10` |

## Interactions With Related Capabilities

A renamed collection remains findable. Creation supplies a scheduled close. New intake does not start posting attention. Manual intake occupies a generated name. 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.
