Add budget loan tracking

This commit is contained in:
Rafael Foster
2026-04-30 23:12:38 -03:00
parent ef1f9e9383
commit ce107c80a4
21 changed files with 1338 additions and 34 deletions
+69
View File
@@ -159,6 +159,31 @@ const MIGRATIONS_SQL = {
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
UNIQUE(category_key, name)
);
CREATE TABLE IF NOT EXISTS budget_loans (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
borrower TEXT NOT NULL,
total_amount REAL NOT NULL CHECK(total_amount > 0),
installment_count INTEGER NOT NULL CHECK(installment_count > 0),
start_month TEXT NOT NULL,
notes TEXT,
status TEXT NOT NULL DEFAULT 'active'
CHECK(status IN ('active', 'paid')),
created_by INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
);
CREATE TABLE IF NOT EXISTS budget_loan_payments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
loan_id INTEGER NOT NULL REFERENCES budget_loans(id) ON DELETE CASCADE,
installment_number INTEGER NOT NULL CHECK(installment_number > 0),
amount REAL NOT NULL CHECK(amount > 0),
paid_date TEXT NOT NULL,
budget_entry_id INTEGER REFERENCES budget_entries(id) ON DELETE SET NULL,
created_by INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
UNIQUE(loan_id, installment_number)
);
CREATE TABLE IF NOT EXISTS api_tokens (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
@@ -203,6 +228,9 @@ const MIGRATIONS_SQL = {
CREATE TRIGGER IF NOT EXISTS trg_budget_entries_updated_at
AFTER UPDATE ON budget_entries FOR EACH ROW
BEGIN UPDATE budget_entries SET updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE id = OLD.id; END;
CREATE TRIGGER IF NOT EXISTS trg_budget_loans_updated_at
AFTER UPDATE ON budget_loans FOR EACH ROW
BEGIN UPDATE budget_loans SET updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE id = OLD.id; END;
CREATE INDEX IF NOT EXISTS idx_tasks_assigned_to ON tasks(assigned_to);
CREATE INDEX IF NOT EXISTS idx_tasks_due_date ON tasks(due_date);
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
@@ -214,6 +242,10 @@ const MIGRATIONS_SQL = {
CREATE INDEX IF NOT EXISTS idx_notes_pinned ON notes(pinned);
CREATE INDEX IF NOT EXISTS idx_budget_date ON budget_entries(date);
CREATE INDEX IF NOT EXISTS idx_budget_created_by ON budget_entries(created_by);
CREATE INDEX IF NOT EXISTS idx_budget_loans_status ON budget_loans(status);
CREATE INDEX IF NOT EXISTS idx_budget_loans_start_month ON budget_loans(start_month);
CREATE INDEX IF NOT EXISTS idx_budget_loan_payments_loan ON budget_loan_payments(loan_id);
CREATE INDEX IF NOT EXISTS idx_budget_loan_payments_paid_date ON budget_loan_payments(paid_date);
CREATE INDEX IF NOT EXISTS idx_birthdays_name ON birthdays(name);
CREATE INDEX IF NOT EXISTS idx_birthdays_birth_date ON birthdays(birth_date);
CREATE INDEX IF NOT EXISTS idx_birthdays_created_by ON birthdays(created_by);
@@ -425,6 +457,43 @@ const MIGRATIONS_SQL = {
ALTER TABLE calendar_events ADD COLUMN attachment_size INTEGER;
ALTER TABLE calendar_events ADD COLUMN attachment_data TEXT;
`,
21: `
CREATE TABLE IF NOT EXISTS budget_loans (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
borrower TEXT NOT NULL,
total_amount REAL NOT NULL CHECK(total_amount > 0),
installment_count INTEGER NOT NULL CHECK(installment_count > 0),
start_month TEXT NOT NULL,
notes TEXT,
status TEXT NOT NULL DEFAULT 'active'
CHECK(status IN ('active', 'paid')),
created_by INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
);
CREATE TABLE IF NOT EXISTS budget_loan_payments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
loan_id INTEGER NOT NULL REFERENCES budget_loans(id) ON DELETE CASCADE,
installment_number INTEGER NOT NULL CHECK(installment_number > 0),
amount REAL NOT NULL CHECK(amount > 0),
paid_date TEXT NOT NULL,
budget_entry_id INTEGER REFERENCES budget_entries(id) ON DELETE SET NULL,
created_by INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
UNIQUE(loan_id, installment_number)
);
CREATE TRIGGER IF NOT EXISTS trg_budget_loans_updated_at
AFTER UPDATE ON budget_loans FOR EACH ROW
BEGIN UPDATE budget_loans SET updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE id = OLD.id; END;
CREATE INDEX IF NOT EXISTS idx_budget_loans_status ON budget_loans(status);
CREATE INDEX IF NOT EXISTS idx_budget_loans_start_month ON budget_loans(start_month);
CREATE INDEX IF NOT EXISTS idx_budget_loan_payments_loan ON budget_loan_payments(loan_id);
CREATE INDEX IF NOT EXISTS idx_budget_loan_payments_paid_date ON budget_loan_payments(paid_date);
`,
};
export { MIGRATIONS_SQL };