---
id: SVC-ACC-BKS-books
title: Books configuration service
product_area: accounting
module: books
repository: services-accounting
source_module: modules/books
revision: 1
status: draft
design_intent: proposed
implementation_evidence: observed
inference: []
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
owns:
  - DOM-ACC-BKS-001
  - DOM-ACC-BKS-002
  - DOM-ACC-BKS-003
  - DOM-ACC-BKS-004
  - DOM-ACC-BKS-006
does_not_own:
  - >-
    Close owns period-standing writes and its routes, including routes hosted by
    the same function.
  - Transactions owns the tax calculation used by the address test.
  - >-
    Products owns the product-type defaults displayed beside tax
    classifications.
  - >-
    Maintenance hosts schedule execution, run history and workspace lifecycle
    participation.
  - >-
    Platform owns access decisions, provider credentials, query execution and
    the workspace record.
operations:
  - operation_id: getConfigurationHealth
    intent: Report deployment health and the configuration build identity.
    access: public
    permission: 'none: public health route'
    realises: []
    published_to_submissions: 'not published: deployment health, without a captured business request'
  - operation_id: createBusinessUnit
    intent: >-
      Create a unit, currency configuration and the first two fiscal years
      atomically, including the supplied policies and document choices.
    access: console
    permission: accounting.business-units.create
    realises:
      - CAP-ACC-BKS-001
      - CAP-ACC-BKS-002
      - CAP-ACC-BKS-003
      - CAP-ACC-BKS-009
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listBusinessUnits
    intent: >-
      Return units ordered by priority with unranked units last, then name,
      applying availability and name-or-code search.
    access: console
    permission: accounting.business-units.read
    realises:
      - CAP-ACC-BKS-001
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getBusinessUnit
    intent: Retrieve one unit and its configuration.
    access: console
    permission: accounting.business-units.read
    realises:
      - CAP-ACC-BKS-001
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateBusinessUnit
    intent: >-
      Apply a versioned unit replacement with founding-value and
      accounting-method guards, currency reconciliation and validated document
      choices; wholly omitted fee and write-off treatment fields retain their
      values.
    access: console
    permission: accounting.business-units.update
    realises:
      - CAP-ACC-BKS-001
      - CAP-ACC-BKS-002
      - CAP-ACC-BKS-003
      - CAP-ACC-BKS-015
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteBusinessUnit
    intent: >-
      Remove an eligible unit and its owned currency, default, department and
      calendar records; accounts and projects must be removed first.
    access: console
    permission: accounting.business-units.delete
    realises:
      - CAP-ACC-BKS-001
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listDefaultGlAccounts
    intent: >-
      Return every standard purpose in display order together with any account
      assigned for the selected unit.
    access: console
    permission: accounting.business-units.read
    realises:
      - CAP-ACC-BKS-006
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: assignDefaultGlAccount
    intent: >-
      Assign an active account from the same unit to a purpose, replacing the
      held assignment without requiring its read version.
    access: console
    permission: accounting.business-units.update
    realises:
      - CAP-ACC-BKS-006
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: clearDefaultGlAccount
    intent: >-
      Remove a purpose assignment without an expected version; an already empty
      purpose also succeeds.
    access: console
    permission: accounting.business-units.update
    realises:
      - CAP-ACC-BKS-006
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listCurrencies
    intent: Return the global offered ISO currency vocabulary sorted by code.
    access: console
    permission: accounting.application.access
    realises:
      - CAP-ACC-BKS-002
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: listDefaultGlAccountPurposes
    intent: Return the standard-purpose vocabulary and expected account types.
    access: console
    permission: accounting.application.access
    realises:
      - CAP-ACC-BKS-006
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: listPaymentProcessors
    intent: Return the global processor choices supported by merchant configuration.
    access: console
    permission: accounting.application.access
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: createGlAccount
    intent: >-
      Create a unit chart account with a normalized unique code and an enabled
      currency.
    access: console
    permission: accounting.gl-accounts.create
    realises:
      - CAP-ACC-BKS-005
      - CAP-ACC-BKS-002
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listGlAccounts
    intent: >-
      Page through chart accounts in unit-and-code order, with unit, type,
      currency and availability filters and a five-hundred-row limit.
    access: console
    permission: accounting.gl-accounts.read
    realises:
      - CAP-ACC-BKS-005
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getGlAccount
    intent: Retrieve the selected GL account.
    access: console
    permission: accounting.gl-accounts.read
    realises:
      - CAP-ACC-BKS-005
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateGlAccount
    intent: >-
      Save a versioned GL replacement with fixed unit and code; an enabled
      currency can change when references allow it, while a default destination
      cannot become inactive.
    access: console
    permission: accounting.gl-accounts.update
    realises:
      - CAP-ACC-BKS-005
      - CAP-ACC-BKS-016
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteGlAccount
    intent: >-
      Remove the selected GL account when declared references permit it;
      recognized dependencies produce a named refusal.
    access: console
    permission: accounting.gl-accounts.delete
    realises:
      - CAP-ACC-BKS-005
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createBankAccount
    intent: Add a new bank destination with validated configuration.
    access: console
    permission: accounting.bank-accounts.create
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listBankAccounts
    intent: >-
      Return a filtered, searchable page of bank destinations in the
      collection’s defined order.
    access: console
    permission: accounting.bank-accounts.read
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getBankAccount
    intent: Retrieve the selected bank destination.
    access: console
    permission: accounting.bank-accounts.read
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateBankAccount
    intent: >-
      Save the supplied bank destination replacement at the version loaded by
      the caller.
    access: console
    permission: accounting.bank-accounts.update
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteBankAccount
    intent: >-
      Remove the selected bank destination when declared references permit it;
      recognized dependencies produce a named refusal.
    access: console
    permission: accounting.bank-accounts.delete
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createMerchantAccount
    intent: Add a new merchant destination with validated configuration.
    access: console
    permission: accounting.merchant-accounts.create
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listMerchantAccounts
    intent: >-
      Return a filtered, searchable page of merchant destinations in the
      collection’s defined order.
    access: console
    permission: accounting.merchant-accounts.read
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getMerchantAccount
    intent: Retrieve the selected merchant destination.
    access: console
    permission: accounting.merchant-accounts.read
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateMerchantAccount
    intent: >-
      Save a versioned merchant replacement with fixed unit, preserving
      Reconciliation’s settlement fields and checking enabled currency and
      references.
    access: console
    permission: accounting.merchant-accounts.update
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteMerchantAccount
    intent: >-
      Remove the selected merchant destination when declared references permit
      it; recognized dependencies produce a named refusal.
    access: console
    permission: accounting.merchant-accounts.delete
    realises:
      - CAP-ACC-BKS-007
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createDepartment
    intent: Add a new department with validated configuration.
    access: console
    permission: accounting.departments.create
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listDepartments
    intent: >-
      Return a filtered, searchable page of departments in the collection’s
      defined order.
    access: console
    permission: accounting.departments.read
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getDepartment
    intent: Retrieve the selected department.
    access: console
    permission: accounting.departments.read
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateDepartment
    intent: >-
      Save the supplied department replacement at the version loaded by the
      caller.
    access: console
    permission: accounting.departments.update
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteDepartment
    intent: >-
      Remove the selected department when declared references permit it;
      recognized dependencies produce a named refusal.
    access: console
    permission: accounting.departments.delete
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createAccountingProject
    intent: Add a new accounting project with validated configuration.
    access: console
    permission: accounting.accounting-projects.create
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listAccountingProjects
    intent: >-
      Return a filtered, searchable page of accounting projects in the
      collection’s defined order.
    access: console
    permission: accounting.accounting-projects.read
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getAccountingProject
    intent: Retrieve the selected accounting project.
    access: console
    permission: accounting.accounting-projects.read
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateAccountingProject
    intent: >-
      Save the supplied accounting project replacement at the version loaded by
      the caller.
    access: console
    permission: accounting.accounting-projects.update
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteAccountingProject
    intent: >-
      Remove the selected accounting project when declared references permit it;
      recognized dependencies produce a named refusal.
    access: console
    permission: accounting.accounting-projects.delete
    realises:
      - CAP-ACC-BKS-008
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createPaymentTerms
    intent: Create a named workspace-wide term with its day count.
    access: console
    permission: accounting.payment-terms.create
    realises:
      - CAP-ACC-BKS-011
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listPaymentTerms
    intent: >-
      Return a filtered, searchable page of payment terms in the collection’s
      defined order.
    access: console
    permission: accounting.payment-terms.read
    realises:
      - CAP-ACC-BKS-011
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getPaymentTerms
    intent: Retrieve the selected payment term.
    access: console
    permission: accounting.payment-terms.read
    realises:
      - CAP-ACC-BKS-011
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updatePaymentTerms
    intent: >-
      Save the supplied payment term replacement at the version loaded by the
      caller.
    access: console
    permission: accounting.payment-terms.update
    realises:
      - CAP-ACC-BKS-011
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deletePaymentTerms
    intent: >-
      Remove an unreferenced term; invoice, customer-term and installment
      dependencies can prevent deletion, with installment failures lacking
      translation.
    access: console
    permission: accounting.payment-terms.delete
    realises:
      - CAP-ACC-BKS-011
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createPaymentMethod
    intent: >-
      Create a tender method with card, bank-debit or offline behavior,
      channels, reference collection and applicable offline options.
    access: console
    permission: accounting.payment-methods.create
    realises:
      - CAP-ACC-BKS-012
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listPaymentMethods
    intent: >-
      Return a filtered, searchable page of tender methods in the collection’s
      defined order.
    access: console
    permission: accounting.payment-methods.read
    realises:
      - CAP-ACC-BKS-012
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getPaymentMethod
    intent: Retrieve the selected tender method.
    access: console
    permission: accounting.payment-methods.read
    realises:
      - CAP-ACC-BKS-012
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updatePaymentMethod
    intent: >-
      Save a versioned method replacement with unchanged behavior and active
      standing for provisioned system methods.
    access: console
    permission: accounting.payment-methods.update
    realises:
      - CAP-ACC-BKS-012
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createTaxClass
    intent: Add a new tax classification with validated configuration.
    access: console
    permission: accounting.tax-classes.create
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listTaxClasses
    intent: >-
      Return a filtered, searchable page of tax classifications in the
      collection’s defined order.
    access: console
    permission: accounting.tax-classes.read
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getTaxClass
    intent: Retrieve the selected tax classification.
    access: console
    permission: accounting.tax-classes.read
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateTaxClass
    intent: >-
      Save the supplied tax classification replacement at the version loaded by
      the caller.
    access: console
    permission: accounting.tax-classes.update
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteTaxClass
    intent: >-
      Remove the selected tax classification when declared references permit it;
      recognized dependencies produce a named refusal.
    access: console
    permission: accounting.tax-classes.delete
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: createTaxZone
    intent: >-
      Create zone coverage and at most twenty rates with class percentages and
      unit-specific payable destinations.
    access: console
    permission: accounting.tax-zones.create
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listTaxZones
    intent: >-
      Return a filtered, searchable page of tax zones and their rates in the
      collection’s defined order.
    access: console
    permission: accounting.tax-zones.read
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getTaxZone
    intent: Retrieve the selected tax zone and its rates.
    access: console
    permission: accounting.tax-zones.read
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateTaxZone
    intent: >-
      Save a versioned zone replacement and recreate every rate, class
      percentage and payable mapping under fresh rate identities.
    access: console
    permission: accounting.tax-zones.update
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteTaxZone
    intent: >-
      Remove the selected tax zone and its rates when declared references permit
      it; recognized dependencies produce a named refusal.
    access: console
    permission: accounting.tax-zones.delete
    realises:
      - CAP-ACC-BKS-013
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listExchangeRates
    intent: >-
      Page through unit and currency prices with recent dates first, applying
      unit, currency and inclusive date bounds.
    access: console
    permission: accounting.exchange-rates.read
    realises:
      - CAP-ACC-BKS-004
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: createExchangeRate
    intent: Store a manually supplied price for one enabled foreign currency and date.
    access: console
    permission: accounting.exchange-rates.create
    realises:
      - CAP-ACC-BKS-004
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: resolveExchangeRate
    intent: >-
      Find the latest price on or before the requested day, defaulting to today,
      and return its origin and missing-price policy or the absence of a quote.
    access: console
    permission: accounting.exchange-rates.read
    realises:
      - CAP-ACC-BKS-004
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: fillExchangeRates
    intent: >-
      Read the bound provider for missing provider-sourced prices and persist
      the returned quotes on the provider’s effective day.
    access: console
    permission: accounting.exchange-rates.create
    realises:
      - CAP-ACC-BKS-004
    published_to_submissions: >-
      not published: administrator-requested provider synchronization, without
      an intake capture
  - operation_id: getExchangeRate
    intent: Retrieve one dated price and its origin.
    access: console
    permission: accounting.exchange-rates.read
    realises:
      - CAP-ACC-BKS-004
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateExchangeRate
    intent: >-
      Save a versioned manual-price replacement; provider quotes cannot be
      edited.
    access: console
    permission: accounting.exchange-rates.update
    realises:
      - CAP-ACC-BKS-004
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteExchangeRate
    intent: Remove a manual or provider quote.
    access: console
    permission: accounting.exchange-rates.delete
    realises:
      - CAP-ACC-BKS-004
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: generateFiscalYears
    intent: >-
      Atomically extend a unit by one to five years with twelve open periods
      each, refusing any new starting date beyond the five-year horizon.
    access: console
    permission: accounting.fiscal-years.create
    realises:
      - CAP-ACC-BKS-009
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listFiscalYears
    intent: >-
      Return years and their monthly periods in starting-date and unit order
      with unit and standing filters.
    access: console
    permission: accounting.fiscal-years.read
    realises:
      - CAP-ACC-BKS-009
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getFiscalYear
    intent: Retrieve one year together with its periods.
    access: console
    permission: accounting.fiscal-years.read
    realises:
      - CAP-ACC-BKS-009
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateFiscalYear
    intent: Save a year’s new name at the loaded version and refuse other changes.
    access: console
    permission: accounting.fiscal-years.update
    realises:
      - CAP-ACC-BKS-009
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteFiscalYear
    intent: >-
      Remove the latest year only while all its periods are open and references
      permit removal.
    access: console
    permission: accounting.fiscal-years.delete
    realises:
      - CAP-ACC-BKS-009
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: getCurrentFiscalPeriod
    intent: >-
      Return the earliest open period in the earliest open year, or refuse when
      none exists.
    access: console
    permission: accounting.fiscal-years.read
    realises:
      - CAP-ACC-BKS-010
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getFiscalPeriodForDate
    intent: >-
      Return the year and period containing the requested date without extending
      coverage.
    access: console
    permission: accounting.fiscal-years.read
    realises:
      - CAP-ACC-BKS-010
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: createDocumentTemplate
    intent: >-
      Create customer content with validated Liquid sources and fields permitted
      for its fixed kind.
    access: console
    permission: accounting.document-templates.create
    realises:
      - CAP-ACC-BKS-014
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: listDocumentTemplates
    intent: >-
      Return built-ins before customer templates with kind and availability
      filters.
    access: console
    permission: accounting.document-templates.read
    realises:
      - CAP-ACC-BKS-014
      - CAP-ACC-BKS-015
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getDocumentTemplate
    intent: >-
      Retrieve built-in or customer content and its derived unit and settings
      usage.
    access: console
    permission: accounting.document-templates.read
    realises:
      - CAP-ACC-BKS-014
      - CAP-ACC-BKS-015
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateDocumentTemplate
    intent: >-
      Save a versioned customer-content replacement; built-ins cannot change and
      referenced content cannot be deactivated.
    access: console
    permission: accounting.document-templates.update
    realises:
      - CAP-ACC-BKS-014
      - CAP-ACC-BKS-015
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: deleteDocumentTemplate
    intent: >-
      Remove customer content only when no unit or settings record references
      it.
    access: console
    permission: accounting.document-templates.delete
    realises:
      - CAP-ACC-BKS-014
      - CAP-ACC-BKS-015
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: duplicateDocumentTemplate
    intent: >-
      Create an active customer copy of the complete selected template,
      including built-in content.
    access: console
    permission: accounting.document-templates.create
    realises:
      - CAP-ACC-BKS-014
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
  - operation_id: previewDocumentTemplate
    intent: >-
      Render an unsaved draft with kind-specific sample data and return empty
      fields and problems without storing content or sending a document.
    access: console
    permission: accounting.document-templates.read
    realises:
      - CAP-ACC-BKS-014
    published_to_submissions: 'not published: unsaved preview, without an intake capture'
  - operation_id: listDocumentTemplateVariables
    intent: >-
      Return the kind’s merge-field catalogue, including types, descriptions,
      examples and available filters.
    access: console
    permission: accounting.document-templates.read
    realises:
      - CAP-ACC-BKS-014
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: getSettings
    intent: Retrieve stored settings or return unsaved defaults at version zero.
    access: console
    permission: accounting.settings.read
    realises:
      - CAP-ACC-BKS-017
      - CAP-ACC-BKS-015
    published_to_submissions: >-
      not published: configuration or operational information retrieval, without
      an intake capture
  - operation_id: updateSettings
    intent: >-
      Save settings at the loaded version, using zero for first persistence; an
      omitted statement choice clears to built-in selection while omitted
      policies remain held.
    access: console
    permission: accounting.settings.update
    realises:
      - CAP-ACC-BKS-017
      - CAP-ACC-BKS-015
    published_to_submissions: >-
      not published: permission-controlled configuration maintenance, without an
      intake capture
events: []
jobs: []
integrations:
  - system: Platform integration gateway (exchange-rate adapter)
    direction: outbound
    contract: >-
      The exchange-rate adapter performs a synchronous provider read without an
      idempotency key; binding resolution can select a unit, application or
      workspace connection.
  - system: Platform query layer
    direction: outbound
    contract: >-
      The business-unit registration exposes a read-only query of identifying
      details, availability and base currency under the declared query
      permission.
  - system: Platform authorizer and registry
    direction: inbound
    contract: >-
      The console routes require their declared permissions, application access
      and licensing, with workspace availability checked before the handler.
  - system: Other Accounting modules (in-process)
    direction: inbound
    contract: >-
      Accounting consumers import shared configuration tables and helpers for
      reads inside their own transactions.
consistency:
  - rule: >-
      Unit creation commits founding configuration, currency rows and two
      initial years together.
    kind: transactional
    compensation: Database rollback restores the entire failed creation.
  - rule: >-
      Versioned replacements include owned collections in the same commit;
      default assignment and clearing have no expected-version precondition.
    kind: transactional
    compensation: Rollback covers the failed replacement only.
  - rule: >-
      Eligible unit deletion atomically removes owned currencies, defaults,
      departments and fiscal coverage.
    kind: transactional
    compensation: Rollback restores the failed deletion.
  - rule: >-
      Declared founding fields, identity codes, template kinds and method
      behaviors are fixed by service validation and database guards.
    kind: transactional
    compensation: Protected-field changes are refused rather than compensated.
  - rule: >-
      Restricting keys protect declared dependencies; recognized constraints
      receive useful translation, while soft references and unknown constraints
      provide weaker protection.
    kind: transactional
    compensation: >-
      Deletion is refused by the applicable reference; no dependent record is
      restored or rewritten.
  - rule: >-
      Provider filling persists only after a successful response and skips dates
      already stored.
    kind: eventual
    compensation: >-
      No external undo is performed; a provider quote can be removed and filled
      again.
  - rule: >-
      Readers observe shared committed configuration according to isolation and
      read timing, without a replicated configuration store.
    kind: transactional
    compensation: No asynchronous synchronization or compensation is involved.
  - rule: >-
      Posting resolves destinations when it runs, so changes after document
      issue can affect those destinations.
    kind: eventual
    compensation: >-
      No compensation follows a setup change; zone replacement can alter later
      tax payable resolution.
evidence:
  - >-
    services-accounting at f47cb263: modules/books/aws/api/*.routes.ts
    (operations generated from the route declarations), configuration.module.ts,
    logic/configuration-api.lambda.ts
  - >-
    services-accounting at f47cb263: aws/accounting.service.ts (permission
    catalogue)
  - >-
    services-accounting at f47cb263: modules/books/services/**, db/**,
    metadata/business-units.object.ts, queries/business-units.query.ts,
    export/books.dataset.ts
  - >-
    services-accounting:modules/books/aws/api/configuration.routes.ts:healthRoute;
    services-accounting:package-lock.json (@rhythmsoftware/macroservice-http:
    healthRoute yields getConfigurationHealth)
controls: [TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-IAM-006, 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-SEC-001, TC-SEC-002, TC-SEC-003, TC-SEC-004, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-CRY-004, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-004, TC-DAT-007, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-CHG-001, TC-CHG-002, TC-CHG-003, TC-CHG-004, TC-CHG-006, TC-AVL-001, TC-AVL-002, TC-AVL-003, TC-AVL-004, TC-AVL-005, TC-MON-001, TC-MON-002, TC-MON-003, TC-MON-004, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-004, TC-PI-005, TC-VEN-001, TC-VEN-002, TC-VEN-003]
---

# Books configuration service

## What This Service Is For

The service maintains the configuration that financial work consumes: units, charts, currencies and rates, calendars, shared definitions, settings and document content. Its console routes support configuration maintenance and reads rather than customer intake.

## Boundary

Books owns configuration maintenance, with explicit field ownership for Close and Reconciliation and lifecycle writes through maintenance. Other Accounting modules read the shared records and use the supplied helpers. Platform supplies permission decisions, provider connections and query execution. Editable tax setup remains here despite the recorded Commerce realignment, which still needs a transfer contract.

## Operations in Words

The operation rows map each route to its exact access, permission, planning capability and publication disposition. They cover unit and chart setup, default assignments, exchange-price maintenance and filling, fiscal generation and lookup, workspace definitions, document content and settings. Provider quotes can be removed but not edited; methods have no deletion route. Built-in templates remain read-only.

## Events and Jobs

This configuration module has no declared events or background jobs. Consumers read the shared database rather than receive change notifications. Current versions and modification details are retained, but no configuration revision history is written.

## Consistency Guarantees

Owned collections share the record’s write transaction. Default assignment is a last-writer update rather than a versioned replacement. Database restrictions cover declared references; fee-product checks and historical tax-rate references have weaker guarantees. Provider filling crosses an external-read boundary before persistence. All operation rows explicitly exclude Submissions because no intake capture is implemented.
