---
id: ATS-ACC-BKS-011
scope: CAP-ACC-BKS-011
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-011-01
    title: Validate bounded day precision
    level: api
    proves:
      - BR-CAP-ACC-BKS-011-01
    preconditions: No prior term is needed.
    steps: >-
      Submit days above the bound, negative, over-precision and textual values,
      then both numeric bounds.
    expected: Invalid inputs identify the day field; zero and 1000 are accepted.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-058
      - TST-ACC-BKS-061
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 naming number_of_days for more than 1000 days
    category: boundary
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 naming number_of_days for more than 1000 days
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 naming number_of_days for a negative number of days
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 naming number_of_days for more than two decimal places
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 naming number_of_days for a number of days sent as text
      - >-
        services-accounting:modules/books/tests/integration/db/accounting-dimensions.table.integration.spec.js#accepts
        0 and 1000 days (the bounds)
  - id: ATS-ACC-BKS-011-02
    title: Keep terms workspace-wide
    level: api
    proves:
      - BR-CAP-ACC-BKS-011-02
    preconditions: A business unit exists.
    steps: Create terms containing that unit.
    expected: The unit property is refused.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-058
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 to a business unit, which payment terms do not carry
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 to a business unit, which payment terms do not carry
  - id: ATS-ACC-BKS-011-03
    title: Give useful deletion refusals for referenced terms
    level: api
    proves:
      - BR-CAP-ACC-BKS-011-04
      - BR-CAP-ACC-BKS-011-05
      - INV-DOM-ACC-BKS-006-03
    preconditions: >-
      Terms are referenced by an invoice, customer terms and an installment
      schedule.
    steps: Attempt removal in each state.
    expected: >-
      Deletion preserves referenced terms. Recognized invoice and customer
      references produce a named dependency conflict; the installment reference
      retains the unexplained refusal recorded by its cited rule.
    negative: true
    data_needs: Isolated fixture records matching this scenario’s setup.
    bound_to: []
    provenance: proposed
    source:
      - FND-ACC-BKS-009
      - >-
        services-accounting:modules/books/services/persistence/configuration-refusals.ts:STILL_REFERENCED
    category: failure
    binding_evidence: []
    note: >-
      The feature regression separately proposes a useful installment dependency
      refusal; this capability scenario records the current contract and known
      defect.
  - id: ATS-ACC-BKS-011-04
    title: Use edited term days at invoice issue
    level: browser
    proves:
      - BR-CAP-ACC-BKS-011-01
      - BR-CAP-ACC-BKS-011-03
    preconditions: >-
      An administrator has a run-owned product, contact, open batch and terms
      initially named for forty-five days.
    steps: >-
      Create the terms, edit their days to forty-six while keeping the name,
      issue an invoice dated October eighteenth, then change it to the zero-day
      terms through Edit Details.
    expected: >-
      The issued invoice falls due on December third; selecting the zero-day
      terms changes its due date to the invoice date.
    negative: false
    data_needs: >-
      A postable unit, priced product, CRM contact, open batch and run-marked
      term records.
    bound_to:
      - TST-ACC-BKS-013
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0018.spec.ts#ACT-ACC-0018
    category: interaction
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0018.spec.ts#ACT-ACC-0018
    binding_review: >-
      The retained browser binding asserts forty-six days after the edited term,
      not the previously described thirty-day example.
  - id: ATS-ACC-BKS-011-05
    title: Exercise the grants for define invoice payment terms
    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-terms.read
      - accounting.payment-terms.create
      - accounting.payment-terms.update
      - accounting.payment-terms.delete
    binding_evidence: []
    supporting_tests:
      - >-
        services-accounting:modules/books/tests/e2e/accounting-dimensions-security.e2e.spec.js#is
        refused the create 403 permission_missing
  - id: ATS-ACC-BKS-011-06
    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-011-07
    title: Shared terms remain protected during a reader inspection
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-011-02
      - BR-CAP-ACC-BKS-016-01
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Inspect terms from two unit contexts as a reader, then attempt replacement
      and deletion without the term write grants.
    expected: >-
      The same shared terms remain readable and each refused mutation leaves
      them unchanged.
    negative: false
    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 to a business unit, which payment terms do not carry
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
        refused the create 403 permission_missing
    exercises:
      - CAP-ACC-BKS-011
      - CAP-ACC-BKS-016
    workflows: []
    binding_evidence: []
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0018.spec.ts
  - >-
    Verified source file:
    services-accounting:modules/books/services/persistence/configuration-refusals.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/accounting-dimensions.table.integration.spec.js
product_intent: proposed
coverage:
  rule: 'gap: FND-ACC-BKS-072'
  transition: 'gap: FND-ACC-BKS-072'
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-BKS-072'
  failure: covered
  boundary: covered
  concurrency: covered
  invariant: 'gap: FND-ACC-BKS-072'
  interaction: covered
coverage_notes:
  rule:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-072
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-072
  transition:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-072
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-072
  validation:
    scenarios:
      - ATS-ACC-BKS-011-02
    provenance: documented
    source:
      - ATS-ACC-BKS-011-02
  permission:
    scenarios:
      - ATS-ACC-BKS-011-05
    provenance: documented
    source:
      - ATS-ACC-BKS-011-05
  edge:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-072
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-072
  failure:
    scenarios:
      - ATS-ACC-BKS-011-03
    provenance: documented
    source:
      - ATS-ACC-BKS-011-03
  boundary:
    scenarios:
      - ATS-ACC-BKS-011-01
    provenance: documented
    source:
      - ATS-ACC-BKS-011-01
  concurrency:
    scenarios:
      - ATS-ACC-BKS-011-06
    provenance: documented
    source:
      - ATS-ACC-BKS-011-06
  invariant:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-072
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-072
  interaction:
    scenarios:
      - ATS-ACC-BKS-011-04
      - ATS-ACC-BKS-011-07
    provenance: documented
    source:
      - ATS-ACC-BKS-011-04
      - ATS-ACC-BKS-011-07
rule_coverage:
  - rule: BR-CAP-ACC-BKS-011-01
    scenarios:
      - ATS-ACC-BKS-011-01
      - ATS-ACC-BKS-011-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 naming number_of_days for more than two decimal places
  - rule: BR-CAP-ACC-BKS-011-02
    scenarios:
      - ATS-ACC-BKS-011-02
      - ATS-ACC-BKS-011-07
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 to a business unit, which payment terms do not carry
  - rule: BR-CAP-ACC-BKS-011-04
    scenarios:
      - ATS-ACC-BKS-011-03
    provenance: documented
    source: >-
      services-accounting:modules/books/services/persistence/configuration-refusals.ts:STILL_REFERENCED
  - rule: BR-CAP-ACC-BKS-011-05
    scenarios:
      - ATS-ACC-BKS-011-03
    provenance: documented
    source: >-
      services-accounting:db/migrations/20261018113309_m5_installments.sql:installment_schedules_payment_terms_fk
related_coverage:
  - capability: CAP-ACC-BKS-016
    scenarios:
      - ATS-ACC-BKS-011-07
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-011-set-when-the-customers-invoices-fall-due.md
workflow_coverage: []
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-terms.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-011-05
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-011-set-when-the-customers-invoices-fall-due.md
    execution_gap: FND-ACC-BKS-072
  - key: accounting.payment-terms.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-011-05
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-011-set-when-the-customers-invoices-fall-due.md
    execution_gap: FND-ACC-BKS-072
  - key: accounting.payment-terms.update
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-011-05
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-011-set-when-the-customers-invoices-fall-due.md
    execution_gap: FND-ACC-BKS-072
  - key: accounting.payment-terms.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-011-05
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-011-set-when-the-customers-invoices-fall-due.md
    execution_gap: FND-ACC-BKS-072
reviewed_at: '2026-10-23'
---

# Define invoice payment terms: Capability Test Specification

## Coverage

- Validate bounded day precision.
- Keep terms workspace-wide.
- Give useful deletion refusals for referenced terms.
- Give useful deletion refusals for referenced terms.

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

## Interactions With Related Capabilities

- Apply Net 30 to invoice issue.
- Shared terms remain protected during a reader inspection.

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.
