@superheld/summae-knex 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sync-db.ts","../src/schema-installer.ts","../src/hydrator.ts","../src/repositories.ts","../src/database-tenant-factory.ts"],"names":["Database","knexFactory","Money","CalendarDate","DimensionValue","EntryLine","Uuid","AccountNumber","Account","date","Period","FiscalYear","JournalEntry","PeriodRef","Voucher","Settlement","OpenItem","Partner","Asset","AuditRecord","Tenant"],"mappings":"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","file":"index.cjs","sourcesContent":["import Database from 'better-sqlite3';\nimport knexFactory from 'knex';\nimport type { Knex } from 'knex';\n\ntype Row = Record<string, unknown>;\n\n/**\n * Synchrone Brücke: **Knex baut das SQL** (dialektkorrekt, später pg-portabel),\n * **better-sqlite3 führt es synchron aus**. Nötig, weil die Core-Ports synchron\n * sind (`append(): void`, `byId(): … | null`) — Knex' Promise-API würde den\n * Vertrag brechen. Knex läuft hier nur als Builder (`.toSQL()`), ohne eigene\n * Verbindung; die Verbindung ist allein better-sqlite3.\n */\nexport class SyncDb {\n private readonly db: Database.Database;\n /** Reiner Query-/Schema-Builder (keine Verbindung). */\n readonly knex: Knex;\n\n constructor(filename = ':memory:') {\n this.db = new Database(filename);\n this.db.pragma('foreign_keys = ON');\n this.knex = knexFactory({ client: 'better-sqlite3', useNullAsDefault: true });\n }\n\n /** Tabelle als Knex-QueryBuilder (nur zum Bauen, Ausführung via run/all/first). */\n table(name: string): Knex.QueryBuilder {\n return this.knex(name);\n }\n\n /** DDL (Schema kann mehrere Statements erzeugen) synchron ausführen. */\n schema(build: (s: Knex.SchemaBuilder) => Knex.SchemaBuilder): void {\n for (const stmt of build(this.knex.schema).toSQL()) {\n this.db.prepare(stmt.sql).run(...normalize(stmt.bindings));\n }\n }\n\n /** Schreibende Anweisung (insert/update/delete). */\n run(builder: Knex.QueryBuilder): void {\n const native = builder.toSQL().toNative();\n this.db.prepare(native.sql).run(...normalize(native.bindings));\n }\n\n /** Alle Treffer als rohe Zeilen. */\n all(builder: Knex.QueryBuilder): Row[] {\n const native = builder.toSQL().toNative();\n return this.db.prepare(native.sql).all(...normalize(native.bindings)) as Row[];\n }\n\n /** Erster Treffer oder null. */\n first(builder: Knex.QueryBuilder): Row | null {\n return this.all(builder.limit(1))[0] ?? null;\n }\n\n close(): void {\n this.db.close();\n void this.knex.destroy();\n }\n}\n\n/** better-sqlite3 akzeptiert kein undefined/boolean als Bindung. */\nfunction normalize(bindings: readonly unknown[]): unknown[] {\n return bindings.map((b) => {\n if (b === undefined || b === null) return null;\n if (typeof b === 'boolean') return b ? 1 : 0;\n return b;\n });\n}\n","import type { SyncDb } from './sync-db.js';\n\n/** Wie PHPs `SchemaInstaller::PREFIX`. */\nexport const TABLE_PREFIX = 'summae_';\n\n/**\n * Erzeugt die 8 `summae_*`-Tabellen — exakt das Layout der PHP-Referenz\n * (`packages/laravel/src/Schema/SchemaInstaller.php`), damit beide Sprachen\n * auf demselben Datenbestand arbeiten können. Journal append-only; Salden sind\n * Projektionen — die Datenbank rechnet nie, sie hält JSON-Dokumente am Aggregat.\n */\nexport function installSchema(db: SyncDb): void {\n db.schema((schema) =>\n schema\n .createTable(`${TABLE_PREFIX}accounts`, (t) => {\n t.uuid('id').primary();\n t.uuid('tenant_id').index();\n t.string('number', 64);\n t.string('name');\n t.string('type', 16);\n t.string('subtype', 32).nullable();\n t.string('status', 16).defaultTo('active');\n t.unique(['tenant_id', 'number']);\n })\n .createTable(`${TABLE_PREFIX}fiscal_years`, (t) => {\n t.uuid('id').primary();\n t.uuid('tenant_id').index();\n t.integer('year');\n t.date('start');\n t.date('end');\n t.string('status', 16).defaultTo('open');\n t.json('periods');\n t.unique(['tenant_id', 'year']);\n })\n .createTable(`${TABLE_PREFIX}vouchers`, (t) => {\n t.uuid('id').primary();\n t.uuid('tenant_id').index();\n t.json('payload');\n })\n .createTable(`${TABLE_PREFIX}journal_entries`, (t) => {\n t.uuid('id').primary();\n t.uuid('tenant_id').index();\n t.integer('fiscal_year');\n t.integer('sequence_number');\n t.integer('period');\n t.string('status', 16);\n t.date('entry_date');\n t.date('voucher_date').nullable();\n t.string('recorded_at', 40);\n t.uuid('voucher_id');\n t.text('text');\n t.json('lines');\n t.uuid('reverses').nullable();\n t.uuid('reversed_by').nullable();\n t.unique(['tenant_id', 'fiscal_year', 'sequence_number']);\n })\n .createTable(`${TABLE_PREFIX}open_items`, (t) => {\n t.uuid('id').primary();\n t.uuid('tenant_id').index();\n t.string('kind', 16);\n t.uuid('origin_entry_id').index();\n t.integer('origin_line_index');\n t.string('amount', 32);\n t.string('currency', 3);\n t.uuid('voucher_id');\n t.date('opened_at');\n t.uuid('partner_id').nullable();\n t.json('settlements');\n })\n .createTable(`${TABLE_PREFIX}partners`, (t) => {\n t.uuid('id').primary();\n t.uuid('tenant_id').index();\n t.json('payload');\n })\n .createTable(`${TABLE_PREFIX}assets`, (t) => {\n t.uuid('id').primary();\n t.uuid('tenant_id').index();\n t.json('payload');\n t.json('state');\n })\n .createTable(`${TABLE_PREFIX}audit_log`, (t) => {\n t.bigIncrements('seq');\n t.uuid('id').unique();\n t.uuid('tenant_id').index();\n t.json('payload');\n }),\n );\n}\n","import {\n AccountNumber,\n CalendarDate,\n DimensionValue,\n EntryLine,\n Money,\n type Side,\n Uuid,\n} from '@superheld/summae-core';\n\n/**\n * (De-)Serialisierung der JSON-Dokumente des Adapters — dieselben\n * „Published-Language\"-Formen wie PHPs `Hydrator`. Geschrieben wird über die\n * `toJSON()` der Domänenobjekte; gelesen wird schlüsselbasiert (Reihenfolge\n * egal — der Cross-Test vergleicht kanonische Projektionen, nicht Spalten-Bytes).\n */\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function encode(data: unknown): string {\n return JSON.stringify(data);\n}\n\nexport function decode(json: unknown): Record<string, unknown> {\n if (typeof json !== 'string' || json === '') return {};\n const parsed: unknown = JSON.parse(json);\n return isRecord(parsed) ? parsed : {};\n}\n\nexport function decodeList(json: unknown): Record<string, unknown>[] {\n if (typeof json !== 'string' || json === '') return [];\n const parsed: unknown = JSON.parse(json);\n return Array.isArray(parsed) ? parsed.filter(isRecord) : [];\n}\n\nexport function money(data: Record<string, unknown>): Money {\n const amount = typeof data.amount === 'string' ? data.amount : '0';\n const currency = typeof data.currency === 'string' ? data.currency : 'EUR';\n return Money.of(amount, currency);\n}\n\n/** Buchungsdatum zonenlos: nur die ersten 10 Zeichen (YYYY-MM-DD). */\nexport function date(value: unknown): CalendarDate | null {\n return typeof value === 'string' && value !== '' ? CalendarDate.of(value.slice(0, 10)) : null;\n}\n\nexport function entryLines(lines: Record<string, unknown>[]): EntryLine[] {\n return lines.map((line) => {\n const dimensions = (Array.isArray(line.dimensions) ? line.dimensions : [])\n .filter(isRecord)\n .filter((d) => typeof d.type === 'string' && typeof d.code === 'string')\n .map((d) => DimensionValue.of(String(d.type), String(d.code)));\n const taxTag = isRecord(line.taxTag) ? line.taxTag : null;\n const moneyData = isRecord(line.money) ? line.money : {};\n return new EntryLine(\n Uuid.fromString(typeof line.accountId === 'string' ? line.accountId : ''),\n AccountNumber.of(typeof line.account === 'string' ? line.account : '0'),\n (typeof line.side === 'string' ? line.side : 'debit') as Side,\n money(moneyData),\n dimensions,\n taxTag,\n );\n });\n}\n\n/** Pflicht-Datum aus einer Spalte; wirft, wenn leer (sollte nie passieren). */\nexport function requireDate(value: unknown, field: string): CalendarDate {\n const result = date(value);\n if (result === null) throw new Error(`${field} fehlt im persistierten Datensatz`);\n return result;\n}\n","import {\n Account,\n AccountNumber,\n type AccountRepository,\n type AccountStatus,\n type AccountType,\n Asset,\n type AssetRepository,\n type AssetRoute,\n type AuditChanges,\n AuditRecord,\n type AuditTrail,\n CalendarDate,\n type EntryStatus,\n FiscalYear,\n type FiscalYearRepository,\n type FiscalYearStatus,\n JournalEntry,\n type JournalRepository,\n OpenItem,\n type OpenItemKind,\n type OpenItemRepository,\n Partner,\n type PartnerRepository,\n Period,\n PeriodRef,\n type PeriodStatus,\n Settlement,\n type SettlementDifferenceKind,\n Uuid,\n Voucher,\n type VoucherRepository,\n} from '@superheld/summae-core';\nimport * as H from './hydrator.js';\nimport { TABLE_PREFIX } from './schema-installer.js';\nimport type { SyncDb } from './sync-db.js';\n\ntype Row = Record<string, unknown>;\n\nfunction str(row: Row, key: string): string {\n const v = row[key];\n return typeof v === 'string' ? v : '';\n}\nfunction strOrNull(row: Row, key: string): string | null {\n const v = row[key];\n return typeof v === 'string' ? v : null;\n}\nfunction int(row: Row, key: string): number {\n const v = row[key];\n if (typeof v === 'number') return v;\n if (typeof v === 'bigint') return Number(v);\n if (typeof v === 'string') return Number.parseInt(v, 10);\n return 0;\n}\n\n/** Konten — flache Spalten (datenformat.md). Eindeutig je Mandant über (tenant, number). */\nexport class DatabaseAccountRepository implements AccountRepository {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n add(account: Account): void {\n this.db.run(\n this.table().insert({\n id: account.id.value,\n tenant_id: this.tenantId.value,\n number: account.number.value,\n name: account.name,\n type: account.type,\n subtype: account.subtype,\n status: account.status(),\n }),\n );\n }\n\n save(account: Account): void {\n this.db.run(this.table().where('id', account.id.value).update({ name: account.name, status: account.status() }));\n }\n\n byNumber(number: AccountNumber): Account | null {\n const row = this.db.first(this.table().where('tenant_id', this.tenantId.value).where('number', number.value));\n return row === null ? null : this.hydrate(row);\n }\n\n byId(id: Uuid): Account | null {\n const row = this.db.first(this.table().where('id', id.value));\n return row === null ? null : this.hydrate(row);\n }\n\n all(): Account[] {\n return this.rows()\n .map((row) => this.hydrate(row))\n .sort((a, b) => a.number.compareTo(b.number));\n }\n\n private hydrate(row: Row): Account {\n return new Account(\n Uuid.fromString(str(row, 'id')),\n AccountNumber.of(str(row, 'number')),\n str(row, 'name'),\n str(row, 'type') as AccountType,\n strOrNull(row, 'subtype'),\n str(row, 'status') as AccountStatus,\n );\n }\n\n private rows(): Row[] {\n return this.db.all(this.table().where('tenant_id', this.tenantId.value).orderBy('rowid'));\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}accounts`);\n }\n}\n\n/** Geschäftsjahre — flache Spalten + Perioden als JSON. */\nexport class DatabaseFiscalYearRepository implements FiscalYearRepository {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n add(fiscalYear: FiscalYear): void {\n this.db.run(\n this.table().insert({\n id: fiscalYear.id.value,\n tenant_id: this.tenantId.value,\n year: fiscalYear.year,\n start: fiscalYear.start.iso,\n end: fiscalYear.end.iso,\n status: fiscalYear.status(),\n periods: this.encodePeriods(fiscalYear),\n }),\n );\n }\n\n save(fiscalYear: FiscalYear): void {\n this.db.run(\n this.table()\n .where('id', fiscalYear.id.value)\n .update({ status: fiscalYear.status(), periods: this.encodePeriods(fiscalYear) }),\n );\n }\n\n byYear(year: number): FiscalYear | null {\n const row = this.db.first(this.table().where('tenant_id', this.tenantId.value).where('year', year));\n return row === null ? null : this.hydrate(row);\n }\n\n forDate(date: CalendarDate): FiscalYear | null {\n for (const fiscalYear of this.all()) {\n if (fiscalYear.contains(date)) return fiscalYear;\n }\n return null;\n }\n\n all(): FiscalYear[] {\n return this.db\n .all(this.table().where('tenant_id', this.tenantId.value).orderBy('rowid'))\n .map((row) => this.hydrate(row))\n .sort((a, b) => a.year - b.year);\n }\n\n private encodePeriods(fiscalYear: FiscalYear): string {\n return H.encode(\n fiscalYear.periods().map((period) => ({\n period: period.number,\n start: period.start.iso,\n end: period.end.iso,\n status: period.status(),\n })),\n );\n }\n\n private hydrate(row: Row): FiscalYear {\n const periods = H.decodeList(row.periods).map(\n (p) =>\n new Period(\n int(p, 'period'),\n H.requireDate(p.start, 'Periodenstart'),\n H.requireDate(p.end, 'Periodenende'),\n str(p, 'status') as PeriodStatus,\n ),\n );\n return FiscalYear.restore(\n Uuid.fromString(str(row, 'id')),\n int(row, 'year'),\n H.requireDate(row.start, 'start'),\n H.requireDate(row.end, 'end'),\n str(row, 'status') as FiscalYearStatus,\n periods,\n );\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}fiscal_years`);\n }\n}\n\n/** Journal — append-only; `save` ändert nur Status/Text/Zeilen/Storno-Verweis. */\nexport class DatabaseJournalRepository implements JournalRepository {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n append(entry: JournalEntry): void {\n this.db.run(\n this.table().insert({\n id: entry.id.value,\n tenant_id: this.tenantId.value,\n fiscal_year: entry.periodRef.fiscalYear,\n sequence_number: entry.sequenceNumber,\n period: entry.periodRef.period,\n status: entry.status(),\n entry_date: entry.entryDate.iso,\n voucher_date: entry.voucherDate?.iso ?? null,\n recorded_at: entry.recordedAt,\n voucher_id: entry.voucherId.value,\n text: entry.text(),\n lines: this.encodeLines(entry),\n reverses: entry.reverses?.value ?? null,\n reversed_by: entry.reversedBy()?.value ?? null,\n }),\n );\n }\n\n save(entry: JournalEntry): void {\n this.db.run(\n this.table()\n .where('id', entry.id.value)\n .update({\n status: entry.status(),\n text: entry.text(),\n lines: this.encodeLines(entry),\n reversed_by: entry.reversedBy()?.value ?? null,\n }),\n );\n }\n\n byId(id: Uuid): JournalEntry | null {\n const row = this.db.first(this.table().where('id', id.value));\n return row === null ? null : this.hydrate(row);\n }\n\n nextSequenceNumber(fiscalYear: number): number {\n const rows = this.db.all(\n this.table().where('tenant_id', this.tenantId.value).where('fiscal_year', fiscalYear).max('sequence_number as max'),\n );\n const max = rows[0]?.max;\n return (typeof max === 'number' ? max : typeof max === 'bigint' ? Number(max) : 0) + 1;\n }\n\n all(): JournalEntry[] {\n return this.db\n .all(this.table().where('tenant_id', this.tenantId.value).orderBy('rowid'))\n .map((row) => this.hydrate(row))\n .sort((a, b) =>\n a.periodRef.fiscalYear !== b.periodRef.fiscalYear\n ? a.periodRef.fiscalYear - b.periodRef.fiscalYear\n : a.sequenceNumber - b.sequenceNumber,\n );\n }\n\n forFiscalYear(fiscalYear: number): JournalEntry[] {\n return this.db\n .all(this.table().where('tenant_id', this.tenantId.value).where('fiscal_year', fiscalYear).orderBy('rowid'))\n .map((row) => this.hydrate(row))\n .sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n }\n\n private encodeLines(entry: JournalEntry): string {\n return H.encode(entry.lines().map((line) => line.toJSON()));\n }\n\n private hydrate(row: Row): JournalEntry {\n return new JournalEntry(\n Uuid.fromString(str(row, 'id')),\n int(row, 'sequence_number'),\n H.requireDate(row.entry_date, 'entry_date'),\n H.date(row.voucher_date),\n str(row, 'recorded_at'),\n new PeriodRef(int(row, 'fiscal_year'), int(row, 'period')),\n Uuid.fromString(str(row, 'voucher_id')),\n str(row, 'text'),\n H.entryLines(H.decodeList(row.lines)),\n strOrNull(row, 'reverses') === null ? null : Uuid.fromString(str(row, 'reverses')),\n strOrNull(row, 'reversed_by') === null ? null : Uuid.fromString(str(row, 'reversed_by')),\n str(row, 'status') as EntryStatus,\n );\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}journal_entries`);\n }\n}\n\n/** Belege — Payload als JSON. */\nexport class DatabaseVoucherRepository implements VoucherRepository {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n add(voucher: Voucher): void {\n this.db.run(\n this.table().insert({ id: voucher.id.value, tenant_id: this.tenantId.value, payload: H.encode(voucher.toJSON()) }),\n );\n }\n\n byId(id: Uuid): Voucher | null {\n const row = this.db.first(this.table().where('id', id.value));\n return row === null ? null : this.hydrate(row);\n }\n\n all(): Voucher[] {\n return this.db\n .all(this.table().where('tenant_id', this.tenantId.value).orderBy('rowid'))\n .map((row) => this.hydrate(row))\n .sort((a, b) => (a.id.value < b.id.value ? -1 : a.id.value > b.id.value ? 1 : 0));\n }\n\n private hydrate(row: Row): Voucher {\n const data = H.decode(row.payload);\n const servicePeriod = H.isRecord(data.servicePeriod) ? data.servicePeriod : {};\n return new Voucher({\n id: Uuid.fromString(str(row, 'id')),\n voucherNumber: str(data, 'voucherNumber'),\n voucherDate: H.requireDate(data.voucherDate, 'voucherDate'),\n due: H.date(data.due),\n recurring: data.recurring === true,\n economicYear: typeof data.economicYear === 'number' ? data.economicYear : null,\n supplierTaxationMethod: strOrNull(data, 'supplierTaxationMethod'),\n serviceDate: H.date(data.serviceDate),\n servicePeriodFrom: H.date(servicePeriod.from),\n servicePeriodTo: H.date(servicePeriod.to),\n kind: strOrNull(data, 'kind'),\n partnerId: typeof data.partnerId === 'string' ? Uuid.fromString(data.partnerId) : null,\n issuer: strOrNull(data, 'issuer'),\n });\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}vouchers`);\n }\n}\n\n/** Offene Posten — flache Spalten + Ausgleiche als JSON. */\nexport class DatabaseOpenItemRepository implements OpenItemRepository {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n add(item: OpenItem): void {\n this.db.run(\n this.table().insert({\n id: item.id.value,\n tenant_id: this.tenantId.value,\n kind: item.kind,\n origin_entry_id: item.originEntryId.value,\n origin_line_index: item.originLineIndex,\n amount: item.money.amountAsString(),\n currency: item.money.currency.code,\n voucher_id: item.voucherId.value,\n opened_at: item.openedAt.iso,\n partner_id: item.partnerId?.value ?? null,\n settlements: this.encodeSettlements(item),\n }),\n );\n }\n\n save(item: OpenItem): void {\n this.db.run(this.table().where('id', item.id.value).update({ settlements: this.encodeSettlements(item) }));\n }\n\n byId(id: Uuid): OpenItem | null {\n const row = this.db.first(this.table().where('id', id.value));\n return row === null ? null : this.hydrate(row);\n }\n\n byOriginEntry(entryId: Uuid): OpenItem[] {\n return this.db\n .all(this.table().where('origin_entry_id', entryId.value).orderBy('rowid'))\n .map((row) => this.hydrate(row));\n }\n\n all(): OpenItem[] {\n return this.db.all(this.table().where('tenant_id', this.tenantId.value).orderBy('rowid')).map((row) => this.hydrate(row));\n }\n\n private encodeSettlements(item: OpenItem): string {\n return H.encode(item.settlements().map((settlement) => settlement.toJSON()));\n }\n\n private hydrate(row: Row): OpenItem {\n const settlements = H.decodeList(row.settlements).map((data) => {\n const difference = H.isRecord(data.difference) ? data.difference : null;\n const differenceMoney = difference !== null && H.isRecord(difference.money) ? H.money(difference.money) : null;\n const differenceKind =\n difference !== null && typeof difference.kind === 'string'\n ? (difference.kind as SettlementDifferenceKind)\n : null;\n return new Settlement(\n Uuid.fromString(str(data, 'entryId')),\n H.money(H.isRecord(data.money) ? data.money : {}),\n H.requireDate(data.settledAt, 'settledAt'),\n differenceMoney,\n differenceKind,\n );\n });\n return OpenItem.restore(\n Uuid.fromString(str(row, 'id')),\n str(row, 'kind') as OpenItemKind,\n Uuid.fromString(str(row, 'origin_entry_id')),\n int(row, 'origin_line_index'),\n H.money({ amount: str(row, 'amount'), currency: str(row, 'currency') }),\n Uuid.fromString(str(row, 'voucher_id')),\n H.requireDate(row.opened_at, 'opened_at'),\n strOrNull(row, 'partner_id') === null ? null : Uuid.fromString(str(row, 'partner_id')),\n settlements,\n );\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}open_items`);\n }\n}\n\n/** Geschäftspartner — Payload als JSON. */\nexport class DatabasePartnerRepository implements PartnerRepository {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n add(partner: Partner): void {\n this.db.run(\n this.table().insert({ id: partner.id.value, tenant_id: this.tenantId.value, payload: H.encode(partner.toJSON()) }),\n );\n }\n\n save(partner: Partner): void {\n this.db.run(this.table().where('id', partner.id.value).update({ payload: H.encode(partner.toJSON()) }));\n }\n\n byId(id: Uuid): Partner | null {\n const row = this.db.first(this.table().where('id', id.value));\n return row === null ? null : this.hydrate(row);\n }\n\n all(): Partner[] {\n return this.db\n .all(this.table().where('tenant_id', this.tenantId.value).orderBy('rowid'))\n .map((row) => this.hydrate(row))\n .sort((a, b) => {\n const byName = a.name() < b.name() ? -1 : a.name() > b.name() ? 1 : 0;\n return byName !== 0 ? byName : a.id.value < b.id.value ? -1 : a.id.value > b.id.value ? 1 : 0;\n });\n }\n\n private hydrate(row: Row): Partner {\n const data = H.decode(row.payload);\n const accountNumbers = (Array.isArray(data.accountNumbers) ? data.accountNumbers : []).filter(\n (n): n is string => typeof n === 'string',\n );\n const address = H.isRecord(data.address) ? data.address : {};\n return new Partner(\n Uuid.fromString(str(row, 'id')),\n str(data, 'name'),\n typeof data.kind === 'string' ? data.kind : 'both',\n strOrNull(data, 'vatId'),\n typeof data.paymentTermsDays === 'number' ? data.paymentTermsDays : null,\n accountNumbers,\n address,\n );\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}partners`);\n }\n}\n\n/** Anlagegüter — Stammdaten (payload) + AfA-Lebenslauf/Abgang (state) als JSON. */\nexport class DatabaseAssetRepository implements AssetRepository {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n add(asset: Asset): void {\n this.db.run(\n this.table().insert({\n id: asset.id.value,\n tenant_id: this.tenantId.value,\n payload: H.encode(this.payload(asset)),\n state: H.encode(this.state(asset)),\n }),\n );\n }\n\n save(asset: Asset): void {\n this.db.run(this.table().where('id', asset.id.value).update({ state: H.encode(this.state(asset)) }));\n }\n\n byId(id: Uuid): Asset | null {\n const row = this.db.first(this.table().where('id', id.value));\n return row === null ? null : this.hydrate(row);\n }\n\n all(): Asset[] {\n return this.db.all(this.table().where('tenant_id', this.tenantId.value).orderBy('rowid')).map((row) => this.hydrate(row));\n }\n\n private payload(asset: Asset): Record<string, unknown> {\n return { ...asset.toJSON(), monthlySchedule: asset.monthlySchedule.map((amount) => amount.toJSON()) };\n }\n\n private state(asset: Asset): Record<string, unknown> {\n return {\n disposed: asset.isDisposed(),\n disposedOn: asset.toJSON().disposedOn,\n accumulated: asset.accumulatedDepreciationAt(null).toJSON(),\n depreciations: asset.depreciationsForPersistence(),\n };\n }\n\n private hydrate(row: Row): Asset {\n const data = H.decode(row.payload);\n const state = H.decode(row.state);\n const schedule = (Array.isArray(data.monthlySchedule) ? data.monthlySchedule : [])\n .filter(H.isRecord)\n .map((amount) => H.money(amount));\n const depreciations = (Array.isArray(state.depreciations) ? state.depreciations : [])\n .filter(H.isRecord)\n .map((booking) => ({\n planMonth: int(booking, 'planMonth'),\n date: H.requireDate(booking.date, 'AfA-Datum'),\n amount: H.money(H.isRecord(booking.amount) ? booking.amount : {}),\n entryId: Uuid.fromString(str(booking, 'entryId')),\n }));\n return Asset.restore(\n Uuid.fromString(str(row, 'id')),\n str(data, 'name'),\n str(data, 'assetClass'),\n AccountNumber.of(str(data, 'assetAccount')),\n H.money(H.isRecord(data.acquisitionCost) ? data.acquisitionCost : {}),\n H.requireDate(data.acquiredOn, 'acquiredOn'),\n str(data, 'route') as AssetRoute,\n typeof data.usefulLifeMonths === 'number' ? data.usefulLifeMonths : null,\n schedule,\n Uuid.fromString(str(data, 'voucherId')),\n depreciations,\n state.disposed === true,\n H.date(state.disposedOn),\n );\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}assets`);\n }\n}\n\n/** Audit-Trail — append-only, Payload als JSON, Reihenfolge über `seq`. */\nexport class DatabaseAuditTrail implements AuditTrail {\n constructor(\n private readonly db: SyncDb,\n private readonly tenantId: Uuid,\n ) {}\n\n append(record: AuditRecord): void {\n this.db.run(\n this.table().insert({ id: record.id.value, tenant_id: this.tenantId.value, payload: H.encode(record.toJSON()) }),\n );\n }\n\n all(): AuditRecord[] {\n return this.db.all(this.table().where('tenant_id', this.tenantId.value).orderBy('seq')).map((row) => {\n const data = H.decode(row.payload);\n const changes = H.isRecord(data.changes) ? (data.changes as AuditChanges) : {};\n return new AuditRecord(\n Uuid.fromString(str(data, 'id')),\n str(data, 'at'),\n typeof data.actor === 'string' ? data.actor : 'system',\n str(data, 'objectType'),\n Uuid.fromString(str(data, 'objectId')),\n str(data, 'action'),\n changes,\n );\n });\n }\n\n private table() {\n return this.db.table(`${TABLE_PREFIX}audit_log`);\n }\n}\n","import {\n type Clock,\n type Currency,\n type DimensionRegistry,\n type IdGenerator,\n type MappingRegistry,\n type TaxCodeRegistry,\n type TaxProfile,\n Tenant,\n type Uuid,\n} from '@superheld/summae-core';\nimport {\n DatabaseAccountRepository,\n DatabaseAssetRepository,\n DatabaseAuditTrail,\n DatabaseFiscalYearRepository,\n DatabaseJournalRepository,\n DatabaseOpenItemRepository,\n DatabasePartnerRepository,\n DatabaseVoucherRepository,\n} from './repositories.js';\nimport type { SyncDb } from './sync-db.js';\n\nexport interface DatabaseTenantOptions {\n /** Mandanten-ID vorgeben (sonst aus dem IdGenerator). */\n tenantId?: Uuid;\n dimensions?: DimensionRegistry;\n taxCodes?: TaxCodeRegistry;\n taxProfile?: TaxProfile;\n mappings?: MappingRegistry;\n}\n\n/**\n * Baut einen `Tenant` mit DB-gestützten Ports — Pendant zu PHPs\n * `DatabaseTenantFactory::build`. Gleiche Services wie `Tenant.inMemory`, nur\n * persistente Ports. Das Schema muss vorher installiert sein (`installSchema`).\n */\nexport class DatabaseTenantFactory {\n static build(\n db: SyncDb,\n name: string,\n baseCurrency: Currency,\n clock: Clock,\n ids: IdGenerator,\n options: DatabaseTenantOptions = {},\n ): Tenant {\n const tenantId = options.tenantId ?? ids.next();\n return Tenant.fromPorts(\n tenantId,\n name,\n baseCurrency,\n {\n accounts: new DatabaseAccountRepository(db, tenantId),\n fiscalYears: new DatabaseFiscalYearRepository(db, tenantId),\n vouchers: new DatabaseVoucherRepository(db, tenantId),\n journal: new DatabaseJournalRepository(db, tenantId),\n openItems: new DatabaseOpenItemRepository(db, tenantId),\n assets: new DatabaseAssetRepository(db, tenantId),\n partners: new DatabasePartnerRepository(db, tenantId),\n audit: new DatabaseAuditTrail(db, tenantId),\n },\n clock,\n ids,\n options.dimensions,\n options.taxCodes,\n options.taxProfile,\n options.mappings,\n );\n }\n}\n"]}
@@ -0,0 +1,161 @@
1
+ import { Knex } from 'knex';
2
+ import { Currency, Clock, IdGenerator, Uuid, DimensionRegistry, TaxCodeRegistry, TaxProfile, MappingRegistry, Tenant, AccountRepository, Account, AccountNumber, AssetRepository, Asset, AuditTrail, AuditRecord, FiscalYearRepository, FiscalYear, CalendarDate, JournalRepository, JournalEntry, OpenItemRepository, OpenItem, PartnerRepository, Partner, VoucherRepository, Voucher } from '@superheld/summae-core';
3
+
4
+ type Row = Record<string, unknown>;
5
+ /**
6
+ * Synchrone Brücke: **Knex baut das SQL** (dialektkorrekt, später pg-portabel),
7
+ * **better-sqlite3 führt es synchron aus**. Nötig, weil die Core-Ports synchron
8
+ * sind (`append(): void`, `byId(): … | null`) — Knex' Promise-API würde den
9
+ * Vertrag brechen. Knex läuft hier nur als Builder (`.toSQL()`), ohne eigene
10
+ * Verbindung; die Verbindung ist allein better-sqlite3.
11
+ */
12
+ declare class SyncDb {
13
+ private readonly db;
14
+ /** Reiner Query-/Schema-Builder (keine Verbindung). */
15
+ readonly knex: Knex;
16
+ constructor(filename?: string);
17
+ /** Tabelle als Knex-QueryBuilder (nur zum Bauen, Ausführung via run/all/first). */
18
+ table(name: string): Knex.QueryBuilder;
19
+ /** DDL (Schema kann mehrere Statements erzeugen) synchron ausführen. */
20
+ schema(build: (s: Knex.SchemaBuilder) => Knex.SchemaBuilder): void;
21
+ /** Schreibende Anweisung (insert/update/delete). */
22
+ run(builder: Knex.QueryBuilder): void;
23
+ /** Alle Treffer als rohe Zeilen. */
24
+ all(builder: Knex.QueryBuilder): Row[];
25
+ /** Erster Treffer oder null. */
26
+ first(builder: Knex.QueryBuilder): Row | null;
27
+ close(): void;
28
+ }
29
+
30
+ /** Wie PHPs `SchemaInstaller::PREFIX`. */
31
+ declare const TABLE_PREFIX = "summae_";
32
+ /**
33
+ * Erzeugt die 8 `summae_*`-Tabellen — exakt das Layout der PHP-Referenz
34
+ * (`packages/laravel/src/Schema/SchemaInstaller.php`), damit beide Sprachen
35
+ * auf demselben Datenbestand arbeiten können. Journal append-only; Salden sind
36
+ * Projektionen — die Datenbank rechnet nie, sie hält JSON-Dokumente am Aggregat.
37
+ */
38
+ declare function installSchema(db: SyncDb): void;
39
+
40
+ interface DatabaseTenantOptions {
41
+ /** Mandanten-ID vorgeben (sonst aus dem IdGenerator). */
42
+ tenantId?: Uuid;
43
+ dimensions?: DimensionRegistry;
44
+ taxCodes?: TaxCodeRegistry;
45
+ taxProfile?: TaxProfile;
46
+ mappings?: MappingRegistry;
47
+ }
48
+ /**
49
+ * Baut einen `Tenant` mit DB-gestützten Ports — Pendant zu PHPs
50
+ * `DatabaseTenantFactory::build`. Gleiche Services wie `Tenant.inMemory`, nur
51
+ * persistente Ports. Das Schema muss vorher installiert sein (`installSchema`).
52
+ */
53
+ declare class DatabaseTenantFactory {
54
+ static build(db: SyncDb, name: string, baseCurrency: Currency, clock: Clock, ids: IdGenerator, options?: DatabaseTenantOptions): Tenant;
55
+ }
56
+
57
+ /** Konten — flache Spalten (datenformat.md). Eindeutig je Mandant über (tenant, number). */
58
+ declare class DatabaseAccountRepository implements AccountRepository {
59
+ private readonly db;
60
+ private readonly tenantId;
61
+ constructor(db: SyncDb, tenantId: Uuid);
62
+ add(account: Account): void;
63
+ save(account: Account): void;
64
+ byNumber(number: AccountNumber): Account | null;
65
+ byId(id: Uuid): Account | null;
66
+ all(): Account[];
67
+ private hydrate;
68
+ private rows;
69
+ private table;
70
+ }
71
+ /** Geschäftsjahre — flache Spalten + Perioden als JSON. */
72
+ declare class DatabaseFiscalYearRepository implements FiscalYearRepository {
73
+ private readonly db;
74
+ private readonly tenantId;
75
+ constructor(db: SyncDb, tenantId: Uuid);
76
+ add(fiscalYear: FiscalYear): void;
77
+ save(fiscalYear: FiscalYear): void;
78
+ byYear(year: number): FiscalYear | null;
79
+ forDate(date: CalendarDate): FiscalYear | null;
80
+ all(): FiscalYear[];
81
+ private encodePeriods;
82
+ private hydrate;
83
+ private table;
84
+ }
85
+ /** Journal — append-only; `save` ändert nur Status/Text/Zeilen/Storno-Verweis. */
86
+ declare class DatabaseJournalRepository implements JournalRepository {
87
+ private readonly db;
88
+ private readonly tenantId;
89
+ constructor(db: SyncDb, tenantId: Uuid);
90
+ append(entry: JournalEntry): void;
91
+ save(entry: JournalEntry): void;
92
+ byId(id: Uuid): JournalEntry | null;
93
+ nextSequenceNumber(fiscalYear: number): number;
94
+ all(): JournalEntry[];
95
+ forFiscalYear(fiscalYear: number): JournalEntry[];
96
+ private encodeLines;
97
+ private hydrate;
98
+ private table;
99
+ }
100
+ /** Belege — Payload als JSON. */
101
+ declare class DatabaseVoucherRepository implements VoucherRepository {
102
+ private readonly db;
103
+ private readonly tenantId;
104
+ constructor(db: SyncDb, tenantId: Uuid);
105
+ add(voucher: Voucher): void;
106
+ byId(id: Uuid): Voucher | null;
107
+ all(): Voucher[];
108
+ private hydrate;
109
+ private table;
110
+ }
111
+ /** Offene Posten — flache Spalten + Ausgleiche als JSON. */
112
+ declare class DatabaseOpenItemRepository implements OpenItemRepository {
113
+ private readonly db;
114
+ private readonly tenantId;
115
+ constructor(db: SyncDb, tenantId: Uuid);
116
+ add(item: OpenItem): void;
117
+ save(item: OpenItem): void;
118
+ byId(id: Uuid): OpenItem | null;
119
+ byOriginEntry(entryId: Uuid): OpenItem[];
120
+ all(): OpenItem[];
121
+ private encodeSettlements;
122
+ private hydrate;
123
+ private table;
124
+ }
125
+ /** Geschäftspartner — Payload als JSON. */
126
+ declare class DatabasePartnerRepository implements PartnerRepository {
127
+ private readonly db;
128
+ private readonly tenantId;
129
+ constructor(db: SyncDb, tenantId: Uuid);
130
+ add(partner: Partner): void;
131
+ save(partner: Partner): void;
132
+ byId(id: Uuid): Partner | null;
133
+ all(): Partner[];
134
+ private hydrate;
135
+ private table;
136
+ }
137
+ /** Anlagegüter — Stammdaten (payload) + AfA-Lebenslauf/Abgang (state) als JSON. */
138
+ declare class DatabaseAssetRepository implements AssetRepository {
139
+ private readonly db;
140
+ private readonly tenantId;
141
+ constructor(db: SyncDb, tenantId: Uuid);
142
+ add(asset: Asset): void;
143
+ save(asset: Asset): void;
144
+ byId(id: Uuid): Asset | null;
145
+ all(): Asset[];
146
+ private payload;
147
+ private state;
148
+ private hydrate;
149
+ private table;
150
+ }
151
+ /** Audit-Trail — append-only, Payload als JSON, Reihenfolge über `seq`. */
152
+ declare class DatabaseAuditTrail implements AuditTrail {
153
+ private readonly db;
154
+ private readonly tenantId;
155
+ constructor(db: SyncDb, tenantId: Uuid);
156
+ append(record: AuditRecord): void;
157
+ all(): AuditRecord[];
158
+ private table;
159
+ }
160
+
161
+ export { DatabaseAccountRepository, DatabaseAssetRepository, DatabaseAuditTrail, DatabaseFiscalYearRepository, DatabaseJournalRepository, DatabaseOpenItemRepository, DatabasePartnerRepository, DatabaseTenantFactory, type DatabaseTenantOptions, DatabaseVoucherRepository, SyncDb, TABLE_PREFIX, installSchema };
@@ -0,0 +1,161 @@
1
+ import { Knex } from 'knex';
2
+ import { Currency, Clock, IdGenerator, Uuid, DimensionRegistry, TaxCodeRegistry, TaxProfile, MappingRegistry, Tenant, AccountRepository, Account, AccountNumber, AssetRepository, Asset, AuditTrail, AuditRecord, FiscalYearRepository, FiscalYear, CalendarDate, JournalRepository, JournalEntry, OpenItemRepository, OpenItem, PartnerRepository, Partner, VoucherRepository, Voucher } from '@superheld/summae-core';
3
+
4
+ type Row = Record<string, unknown>;
5
+ /**
6
+ * Synchrone Brücke: **Knex baut das SQL** (dialektkorrekt, später pg-portabel),
7
+ * **better-sqlite3 führt es synchron aus**. Nötig, weil die Core-Ports synchron
8
+ * sind (`append(): void`, `byId(): … | null`) — Knex' Promise-API würde den
9
+ * Vertrag brechen. Knex läuft hier nur als Builder (`.toSQL()`), ohne eigene
10
+ * Verbindung; die Verbindung ist allein better-sqlite3.
11
+ */
12
+ declare class SyncDb {
13
+ private readonly db;
14
+ /** Reiner Query-/Schema-Builder (keine Verbindung). */
15
+ readonly knex: Knex;
16
+ constructor(filename?: string);
17
+ /** Tabelle als Knex-QueryBuilder (nur zum Bauen, Ausführung via run/all/first). */
18
+ table(name: string): Knex.QueryBuilder;
19
+ /** DDL (Schema kann mehrere Statements erzeugen) synchron ausführen. */
20
+ schema(build: (s: Knex.SchemaBuilder) => Knex.SchemaBuilder): void;
21
+ /** Schreibende Anweisung (insert/update/delete). */
22
+ run(builder: Knex.QueryBuilder): void;
23
+ /** Alle Treffer als rohe Zeilen. */
24
+ all(builder: Knex.QueryBuilder): Row[];
25
+ /** Erster Treffer oder null. */
26
+ first(builder: Knex.QueryBuilder): Row | null;
27
+ close(): void;
28
+ }
29
+
30
+ /** Wie PHPs `SchemaInstaller::PREFIX`. */
31
+ declare const TABLE_PREFIX = "summae_";
32
+ /**
33
+ * Erzeugt die 8 `summae_*`-Tabellen — exakt das Layout der PHP-Referenz
34
+ * (`packages/laravel/src/Schema/SchemaInstaller.php`), damit beide Sprachen
35
+ * auf demselben Datenbestand arbeiten können. Journal append-only; Salden sind
36
+ * Projektionen — die Datenbank rechnet nie, sie hält JSON-Dokumente am Aggregat.
37
+ */
38
+ declare function installSchema(db: SyncDb): void;
39
+
40
+ interface DatabaseTenantOptions {
41
+ /** Mandanten-ID vorgeben (sonst aus dem IdGenerator). */
42
+ tenantId?: Uuid;
43
+ dimensions?: DimensionRegistry;
44
+ taxCodes?: TaxCodeRegistry;
45
+ taxProfile?: TaxProfile;
46
+ mappings?: MappingRegistry;
47
+ }
48
+ /**
49
+ * Baut einen `Tenant` mit DB-gestützten Ports — Pendant zu PHPs
50
+ * `DatabaseTenantFactory::build`. Gleiche Services wie `Tenant.inMemory`, nur
51
+ * persistente Ports. Das Schema muss vorher installiert sein (`installSchema`).
52
+ */
53
+ declare class DatabaseTenantFactory {
54
+ static build(db: SyncDb, name: string, baseCurrency: Currency, clock: Clock, ids: IdGenerator, options?: DatabaseTenantOptions): Tenant;
55
+ }
56
+
57
+ /** Konten — flache Spalten (datenformat.md). Eindeutig je Mandant über (tenant, number). */
58
+ declare class DatabaseAccountRepository implements AccountRepository {
59
+ private readonly db;
60
+ private readonly tenantId;
61
+ constructor(db: SyncDb, tenantId: Uuid);
62
+ add(account: Account): void;
63
+ save(account: Account): void;
64
+ byNumber(number: AccountNumber): Account | null;
65
+ byId(id: Uuid): Account | null;
66
+ all(): Account[];
67
+ private hydrate;
68
+ private rows;
69
+ private table;
70
+ }
71
+ /** Geschäftsjahre — flache Spalten + Perioden als JSON. */
72
+ declare class DatabaseFiscalYearRepository implements FiscalYearRepository {
73
+ private readonly db;
74
+ private readonly tenantId;
75
+ constructor(db: SyncDb, tenantId: Uuid);
76
+ add(fiscalYear: FiscalYear): void;
77
+ save(fiscalYear: FiscalYear): void;
78
+ byYear(year: number): FiscalYear | null;
79
+ forDate(date: CalendarDate): FiscalYear | null;
80
+ all(): FiscalYear[];
81
+ private encodePeriods;
82
+ private hydrate;
83
+ private table;
84
+ }
85
+ /** Journal — append-only; `save` ändert nur Status/Text/Zeilen/Storno-Verweis. */
86
+ declare class DatabaseJournalRepository implements JournalRepository {
87
+ private readonly db;
88
+ private readonly tenantId;
89
+ constructor(db: SyncDb, tenantId: Uuid);
90
+ append(entry: JournalEntry): void;
91
+ save(entry: JournalEntry): void;
92
+ byId(id: Uuid): JournalEntry | null;
93
+ nextSequenceNumber(fiscalYear: number): number;
94
+ all(): JournalEntry[];
95
+ forFiscalYear(fiscalYear: number): JournalEntry[];
96
+ private encodeLines;
97
+ private hydrate;
98
+ private table;
99
+ }
100
+ /** Belege — Payload als JSON. */
101
+ declare class DatabaseVoucherRepository implements VoucherRepository {
102
+ private readonly db;
103
+ private readonly tenantId;
104
+ constructor(db: SyncDb, tenantId: Uuid);
105
+ add(voucher: Voucher): void;
106
+ byId(id: Uuid): Voucher | null;
107
+ all(): Voucher[];
108
+ private hydrate;
109
+ private table;
110
+ }
111
+ /** Offene Posten — flache Spalten + Ausgleiche als JSON. */
112
+ declare class DatabaseOpenItemRepository implements OpenItemRepository {
113
+ private readonly db;
114
+ private readonly tenantId;
115
+ constructor(db: SyncDb, tenantId: Uuid);
116
+ add(item: OpenItem): void;
117
+ save(item: OpenItem): void;
118
+ byId(id: Uuid): OpenItem | null;
119
+ byOriginEntry(entryId: Uuid): OpenItem[];
120
+ all(): OpenItem[];
121
+ private encodeSettlements;
122
+ private hydrate;
123
+ private table;
124
+ }
125
+ /** Geschäftspartner — Payload als JSON. */
126
+ declare class DatabasePartnerRepository implements PartnerRepository {
127
+ private readonly db;
128
+ private readonly tenantId;
129
+ constructor(db: SyncDb, tenantId: Uuid);
130
+ add(partner: Partner): void;
131
+ save(partner: Partner): void;
132
+ byId(id: Uuid): Partner | null;
133
+ all(): Partner[];
134
+ private hydrate;
135
+ private table;
136
+ }
137
+ /** Anlagegüter — Stammdaten (payload) + AfA-Lebenslauf/Abgang (state) als JSON. */
138
+ declare class DatabaseAssetRepository implements AssetRepository {
139
+ private readonly db;
140
+ private readonly tenantId;
141
+ constructor(db: SyncDb, tenantId: Uuid);
142
+ add(asset: Asset): void;
143
+ save(asset: Asset): void;
144
+ byId(id: Uuid): Asset | null;
145
+ all(): Asset[];
146
+ private payload;
147
+ private state;
148
+ private hydrate;
149
+ private table;
150
+ }
151
+ /** Audit-Trail — append-only, Payload als JSON, Reihenfolge über `seq`. */
152
+ declare class DatabaseAuditTrail implements AuditTrail {
153
+ private readonly db;
154
+ private readonly tenantId;
155
+ constructor(db: SyncDb, tenantId: Uuid);
156
+ append(record: AuditRecord): void;
157
+ all(): AuditRecord[];
158
+ private table;
159
+ }
160
+
161
+ export { DatabaseAccountRepository, DatabaseAssetRepository, DatabaseAuditTrail, DatabaseFiscalYearRepository, DatabaseJournalRepository, DatabaseOpenItemRepository, DatabasePartnerRepository, DatabaseTenantFactory, type DatabaseTenantOptions, DatabaseVoucherRepository, SyncDb, TABLE_PREFIX, installSchema };