CREATE TABLE IF NOT EXISTS outlets ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, address TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, sort_order INT DEFAULT 0 ); CREATE TABLE IF NOT EXISTS products ( id INT AUTO_INCREMENT PRIMARY KEY, category_id INT, name VARCHAR(255) NOT NULL, description TEXT, price DECIMAL(10, 2) NOT NULL, cost_price DECIMAL(10, 2) DEFAULT 0.00, stock_quantity INT DEFAULT 0, image_url VARCHAR(255), promo_discount_percent DECIMAL(5, 2) DEFAULT NULL, promo_date_from DATE DEFAULT NULL, promo_date_to DATE DEFAULT NULL, FOREIGN KEY (category_id) REFERENCES categories(id) ); CREATE TABLE IF NOT EXISTS product_variants ( id INT AUTO_INCREMENT PRIMARY KEY, product_id INT, name VARCHAR(255) NOT NULL, price_adjustment DECIMAL(10, 2) DEFAULT 0.00, FOREIGN KEY (product_id) REFERENCES products(id) ); CREATE TABLE IF NOT EXISTS areas ( id INT AUTO_INCREMENT PRIMARY KEY, outlet_id INT, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (outlet_id) REFERENCES outlets(id) ); CREATE TABLE IF NOT EXISTS tables ( id INT AUTO_INCREMENT PRIMARY KEY, area_id INT, name VARCHAR(50) NOT NULL, capacity INT DEFAULT 4, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (area_id) REFERENCES areas(id) ); CREATE TABLE IF NOT EXISTS user_groups ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, permissions TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, group_id INT, username VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, full_name VARCHAR(255), employee_id VARCHAR(50) UNIQUE, email VARCHAR(255) UNIQUE, profile_pic VARCHAR(255) DEFAULT NULL, is_active BOOLEAN DEFAULT TRUE, is_ratable TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (group_id) REFERENCES user_groups(id) ON DELETE SET NULL ); CREATE TABLE IF NOT EXISTS user_outlets ( user_id INT(11) NOT NULL, outlet_id INT(11) NOT NULL, PRIMARY KEY (user_id, outlet_id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (outlet_id) REFERENCES outlets(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS customers ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, phone VARCHAR(20) UNIQUE, email VARCHAR(255), points INT DEFAULT 0, loyalty_redemptions_count INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS payment_types ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, type ENUM('cash', 'card', 'api') DEFAULT 'cash', api_provider VARCHAR(50) DEFAULT NULL, is_active BOOLEAN DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS orders ( id INT AUTO_INCREMENT PRIMARY KEY, outlet_id INT, user_id INT(11) NULL, customer_id INT DEFAULT NULL, table_id INT, table_number VARCHAR(50), order_type ENUM('dine-in', 'delivery', 'drive-thru', 'takeaway') DEFAULT 'dine-in', status ENUM('pending', 'preparing', 'ready', 'completed', 'cancelled') DEFAULT 'pending', payment_type_id INT DEFAULT NULL, total_amount DECIMAL(10, 2) NOT NULL, customer_name VARCHAR(255), customer_phone VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (outlet_id) REFERENCES outlets(id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE SET NULL, FOREIGN KEY (table_id) REFERENCES tables(id) ); CREATE TABLE IF NOT EXISTS order_items ( id INT AUTO_INCREMENT PRIMARY KEY, order_id INT, product_id INT, variant_id INT, quantity INT NOT NULL, unit_price DECIMAL(10, 2) NOT NULL, FOREIGN KEY (order_id) REFERENCES orders(id), FOREIGN KEY (product_id) REFERENCES products(id) ); CREATE TABLE IF NOT EXISTS company_settings ( id INT AUTO_INCREMENT PRIMARY KEY, company_name VARCHAR(255) NOT NULL DEFAULT 'My Restaurant', address TEXT, phone VARCHAR(50), email VARCHAR(255), vat_rate DECIMAL(5, 2) DEFAULT 0.00, currency_symbol VARCHAR(10) DEFAULT '$', currency_decimals INT DEFAULT 2, logo_url VARCHAR(255), favicon_url VARCHAR(255), ctr_number VARCHAR(50), vat_number VARCHAR(50), updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS loyalty_settings ( id INT PRIMARY KEY, points_per_order INT DEFAULT 10, points_for_free_meal INT DEFAULT 70, is_enabled TINYINT(1) DEFAULT 1 ); CREATE TABLE IF NOT EXISTS integration_settings ( id INT AUTO_INCREMENT PRIMARY KEY, provider VARCHAR(50) NOT NULL, setting_key VARCHAR(100) NOT NULL, setting_value TEXT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY unique_provider_key (provider, setting_key) ); CREATE TABLE IF NOT EXISTS expense_categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS expenses ( id INT AUTO_INCREMENT PRIMARY KEY, category_id INT NOT NULL, outlet_id INT NOT NULL, amount DECIMAL(10, 2) NOT NULL, description TEXT, expense_date DATE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (category_id) REFERENCES expense_categories(id), FOREIGN KEY (outlet_id) REFERENCES outlets(id) ); CREATE TABLE IF NOT EXISTS suppliers ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, contact_person VARCHAR(255), email VARCHAR(255), phone VARCHAR(50), address TEXT, vat_no VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS purchases ( id INT AUTO_INCREMENT PRIMARY KEY, supplier_id INT NULL, purchase_date DATE NOT NULL, total_amount DECIMAL(10, 2) DEFAULT 0.00, status ENUM('pending', 'completed', 'cancelled') DEFAULT 'pending', notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (supplier_id) REFERENCES suppliers(id) ON DELETE SET NULL ); CREATE TABLE IF NOT EXISTS purchase_items ( id INT AUTO_INCREMENT PRIMARY KEY, purchase_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, cost_price DECIMAL(10, 2) NOT NULL, total_price DECIMAL(10, 2) NOT NULL, FOREIGN KEY (purchase_id) REFERENCES purchases(id) ON DELETE CASCADE, FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS ads_images ( id INT AUTO_INCREMENT PRIMARY KEY, image_path VARCHAR(255) NOT NULL, title VARCHAR(255) DEFAULT NULL, sort_order INT DEFAULT 0, is_active TINYINT(1) DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS attendance_logs ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, employee_id VARCHAR(50), log_timestamp DATETIME, log_type ENUM('IN', 'OUT', 'OTHER') DEFAULT 'IN', device_id VARCHAR(100), ip_address VARCHAR(45), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL ); CREATE TABLE IF NOT EXISTS staff_ratings ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, rating INT NOT NULL CHECK (rating >= 1 AND rating <= 5), comment TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS service_ratings ( id INT AUTO_INCREMENT PRIMARY KEY, rating INT NOT NULL CHECK (rating >= 1 AND rating <= 5), comment TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );