---
id: ATS-ACC-BKS-014
scope: CAP-ACC-BKS-014
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-014-01
    title: Preserve template kind
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-01
      - INV-DOM-ACC-BKS-004-01
    preconditions: An invoice template exists.
    steps: Replace its kind and create an unknown kind.
    expected: Both invalid-kind attempts fail.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-052
      - TST-ACC-BKS-066
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to a change of kind, which is write-once
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        409 to a change of kind, which is write-once
      - >-
        services-accounting:modules/books/tests/integration/db/document-templates.table.integration.spec.js#refuses
        a kind that is not one of the five
  - id: ATS-ACC-BKS-014-02
    title: Refuse invalid source text
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-02
      - INV-DOM-ACC-BKS-004-02
    preconditions: No saved template is required.
    steps: 'Submit Handlebars, malformed Liquid and unknown fields or filters.'
    expected: Validation identifies field and position and saves no invalid template.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-052
      - TST-ACC-BKS-167
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      400 with the renderer’s sentence for Handlebars pasted into the body
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 with the renderer’s sentence for Handlebars pasted into the body
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 naming the line and column of Liquid that cannot be read
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 for a variable the kind does not provide, where it is read
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 for a filter Accounting does not have
      - >-
        services-accounting:modules/books/tests/unit/document-templates/template-sources.spec.js#refuses
        a save with every problem’s field and sentence, positions included
  - id: ATS-ACC-BKS-014-03
    title: Validate e-mail and download parts
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-03
      - INV-DOM-ACC-BKS-004-03
    preconditions: No saved template is required.
    steps: >-
      Submit missing statement e-mail, incomplete e-mail, download e-mail,
      missing download format and an invalid reply-to.
    expected: Every incompatible template is refused.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-066
      - TST-ACC-BKS-052
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/db/document-templates.table.integration.spec.js#refuses
      a statement without its e-mail (Rhythm 1.0’s V6)
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/db/document-templates.table.integration.spec.js#refuses
        a statement without its e-mail (Rhythm 1.0’s V6)
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 naming the e-mail body for a subject without one
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 to an e-mail on a batch download
      - >-
        services-accounting:modules/books/tests/integration/db/document-templates.table.integration.spec.js#refuses
        a batch download without its output format
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 naming the reply-to address when it is not an address
  - id: ATS-ACC-BKS-014-04
    title: Choose statement recipients consistently
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-04
    preconditions: Recipient roles are available.
    steps: >-
      Save default recipients, role recipients and all-contacts mode carrying
      roles.
    expected: >-
      Default and role selections persist; conflicting all-contact roles are
      refused.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-052
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#sends
      a statement to all contacts when send_to is not stated
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#sends
        a statement to all contacts when send_to is not stated
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#keeps
        a statement’s contact roles when it sends to contact roles
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 to contact roles a statement does not send to
  - id: ATS-ACC-BKS-014-05
    title: Copy protected built-ins safely
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-05
      - BR-CAP-ACC-BKS-014-06
      - INV-DOM-ACC-BKS-004-04
    preconditions: Built-in content is available.
    steps: >-
      Replace, delete and duplicate the invoice built-in and reuse its identity
      for a customer template.
    expected: >-
      Mutations and identity reuse fail; duplication creates an active complete
      copy.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-052
      - TST-ACC-BKS-163
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to a replacement of a built-in
    category: transition
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        409 to a replacement of a built-in
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        409 to deleting a built-in
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 to an id a built-in owns
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#copies
        a built-in into a new, active tenant template with the built-in’s
        content
      - >-
        services-accounting:modules/books/tests/unit/document-templates/built-ins.golden.spec.js#renders
        thirty golden files: four documents, three e-mails, five downloads at
        three levels with their file names
  - id: ATS-ACC-BKS-014-06
    title: Preview draft output without saving
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-07
    preconditions: Unsaved invoice and download sources include a bad variable.
    steps: Preview both kinds.
    expected: >-
      Sample rendering uses suitable escaping, identifies empty values and
      problems and preserves unaffected output.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-052
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#renders
      an invoice body and its e-mail with the sample invoice, escaping it as
      HTML
    category: edge
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#renders
        an invoice body and its e-mail with the sample invoice, escaping it as
        HTML
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#names
        the merge fields that rendered empty
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        an unknown variable with where it is read, and still renders the other
        parts
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#renders
        a batch download and its file name at the detail level asked for,
        unescaped
  - id: ATS-ACC-BKS-014-07
    title: Prepare a chapter’s invoice content
    level: browser
    proves:
      - AS-JNY-ACC-BKS-004-01
      - AS-JNY-ACC-BKS-004-02
    preconditions: The chapter has a business unit.
    steps: Copy and edit its invoice template through the journey.
    expected: >-
      Invalid content cannot save; corrected content is available for the unit’s
      selection.
    negative: false
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-020
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0026.spec.ts#ACT-ACC-0026
    category: interaction
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0026.spec.ts#ACT-ACC-0026
  - id: ATS-ACC-BKS-014-08
    title: Exercise the grants for prepare accounting document and export templates
    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.document-templates.read
      - accounting.document-templates.create
      - accounting.document-templates.update
      - accounting.document-templates.delete
    binding_evidence: []
    supporting_tests:
      - >-
        services-accounting:modules/books/tests/e2e/document-templates-security.e2e.spec.js#is
        refused the template create 403 permission_missing
  - id: ATS-ACC-BKS-014-09
    title: Reactivate and remove unused customer content
    category: transition
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-01
      - BR-CAP-ACC-BKS-014-06
      - BR-CAP-ACC-BKS-015-05
      - INV-DOM-ACC-BKS-004-05
    preconditions: >-
      An administrator has valid unassigned content and two unused customer
      identities.
    steps: >-
      Create inactive content, reactivate it and deactivate it again. Create an
      active copy and remove it while unused. Remove the inactive original and
      read both identities.
    expected: >-
      The lifecycle accepts each eligible transition and neither removed
      identity reads back as stored content.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source: >-
      specs/accounting/books/design/state-models/STATE-ACC-BKS-003-document-template-lifecycle.md:transitions
    state_model: STATE-ACC-BKS-003
    transitions:
      - - absent
        - inactive
      - - inactive
        - active
      - - active
        - inactive
      - - active
        - deleted
      - - inactive
        - deleted
    binding_evidence: []
  - id: ATS-ACC-BKS-014-10
    title: Statement role-count endpoints
    category: boundary
    level: api
    proves:
      - BR-CAP-ACC-BKS-014-04
    preconditions: >-
      An isolated workspace has records needed for both eligible and ineligible
      examples.
    steps: >-
      Save a role-recipient statement with one and fifty roles, then zero and
      fifty-one roles.
    expected: >-
      Eligible role collections persist and out-of-range collections leave the
      saved content 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/document-templates.e2e.spec.js#sends
      a statement to all contacts when send_to is not stated
    binding_evidence: []
  - id: ATS-ACC-BKS-014-11
    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-014-12
    title: Prepared content stays protected while selected
    category: interaction
    level: browser
    proves:
      - BR-CAP-ACC-BKS-014-06
      - BR-CAP-ACC-BKS-015-05
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Copy and edit an invoice template, assign it to a unit, try deleting and
      deactivating it, clear the choice and delete it.
    expected: >-
      Selected content survives both refusals and becomes removable after
      release.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to:
      - TST-ACC-BKS-020
    provenance: test
    source:
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#copies
        a built-in into a new, active tenant template with the built-in’s
        content
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        409 to deleting the business unit’s template, naming the unit
    exercises:
      - CAP-ACC-BKS-014
      - CAP-ACC-BKS-015
    workflows:
      - WF-ACC-BKS-007
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0026.spec.ts#ACT-ACC-0026
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0026.spec.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/document-templates.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/unit/document-templates/built-ins.golden.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/unit/document-templates/template-sources.spec.js
product_intent: proposed
state_transition_coverage:
  - state_model: STATE-ACC-BKS-003
    from: absent
    to: active
    trigger: Create active content or make a copy
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#copies
      a built-in into a new, active tenant template with the built-in’s content
    scenarios:
      - ATS-ACC-BKS-014-05
  - state_model: STATE-ACC-BKS-003
    from: built-in
    to: active
    trigger: Copy built-in content
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#copies
      a built-in into a new, active tenant template with the built-in’s content
    scenarios:
      - ATS-ACC-BKS-014-05
  - state_model: STATE-ACC-BKS-003
    from: active
    to: in use
    trigger: Select the template
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      400 to a business unit naming an inactive template
    scenarios:
      - ATS-ACC-BKS-015-04
  - state_model: STATE-ACC-BKS-003
    from: in use
    to: active
    trigger: Release every configuration selection
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/document-templates.integration.spec.js#returns
      a unit to the built-in when a replacement leaves its reference out
    scenarios:
      - ATS-ACC-BKS-015-06
  - state_model: STATE-ACC-BKS-003
    from: active
    to: inactive
    trigger: Deactivate unused content
    provenance: observed
    source: >-
      services-accounting:modules/books/db/document-templates.table.ts:document_templates_reference_guard_trigger
    scenarios:
      - ATS-ACC-BKS-014-09
  - state_model: STATE-ACC-BKS-003
    from: inactive
    to: active
    trigger: Reactivate content
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/document-templates.ts
    scenarios:
      - ATS-ACC-BKS-014-09
  - state_model: STATE-ACC-BKS-003
    from: active
    to: deleted
    trigger: Delete unused active content
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to deleting the business unit’s template, naming the unit
    scenarios:
      - ATS-ACC-BKS-014-09
      - ATS-ACC-BKS-015-07
  - state_model: STATE-ACC-BKS-003
    from: inactive
    to: deleted
    trigger: Delete inactive content
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/document-templates.ts
    scenarios:
      - ATS-ACC-BKS-014-09
  - state_model: STATE-ACC-BKS-003
    from: absent
    to: inactive
    trigger: Create inactive content
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/document-templates.ts:createDocumentTemplate
    scenarios:
      - ATS-ACC-BKS-014-09
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  edge: covered
  failure: 'gap: FND-ACC-BKS-075'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-014-04
    provenance: documented
    source:
      - ATS-ACC-BKS-014-04
  transition:
    scenarios:
      - ATS-ACC-BKS-014-05
      - ATS-ACC-BKS-014-09
    provenance: documented
    source:
      - ATS-ACC-BKS-014-05
      - ATS-ACC-BKS-014-09
  validation:
    scenarios:
      - ATS-ACC-BKS-014-02
      - ATS-ACC-BKS-014-03
    provenance: documented
    source:
      - ATS-ACC-BKS-014-02
      - ATS-ACC-BKS-014-03
  permission:
    scenarios:
      - ATS-ACC-BKS-014-08
    provenance: documented
    source:
      - ATS-ACC-BKS-014-08
  edge:
    scenarios:
      - ATS-ACC-BKS-014-06
    provenance: documented
    source:
      - ATS-ACC-BKS-014-06
  failure:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-075
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-075
  boundary:
    scenarios:
      - ATS-ACC-BKS-014-10
    provenance: documented
    source:
      - ATS-ACC-BKS-014-10
  concurrency:
    scenarios:
      - ATS-ACC-BKS-014-11
    provenance: documented
    source:
      - ATS-ACC-BKS-014-11
  invariant:
    scenarios:
      - ATS-ACC-BKS-014-01
    provenance: documented
    source:
      - ATS-ACC-BKS-014-01
  interaction:
    scenarios:
      - ATS-ACC-BKS-014-07
      - ATS-ACC-BKS-014-12
    provenance: documented
    source:
      - ATS-ACC-BKS-014-07
      - ATS-ACC-BKS-014-12
rule_coverage:
  - rule: BR-CAP-ACC-BKS-014-01
    scenarios:
      - ATS-ACC-BKS-014-01
      - ATS-ACC-BKS-014-09
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to a change of kind, which is write-once
  - rule: BR-CAP-ACC-BKS-014-02
    scenarios:
      - ATS-ACC-BKS-014-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      400 naming the line and column of Liquid that cannot be read
  - rule: BR-CAP-ACC-BKS-014-03
    scenarios:
      - ATS-ACC-BKS-014-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/db/document-templates.table.integration.spec.js#refuses
      a statement without its e-mail (Rhythm 1.0’s V6)
  - rule: BR-CAP-ACC-BKS-014-04
    scenarios:
      - ATS-ACC-BKS-014-04
      - ATS-ACC-BKS-014-10
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#sends
      a statement to all contacts when send_to is not stated
  - rule: BR-CAP-ACC-BKS-014-05
    scenarios:
      - ATS-ACC-BKS-014-05
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to a replacement of a built-in
  - rule: BR-CAP-ACC-BKS-014-06
    scenarios:
      - ATS-ACC-BKS-014-05
      - ATS-ACC-BKS-014-09
      - ATS-ACC-BKS-014-12
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#copies
      a built-in into a new, active tenant template with the built-in’s content
  - rule: BR-CAP-ACC-BKS-014-07
    scenarios:
      - ATS-ACC-BKS-014-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#names
      the merge fields that rendered empty
related_coverage:
  - capability: CAP-ACC-BKS-015
    scenarios:
      - ATS-ACC-BKS-014-12
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-014-design-the-invoices-receipts-statements-and-exports-rhythm.md
workflow_coverage:
  - workflow: WF-ACC-BKS-007
    interactions:
      - ATS-ACC-BKS-014-12
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-007-resolve-and-render-a-documents-template.md
    gap: FND-ACC-BKS-075
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-004-01
    scenarios:
      - ATS-ACC-BKS-014-01
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to a change of kind, which is write-once
  - invariant: INV-DOM-ACC-BKS-004-02
    scenarios:
      - ATS-ACC-BKS-014-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      400 naming the line and column of Liquid that cannot be read
  - invariant: INV-DOM-ACC-BKS-004-03
    scenarios:
      - ATS-ACC-BKS-014-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/db/document-templates.table.integration.spec.js#refuses
      a statement without its e-mail (Rhythm 1.0’s V6)
  - invariant: INV-DOM-ACC-BKS-004-04
    scenarios:
      - ATS-ACC-BKS-014-05
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to a replacement of a built-in
  - invariant: INV-DOM-ACC-BKS-004-05
    scenarios:
      - ATS-ACC-BKS-014-09
      - ATS-ACC-BKS-015-05
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
      409 to deleting the business unit’s template, naming the unit
  - invariant: INV-DOM-ACC-BKS-004-06
    scenarios:
      - ATS-ACC-BKS-015-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/unit/document-templates/resolution.spec.js#refuses
      an inactive template named explicitly, in Rhythm 1.0’s words
permission_coverage:
  - key: accounting.document-templates.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-014-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-014-design-the-invoices-receipts-statements-and-exports-rhythm.md
    execution_gap: FND-ACC-BKS-075
  - key: accounting.document-templates.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-014-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-014-design-the-invoices-receipts-statements-and-exports-rhythm.md
    execution_gap: FND-ACC-BKS-075
  - key: accounting.document-templates.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-014-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-014-design-the-invoices-receipts-statements-and-exports-rhythm.md
    execution_gap: FND-ACC-BKS-075
  - key: accounting.document-templates.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-014-08
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-014-design-the-invoices-receipts-statements-and-exports-rhythm.md
    execution_gap: FND-ACC-BKS-075
reviewed_at: '2026-10-23'
---

# Prepare Accounting document and export templates: Capability Test Specification

## Coverage

- Preserve template kind.
- Refuse invalid source text.
- Validate e-mail and download parts.
- Choose statement recipients consistently.
- Copy protected built-ins safely.
- Copy protected built-ins safely.
- Preview draft output without saving.

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

## Interactions With Related Capabilities

- Prepare a chapter’s invoice content.
- Prepared content stays protected while selected.

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.
