VRPlatformVRPlatform
Build a Product UI

Accounting Administration

Build tax, opening-balance, and books-closing workflows

Mental Model

Administrative accounting writes configure tax, establish opening positions, or move the first open accounting date. Their consequences span more data than a normal row edit.

Resources and Lifecycle

Tax rates remain renderable on historical fees and transactions after they become inactive. Opening balances are separate resources, one per accounting purpose. booksClosedAt is the first open date; earlier affected journal dates are closed.

Explicit opening balances carry the position immediately before the first live GL date and remain active even though their journal date precedes statementStartAt. Setting or reapplying statementStartAt reclassifies other unlocked journals around that boundary. It preserves active opening balances and restores any that were made inactive solely by the previous GL boundary. The first owner statement then includes those listing positions in Balance start.

Read Model

Render current tax-rate status and usage, dedicated opening-balance responses, team booksClosedAt, operation issues, and affected-resource results. Each opening-balance type has its own operation and schema; use them as-is.

Decision Table

Tax and Opening Balances

WorkflowClient rule
Tax-rate removalArchive only when returned contract supports it
Opening trial balanceUse dedicated account and balancing contract
A/P, A/R, deferred, deposits, taxUse each dedicated operation
Listing or bank initializationKeep its own identity and posting rules
Close booksSet boundary; explain first-open-date semantics; confirm
Reopen all datesSend booksClosedAt=null through normal operation
x-ignore-books-closed-at headerNever expose as a normal product control

Editability

Tax usage and historical journals can prevent deletion. Opening balances and books closing must respect statement attachments and other locks even when the x-ignore-books-closed-at header is available for controlled repair workflows.

Books Closing

A business entity can have several journal dates. Compare the affected posting date, not just its top-level transaction or reservation date.

After a successful books-closing update, the new boundary applies immediately to subsequent writes and previews. Clients do not need to refresh their auth session before validating affected resources.

Preview and Preflight

Tax-rate and opening-balance mutations expose dry run where the generated OpenAPI declares the dryRun parameter. The books-closing update intentionally has neither generic dry run nor a dedicated preview. Explain the boundary and require confirmation, then apply and handle the normal response.

Mutation Recipe

  1. Load current configuration and affected operation response.
  2. Pick the administrative workflow built for the change.
  3. Validate its exact generated schema and balancing requirements.
  4. Dry-run when the operation declares support.
  5. Explain broad journal or lock consequences.
  6. Confirm and apply.
  7. Re-read the team and affected resources.
  8. Surface any resulting issues or queued recalculation state.

Failure and Recovery

For locked historical input, show the statement or books boundary and keep the original payload. Do not recommend the x-ignore-books-closed-at header. For an unbalanced import, repair the opening workflow itself rather than posting an unrelated transaction to hide the difference.

Common Recipes

Close a month

Select the first date that should remain open, explain that every earlier affected posting date closes, confirm without dry run, apply, and re-read the team setting.

PUT /team/books-closing
Content-Type: application/json

{
  "booksClosedAt": "2026-07-01"
}

Import an opening trial balance

Load the current trial-balance response, map accounts, validate balance, dry-run the complete import, then apply through the dedicated operation.

PUT /general-ledger/opening-trial-balance?dryRun=true
Content-Type: application/json

{
  "rows": [
    {
      "accountId": "22222222-2222-4222-8222-222222222222",
      "combinedCentTotal": 250000
    },
    {
      "accountId": "33333333-3333-4333-8333-333333333333",
      "combinedCentTotal": -40000
    }
  ]
}

API Reference

On this page