---
id: CAP-ACC-BKS-003
title: Set a unit’s accounting and tender-fee policies
feature: FEAT-ACC-BKS-01
product_area: accounting
module: books
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: partially-observed
supersedes: []
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-2'
  - 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-17'
purpose: >-
  Controllers choose how the unit recognizes activity, treats write-offs and
  charges tender fees.
outcomes:
  - Current-period posted activity prevents accounting-method changes.
  - Posting uses the write-off policy currently in force.
  - Each tender receives one consistently calculated unit fee.
concepts:
  - CON-ACC-BKS-001
actors:
  - ACT-ACC-001
  - ACT-ACC-004
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: accounting.business-units.update
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-ACC-BKS-003-01
    proved_by: [ATS-ACC-BKS-003-01, TST-ACC-BKS-074]
    statement: >-
      Accounting defaults to accrual and may be changed to cash or back unless
      the current open period has posted or downloaded batches, when the refusal
      names the period and count; no open period permits the change.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
      the change 409 naming the period and the count when a batch of the open
      period is posted, leaving the method
    origin: 'services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md#D12'
  - id: BR-CAP-ACC-BKS-003-02
    proved_by: [ATS-ACC-BKS-001-15, ATS-ACC-BKS-003-02, ATS-ACC-BKS-003-11, ATS-ACC-BKS-003-12, ATS-ACC-BKS-006-08, TST-ACC-BKS-002, TST-ACC-BKS-003, TST-ACC-BKS-074]
    statement: >-
      The unit defaults to direct write-offs and bad-debt expense, permits
      allowance or revenue-reversal choices, and supplies the policy effective
      at posting rather than at write-off creation.
    kind: policy
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#takes
      bad_debt_expense on a create that leaves the treatment out
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-2'
  - id: BR-CAP-ACC-BKS-003-03
    proved_by: [ATS-ACC-BKS-003-03, ATS-ACC-BKS-003-09, TST-ACC-BKS-074]
    statement: >-
      A card-fee rule requires a product and a percentage, fixed amount or both,
      with an optional minimum; percentages range from 0 to 100 with four
      decimal places and base-currency minor-unit amounts are nonnegative.
    kind: validation
    enforced_at:
      - api
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
      a rule that is not whole (a percent without a product, a product without
      an amount, a minimum alone) by the database’s rule
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-17'
  - id: BR-CAP-ACC-BKS-003-04
    proved_by: [ATS-ACC-BKS-003-04, TST-ACC-BKS-074]
    statement: The fee product must be active and belong to the same unit.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js#refuses
      a fee product of another unit, an inactive one and one the tenant does not
      have, naming card_fee_product_id
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-17'
  - id: BR-CAP-ACC-BKS-003-05
    proved_by: [ATS-ACC-BKS-003-05, TST-ACC-BKS-171]
    statement: >-
      The tender fee combines the half-up-rounded percentage with a fixed amount
      and minimum in base currency, uses only the percentage for other
      currencies, and is calculated once then distributed across the invoices.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/rules/card-fee-rules.spec.js#adds
      the fixed amount in the base currency: 2.9% + 30 on 10000 is 320
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-17'
    examples:
      positive: A valid configuration completes the stated operation.
  - id: BR-CAP-ACC-BKS-003-06
    proved_by: [ATS-ACC-BKS-003-06, ATS-ACC-BKS-012-10, TST-ACC-BKS-171]
    statement: >-
      A configured fee applies to cards, applies to bank debits only when
      electronic-check charging is enabled, and never applies to offline
      methods.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-accounting:modules/books/tests/unit/rules/card-fee-rules.spec.js#charges
      a card behaviour always, a bank debit only when the rule says so, and
      never an offline method or without a rule
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-17'
  - id: BR-CAP-ACC-BKS-003-07
    proved_by: []
    statement: >-
      A new invoice takes the unit’s default fee policy when no policy is
      supplied, choosing none, required or optional with none as the default.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: documented
    source: 'services-accounting:docs/accounting/configuration-api.md#Business units'
    origin: 'services-accounting:docs/architecture/accounting-2.0/02-decisions.md#A-17'
  - id: BR-CAP-ACC-BKS-003-08
    proved_by: []
    statement: >-
      The unit stores download detail, financial-software choice and receivable
      project inheritance for posting and exports to read.
    kind: policy
    enforced_at:
      - service
      - database
    must_prove: false
    provenance: observed
    source: 'services-accounting:modules/books/db/business-units.table.ts:businessUnits'
    origin: none
  - id: BR-CAP-ACC-BKS-003-09
    proved_by: [ATS-ACC-BKS-003-07]
    statement: >-
      Zero and negative tender amounts calculate a zero fee even when fixed or
      minimum charges are configured.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-accounting:modules/books/services/rules/card-fee-rules.ts:cardFeeAmountOf
    origin: none
scenarios:
  - id: SC-CAP-ACC-BKS-003-01
    given: >-
      The configured tender rule charges 2.9 percent plus 30 cents, with a
      dollar minimum.
    when: A single card tender settles two invoices.
    then: The total fee is calculated once and allocated between the invoices.
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0048.spec.ts#ACT-ACC-0048
  - id: SC-CAP-ACC-BKS-003-02
    given: A pending write-off was entered under bad-debt-expense treatment.
    when: The controller selects revenue reversal before posting its batch.
    then: Posting uses the revenue account rather than the creation-time treatment.
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0003.spec.ts#ACT-ACC-0003
edge_cases: []
constraints: []
depends_on:
  - CAP-ACC-BKS-001
related:
  - CAP-ACC-BKS-006
journeys: []
open_questions:
  - OQ-ACC-BKS-002
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0003.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0048.spec.ts
  - 'Verified source file: services-accounting:aws/accounting.service.ts'
  - >-
    Verified source file:
    services-accounting:docs/accounting/configuration-api.md
  - >-
    Verified source file:
    services-accounting:docs/architecture/accounting-2.0/02-decisions.md
  - >-
    Verified source file:
    services-accounting:docs/milestones/ACCT-M1-books-and-invoices.md
  - >-
    Verified source file:
    services-accounting:modules/books/db/business-units.table.ts
  - >-
    Verified source file:
    services-accounting:modules/books/services/rules/card-fee-rules.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/business-units.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/unit/rules/card-fee-rules.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-002, TC-DAT-005, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005]
exercised_by: [FAS-ACC-BKS-01-01, FAS-ACC-BKS-01-04, FAS-ACC-BKS-01-05, FAS-ACC-BKS-04-02]
suites: [TST-ACC-BKS-002, TST-ACC-BKS-003, TST-ACC-BKS-074, TST-ACC-BKS-171]
---

# Set a unit’s accounting and tender-fee policies

## Purpose

Controllers choose how the unit recognizes activity, treats write-offs and charges tender fees.

## How It Works

The controller edits the accounting choices on a business unit. These choices supply policy to later transaction and posting work. A write-off uses the policy at the point its batch posts. A fee rule names the product used to represent the charge and the amounts used to calculate it. The payment method’s behaviour determines whether that rule applies. A change can be refused when accounting activity has already fixed the current period’s treatment. Invalid fee configuration is refused before the unit is saved.

## Relationships

Posting uses the write-off choices, while transaction workflows use tender behaviour and fee policy.
