---
id: CAP-ACC-BKS-011
title: Define invoice payment terms
feature: FEAT-ACC-BKS-04
product_area: accounting
module: books
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: inconsistent
supersedes:
  - CAP-ACC-CFG-009
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/milestones/plans/ACCT-M1-plan.md#2. Scope'
  - 'services-accounting:docs/milestones/plans/ACCT-M1-plan.md#D12'
purpose: Finance staff give invoice due-date choices recognizable names and durations.
outcomes:
  - Named terms give finance staff control over invoice due-date choices.
  - Financial references prevent removal of terms still in use.
concepts:
  - CON-ACC-BKS-006
actors:
  - ACT-ACC-001
  - ACT-ACC-002
  - ACT-ACC-003
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: accounting.payment-terms.read
    where_checked: api
    scope: tenant
  - key: accounting.payment-terms.create
    where_checked: api
    scope: tenant
  - key: accounting.payment-terms.update
    where_checked: api
    scope: tenant
  - key: accounting.payment-terms.delete
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-BKS-011-01
    proved_by: [ATS-ACC-BKS-011-01, ATS-ACC-BKS-011-04, TST-ACC-BKS-013, TST-ACC-BKS-058, TST-ACC-BKS-061]
    statement: >-
      Payment-term days are numeric values from 0 through 1000 with at most two
      decimal places; text and out-of-range or over-precision values are refused
      with the field named.
    kind: validation
    enforced_at:
      - api
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 naming number_of_days for more than two decimal places
    origin: none
    examples:
      positive: A valid configuration completes the stated operation.
      negative: A conflicting configuration receives the stated refusal.
  - id: BR-CAP-ACC-BKS-011-02
    proved_by: [ATS-ACC-BKS-011-02, ATS-ACC-BKS-011-07, TST-ACC-BKS-058]
    statement: Payment terms belong to the workspace and refuse a business-unit property.
    kind: validation
    enforced_at:
      - api
    must_prove: true
    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
    origin: none
  - id: BR-CAP-ACC-BKS-011-03
    proved_by: [ATS-ACC-BKS-011-04, TST-ACC-BKS-013]
    statement: >-
      The service preserves the supplied name independently of days, permits
      duplicate names under different identifiers and derives an omitted
      identifier from the name.
    kind: policy
    enforced_at:
      - service
      - database
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#keeps
      the name it is sent, whatever the number of days (the Net <n> rewrite is
      the console’s)
    origin: none
  - id: BR-CAP-ACC-BKS-011-04
    proved_by: [ATS-ACC-BKS-011-03]
    statement: >-
      Invoices and customer-term references prevent term deletion with the
      dependent kind identified.
    kind: invariant
    enforced_at:
      - database
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-accounting:modules/books/services/persistence/configuration-refusals.ts:STILL_REFERENCED
    origin: none
  - id: BR-CAP-ACC-BKS-011-05
    proved_by: [ATS-ACC-BKS-011-03]
    statement: >-
      An installment-schedule reference also prevents deletion, but its
      untranslated database refusal currently reaches the caller as an
      unexplained error.
    kind: invariant
    enforced_at:
      - database
    must_prove: true
    provenance: observed
    source: >-
      services-accounting:db/migrations/20261018113309_m5_installments.sql:installment_schedules_payment_terms_fk
    origin: none
  - id: BR-CAP-ACC-BKS-011-06
    proved_by: []
    statement: >-
      The console proposes a Net name based on the entered day count and accepts
      whole days.
    kind: policy
    enforced_at:
      - console
    must_prove: false
    provenance: observed
    source: >-
      react-console:components/configuration/resources/accounting-setup.tsx:paymentTermResources
    origin: 'services-accounting:docs/milestones/plans/ACCT-M1-plan.md#D12'
  - id: BR-CAP-ACC-BKS-011-07
    proved_by: []
    statement: >-
      Term lists order by name, support active-state filters and search
      identifier or name.
    kind: policy
    enforced_at:
      - api
      - service
    must_prove: false
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      every term by name
    origin: none
scenarios:
  - id: SC-CAP-ACC-BKS-011-01
    given: The organization offers Net 30 and payment on receipt.
    when: >-
      The controller records both and issues an invoice to a member assigned Net
      30.
    then: The due date is thirty days after the invoice date.
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0018.spec.ts#ACT-ACC-0018
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-ACC-BKS-016
journeys:
  - JNY-ACC-BKS-001
open_questions: []
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0018.spec.ts
  - >-
    Verified source file:
    react-console:components/configuration/resources/accounting-setup.tsx
  - 'Verified source file: services-accounting:aws/accounting.service.ts'
  - >-
    Verified source file:
    services-accounting:db/migrations/20261018113309_m5_installments.sql
  - >-
    Verified source file:
    services-accounting:docs/milestones/plans/ACCT-M1-plan.md
  - >-
    Verified source file:
    services-accounting:modules/books/db/payment-terms.table.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
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/payment-terms.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/payment-terms.queries.integration.spec.js
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-AZ-005, TC-AZ-006, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-DAT-001, TC-DAT-004, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003]
exercised_by: [FAS-ACC-BKS-04-01, FAS-ACC-BKS-04-04, FAS-ACC-BKS-04-05]
suites: [TST-ACC-BKS-013, TST-ACC-BKS-058, TST-ACC-BKS-061]
---

# Define invoice payment terms

## Purpose

Finance staff give invoice due-date choices recognizable names and durations.

## How It Works

The administrator records the terms the finance team uses, such as payment on receipt or a named credit period. Terms are shared by the workspace’s units. Staff choose from them in customer and invoice work. The console helps name a new term from its duration. The service can retain a different supplied name. Removing a term can fail when an existing financial record still uses it. One installment dependency currently produces a less useful error that needs repair.

## Relationships

Transactions owns customer terms and due-date calculation using these definitions.
