db.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. const Database = require('better-sqlite3');
  2. const path = require('path');
  3. const db = new Database(path.join(__dirname, '../data/gestion_locative.db'));
  4. db.pragma('journal_mode = WAL');
  5. db.pragma('foreign_keys = ON');
  6. db.exec(`
  7. CREATE TABLE IF NOT EXISTS users (
  8. id INTEGER PRIMARY KEY AUTOINCREMENT,
  9. email TEXT UNIQUE NOT NULL,
  10. password TEXT NOT NULL,
  11. name TEXT NOT NULL,
  12. created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  13. );
  14. CREATE TABLE IF NOT EXISTS properties (
  15. id INTEGER PRIMARY KEY AUTOINCREMENT,
  16. user_id INTEGER NOT NULL,
  17. name TEXT NOT NULL,
  18. address TEXT NOT NULL,
  19. city TEXT NOT NULL,
  20. zip_code TEXT NOT NULL,
  21. type TEXT NOT NULL,
  22. rooms INTEGER,
  23. area REAL,
  24. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  25. FOREIGN KEY (user_id) REFERENCES users(id)
  26. );
  27. CREATE TABLE IF NOT EXISTS tenants (
  28. id INTEGER PRIMARY KEY AUTOINCREMENT,
  29. user_id INTEGER NOT NULL,
  30. first_name TEXT NOT NULL,
  31. last_name TEXT NOT NULL,
  32. email TEXT,
  33. phone TEXT,
  34. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  35. FOREIGN KEY (user_id) REFERENCES users(id)
  36. );
  37. CREATE TABLE IF NOT EXISTS leases (
  38. id INTEGER PRIMARY KEY AUTOINCREMENT,
  39. user_id INTEGER NOT NULL,
  40. property_id INTEGER NOT NULL,
  41. tenant_id INTEGER NOT NULL,
  42. start_date TEXT NOT NULL,
  43. end_date TEXT,
  44. rent_amount REAL NOT NULL,
  45. charges_amount REAL NOT NULL DEFAULT 0,
  46. deposit_amount REAL NOT NULL DEFAULT 0,
  47. payment_day INTEGER NOT NULL DEFAULT 1,
  48. active INTEGER NOT NULL DEFAULT 1,
  49. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  50. FOREIGN KEY (user_id) REFERENCES users(id),
  51. FOREIGN KEY (property_id) REFERENCES properties(id),
  52. FOREIGN KEY (tenant_id) REFERENCES tenants(id)
  53. );
  54. CREATE TABLE IF NOT EXISTS payments (
  55. id INTEGER PRIMARY KEY AUTOINCREMENT,
  56. lease_id INTEGER NOT NULL,
  57. user_id INTEGER NOT NULL,
  58. period_month INTEGER NOT NULL,
  59. period_year INTEGER NOT NULL,
  60. rent_paid REAL NOT NULL,
  61. charges_paid REAL NOT NULL DEFAULT 0,
  62. payment_date TEXT NOT NULL,
  63. payment_method TEXT NOT NULL DEFAULT 'virement',
  64. notes TEXT,
  65. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  66. FOREIGN KEY (lease_id) REFERENCES leases(id),
  67. FOREIGN KEY (user_id) REFERENCES users(id)
  68. );
  69. CREATE TABLE IF NOT EXISTS charges (
  70. id INTEGER PRIMARY KEY AUTOINCREMENT,
  71. user_id INTEGER NOT NULL,
  72. property_id INTEGER NOT NULL,
  73. category TEXT NOT NULL,
  74. label TEXT NOT NULL,
  75. amount REAL NOT NULL,
  76. date TEXT NOT NULL,
  77. year INTEGER NOT NULL,
  78. invoice_path TEXT,
  79. invoice_name TEXT,
  80. notes TEXT,
  81. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  82. FOREIGN KEY (user_id) REFERENCES users(id),
  83. FOREIGN KEY (property_id) REFERENCES properties(id)
  84. );
  85. `);
  86. // Add profile columns to users if they don't exist yet
  87. ['first_name', 'last_name', 'address', 'phone'].forEach(col => {
  88. try { db.exec(`ALTER TABLE users ADD COLUMN ${col} TEXT`); } catch {}
  89. });
  90. // Lease revisions history
  91. db.exec(`
  92. CREATE TABLE IF NOT EXISTS lease_revisions (
  93. id INTEGER PRIMARY KEY AUTOINCREMENT,
  94. lease_id INTEGER NOT NULL,
  95. user_id INTEGER NOT NULL,
  96. effective_date TEXT NOT NULL,
  97. rent_amount REAL NOT NULL,
  98. charges_amount REAL NOT NULL DEFAULT 0,
  99. notes TEXT,
  100. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  101. FOREIGN KEY (lease_id) REFERENCES leases(id),
  102. FOREIGN KEY (user_id) REFERENCES users(id)
  103. )
  104. `);
  105. // Add recoverable column to charges if missing
  106. try { db.exec('ALTER TABLE charges ADD COLUMN recoverable INTEGER NOT NULL DEFAULT 1'); } catch {}
  107. // Add charge_regularization column to payments if missing
  108. try { db.exec('ALTER TABLE payments ADD COLUMN charge_regularization REAL DEFAULT 0'); } catch {}
  109. // Prorata columns on payments
  110. try { db.exec('ALTER TABLE payments ADD COLUMN is_prorata INTEGER DEFAULT 0'); } catch {}
  111. try { db.exec('ALTER TABLE payments ADD COLUMN prorata_days INTEGER'); } catch {}
  112. try { db.exec('ALTER TABLE payments ADD COLUMN prorata_total_days INTEGER'); } catch {}
  113. // Regularizations from annual exercise closure
  114. db.exec(`
  115. CREATE TABLE IF NOT EXISTS charge_regularizations (
  116. id INTEGER PRIMARY KEY AUTOINCREMENT,
  117. lease_id INTEGER NOT NULL,
  118. user_id INTEGER NOT NULL,
  119. property_id INTEGER NOT NULL,
  120. year INTEGER NOT NULL,
  121. amount REAL NOT NULL,
  122. notes TEXT,
  123. applied_payment_id INTEGER,
  124. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  125. FOREIGN KEY (lease_id) REFERENCES leases(id),
  126. FOREIGN KEY (user_id) REFERENCES users(id)
  127. )
  128. `);
  129. module.exports = db;