@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.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapter.d.ts +4 -0
  3. package/dist/adapter.d.ts.map +1 -0
  4. package/dist/adapter.js +21 -0
  5. package/dist/adapter.js.map +1 -0
  6. package/dist/closing-store.d.ts +5 -0
  7. package/dist/closing-store.d.ts.map +1 -0
  8. package/dist/closing-store.js +113 -0
  9. package/dist/closing-store.js.map +1 -0
  10. package/dist/entry-store.d.ts +6 -0
  11. package/dist/entry-store.d.ts.map +1 -0
  12. package/dist/entry-store.js +266 -0
  13. package/dist/entry-store.js.map +1 -0
  14. package/dist/fiscal-period-guard.d.ts +6 -0
  15. package/dist/fiscal-period-guard.d.ts.map +1 -0
  16. package/dist/fiscal-period-guard.js +34 -0
  17. package/dist/fiscal-period-guard.js.map +1 -0
  18. package/dist/fiscal-period-record.d.ts +5 -0
  19. package/dist/fiscal-period-record.d.ts.map +1 -0
  20. package/dist/fiscal-period-record.js +32 -0
  21. package/dist/fiscal-period-record.js.map +1 -0
  22. package/dist/fiscal-period-store.d.ts +4 -0
  23. package/dist/fiscal-period-store.d.ts.map +1 -0
  24. package/dist/fiscal-period-store.js +364 -0
  25. package/dist/fiscal-period-store.js.map +1 -0
  26. package/dist/fiscal-period-transition.d.ts +4 -0
  27. package/dist/fiscal-period-transition.d.ts.map +1 -0
  28. package/dist/fiscal-period-transition.js +30 -0
  29. package/dist/fiscal-period-transition.js.map +1 -0
  30. package/dist/fixed-asset-store.d.ts +4 -0
  31. package/dist/fixed-asset-store.d.ts.map +1 -0
  32. package/dist/fixed-asset-store.js +142 -0
  33. package/dist/fixed-asset-store.js.map +1 -0
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +4 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/master-data-store.d.ts +3 -0
  39. package/dist/master-data-store.d.ts.map +1 -0
  40. package/dist/master-data-store.js +39 -0
  41. package/dist/master-data-store.js.map +1 -0
  42. package/dist/migrate.d.ts +6 -0
  43. package/dist/migrate.d.ts.map +1 -0
  44. package/dist/migrate.js +53 -0
  45. package/dist/migrate.js.map +1 -0
  46. package/dist/opening-store.d.ts +7 -0
  47. package/dist/opening-store.d.ts.map +1 -0
  48. package/dist/opening-store.js +150 -0
  49. package/dist/opening-store.js.map +1 -0
  50. package/dist/persistence-codec.d.ts +9 -0
  51. package/dist/persistence-codec.d.ts.map +1 -0
  52. package/dist/persistence-codec.js +210 -0
  53. package/dist/persistence-codec.js.map +1 -0
  54. package/dist/record-validation.d.ts +11 -0
  55. package/dist/record-validation.d.ts.map +1 -0
  56. package/dist/record-validation.js +75 -0
  57. package/dist/record-validation.js.map +1 -0
  58. package/dist/runtime.d.ts +3 -0
  59. package/dist/runtime.d.ts.map +1 -0
  60. package/dist/runtime.js +7 -0
  61. package/dist/runtime.js.map +1 -0
  62. package/dist/schema.d.ts +7 -0
  63. package/dist/schema.d.ts.map +1 -0
  64. package/dist/schema.js +688 -0
  65. package/dist/schema.js.map +1 -0
  66. package/dist/seed-store.d.ts +4 -0
  67. package/dist/seed-store.d.ts.map +1 -0
  68. package/dist/seed-store.js +174 -0
  69. package/dist/seed-store.js.map +1 -0
  70. package/dist/sql-db.d.ts +9 -0
  71. package/dist/sql-db.d.ts.map +1 -0
  72. package/dist/sql-db.js +2 -0
  73. package/dist/sql-db.js.map +1 -0
  74. package/dist/table-types.d.ts +27 -0
  75. package/dist/table-types.d.ts.map +1 -0
  76. package/dist/table-types.js +2 -0
  77. package/dist/table-types.js.map +1 -0
  78. package/dist/transaction.d.ts +4 -0
  79. package/dist/transaction.d.ts.map +1 -0
  80. package/dist/transaction.js +21 -0
  81. package/dist/transaction.js.map +1 -0
  82. package/package.json +42 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rubydog
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,4 @@
1
+ import { type DbSnapshot, type OpenkkDbPort } from "@rubydogjp/openkk-server-ports";
2
+ import type { SqlDb } from "./sql-db.js";
3
+ export declare function createSqliteDbAdapter(db: SqlDb, seed: DbSnapshot | null): Promise<OpenkkDbPort>;
4
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AAOxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,KAAK,EACT,IAAI,EAAE,UAAU,GAAG,IAAI,GACtB,OAAO,CAAC,YAAY,CAAC,CAWvB"}
@@ -0,0 +1,21 @@
1
+ import { serializePortOperations, } from "@rubydogjp/openkk-server-ports";
2
+ import { createClosingsDb, createPreClosingsDb } from "./closing-store.js";
3
+ import { createEntriesDb } from "./entry-store.js";
4
+ import { createFiscalPeriodsDb } from "./fiscal-period-store.js";
5
+ import { createFixedAssetsDb } from "./fixed-asset-store.js";
6
+ import { createMasterDataDb } from "./master-data-store.js";
7
+ import { seedStores } from "./seed-store.js";
8
+ export async function createSqliteDbAdapter(db, seed) {
9
+ await db.exec("PRAGMA foreign_keys = ON");
10
+ if (seed != null)
11
+ await seedStores(db, seed);
12
+ return serializePortOperations({
13
+ fiscalPeriods: createFiscalPeriodsDb(db),
14
+ entries: createEntriesDb(db),
15
+ fixedAssets: createFixedAssetsDb(db),
16
+ preClosings: createPreClosingsDb(db),
17
+ closings: createClosingsDb(db),
18
+ masterData: createMasterDataDb(),
19
+ });
20
+ }
21
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAGxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,EAAS,EACT,IAAuB;IAEvB,MAAM,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,IAAI,IAAI,IAAI,IAAI;QAAE,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7C,OAAO,uBAAuB,CAAe;QAC3C,aAAa,EAAE,qBAAqB,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,eAAe,CAAC,EAAE,CAAC;QAC5B,WAAW,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACpC,WAAW,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACpC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC9B,UAAU,EAAE,kBAAkB,EAAE;KACjC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ClosingsDb, PreClosingsDb } from "@rubydogjp/openkk-server-ports";
2
+ import type { SqlDb } from "./sql-db.js";
3
+ export declare function createPreClosingsDb(db: SqlDb): PreClosingsDb;
4
+ export declare function createClosingsDb(db: SqlDb): ClosingsDb;
5
+ //# sourceMappingURL=closing-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing-store.d.ts","sourceRoot":"","sources":["../src/closing-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,UAAU,EAIV,aAAa,EACd,MAAM,gCAAgC,CAAC;AASxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,KAAK,GAAG,aAAa,CAiD5D;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,KAAK,GAAG,UAAU,CAmCtD"}
@@ -0,0 +1,113 @@
1
+ import { assertEntryMatchesRules, serverConflictError, serverValidationError, VIRTUAL_ENTRY_LOCAL_ID_PREFIX, } from "@rubydogjp/openkk-server-domain";
2
+ import { insertEntryLines, insertImportedEntries } from "./entry-store.js";
3
+ import { transitionFiscalPeriod } from "./fiscal-period-transition.js";
4
+ import { msToIso } from "./persistence-codec.js";
5
+ import { assertDbClosingGeneratedSizeLimits, assertDbClosingYear, } from "./record-validation.js";
6
+ import { newId, nowMs } from "./runtime.js";
7
+ export function createPreClosingsDb(db) {
8
+ return {
9
+ async get(fiscalPeriodId, year) {
10
+ const rows = (await db.exec({
11
+ sql: `SELECT 1 FROM pre_closings WHERE fiscal_period_id = ? AND year = ?`,
12
+ bind: [fiscalPeriodId, year],
13
+ returnValue: "resultRows",
14
+ rowMode: "array",
15
+ }));
16
+ return rows[0] != null;
17
+ },
18
+ async run(fiscalPeriodId, year) {
19
+ return transitionFiscalPeriod(db, fiscalPeriodId, "journalizing", "pre_closing", async (period) => {
20
+ assertDbClosingYear(period, year);
21
+ await db.exec({
22
+ sql: `INSERT OR REPLACE INTO pre_closings(fiscal_period_id, year) VALUES(?, ?)`,
23
+ bind: [fiscalPeriodId, year],
24
+ });
25
+ });
26
+ },
27
+ async cancel(fiscalPeriodId, year) {
28
+ return transitionFiscalPeriod(db, fiscalPeriodId, "pre_closing", "journalizing", async (period) => {
29
+ assertDbClosingYear(period, year);
30
+ await assertDbClosingMarkerExists(db, "pre_closings", fiscalPeriodId, year);
31
+ await db.exec({
32
+ sql: `DELETE FROM pre_closings WHERE fiscal_period_id = ? AND year = ?`,
33
+ bind: [fiscalPeriodId, year],
34
+ });
35
+ await deleteClosingGeneratedEntries(db, fiscalPeriodId);
36
+ });
37
+ },
38
+ };
39
+ }
40
+ export function createClosingsDb(db) {
41
+ return {
42
+ async get(fiscalPeriodId, year) {
43
+ const rows = (await db.exec({
44
+ sql: `SELECT 1 FROM closings WHERE fiscal_period_id = ? AND year = ?`,
45
+ bind: [fiscalPeriodId, year],
46
+ returnValue: "resultRows",
47
+ rowMode: "array",
48
+ }));
49
+ return rows[0] != null;
50
+ },
51
+ async run(fiscalPeriodId, year, entries) {
52
+ assertDbClosingGeneratedSizeLimits(entries);
53
+ return transitionFiscalPeriod(db, fiscalPeriodId, "pre_closing", "post_closing", async (period) => {
54
+ assertDbClosingYear(period, year);
55
+ await assertDbClosingMarkerExists(db, "pre_closings", fiscalPeriodId, year);
56
+ await replaceClosingGeneratedEntries(db, period, entries);
57
+ await db.exec({
58
+ sql: `INSERT OR REPLACE INTO closings(fiscal_period_id, year) VALUES(?, ?)`,
59
+ bind: [fiscalPeriodId, year],
60
+ });
61
+ });
62
+ },
63
+ };
64
+ }
65
+ async function deleteClosingGeneratedEntries(db, fiscalPeriodId) {
66
+ await db.exec({
67
+ sql: `DELETE FROM entries WHERE fiscal_period_id = ? AND local_id GLOB ?`,
68
+ bind: [fiscalPeriodId, `${VIRTUAL_ENTRY_LOCAL_ID_PREFIX}*`],
69
+ });
70
+ }
71
+ async function replaceClosingGeneratedEntries(db, period, inputs) {
72
+ for (const input of inputs) {
73
+ assertEntryMatchesRules(input, period, "Closing entry");
74
+ if (typeof input.localId !== "string" ||
75
+ !input.localId.startsWith(VIRTUAL_ENTRY_LOCAL_ID_PREFIX)) {
76
+ throw serverValidationError("Closing entry localId must use the reserved generated prefix", null);
77
+ }
78
+ }
79
+ await deleteClosingGeneratedEntries(db, period.id);
80
+ const now = nowMs();
81
+ const timestamp = msToIso(now);
82
+ const candidates = inputs.map((input) => ({
83
+ id: newId("entry"),
84
+ userId: period.userId,
85
+ fiscalPeriodId: period.id,
86
+ date: input.date,
87
+ description: input.description,
88
+ localId: input.localId,
89
+ businessRate: input.businessRate,
90
+ lines: input.lines.map((line) => ({ ...line, id: newId("eline") })),
91
+ createdAt: timestamp,
92
+ updatedAt: timestamp,
93
+ }));
94
+ const insertedIds = await insertImportedEntries(db, candidates, now);
95
+ if (insertedIds.size !== candidates.length) {
96
+ throw serverConflictError("closing generated entries contain duplicate localIds", "本締め用の自動仕訳が重複したため、本締めを中止しました");
97
+ }
98
+ for (const entry of candidates) {
99
+ await insertEntryLines(db, entry);
100
+ }
101
+ }
102
+ async function assertDbClosingMarkerExists(db, table, fiscalPeriodId, year) {
103
+ const rows = (await db.exec({
104
+ sql: `SELECT 1 FROM ${table} WHERE fiscal_period_id = ? AND year = ?`,
105
+ bind: [fiscalPeriodId, year],
106
+ returnValue: "resultRows",
107
+ rowMode: "array",
108
+ }));
109
+ if (rows[0] == null) {
110
+ throw serverConflictError(`${table} marker is missing for fiscal period ${fiscalPeriodId} and year ${year}`, "締め状態の保存データが一致しないため、処理を実行できません");
111
+ }
112
+ }
113
+ //# sourceMappingURL=closing-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing-store.js","sourceRoot":"","sources":["../src/closing-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { EntriesDb, EntryDbRecord } from "@rubydogjp/openkk-server-ports";
2
+ import type { SqlDb } from "./sql-db.js";
3
+ export declare function createEntriesDb(db: SqlDb): EntriesDb;
4
+ export declare function insertEntryLines(db: SqlDb, entry: EntryDbRecord): Promise<void>;
5
+ export declare function insertImportedEntries(db: SqlDb, entries: EntryDbRecord[], now: number): Promise<Set<string>>;
6
+ //# sourceMappingURL=entry-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-store.d.ts","sourceRoot":"","sources":["../src/entry-store.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACd,MAAM,gCAAgC,CAAC;AASxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,wBAAgB,eAAe,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,CAyKpD;AAmGD,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,KAAK,EACT,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAID,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,KAAK,EACT,OAAO,EAAE,aAAa,EAAE,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CA+BtB"}
@@ -0,0 +1,266 @@
1
+ import { assertEntryCollectionItemLimit, assertEntryCollectionLineLimit, assertEntryMatchesRules, serverNotFoundError, serverValidationError, } from "@rubydogjp/openkk-server-domain";
2
+ import { assertDbFiscalPeriodAllows, assertDbOwnedFiscalPeriodAllows, } from "./fiscal-period-guard.js";
3
+ import { msToIso, parseFiscalPeriodDbData } from "./persistence-codec.js";
4
+ import { assertDbStoredEntryRecord } from "./record-validation.js";
5
+ import { newId, nowMs } from "./runtime.js";
6
+ import { runInTransaction } from "./transaction.js";
7
+ export function createEntriesDb(db) {
8
+ return {
9
+ async getAll(fiscalPeriodId) {
10
+ return loadEntries(db, `WHERE e.fiscal_period_id = ? ORDER BY e.date ASC, e.created_at ASC, e.id ASC, l.position ASC`, [fiscalPeriodId]);
11
+ },
12
+ async getById(id) {
13
+ return ((await loadEntries(db, `WHERE e.id = ? ORDER BY l.position ASC`, [id]))[0] ?? null);
14
+ },
15
+ async create(userId, fiscalPeriodId, input) {
16
+ const id = newId("entry");
17
+ const now = nowMs();
18
+ const timestamp = msToIso(now);
19
+ const record = {
20
+ id,
21
+ userId,
22
+ fiscalPeriodId,
23
+ date: input.date,
24
+ description: input.description,
25
+ localId: input.localId,
26
+ businessRate: input.businessRate,
27
+ lines: input.lines.map((line) => ({ ...line, id: newId("eline") })),
28
+ createdAt: timestamp,
29
+ updatedAt: timestamp,
30
+ };
31
+ await runInTransaction(db, async () => {
32
+ const period = await assertDbOwnedFiscalPeriodAllows(db, userId, fiscalPeriodId, ["journalizing"], "create entry");
33
+ assertEntryMatchesRules(input, period, "Entry");
34
+ await db.exec({
35
+ sql: `INSERT INTO entries(id, fiscal_period_id, date, local_id, description, business_rate, created_at, updated_at) VALUES(?, ?, ?, ?, ?, ?, ?, ?)`,
36
+ bind: [
37
+ id,
38
+ fiscalPeriodId,
39
+ record.date,
40
+ record.localId,
41
+ record.description,
42
+ record.businessRate,
43
+ now,
44
+ now,
45
+ ],
46
+ });
47
+ await insertEntryLines(db, record);
48
+ });
49
+ return record;
50
+ },
51
+ async update(id, input) {
52
+ return runInTransaction(db, async () => {
53
+ const existing = (await loadEntries(db, `WHERE e.id = ? ORDER BY l.position ASC`, [
54
+ id,
55
+ ]))[0] ?? null;
56
+ if (existing == null)
57
+ throw serverNotFoundError(`entry not found: ${id}`);
58
+ const period = await assertDbFiscalPeriodAllows(db, existing.fiscalPeriodId, ["journalizing"], "update entry");
59
+ assertEntryMatchesRules(input, period, "Entry");
60
+ const now = nowMs();
61
+ const updated = {
62
+ ...existing,
63
+ date: input.date,
64
+ description: input.description,
65
+ localId: input.localId,
66
+ businessRate: input.businessRate,
67
+ lines: input.lines.map((line) => ({ ...line, id: newId("eline") })),
68
+ updatedAt: msToIso(now),
69
+ };
70
+ await db.exec({
71
+ sql: `UPDATE entries SET date = ?, local_id = ?, description = ?, business_rate = ?, updated_at = ? WHERE id = ?`,
72
+ bind: [
73
+ updated.date,
74
+ updated.localId,
75
+ updated.description,
76
+ updated.businessRate,
77
+ now,
78
+ id,
79
+ ],
80
+ });
81
+ await db.exec({
82
+ sql: `DELETE FROM entry_lines WHERE entry_id = ?`,
83
+ bind: [id],
84
+ });
85
+ await insertEntryLines(db, updated);
86
+ return updated;
87
+ });
88
+ },
89
+ async remove(id) {
90
+ await runInTransaction(db, async () => {
91
+ const rows = (await db.exec({
92
+ sql: `SELECT fiscal_period_id FROM entries WHERE id = ?`,
93
+ bind: [id],
94
+ returnValue: "resultRows",
95
+ rowMode: "array",
96
+ }));
97
+ if (rows[0] == null)
98
+ return;
99
+ await assertDbFiscalPeriodAllows(db, rows[0][0], ["journalizing"], "delete entry");
100
+ await db.exec({ sql: `DELETE FROM entries WHERE id = ?`, bind: [id] });
101
+ });
102
+ },
103
+ async importMany(userId, fiscalPeriodId, inputs) {
104
+ if (!Array.isArray(inputs)) {
105
+ throw serverValidationError("Entry import input must be an array", null);
106
+ }
107
+ assertEntryCollectionItemLimit(inputs, "Imported entries", null);
108
+ assertEntryCollectionLineLimit(inputs, "Imported entries", null);
109
+ const now = nowMs();
110
+ const timestamp = msToIso(now);
111
+ return runInTransaction(db, async () => {
112
+ const period = await assertDbOwnedFiscalPeriodAllows(db, userId, fiscalPeriodId, ["pre_opening", "journalizing"], "import entries");
113
+ for (const input of inputs) {
114
+ assertEntryMatchesRules(input, period, "Entry");
115
+ }
116
+ const seenLocalIds = new Set();
117
+ const candidates = inputs
118
+ .filter((input) => {
119
+ if (input.localId == null)
120
+ return true;
121
+ if (seenLocalIds.has(input.localId))
122
+ return false;
123
+ seenLocalIds.add(input.localId);
124
+ return true;
125
+ })
126
+ .map((input) => ({
127
+ id: newId("entry"),
128
+ userId,
129
+ fiscalPeriodId,
130
+ date: input.date,
131
+ description: input.description,
132
+ localId: input.localId,
133
+ businessRate: input.businessRate,
134
+ lines: input.lines.map((line) => ({ ...line, id: newId("eline") })),
135
+ createdAt: timestamp,
136
+ updatedAt: timestamp,
137
+ }));
138
+ const insertedIds = await insertImportedEntries(db, candidates, now);
139
+ for (const entry of candidates) {
140
+ if (insertedIds.has(entry.id))
141
+ await insertEntryLines(db, entry);
142
+ }
143
+ return candidates.filter((record) => insertedIds.has(record.id));
144
+ });
145
+ },
146
+ };
147
+ }
148
+ async function loadEntries(db, whereAndOrder, bind) {
149
+ const rows = (await db.exec({
150
+ sql: `SELECT
151
+ e.id, fp.user_id, e.fiscal_period_id, e.date, e.description, e.local_id,
152
+ e.business_rate, e.created_at, e.updated_at,
153
+ l.id AS line_id, l.side, l.book_account_id, l.amount, l.partner_name,
154
+ l.tax_category_id, l.business_category_id,
155
+ fp.data AS fiscal_period_data
156
+ FROM entries e
157
+ JOIN fiscal_periods fp ON fp.id = e.fiscal_period_id
158
+ LEFT JOIN entry_lines l ON l.entry_id = e.id
159
+ ${whereAndOrder}`,
160
+ bind,
161
+ returnValue: "resultRows",
162
+ rowMode: "object",
163
+ }));
164
+ const records = new Map();
165
+ const periods = new Map();
166
+ for (const row of rows) {
167
+ let record = records.get(row.id);
168
+ if (record == null) {
169
+ record = {
170
+ id: row.id,
171
+ userId: row.user_id,
172
+ fiscalPeriodId: row.fiscal_period_id,
173
+ date: row.date,
174
+ description: row.description,
175
+ localId: row.local_id,
176
+ businessRate: row.business_rate,
177
+ createdAt: msToIso(row.created_at),
178
+ updatedAt: msToIso(row.updated_at),
179
+ lines: [],
180
+ };
181
+ records.set(record.id, record);
182
+ }
183
+ if (!periods.has(row.fiscal_period_id)) {
184
+ periods.set(row.fiscal_period_id, parseFiscalPeriodDbData(row.fiscal_period_data));
185
+ }
186
+ if (row.side == null)
187
+ continue;
188
+ if (row.line_id == null ||
189
+ (row.side !== "debit" && row.side !== "credit") ||
190
+ row.book_account_id == null ||
191
+ row.amount == null ||
192
+ row.partner_name == null ||
193
+ row.tax_category_id == null ||
194
+ row.business_category_id == null) {
195
+ throw new Error(`invalid stored entry line: ${record.id}`);
196
+ }
197
+ record.lines.push({
198
+ id: row.line_id,
199
+ side: row.side,
200
+ bookAccountId: row.book_account_id,
201
+ amount: row.amount,
202
+ partnerName: row.partner_name,
203
+ taxCategoryId: row.tax_category_id,
204
+ businessCategoryId: row.business_category_id,
205
+ });
206
+ }
207
+ for (const record of records.values()) {
208
+ const period = periods.get(record.fiscalPeriodId);
209
+ if (period == null) {
210
+ throw new Error(`fiscal period not found for stored entry: ${record.id}`);
211
+ }
212
+ assertDbStoredEntryRecord(record, period);
213
+ }
214
+ return [...records.values()];
215
+ }
216
+ export async function insertEntryLines(db, entry) {
217
+ for (const [position, line] of entry.lines.entries()) {
218
+ await db.exec({
219
+ sql: `INSERT INTO entry_lines(
220
+ entry_id, id, side, book_account_id, amount, partner_name,
221
+ tax_category_id, business_category_id, position
222
+ ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)`,
223
+ bind: [
224
+ entry.id,
225
+ line.id,
226
+ line.side,
227
+ line.bookAccountId,
228
+ line.amount,
229
+ line.partnerName,
230
+ line.taxCategoryId,
231
+ line.businessCategoryId,
232
+ position,
233
+ ],
234
+ });
235
+ }
236
+ }
237
+ const ENTRY_IMPORT_CHUNK_SIZE = 250;
238
+ export async function insertImportedEntries(db, entries, now) {
239
+ const insertedIds = new Set();
240
+ for (let offset = 0; offset < entries.length; offset += ENTRY_IMPORT_CHUNK_SIZE) {
241
+ const chunk = entries.slice(offset, offset + ENTRY_IMPORT_CHUNK_SIZE);
242
+ const placeholders = chunk.map(() => "(?, ?, ?, ?, ?, ?, ?, ?)").join(", ");
243
+ const bind = chunk.flatMap((entry) => [
244
+ entry.id,
245
+ entry.fiscalPeriodId,
246
+ entry.date,
247
+ entry.localId,
248
+ entry.description,
249
+ entry.businessRate,
250
+ now,
251
+ now,
252
+ ]);
253
+ const rows = (await db.exec({
254
+ sql: `INSERT INTO entries(id, fiscal_period_id, date, local_id, description, business_rate, created_at, updated_at)
255
+ VALUES ${placeholders}
256
+ ON CONFLICT(fiscal_period_id, local_id) WHERE local_id IS NOT NULL DO NOTHING
257
+ RETURNING id`,
258
+ bind,
259
+ returnValue: "resultRows",
260
+ rowMode: "array",
261
+ }));
262
+ rows.forEach(([id]) => insertedIds.add(id));
263
+ }
264
+ return insertedIds;
265
+ }
266
+ //# sourceMappingURL=entry-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-store.js","sourceRoot":"","sources":["../src/entry-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { FiscalPeriodDbPhase } from "@rubydogjp/openkk-server-ports";
2
+ import type { FiscalPeriodDbData } from "./table-types.js";
3
+ import type { SqlDb } from "./sql-db.js";
4
+ export declare function assertDbFiscalPeriodAllows(db: SqlDb, fiscalPeriodId: string, allowedPhases: FiscalPeriodDbPhase[], operation: string): Promise<FiscalPeriodDbData>;
5
+ export declare function assertDbOwnedFiscalPeriodAllows(db: SqlDb, userId: string, fiscalPeriodId: string, allowedPhases: FiscalPeriodDbPhase[], operation: string): Promise<FiscalPeriodDbData>;
6
+ //# sourceMappingURL=fiscal-period-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiscal-period-guard.d.ts","sourceRoot":"","sources":["../src/fiscal-period-guard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,KAAK,EACT,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,mBAAmB,EAAE,EACpC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAO7B;AAED,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,KAAK,EACT,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,mBAAmB,EAAE,EACpC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAU7B"}
@@ -0,0 +1,34 @@
1
+ import { serverConflictError, serverNotFoundError, } from "@rubydogjp/openkk-server-domain";
2
+ import { parseFiscalPeriodDbData } from "./persistence-codec.js";
3
+ export async function assertDbFiscalPeriodAllows(db, fiscalPeriodId, allowedPhases, operation) {
4
+ const [, data] = await requireFiscalPeriodRow(db, fiscalPeriodId);
5
+ return assertPhaseAllows(parseFiscalPeriodDbData(data), allowedPhases, operation);
6
+ }
7
+ export async function assertDbOwnedFiscalPeriodAllows(db, userId, fiscalPeriodId, allowedPhases, operation) {
8
+ const [ownerId, data] = await requireFiscalPeriodRow(db, fiscalPeriodId);
9
+ if (ownerId !== userId) {
10
+ throw serverNotFoundError(`fiscal period not found: ${fiscalPeriodId}`);
11
+ }
12
+ return assertPhaseAllows(parseFiscalPeriodDbData(data), allowedPhases, operation);
13
+ }
14
+ async function requireFiscalPeriodRow(db, fiscalPeriodId) {
15
+ const rows = (await db.exec({
16
+ sql: `SELECT user_id, data FROM fiscal_periods WHERE id = ?`,
17
+ bind: [fiscalPeriodId],
18
+ returnValue: "resultRows",
19
+ rowMode: "array",
20
+ }));
21
+ const row = rows[0];
22
+ if (row == null) {
23
+ throw serverNotFoundError(`fiscal period not found: ${fiscalPeriodId}`);
24
+ }
25
+ return row;
26
+ }
27
+ function assertPhaseAllows(period, allowedPhases, operation) {
28
+ if (period.archiveStatus !== "active" ||
29
+ !allowedPhases.includes(period.phase)) {
30
+ throw serverConflictError(`fiscal period cannot ${operation} from phase ${period.phase} (${period.archiveStatus})`, "会計期間の状態が変わったため、この操作を実行できません");
31
+ }
32
+ return period;
33
+ }
34
+ //# sourceMappingURL=fiscal-period-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiscal-period-guard.js","sourceRoot":"","sources":["../src/fiscal-period-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,EAAS,EACT,cAAsB,EACtB,aAAoC,EACpC,SAAiB;IAEjB,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,sBAAsB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAClE,OAAO,iBAAiB,CACtB,uBAAuB,CAAC,IAAI,CAAC,EAC7B,aAAa,EACb,SAAS,CACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,EAAS,EACT,MAAc,EACd,cAAsB,EACtB,aAAoC,EACpC,SAAiB;IAEjB,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,MAAM,sBAAsB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACzE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,mBAAmB,CAAC,4BAA4B,cAAc,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,iBAAiB,CACtB,uBAAuB,CAAC,IAAI,CAAC,EAC7B,aAAa,EACb,SAAS,CACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,EAAS,EACT,cAAsB;IAEtB,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAC1B,GAAG,EAAE,uDAAuD;QAC5D,IAAI,EAAE,CAAC,cAAc,CAAC;QACtB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,OAAO;KACjB,CAAC,CAA4B,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,MAAM,mBAAmB,CAAC,4BAA4B,cAAc,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA0B,EAC1B,aAAoC,EACpC,SAAiB;IAEjB,IACE,MAAM,CAAC,aAAa,KAAK,QAAQ;QACjC,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EACrC,CAAC;QACD,MAAM,mBAAmB,CACvB,wBAAwB,SAAS,eAAe,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,aAAa,GAAG,EACxF,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FiscalPeriodDbRecord } from "@rubydogjp/openkk-server-ports";
2
+ import type { SqlDb } from "./sql-db.js";
3
+ export declare function findFiscalPeriodRecord(db: SqlDb, id: string): Promise<FiscalPeriodDbRecord | null>;
4
+ export declare function requireFiscalPeriodRecord(db: SqlDb, id: string): Promise<FiscalPeriodDbRecord>;
5
+ //# sourceMappingURL=fiscal-period-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiscal-period-record.d.ts","sourceRoot":"","sources":["../src/fiscal-period-record.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAI3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,KAAK,EACT,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAmBtC;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,KAAK,EACT,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,oBAAoB,CAAC,CAI/B"}
@@ -0,0 +1,32 @@
1
+ import { serverNotFoundError } from "@rubydogjp/openkk-server-domain";
2
+ import { loadOpeningByFiscalPeriod } from "./opening-store.js";
3
+ import { msToIso, parseFiscalPeriodDbData } from "./persistence-codec.js";
4
+ import { assertDbOpeningForPeriod } from "./record-validation.js";
5
+ export async function findFiscalPeriodRecord(db, id) {
6
+ const rows = (await db.exec({
7
+ sql: `SELECT user_id, data, created_at, updated_at FROM fiscal_periods WHERE id = ?`,
8
+ bind: [id],
9
+ returnValue: "resultRows",
10
+ rowMode: "array",
11
+ }));
12
+ const row = rows[0];
13
+ if (row == null)
14
+ return null;
15
+ const opening = await loadOpeningByFiscalPeriod(db, id);
16
+ const record = {
17
+ ...parseFiscalPeriodDbData(row[1]),
18
+ userId: row[0],
19
+ createdAt: msToIso(row[2]),
20
+ updatedAt: msToIso(row[3]),
21
+ opening,
22
+ };
23
+ assertDbOpeningForPeriod(opening, record);
24
+ return record;
25
+ }
26
+ export async function requireFiscalPeriodRecord(db, id) {
27
+ const record = await findFiscalPeriodRecord(db, id);
28
+ if (record == null)
29
+ throw serverNotFoundError(`fiscal period not found: ${id}`);
30
+ return record;
31
+ }
32
+ //# sourceMappingURL=fiscal-period-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiscal-period-record.js","sourceRoot":"","sources":["../src/fiscal-period-record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAS,EACT,EAAU;IAEV,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAC1B,GAAG,EAAE,+EAA+E;QACpF,IAAI,EAAE,CAAC,EAAE,CAAC;QACV,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,OAAO;KACjB,CAAC,CAA4C,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,MAAM,GAAyB;QACnC,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACd,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1B,OAAO;KACR,CAAC;IACF,wBAAwB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAAS,EACT,EAAU;IAEV,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,IAAI,IAAI;QAAE,MAAM,mBAAmB,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FiscalPeriodsDb } from "@rubydogjp/openkk-server-ports";
2
+ import type { SqlDb } from "./sql-db.js";
3
+ export declare function createFiscalPeriodsDb(db: SqlDb): FiscalPeriodsDb;
4
+ //# sourceMappingURL=fiscal-period-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiscal-period-store.d.ts","sourceRoot":"","sources":["../src/fiscal-period-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAIV,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AA0BxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,KAAK,GAAG,eAAe,CAuThE"}