File size: 2,538 Bytes
2dddd1f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDb = getDb;
const sqlite3_1 = __importDefault(require("sqlite3"));
const sqlite_1 = require("sqlite");
const path_1 = __importDefault(require("path"));
const dbPath = path_1.default.resolve(__dirname, '../database.sqlite');
let dbInstance = null;
async function getDb() {
    if (dbInstance)
        return dbInstance;
    dbInstance = await (0, sqlite_1.open)({
        filename: dbPath,
        driver: sqlite3_1.default.Database
    });
    // Enforce foreign key constraints
    await dbInstance.exec('PRAGMA foreign_keys = ON');
    await dbInstance.exec(`
    CREATE TABLE IF NOT EXISTS wallets (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL,
      type TEXT NOT NULL,
      currency TEXT NOT NULL
    );

    CREATE TABLE IF NOT EXISTS transactions (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      type TEXT NOT NULL, -- 'income' | 'expense' | 'transfer'
      amount REAL NOT NULL,
      currency TEXT NOT NULL,
      wallet_id INTEGER,
      to_wallet_id INTEGER, -- For transfers
      category TEXT,
      note TEXT,
      date TEXT NOT NULL,
      country_id TEXT, -- For travel mode
      FOREIGN KEY(wallet_id) REFERENCES wallets(id),
      FOREIGN KEY(to_wallet_id) REFERENCES wallets(id)
    );

    CREATE TABLE IF NOT EXISTS exchanges (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      from_amount REAL NOT NULL,
      from_currency TEXT NOT NULL,
      to_amount REAL NOT NULL,
      to_currency TEXT NOT NULL,
      rate REAL NOT NULL,
      date TEXT NOT NULL,
      note TEXT
    );

    CREATE TABLE IF NOT EXISTS loans (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      person TEXT NOT NULL,
      type TEXT NOT NULL, -- 'borrowed_from_me' | 'owed_by_me'
      amount REAL NOT NULL,
      currency TEXT NOT NULL,
      paid REAL DEFAULT 0,
      date TEXT NOT NULL,
      note TEXT
    );
  `);
    // Insert default wallets if empty
    const walletCount = await dbInstance.get('SELECT COUNT(*) as count FROM wallets');
    if (walletCount.count === 0) {
        await dbInstance.exec(`
      INSERT INTO wallets (name, type, currency) VALUES 
      ('Cash', 'cash', 'USD'),
      ('FIB', 'bank', 'IQD'),
      ('SuperQi', 'ewallet', 'IQD'),
      ('Alipay', 'ewallet', 'RMB'),
      ('WeChat Pay', 'ewallet', 'RMB');
    `);
    }
    return dbInstance;
}