42 lines
2.2 KiB
SQL
42 lines
2.2 KiB
SQL
-- ─── Tenants ──────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS tenants (
|
|
id CHAR(36) NOT NULL DEFAULT (UUID()),
|
|
name VARCHAR(255) NOT NULL,
|
|
email VARCHAR(255) NOT NULL,
|
|
phone VARCHAR(20) NULL,
|
|
status ENUM('active','suspended','trial') NOT NULL DEFAULT 'trial',
|
|
trial_ends_at DATETIME NULL,
|
|
settings JSON DEFAULT (JSON_OBJECT()),
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
deleted_at DATETIME NULL,
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY uq_tenants_email (email)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ─── Users ────────────────────────────────────────────────
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id CHAR(36) NOT NULL DEFAULT (UUID()),
|
|
tenant_id CHAR(36) NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
email VARCHAR(255) NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
role ENUM('super_admin','admin','accountant','employee','viewer') NOT NULL,
|
|
assigned_company_id CHAR(36) NULL,
|
|
refresh_token_hash VARCHAR(255) NULL,
|
|
totp_secret VARCHAR(64) NULL,
|
|
totp_enabled TINYINT(1) NOT NULL DEFAULT 0,
|
|
is_active TINYINT(1) NOT NULL DEFAULT 1,
|
|
email_verified_at DATETIME NULL,
|
|
last_login_at DATETIME NULL,
|
|
last_login_ip VARCHAR(45) NULL,
|
|
failed_login_count INT NOT NULL DEFAULT 0,
|
|
locked_until DATETIME NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
deleted_at DATETIME NULL,
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY uq_tenant_email (tenant_id, email),
|
|
CONSTRAINT fk_users_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|