@rubydogjp/openkk-sqlite-adapter 26.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.
- package/LICENSE +21 -0
- package/dist/adapter.d.ts +4 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +21 -0
- package/dist/adapter.js.map +1 -0
- package/dist/closing-store.d.ts +5 -0
- package/dist/closing-store.d.ts.map +1 -0
- package/dist/closing-store.js +113 -0
- package/dist/closing-store.js.map +1 -0
- package/dist/entry-store.d.ts +6 -0
- package/dist/entry-store.d.ts.map +1 -0
- package/dist/entry-store.js +266 -0
- package/dist/entry-store.js.map +1 -0
- package/dist/fiscal-period-guard.d.ts +6 -0
- package/dist/fiscal-period-guard.d.ts.map +1 -0
- package/dist/fiscal-period-guard.js +34 -0
- package/dist/fiscal-period-guard.js.map +1 -0
- package/dist/fiscal-period-record.d.ts +5 -0
- package/dist/fiscal-period-record.d.ts.map +1 -0
- package/dist/fiscal-period-record.js +32 -0
- package/dist/fiscal-period-record.js.map +1 -0
- package/dist/fiscal-period-store.d.ts +4 -0
- package/dist/fiscal-period-store.d.ts.map +1 -0
- package/dist/fiscal-period-store.js +364 -0
- package/dist/fiscal-period-store.js.map +1 -0
- package/dist/fiscal-period-transition.d.ts +4 -0
- package/dist/fiscal-period-transition.d.ts.map +1 -0
- package/dist/fiscal-period-transition.js +30 -0
- package/dist/fiscal-period-transition.js.map +1 -0
- package/dist/fixed-asset-store.d.ts +4 -0
- package/dist/fixed-asset-store.d.ts.map +1 -0
- package/dist/fixed-asset-store.js +142 -0
- package/dist/fixed-asset-store.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/master-data-store.d.ts +3 -0
- package/dist/master-data-store.d.ts.map +1 -0
- package/dist/master-data-store.js +39 -0
- package/dist/master-data-store.js.map +1 -0
- package/dist/migrate.d.ts +6 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +53 -0
- package/dist/migrate.js.map +1 -0
- package/dist/opening-store.d.ts +7 -0
- package/dist/opening-store.d.ts.map +1 -0
- package/dist/opening-store.js +150 -0
- package/dist/opening-store.js.map +1 -0
- package/dist/persistence-codec.d.ts +9 -0
- package/dist/persistence-codec.d.ts.map +1 -0
- package/dist/persistence-codec.js +210 -0
- package/dist/persistence-codec.js.map +1 -0
- package/dist/record-validation.d.ts +11 -0
- package/dist/record-validation.d.ts.map +1 -0
- package/dist/record-validation.js +75 -0
- package/dist/record-validation.js.map +1 -0
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +7 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema.d.ts +7 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +688 -0
- package/dist/schema.js.map +1 -0
- package/dist/seed-store.d.ts +4 -0
- package/dist/seed-store.d.ts.map +1 -0
- package/dist/seed-store.js +174 -0
- package/dist/seed-store.js.map +1 -0
- package/dist/sql-db.d.ts +9 -0
- package/dist/sql-db.d.ts.map +1 -0
- package/dist/sql-db.js +2 -0
- package/dist/sql-db.js.map +1 -0
- package/dist/table-types.d.ts +27 -0
- package/dist/table-types.d.ts.map +1 -0
- package/dist/table-types.js +2 -0
- package/dist/table-types.js.map +1 -0
- package/dist/transaction.d.ts +4 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +21 -0
- package/dist/transaction.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { DEFAULT_BOOK_ACCOUNTS, DEFAULT_BUSINESS_CATEGORIES, DEFAULT_TAX_CATEGORIES, } from "@rubydogjp/openkk-server-domain";
|
|
2
|
+
import { msToIso } from "./persistence-codec.js";
|
|
3
|
+
const MASTER_RECORD_TIMESTAMP = msToIso(0);
|
|
4
|
+
export function createMasterDataDb() {
|
|
5
|
+
return {
|
|
6
|
+
async getBookAccounts() {
|
|
7
|
+
return DEFAULT_BOOK_ACCOUNTS.map((account) => ({
|
|
8
|
+
id: account.id,
|
|
9
|
+
name: account.name,
|
|
10
|
+
description: account.description,
|
|
11
|
+
kana: account.kana,
|
|
12
|
+
normalBalanceSide: account.normalBalanceSide,
|
|
13
|
+
accountType: account.accountType,
|
|
14
|
+
balanceSheetSection: account.balanceSheetSection,
|
|
15
|
+
sortOrder: account.sortOrder,
|
|
16
|
+
createdAt: MASTER_RECORD_TIMESTAMP,
|
|
17
|
+
updatedAt: MASTER_RECORD_TIMESTAMP,
|
|
18
|
+
}));
|
|
19
|
+
},
|
|
20
|
+
async getTaxCategories() {
|
|
21
|
+
return DEFAULT_TAX_CATEGORIES.map((category) => ({
|
|
22
|
+
id: category.id,
|
|
23
|
+
name: category.name,
|
|
24
|
+
rate: category.rate,
|
|
25
|
+
createdAt: MASTER_RECORD_TIMESTAMP,
|
|
26
|
+
updatedAt: MASTER_RECORD_TIMESTAMP,
|
|
27
|
+
}));
|
|
28
|
+
},
|
|
29
|
+
async getBusinessCategories() {
|
|
30
|
+
return DEFAULT_BUSINESS_CATEGORIES.map((category) => ({
|
|
31
|
+
id: category.id,
|
|
32
|
+
name: category.name,
|
|
33
|
+
createdAt: MASTER_RECORD_TIMESTAMP,
|
|
34
|
+
updatedAt: MASTER_RECORD_TIMESTAMP,
|
|
35
|
+
}));
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=master-data-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"master-data-store.js","sourceRoot":"","sources":["../src/master-data-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,uBAAuB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE3C,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,KAAK,CAAC,eAAe;YACnB,OAAO,qBAAqB,CAAC,GAAG,CAC9B,CAAC,OAAO,EAA6B,EAAE,CAAC,CAAC;gBACvC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;gBAChD,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,SAAS,EAAE,uBAAuB;gBAClC,SAAS,EAAE,uBAAuB;aACnC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,gBAAgB;YACpB,OAAO,sBAAsB,CAAC,GAAG,CAC/B,CAAC,QAAQ,EAA6B,EAAE,CAAC,CAAC;gBACxC,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,SAAS,EAAE,uBAAuB;gBAClC,SAAS,EAAE,uBAAuB;aACnC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,qBAAqB;YACzB,OAAO,2BAA2B,CAAC,GAAG,CACpC,CAAC,QAAQ,EAAkC,EAAE,CAAC,CAAC;gBAC7C,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,SAAS,EAAE,uBAAuB;gBAClC,SAAS,EAAE,uBAAuB;aACnC,CAAC,CACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CACnC,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAoCnD"}
|
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { SCHEMA_MIGRATIONS, SCHEMA_VERSION } from "./schema.js";
|
|
2
|
+
import { transactionRollbackError } from "./transaction.js";
|
|
3
|
+
export function runMigrations(db) {
|
|
4
|
+
const currentVersion = readSchemaVersion(db);
|
|
5
|
+
if (currentVersion === SCHEMA_VERSION) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (currentVersion > SCHEMA_VERSION) {
|
|
9
|
+
throw new Error(`schema_version ${currentVersion} is newer than app SCHEMA_VERSION ${SCHEMA_VERSION}; refusing to downgrade. Update the app.`);
|
|
10
|
+
}
|
|
11
|
+
const pending = SCHEMA_MIGRATIONS.filter((m) => m.version > currentVersion);
|
|
12
|
+
for (const migration of pending) {
|
|
13
|
+
db.exec("BEGIN");
|
|
14
|
+
try {
|
|
15
|
+
db.exec(migration.sql);
|
|
16
|
+
db.exec({
|
|
17
|
+
sql: `INSERT OR REPLACE INTO openkk_meta(key, value) VALUES('schema_version', ?)`,
|
|
18
|
+
bind: [String(migration.version)],
|
|
19
|
+
});
|
|
20
|
+
db.exec("COMMIT");
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
let cause = error;
|
|
24
|
+
try {
|
|
25
|
+
db.exec("ROLLBACK");
|
|
26
|
+
}
|
|
27
|
+
catch (rollbackError) {
|
|
28
|
+
cause = transactionRollbackError(error, rollbackError);
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`migration to version ${migration.version} failed: ${error instanceof Error ? error.message : String(error)}`, { cause });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function readSchemaVersion(db) {
|
|
35
|
+
const tableExists = db.selectValue("SELECT 1 FROM sqlite_master WHERE type='table' AND name='openkk_meta'");
|
|
36
|
+
if (tableExists == null) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
const raw = db.selectValue("SELECT value FROM openkk_meta WHERE key='schema_version'");
|
|
40
|
+
if (raw == null) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
const text = String(raw);
|
|
44
|
+
if (!/^(0|[1-9]\d*)$/.test(text)) {
|
|
45
|
+
throw new Error(`invalid schema_version: ${JSON.stringify(text)}`);
|
|
46
|
+
}
|
|
47
|
+
const parsed = Number(text);
|
|
48
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
49
|
+
throw new Error(`schema_version is outside the safe integer range: ${text}`);
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,MAAM,UAAU,aAAa,CAAC,EAAe;IAC3C,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IACD,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,kBAAkB,cAAc,qCAAqC,cAAc,0CAA0C,CAC9H,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAC5E,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,IAAI,CAAC;gBACN,GAAG,EAAE,4EAA4E;gBACjF,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;aAClC,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,aAAa,EAAE,CAAC;gBACvB,KAAK,GAAG,wBAAwB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,IAAI,KAAK,CACb,wBAAwB,SAAS,CAAC,OAAO,YACvC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,EACF,EAAE,KAAK,EAAE,CACV,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAe;IACxC,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAChC,uEAAuE,CACxE,CAAC;IACF,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CACxB,0DAA0D,CAC3D,CAAC;IACF,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAClD,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,qDAAqD,IAAI,EAAE,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FiscalPeriodOpeningDbRecord } from "@rubydogjp/openkk-server-ports";
|
|
2
|
+
import type { SqlDb } from "./sql-db.js";
|
|
3
|
+
export declare function emptyOpening(): FiscalPeriodOpeningDbRecord;
|
|
4
|
+
export declare function loadOpeningsByUser(db: SqlDb, userId: string): Promise<Map<string, FiscalPeriodOpeningDbRecord>>;
|
|
5
|
+
export declare function loadOpeningByFiscalPeriod(db: SqlDb, fiscalPeriodId: string): Promise<FiscalPeriodOpeningDbRecord>;
|
|
6
|
+
export declare function replaceOpening(db: SqlDb, fiscalPeriodId: string, opening: FiscalPeriodOpeningDbRecord): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=opening-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opening-store.d.ts","sourceRoot":"","sources":["../src/opening-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,2BAA2B,EAE5B,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAgB,YAAY,IAAI,2BAA2B,CAE1D;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,KAAK,EACT,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAEnD;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,KAAK,EACT,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,2BAA2B,CAAC,CAGtC;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,KAAK,EACT,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAqDf"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { validateOpeningDbRecord } from "./persistence-codec.js";
|
|
2
|
+
export function emptyOpening() {
|
|
3
|
+
return { balanceLines: [], journals: [] };
|
|
4
|
+
}
|
|
5
|
+
export async function loadOpeningsByUser(db, userId) {
|
|
6
|
+
return loadOpenings(db, "fp.user_id = ?", userId);
|
|
7
|
+
}
|
|
8
|
+
export async function loadOpeningByFiscalPeriod(db, fiscalPeriodId) {
|
|
9
|
+
const openings = await loadOpenings(db, "fp.id = ?", fiscalPeriodId);
|
|
10
|
+
return openings.get(fiscalPeriodId) ?? emptyOpening();
|
|
11
|
+
}
|
|
12
|
+
export async function replaceOpening(db, fiscalPeriodId, opening) {
|
|
13
|
+
for (const table of [
|
|
14
|
+
"opening_journal_lines",
|
|
15
|
+
"opening_journals",
|
|
16
|
+
"opening_balance_lines",
|
|
17
|
+
]) {
|
|
18
|
+
await db.exec({
|
|
19
|
+
sql: `DELETE FROM ${table} WHERE fiscal_period_id = ?`,
|
|
20
|
+
bind: [fiscalPeriodId],
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
for (const [position, line] of opening.balanceLines.entries()) {
|
|
24
|
+
await db.exec({
|
|
25
|
+
sql: `INSERT INTO opening_balance_lines(fiscal_period_id, id, account_id, amount, position)
|
|
26
|
+
VALUES(?, ?, ?, ?, ?)`,
|
|
27
|
+
bind: [fiscalPeriodId, line.id, line.accountId, line.amount, position],
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
for (const [position, journal] of opening.journals.entries()) {
|
|
31
|
+
await db.exec({
|
|
32
|
+
sql: `INSERT INTO opening_journals(
|
|
33
|
+
fiscal_period_id, id, date, description, business_rate, position
|
|
34
|
+
) VALUES(?, ?, ?, ?, ?, ?)`,
|
|
35
|
+
bind: [
|
|
36
|
+
fiscalPeriodId,
|
|
37
|
+
journal.id,
|
|
38
|
+
journal.date,
|
|
39
|
+
journal.description,
|
|
40
|
+
journal.businessRate,
|
|
41
|
+
position,
|
|
42
|
+
],
|
|
43
|
+
});
|
|
44
|
+
for (const [linePosition, line] of journal.lines.entries()) {
|
|
45
|
+
await db.exec({
|
|
46
|
+
sql: `INSERT INTO opening_journal_lines(
|
|
47
|
+
fiscal_period_id, opening_journal_id, id, side, book_account_id, amount,
|
|
48
|
+
partner_name, tax_category_id, business_category_id, position
|
|
49
|
+
) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
50
|
+
bind: [
|
|
51
|
+
fiscalPeriodId,
|
|
52
|
+
journal.id,
|
|
53
|
+
line.id,
|
|
54
|
+
line.side,
|
|
55
|
+
line.bookAccountId,
|
|
56
|
+
line.amount,
|
|
57
|
+
line.partnerName,
|
|
58
|
+
line.taxCategoryId,
|
|
59
|
+
line.businessCategoryId,
|
|
60
|
+
linePosition,
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function loadOpenings(db, where, value) {
|
|
67
|
+
const result = new Map();
|
|
68
|
+
const openingFor = (fiscalPeriodId) => {
|
|
69
|
+
let opening = result.get(fiscalPeriodId);
|
|
70
|
+
if (opening == null) {
|
|
71
|
+
opening = emptyOpening();
|
|
72
|
+
result.set(fiscalPeriodId, opening);
|
|
73
|
+
}
|
|
74
|
+
return opening;
|
|
75
|
+
};
|
|
76
|
+
const balanceRows = (await db.exec({
|
|
77
|
+
sql: `SELECT line.fiscal_period_id, line.id, line.account_id, line.amount
|
|
78
|
+
FROM opening_balance_lines line
|
|
79
|
+
JOIN fiscal_periods fp ON fp.id = line.fiscal_period_id
|
|
80
|
+
WHERE ${where}
|
|
81
|
+
ORDER BY line.fiscal_period_id, line.position, line.id`,
|
|
82
|
+
bind: [value],
|
|
83
|
+
returnValue: "resultRows",
|
|
84
|
+
rowMode: "array",
|
|
85
|
+
}));
|
|
86
|
+
for (const [fiscalPeriodId, id, accountId, amount] of balanceRows) {
|
|
87
|
+
openingFor(fiscalPeriodId).balanceLines.push({
|
|
88
|
+
id,
|
|
89
|
+
accountId,
|
|
90
|
+
amount,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const journalRows = (await db.exec({
|
|
94
|
+
sql: `SELECT journal.fiscal_period_id, journal.id, journal.date,
|
|
95
|
+
journal.description, journal.business_rate
|
|
96
|
+
FROM opening_journals journal
|
|
97
|
+
JOIN fiscal_periods fp ON fp.id = journal.fiscal_period_id
|
|
98
|
+
WHERE ${where}
|
|
99
|
+
ORDER BY journal.fiscal_period_id, journal.position, journal.id`,
|
|
100
|
+
bind: [value],
|
|
101
|
+
returnValue: "resultRows",
|
|
102
|
+
rowMode: "array",
|
|
103
|
+
}));
|
|
104
|
+
const journals = new Map();
|
|
105
|
+
for (const [fiscalPeriodId, id, date, description, businessRate,] of journalRows) {
|
|
106
|
+
const journal = {
|
|
107
|
+
id,
|
|
108
|
+
date,
|
|
109
|
+
description,
|
|
110
|
+
businessRate,
|
|
111
|
+
lines: [],
|
|
112
|
+
};
|
|
113
|
+
journals.set(journalKey(fiscalPeriodId, id), journal);
|
|
114
|
+
openingFor(fiscalPeriodId).journals.push(journal);
|
|
115
|
+
}
|
|
116
|
+
const lineRows = (await db.exec({
|
|
117
|
+
sql: `SELECT line.fiscal_period_id, line.opening_journal_id, line.id, line.side,
|
|
118
|
+
line.book_account_id, line.amount, line.partner_name,
|
|
119
|
+
line.tax_category_id, line.business_category_id
|
|
120
|
+
FROM opening_journal_lines line
|
|
121
|
+
JOIN fiscal_periods fp ON fp.id = line.fiscal_period_id
|
|
122
|
+
WHERE ${where}
|
|
123
|
+
ORDER BY line.fiscal_period_id, line.opening_journal_id, line.position, line.id`,
|
|
124
|
+
bind: [value],
|
|
125
|
+
returnValue: "resultRows",
|
|
126
|
+
rowMode: "array",
|
|
127
|
+
}));
|
|
128
|
+
for (const [fiscalPeriodId, openingJournalId, id, side, bookAccountId, amount, partnerName, taxCategoryId, businessCategoryId,] of lineRows) {
|
|
129
|
+
const journal = journals.get(journalKey(fiscalPeriodId, openingJournalId));
|
|
130
|
+
if (journal == null)
|
|
131
|
+
throw new Error(`opening journal not found: ${openingJournalId}`);
|
|
132
|
+
journal.lines.push({
|
|
133
|
+
id,
|
|
134
|
+
side,
|
|
135
|
+
bookAccountId,
|
|
136
|
+
amount,
|
|
137
|
+
partnerName,
|
|
138
|
+
taxCategoryId,
|
|
139
|
+
businessCategoryId,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
for (const opening of result.values()) {
|
|
143
|
+
validateOpeningDbRecord(opening);
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
function journalKey(fiscalPeriodId, journalId) {
|
|
148
|
+
return `${fiscalPeriodId}\u0000${journalId}`;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=opening-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opening-store.js","sourceRoot":"","sources":["../src/opening-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FiscalPeriodOpeningDbRecord } from "@rubydogjp/openkk-server-ports";
|
|
2
|
+
import type { FiscalPeriodDbData, FixedAssetDbData } from "./table-types.js";
|
|
3
|
+
export declare function msToIso(ms: number): string;
|
|
4
|
+
export declare function parseFiscalPeriodDbData(json: string): FiscalPeriodDbData;
|
|
5
|
+
export declare function serializeFiscalPeriodDbData(value: FiscalPeriodDbData): string;
|
|
6
|
+
export declare function validateOpeningDbRecord(opening: FiscalPeriodOpeningDbRecord): void;
|
|
7
|
+
export declare function parseFixedAssetDbData(json: string): FixedAssetDbData;
|
|
8
|
+
export declare function serializeFixedAssetDbData(value: FixedAssetDbData): string;
|
|
9
|
+
//# sourceMappingURL=persistence-codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence-codec.d.ts","sourceRoot":"","sources":["../src/persistence-codec.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GACX,kBAAkB,CAmDpB;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,kBAAkB,GACxB,MAAM,CAaR;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,2BAA2B,GACnC,IAAI,CAIN;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAwCpE;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,gBAAgB,GACtB,MAAM,CAgBR"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { assertDateRange, assertFiscalPeriodArchiveState, assertFiscalPeriodLifecycleFlags, assertOpeningMatchesRules, parseIsoDate, requireObject, serverValidationError, } from "@rubydogjp/openkk-server-domain";
|
|
2
|
+
export function msToIso(ms) {
|
|
3
|
+
return new Date(ms).toISOString();
|
|
4
|
+
}
|
|
5
|
+
export function parseFiscalPeriodDbData(json) {
|
|
6
|
+
return decodeRecord(json, "fiscal period", (value) => {
|
|
7
|
+
const id = nonBlankString(value, "id");
|
|
8
|
+
const name = nonBlankString(value, "name");
|
|
9
|
+
const startDate = isoDate(value, "startDate");
|
|
10
|
+
const endDate = isoDate(value, "endDate");
|
|
11
|
+
const phase = enumValue(value, "phase", [
|
|
12
|
+
"pre_opening",
|
|
13
|
+
"journalizing",
|
|
14
|
+
"pre_closing",
|
|
15
|
+
"post_closing",
|
|
16
|
+
]);
|
|
17
|
+
const archiveStatus = enumValue(value, "archiveStatus", [
|
|
18
|
+
"active",
|
|
19
|
+
"archived",
|
|
20
|
+
"purged",
|
|
21
|
+
]);
|
|
22
|
+
const openingBalancesCompleted = booleanValue(value, "openingBalancesCompleted");
|
|
23
|
+
const documentsReceivedCompleted = booleanValue(value, "documentsReceivedCompleted");
|
|
24
|
+
const archivedAt = nullableValue(value, "archivedAt", isoTimestamp);
|
|
25
|
+
assertDateRange(startDate, endDate, "fiscal period");
|
|
26
|
+
assertFiscalPeriodLifecycleFlags({
|
|
27
|
+
phase,
|
|
28
|
+
openingBalancesCompleted,
|
|
29
|
+
documentsReceivedCompleted,
|
|
30
|
+
}, "fiscal period");
|
|
31
|
+
assertFiscalPeriodArchiveState({ archiveStatus, archivedAt }, "fiscal period");
|
|
32
|
+
return {
|
|
33
|
+
id,
|
|
34
|
+
name,
|
|
35
|
+
startDate,
|
|
36
|
+
endDate,
|
|
37
|
+
phase,
|
|
38
|
+
archiveStatus,
|
|
39
|
+
archivedAt,
|
|
40
|
+
openingBalancesCompleted,
|
|
41
|
+
documentsReceivedCompleted,
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export function serializeFiscalPeriodDbData(value) {
|
|
46
|
+
const data = {
|
|
47
|
+
id: value.id,
|
|
48
|
+
name: value.name,
|
|
49
|
+
startDate: value.startDate,
|
|
50
|
+
endDate: value.endDate,
|
|
51
|
+
phase: value.phase,
|
|
52
|
+
archiveStatus: value.archiveStatus,
|
|
53
|
+
archivedAt: value.archivedAt,
|
|
54
|
+
openingBalancesCompleted: value.openingBalancesCompleted,
|
|
55
|
+
documentsReceivedCompleted: value.documentsReceivedCompleted,
|
|
56
|
+
};
|
|
57
|
+
return serializeRecord(data, parseFiscalPeriodDbData);
|
|
58
|
+
}
|
|
59
|
+
export function validateOpeningDbRecord(opening) {
|
|
60
|
+
assertOpeningMatchesRules(opening, null, "Stored opening", {
|
|
61
|
+
completed: false,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export function parseFixedAssetDbData(json) {
|
|
65
|
+
return decodeRecord(json, "fixed asset", (value) => {
|
|
66
|
+
const id = nonBlankString(value, "id");
|
|
67
|
+
const fiscalPeriodId = nonBlankString(value, "fiscalPeriodId");
|
|
68
|
+
const name = nonBlankString(value, "name");
|
|
69
|
+
const acquisitionDate = isoDate(value, "acquisitionDate");
|
|
70
|
+
const acquisitionCost = positiveInteger(value, "acquisitionCost");
|
|
71
|
+
const usefulLife = positiveInteger(value, "usefulLife");
|
|
72
|
+
const depreciationMethod = enumValue(value, "depreciationMethod", [
|
|
73
|
+
"straight_line",
|
|
74
|
+
]);
|
|
75
|
+
const businessRate = unitRate(value, "businessRate");
|
|
76
|
+
const status = enumValue(value, "status", [
|
|
77
|
+
"active",
|
|
78
|
+
"sold",
|
|
79
|
+
"disposed",
|
|
80
|
+
"retired",
|
|
81
|
+
]);
|
|
82
|
+
const disposalDate = nullableValue(value, "disposalDate", isoDate);
|
|
83
|
+
const disposalPrice = nullableValue(value, "disposalPrice", nonNegativeInteger);
|
|
84
|
+
const bookAccountId = nonBlankString(value, "bookAccountId");
|
|
85
|
+
return {
|
|
86
|
+
id,
|
|
87
|
+
fiscalPeriodId,
|
|
88
|
+
name,
|
|
89
|
+
acquisitionDate,
|
|
90
|
+
acquisitionCost,
|
|
91
|
+
usefulLife,
|
|
92
|
+
depreciationMethod,
|
|
93
|
+
businessRate,
|
|
94
|
+
status,
|
|
95
|
+
disposalDate,
|
|
96
|
+
disposalPrice,
|
|
97
|
+
bookAccountId,
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
export function serializeFixedAssetDbData(value) {
|
|
102
|
+
const data = {
|
|
103
|
+
id: value.id,
|
|
104
|
+
fiscalPeriodId: value.fiscalPeriodId,
|
|
105
|
+
name: value.name,
|
|
106
|
+
acquisitionDate: value.acquisitionDate,
|
|
107
|
+
acquisitionCost: value.acquisitionCost,
|
|
108
|
+
usefulLife: value.usefulLife,
|
|
109
|
+
depreciationMethod: value.depreciationMethod,
|
|
110
|
+
businessRate: value.businessRate,
|
|
111
|
+
status: value.status,
|
|
112
|
+
disposalDate: value.disposalDate,
|
|
113
|
+
disposalPrice: value.disposalPrice,
|
|
114
|
+
bookAccountId: value.bookAccountId,
|
|
115
|
+
};
|
|
116
|
+
return serializeRecord(data, parseFixedAssetDbData);
|
|
117
|
+
}
|
|
118
|
+
function decodeRecord(json, label, decode) {
|
|
119
|
+
try {
|
|
120
|
+
return decode(requireObject(JSON.parse(json), label));
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw new Error(`Invalid ${label} data in SQLite: ${error instanceof Error ? error.message : String(error)}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function serializeRecord(value, validate) {
|
|
127
|
+
const json = JSON.stringify(value);
|
|
128
|
+
validate(json);
|
|
129
|
+
return json;
|
|
130
|
+
}
|
|
131
|
+
function stringValue(record, key) {
|
|
132
|
+
const value = record[key];
|
|
133
|
+
if (typeof value !== "string") {
|
|
134
|
+
throw serverValidationError(`${key} must be a string`, null);
|
|
135
|
+
}
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
function nonBlankString(record, key) {
|
|
139
|
+
const value = stringValue(record, key);
|
|
140
|
+
if (value.trim() === "") {
|
|
141
|
+
throw serverValidationError(`${key} must not be blank`, null);
|
|
142
|
+
}
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
function nullableValue(record, key, read) {
|
|
146
|
+
if (!(key in record)) {
|
|
147
|
+
throw serverValidationError(`${key} is required`, null);
|
|
148
|
+
}
|
|
149
|
+
return record[key] === null ? null : read(record, key);
|
|
150
|
+
}
|
|
151
|
+
function booleanValue(record, key) {
|
|
152
|
+
const value = record[key];
|
|
153
|
+
if (typeof value !== "boolean") {
|
|
154
|
+
throw serverValidationError(`${key} must be a boolean`, null);
|
|
155
|
+
}
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
function finiteNumber(record, key) {
|
|
159
|
+
const value = record[key];
|
|
160
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
161
|
+
throw serverValidationError(`${key} must be a finite number`, null);
|
|
162
|
+
}
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
function nonNegativeInteger(record, key) {
|
|
166
|
+
const value = finiteNumber(record, key);
|
|
167
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
168
|
+
throw serverValidationError(`${key} must be a non-negative safe integer`, null);
|
|
169
|
+
}
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
function positiveInteger(record, key) {
|
|
173
|
+
const value = finiteNumber(record, key);
|
|
174
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
175
|
+
throw serverValidationError(`${key} must be a positive safe integer`, null);
|
|
176
|
+
}
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
function unitRate(record, key) {
|
|
180
|
+
const rate = finiteNumber(record, key);
|
|
181
|
+
if (rate < 0 || rate > 1)
|
|
182
|
+
throw serverValidationError(`${key} must be between 0 and 1`, null);
|
|
183
|
+
return rate;
|
|
184
|
+
}
|
|
185
|
+
function isoDate(record, key) {
|
|
186
|
+
const value = stringValue(record, key);
|
|
187
|
+
if (parseIsoDate(value) == null) {
|
|
188
|
+
throw serverValidationError(`${key} must be an ISO date`, null);
|
|
189
|
+
}
|
|
190
|
+
return value;
|
|
191
|
+
}
|
|
192
|
+
function isoTimestamp(record, key) {
|
|
193
|
+
const timestamp = stringValue(record, key);
|
|
194
|
+
const parsed = new Date(timestamp);
|
|
195
|
+
if (Number.isNaN(parsed.getTime()) || parsed.toISOString() !== timestamp) {
|
|
196
|
+
throw serverValidationError(`${key} must be an ISO timestamp`, null);
|
|
197
|
+
}
|
|
198
|
+
return timestamp;
|
|
199
|
+
}
|
|
200
|
+
function enumValue(record, key, allowed) {
|
|
201
|
+
const value = record[key];
|
|
202
|
+
if (typeof value === "string") {
|
|
203
|
+
for (const candidate of allowed) {
|
|
204
|
+
if (candidate === value)
|
|
205
|
+
return candidate;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
throw serverValidationError(`${key} has an unsupported value`, null);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=persistence-codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence-codec.js","sourceRoot":"","sources":["../src/persistence-codec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,8BAA8B,EAC9B,gCAAgC,EAChC,yBAAyB,EACzB,YAAY,EACZ,aAAa,EACb,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AAOzC,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAAY;IAEZ,OAAO,YAAY,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;QACnD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE;YACtC,aAAa;YACb,cAAc;YACd,aAAa;YACb,cAAc;SACf,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,EAAE,eAAe,EAAE;YACtD,QAAQ;YACR,UAAU;YACV,QAAQ;SACT,CAAC,CAAC;QACH,MAAM,wBAAwB,GAAG,YAAY,CAC3C,KAAK,EACL,0BAA0B,CAC3B,CAAC;QACF,MAAM,0BAA0B,GAAG,YAAY,CAC7C,KAAK,EACL,4BAA4B,CAC7B,CAAC;QACF,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QACpE,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QACrD,gCAAgC,CAC9B;YACE,KAAK;YACL,wBAAwB;YACxB,0BAA0B;SAC3B,EACD,eAAe,CAChB,CAAC;QACF,8BAA8B,CAC5B,EAAE,aAAa,EAAE,UAAU,EAAE,EAC7B,eAAe,CAChB,CAAC;QACF,OAAO;YACL,EAAE;YACF,IAAI;YACJ,SAAS;YACT,OAAO;YACP,KAAK;YACL,aAAa;YACb,UAAU;YACV,wBAAwB;YACxB,0BAA0B;SAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAyB;IAEzB,MAAM,IAAI,GAAuB;QAC/B,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;QACxD,0BAA0B,EAAE,KAAK,CAAC,0BAA0B;KAC7D,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAoC;IAEpC,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE;QACzD,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,kBAAkB,GAAG,SAAS,CAAC,KAAK,EAAE,oBAAoB,EAAE;YAChE,eAAe;SAChB,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE;YACxC,QAAQ;YACR,MAAM;YACN,UAAU;YACV,SAAS;SACV,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,aAAa,CACjC,KAAK,EACL,eAAe,EACf,kBAAkB,CACnB,CAAC;QACF,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAC7D,OAAO;YACL,EAAE;YACF,cAAc;YACd,IAAI;YACJ,eAAe;YACf,eAAe;YACf,UAAU;YACV,kBAAkB;YAClB,YAAY;YACZ,MAAM;YACN,YAAY;YACZ,aAAa;YACb,aAAa;SACd,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAuB;IAEvB,MAAM,IAAI,GAAqB;QAC7B,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,KAAa,EACb,MAAkD;IAElD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,WAAW,KAAK,oBACd,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,KAAY,EACZ,QAAiC;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAClB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,qBAAqB,CAAC,GAAG,GAAG,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,qBAAqB,CAAC,GAAG,GAAG,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CACpB,MAA+B,EAC/B,GAAW,EACX,IAA6D;IAE7D,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,qBAAqB,CAAC,GAAG,GAAG,cAAc,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CACnB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,qBAAqB,CAAC,GAAG,GAAG,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CACnB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,qBAAqB,CAAC,GAAG,GAAG,0BAA0B,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,qBAAqB,CAAC,GAAG,GAAG,sCAAsC,EAAE,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,qBAAqB,CAAC,GAAG,GAAG,kCAAkC,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAA+B,EAAE,GAAW;IAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,qBAAqB,CAAC,GAAG,GAAG,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAC9F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,MAA+B,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,qBAAqB,CAAC,GAAG,GAAG,sBAAsB,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAA+B,EAAE,GAAW;IAChE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;QACzE,MAAM,qBAAqB,CAAC,GAAG,GAAG,2BAA2B,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAChB,MAA+B,EAC/B,GAAW,EACX,OAAyB;IAEzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,IAAI,SAAS,KAAK,KAAK;gBAAE,OAAO,SAAS,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,MAAM,qBAAqB,CAAC,GAAG,GAAG,2BAA2B,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ClosingMarkerDbImportInput, EntryDbRecord, EntryDbUpsertInput, FiscalPeriodArchiveDbImportInput, FiscalPeriodDbPatchInput, FiscalPeriodOpeningDbRecord, FixedAssetDbRecord } from "@rubydogjp/openkk-server-ports";
|
|
2
|
+
import type { FiscalPeriodDbData } from "./table-types.js";
|
|
3
|
+
export declare function assertDbArchiveImportSizeLimits(input: unknown): asserts input is FiscalPeriodArchiveDbImportInput;
|
|
4
|
+
export declare function assertDbOpeningForPeriod(opening: FiscalPeriodOpeningDbRecord, period: FiscalPeriodDbData): void;
|
|
5
|
+
export declare function assertDbFiscalPeriodPatchAllowed(period: FiscalPeriodDbData, patch: FiscalPeriodDbPatchInput): void;
|
|
6
|
+
export declare function assertDbStoredEntryRecord(record: unknown, period: FiscalPeriodDbData): asserts record is EntryDbRecord;
|
|
7
|
+
export declare function assertDbStoredFixedAssetRecord(asset: unknown, period: FiscalPeriodDbData): asserts asset is FixedAssetDbRecord;
|
|
8
|
+
export declare function assertDbClosingGeneratedSizeLimits(entries: unknown): asserts entries is EntryDbUpsertInput[];
|
|
9
|
+
export declare function assertDbClosingYear(period: FiscalPeriodDbData, year: number): void;
|
|
10
|
+
export declare function assertDbImportedClosingState(period: FiscalPeriodDbData, preClosings: ReadonlyArray<ClosingMarkerDbImportInput>, closings: ReadonlyArray<ClosingMarkerDbImportInput>): void;
|
|
11
|
+
//# sourceMappingURL=record-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-validation.d.ts","sourceRoot":"","sources":["../src/record-validation.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACb,kBAAkB,EAClB,gCAAgC,EAChC,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,gCAAgC,CA0BnD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,2BAA2B,EACpC,MAAM,EAAE,kBAAkB,GACzB,IAAI,CAIN;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,wBAAwB,GAC9B,IAAI,CAQN;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,MAAM,IAAI,aAAa,CAejC;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAarC;AAED,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAMzC;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,MAAM,GACX,IAAI,CASN;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,aAAa,CAAC,0BAA0B,CAAC,EACtD,QAAQ,EAAE,aAAa,CAAC,0BAA0B,CAAC,GAClD,IAAI,CAYN"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { assertEntryCollectionItemLimit, assertEntryCollectionLineLimit, assertEntryMatchesRules, assertFiscalPeriodArchiveSize, assertFiscalPeriodClosingMarkers, assertFiscalPeriodPatchMatchesPhase, assertFixedAssetMatchesRules, assertOpeningMatchesRules, assertPositiveInteger, assertUniqueIds, isNonBlankString, requireObject, serverConflictError, serverValidationError, } from "@rubydogjp/openkk-server-domain";
|
|
2
|
+
export function assertDbArchiveImportSizeLimits(input) {
|
|
3
|
+
const value = requireObject(input, "Archived import");
|
|
4
|
+
if (!Array.isArray(value.entries) ||
|
|
5
|
+
!Array.isArray(value.fixedAssets) ||
|
|
6
|
+
!Array.isArray(value.preClosings) ||
|
|
7
|
+
!Array.isArray(value.closings)) {
|
|
8
|
+
throw serverValidationError("Archived import collections must be arrays", null);
|
|
9
|
+
}
|
|
10
|
+
assertFiscalPeriodArchiveSize([
|
|
11
|
+
value.fiscalPeriod,
|
|
12
|
+
value.entries,
|
|
13
|
+
value.fixedAssets,
|
|
14
|
+
value.preClosings,
|
|
15
|
+
value.closings,
|
|
16
|
+
]);
|
|
17
|
+
if (value.preClosings.length > 1 || value.closings.length > 1) {
|
|
18
|
+
throw serverValidationError("Archived closing collections must contain at most one record each", null);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function assertDbOpeningForPeriod(opening, period) {
|
|
22
|
+
assertOpeningMatchesRules(opening, period, "Opening", {
|
|
23
|
+
completed: period.openingBalancesCompleted,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function assertDbFiscalPeriodPatchAllowed(period, patch) {
|
|
27
|
+
if (period.archiveStatus !== "active") {
|
|
28
|
+
throw serverConflictError(`archived fiscal period cannot be updated: ${period.id}`, "圧縮保存済みの会計期間は変更できません");
|
|
29
|
+
}
|
|
30
|
+
assertFiscalPeriodPatchMatchesPhase(period, patch);
|
|
31
|
+
}
|
|
32
|
+
export function assertDbStoredEntryRecord(record, period) {
|
|
33
|
+
const value = requireObject(record, "Stored entry");
|
|
34
|
+
const id = value.id;
|
|
35
|
+
if (!isNonBlankString(id) ||
|
|
36
|
+
!isNonBlankString(value.userId) ||
|
|
37
|
+
value.fiscalPeriodId !== period.id) {
|
|
38
|
+
throw serverValidationError(`Stored entry identity is invalid: ${String(id)}`, null);
|
|
39
|
+
}
|
|
40
|
+
assertEntryMatchesRules(value, period, "Stored entry");
|
|
41
|
+
assertUniqueIds(value.lines, `Stored entry ${id} line`, null);
|
|
42
|
+
}
|
|
43
|
+
export function assertDbStoredFixedAssetRecord(asset, period) {
|
|
44
|
+
const value = requireObject(asset, "Stored fixed asset");
|
|
45
|
+
if (!isNonBlankString(value.id) ||
|
|
46
|
+
!isNonBlankString(value.userId) ||
|
|
47
|
+
value.fiscalPeriodId !== period.id) {
|
|
48
|
+
throw serverValidationError(`Stored fixed asset identity is invalid: ${String(value.id)}`, null);
|
|
49
|
+
}
|
|
50
|
+
assertFixedAssetMatchesRules(value, period);
|
|
51
|
+
}
|
|
52
|
+
export function assertDbClosingGeneratedSizeLimits(entries) {
|
|
53
|
+
if (!Array.isArray(entries)) {
|
|
54
|
+
throw serverValidationError("Closing entries must be an array", null);
|
|
55
|
+
}
|
|
56
|
+
assertEntryCollectionItemLimit(entries, "Closing entries", null);
|
|
57
|
+
assertEntryCollectionLineLimit(entries, "Closing entries", null);
|
|
58
|
+
}
|
|
59
|
+
export function assertDbClosingYear(period, year) {
|
|
60
|
+
assertPositiveInteger(year, "Closing year");
|
|
61
|
+
const expectedYear = Number(period.endDate.slice(0, 4));
|
|
62
|
+
if (year !== expectedYear) {
|
|
63
|
+
throw serverValidationError(`Closing year ${year} must match fiscal period end year ${expectedYear}`, "締め年度が会計期間の終了年と一致しません");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function assertDbImportedClosingState(period, preClosings, closings) {
|
|
67
|
+
for (const row of [...preClosings, ...closings]) {
|
|
68
|
+
assertDbClosingYear(period, row.year);
|
|
69
|
+
}
|
|
70
|
+
assertFiscalPeriodClosingMarkers(period.phase, {
|
|
71
|
+
hasPreClosing: preClosings.length > 0,
|
|
72
|
+
hasClosing: closings.length > 0,
|
|
73
|
+
}, "Imported");
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=record-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-validation.js","sourceRoot":"","sources":["../src/record-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,KAAK,IAAI,MAAM,CAE9B"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC"}
|