db.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. const { Pool } = require('pg');
  2. const pool = new Pool({
  3. host: process.env.PGHOST || 'localhost',
  4. port: parseInt(process.env.PGPORT || '5432'),
  5. user: process.env.PGUSER || 'postgres',
  6. password: process.env.PGPASSWORD || 'postgres',
  7. database: process.env.PGDATABASE || 'gestion_locative',
  8. });
  9. async function initDb() {
  10. await pool.query(`
  11. CREATE TABLE IF NOT EXISTS users (
  12. id SERIAL PRIMARY KEY,
  13. email TEXT UNIQUE NOT NULL,
  14. password TEXT NOT NULL,
  15. name TEXT NOT NULL,
  16. first_name TEXT,
  17. last_name TEXT,
  18. address TEXT,
  19. phone TEXT,
  20. created_at TIMESTAMP DEFAULT NOW()
  21. );
  22. CREATE TABLE IF NOT EXISTS owners (
  23. id SERIAL PRIMARY KEY,
  24. user_id INTEGER NOT NULL REFERENCES users(id),
  25. type TEXT NOT NULL DEFAULT 'physique',
  26. first_name TEXT,
  27. last_name TEXT,
  28. company_name TEXT,
  29. siret TEXT,
  30. address TEXT,
  31. zip_code TEXT,
  32. city TEXT,
  33. email TEXT,
  34. phone TEXT,
  35. created_at TIMESTAMP DEFAULT NOW()
  36. );
  37. CREATE TABLE IF NOT EXISTS properties (
  38. id SERIAL PRIMARY KEY,
  39. user_id INTEGER NOT NULL REFERENCES users(id),
  40. owner_id INTEGER REFERENCES owners(id),
  41. name TEXT NOT NULL,
  42. address TEXT NOT NULL,
  43. city TEXT NOT NULL,
  44. zip_code TEXT NOT NULL,
  45. type TEXT NOT NULL,
  46. rooms INTEGER,
  47. area REAL,
  48. created_at TIMESTAMP DEFAULT NOW()
  49. );
  50. CREATE TABLE IF NOT EXISTS tenants (
  51. id SERIAL PRIMARY KEY,
  52. user_id INTEGER NOT NULL REFERENCES users(id),
  53. first_name TEXT NOT NULL,
  54. last_name TEXT NOT NULL,
  55. email TEXT,
  56. phone TEXT,
  57. created_at TIMESTAMP DEFAULT NOW()
  58. );
  59. CREATE TABLE IF NOT EXISTS leases (
  60. id SERIAL PRIMARY KEY,
  61. user_id INTEGER NOT NULL REFERENCES users(id),
  62. property_id INTEGER NOT NULL REFERENCES properties(id),
  63. tenant_id INTEGER NOT NULL REFERENCES tenants(id),
  64. owner_id INTEGER REFERENCES owners(id),
  65. start_date TEXT NOT NULL,
  66. end_date TEXT,
  67. rent_amount REAL NOT NULL,
  68. charges_amount REAL NOT NULL DEFAULT 0,
  69. deposit_amount REAL NOT NULL DEFAULT 0,
  70. payment_day INTEGER NOT NULL DEFAULT 1,
  71. active INTEGER NOT NULL DEFAULT 1,
  72. created_at TIMESTAMP DEFAULT NOW()
  73. );
  74. CREATE TABLE IF NOT EXISTS payments (
  75. id SERIAL PRIMARY KEY,
  76. lease_id INTEGER NOT NULL REFERENCES leases(id),
  77. user_id INTEGER NOT NULL REFERENCES users(id),
  78. period_month INTEGER NOT NULL,
  79. period_year INTEGER NOT NULL,
  80. rent_paid REAL NOT NULL,
  81. charges_paid REAL NOT NULL DEFAULT 0,
  82. payment_date TEXT NOT NULL,
  83. payment_method TEXT NOT NULL DEFAULT 'virement',
  84. notes TEXT,
  85. charge_regularization REAL DEFAULT 0,
  86. is_prorata INTEGER DEFAULT 0,
  87. prorata_days INTEGER,
  88. prorata_total_days INTEGER,
  89. created_at TIMESTAMP DEFAULT NOW()
  90. );
  91. CREATE TABLE IF NOT EXISTS charges (
  92. id SERIAL PRIMARY KEY,
  93. user_id INTEGER NOT NULL REFERENCES users(id),
  94. property_id INTEGER NOT NULL REFERENCES properties(id),
  95. category TEXT NOT NULL,
  96. label TEXT NOT NULL,
  97. amount REAL NOT NULL,
  98. date TEXT NOT NULL,
  99. year INTEGER NOT NULL,
  100. invoice_path TEXT,
  101. invoice_name TEXT,
  102. notes TEXT,
  103. recoverable INTEGER NOT NULL DEFAULT 1,
  104. created_at TIMESTAMP DEFAULT NOW()
  105. );
  106. CREATE TABLE IF NOT EXISTS lease_revisions (
  107. id SERIAL PRIMARY KEY,
  108. lease_id INTEGER NOT NULL REFERENCES leases(id),
  109. user_id INTEGER NOT NULL REFERENCES users(id),
  110. effective_date TEXT NOT NULL,
  111. rent_amount REAL NOT NULL,
  112. charges_amount REAL NOT NULL DEFAULT 0,
  113. notes TEXT,
  114. created_at TIMESTAMP DEFAULT NOW()
  115. );
  116. CREATE TABLE IF NOT EXISTS charge_regularizations (
  117. id SERIAL PRIMARY KEY,
  118. lease_id INTEGER NOT NULL REFERENCES leases(id),
  119. user_id INTEGER NOT NULL REFERENCES users(id),
  120. property_id INTEGER NOT NULL,
  121. year INTEGER NOT NULL,
  122. amount REAL NOT NULL,
  123. notes TEXT,
  124. applied_payment_id INTEGER,
  125. created_at TIMESTAMP DEFAULT NOW()
  126. );
  127. `);
  128. // Idempotent migrations for columns added after initial schema
  129. await pool.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS first_name TEXT`);
  130. await pool.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS last_name TEXT`);
  131. await pool.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS address TEXT`);
  132. await pool.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS phone TEXT`);
  133. await pool.query(`ALTER TABLE leases ADD COLUMN IF NOT EXISTS owner_id INTEGER REFERENCES owners(id)`);
  134. await pool.query(`ALTER TABLE charges ADD COLUMN IF NOT EXISTS recoverable INTEGER NOT NULL DEFAULT 1`);
  135. await pool.query(`ALTER TABLE payments ADD COLUMN IF NOT EXISTS charge_regularization REAL DEFAULT 0`);
  136. await pool.query(`ALTER TABLE payments ADD COLUMN IF NOT EXISTS is_prorata INTEGER DEFAULT 0`);
  137. await pool.query(`ALTER TABLE payments ADD COLUMN IF NOT EXISTS prorata_days INTEGER`);
  138. await pool.query(`ALTER TABLE payments ADD COLUMN IF NOT EXISTS prorata_total_days INTEGER`);
  139. }
  140. initDb().catch(err => {
  141. console.error('Database initialization error:', err);
  142. process.exit(1);
  143. });
  144. module.exports = pool;