# LedgerStack Core

A reusable Node.js accounting engine with multi-company support, optional multi-tenant mode, cached balances, worker-driven recalculation, and reporting through a clean public API.

Documentation: https://akram-ashraf.github.io/ledgerstack-core-public/

## Install

```bash
npm install ledgerstack-core
```

## Init

```ts
import { initAccounts } from "ledgerstack-core";

await initAccounts({
  adapter,
  tenant: true,
  worker: true,
  autoMigrate: false,
});
```

## Migrate

```ts
import { migrate } from "ledgerstack-core";

await migrate();
```

## Create Account

```ts
import {
  createCompany,
  createYear,
  setActiveYear,
  createGroup,
  createAccount,
} from "ledgerstack-core";

const company = await createCompany(null, "Demo Company");
const year = await createYear(company.id, "2026-04-01", "2027-03-31");
await setActiveYear(company.id, year.id);

const assets = await createGroup(company.id, {
  name: "Assets",
  parent_id: null,
  type: "ASSET",
  nature: "DEBIT",
  position: 1,
});

const cash = await createAccount(company.id, {
  code: "1000",
  name: "Cash",
  group_id: assets.id,
  opening_debit: 0,
  opening_credit: 0,
  is_active: true,
  is_system: false,
});
```

## Create Voucher

```ts
import { createVoucher } from "ledgerstack-core";

await createVoucher({
  company_id: company.id,
  year_id: year.id,
  reference_id: "JV-0001",
  voucher_type: "JOURNAL",
  date: "2026-04-01",
  narration: "Initial capital",
  entries: [
    { account_id: cash.id, debit: 1000, credit: 0 },
    { account_id: capitalId, debit: 0, credit: 1000 },
  ],
});
```

## Run Worker

```ts
import { processJobs } from "ledgerstack-core";

await processJobs();
```

## Get Report

```ts
import { getTrialBalance, getBalanceSheet, getProfitLoss } from "ledgerstack-core";

const trialBalance = await getTrialBalance(company.id);
const balanceSheet = await getBalanceSheet(company.id);
const profitLoss = await getProfitLoss(company.id);
```

## Module Docs

- [Introduction](https://akram-ashraf.github.io/ledgerstack-core-public/#introduction)
- [Init](https://akram-ashraf.github.io/ledgerstack-core-public/#init)
- [Adapter](https://akram-ashraf.github.io/ledgerstack-core-public/#adapter)
- [Accounts](https://akram-ashraf.github.io/ledgerstack-core-public/#accounts)
- [Vouchers](https://akram-ashraf.github.io/ledgerstack-core-public/#vouchers)
- [Balance](https://akram-ashraf.github.io/ledgerstack-core-public/#balance)
- [Cache](https://akram-ashraf.github.io/ledgerstack-core-public/#cache)
- [Reports](https://akram-ashraf.github.io/ledgerstack-core-public/#reports)
- [Worker](https://akram-ashraf.github.io/ledgerstack-core-public/#worker)
- [Year](https://akram-ashraf.github.io/ledgerstack-core-public/#year)
- [Tenant](https://akram-ashraf.github.io/ledgerstack-core-public/#tenant)
- [Audit](https://akram-ashraf.github.io/ledgerstack-core-public/#audit)
- [Currency](https://akram-ashraf.github.io/ledgerstack-core-public/#currency)
- [Cost Center](https://akram-ashraf.github.io/ledgerstack-core-public/#cost-center)
- [API](https://akram-ashraf.github.io/ledgerstack-core-public/#api)

## Notes

- initialize before using any engine function
- run migrations before inserting business data
- process worker jobs after voucher changes so cache-backed reports stay current
- reports should rely on cached balances instead of recalculating totals from entries
