205 lines
7.3 KiB
SQL
205 lines
7.3 KiB
SQL
-- UK Data Services Database Initialization
|
|
-- Creates tables for contact forms, analytics, and user management
|
|
|
|
-- Set charset and collation
|
|
SET NAMES utf8mb4;
|
|
SET FOREIGN_KEY_CHECKS = 0;
|
|
|
|
-- Contact Form Submissions
|
|
CREATE TABLE IF NOT EXISTS `contact_submissions` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`name` VARCHAR(100) NOT NULL,
|
|
`email` VARCHAR(100) NOT NULL,
|
|
`company` VARCHAR(100) DEFAULT NULL,
|
|
`service` VARCHAR(50) DEFAULT NULL,
|
|
`message` TEXT NOT NULL,
|
|
`ip_address` VARCHAR(45) DEFAULT NULL,
|
|
`user_agent` TEXT DEFAULT NULL,
|
|
`submitted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
`status` ENUM('new', 'contacted', 'converted', 'closed') DEFAULT 'new',
|
|
`notes` TEXT DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
INDEX `idx_email` (`email`),
|
|
INDEX `idx_submitted_at` (`submitted_at`),
|
|
INDEX `idx_status` (`status`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Quote Requests
|
|
CREATE TABLE IF NOT EXISTS `quote_requests` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`company_name` VARCHAR(100) NOT NULL,
|
|
`first_name` VARCHAR(50) NOT NULL,
|
|
`last_name` VARCHAR(50) NOT NULL,
|
|
`email` VARCHAR(100) NOT NULL,
|
|
`phone` VARCHAR(20) DEFAULT NULL,
|
|
`company_size` VARCHAR(20) DEFAULT NULL,
|
|
`services_needed` JSON DEFAULT NULL,
|
|
`project_details` TEXT DEFAULT NULL,
|
|
`budget` VARCHAR(20) DEFAULT NULL,
|
|
`timeline` VARCHAR(20) DEFAULT NULL,
|
|
`ip_address` VARCHAR(45) DEFAULT NULL,
|
|
`submitted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
`status` ENUM('new', 'reviewing', 'quoted', 'accepted', 'declined') DEFAULT 'new',
|
|
`quote_amount` DECIMAL(10,2) DEFAULT NULL,
|
|
`notes` TEXT DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
INDEX `idx_email` (`email`),
|
|
INDEX `idx_submitted_at` (`submitted_at`),
|
|
INDEX `idx_status` (`status`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Site Analytics (basic tracking)
|
|
CREATE TABLE IF NOT EXISTS `site_analytics` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`page_url` VARCHAR(255) NOT NULL,
|
|
`referrer` VARCHAR(255) DEFAULT NULL,
|
|
`user_agent` TEXT DEFAULT NULL,
|
|
`ip_address` VARCHAR(45) DEFAULT NULL,
|
|
`session_id` VARCHAR(255) DEFAULT NULL,
|
|
`visit_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
`page_load_time` INT DEFAULT NULL,
|
|
`country` VARCHAR(2) DEFAULT NULL,
|
|
`city` VARCHAR(100) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
INDEX `idx_page_url` (`page_url`),
|
|
INDEX `idx_visit_time` (`visit_time`),
|
|
INDEX `idx_session_id` (`session_id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Error Logs
|
|
CREATE TABLE IF NOT EXISTS `error_logs` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`error_type` VARCHAR(50) NOT NULL,
|
|
`error_message` TEXT NOT NULL,
|
|
`file_path` VARCHAR(255) DEFAULT NULL,
|
|
`line_number` INT DEFAULT NULL,
|
|
`stack_trace` TEXT DEFAULT NULL,
|
|
`user_agent` TEXT DEFAULT NULL,
|
|
`ip_address` VARCHAR(45) DEFAULT NULL,
|
|
`occurred_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
INDEX `idx_error_type` (`error_type`),
|
|
INDEX `idx_occurred_at` (`occurred_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Newsletter Subscriptions
|
|
CREATE TABLE IF NOT EXISTS `newsletter_subscriptions` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`email` VARCHAR(100) NOT NULL UNIQUE,
|
|
`name` VARCHAR(100) DEFAULT NULL,
|
|
`company` VARCHAR(100) DEFAULT NULL,
|
|
`interests` JSON DEFAULT NULL,
|
|
`subscribed_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
`confirmed_at` TIMESTAMP NULL DEFAULT NULL,
|
|
`unsubscribed_at` TIMESTAMP NULL DEFAULT NULL,
|
|
`status` ENUM('pending', 'confirmed', 'unsubscribed') DEFAULT 'pending',
|
|
`confirmation_token` VARCHAR(255) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `unique_email` (`email`),
|
|
INDEX `idx_status` (`status`),
|
|
INDEX `idx_subscribed_at` (`subscribed_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- FAQ Search Tracking
|
|
CREATE TABLE IF NOT EXISTS `faq_searches` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`search_term` VARCHAR(255) NOT NULL,
|
|
`results_found` INT DEFAULT 0,
|
|
`ip_address` VARCHAR(45) DEFAULT NULL,
|
|
`searched_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`id`),
|
|
INDEX `idx_search_term` (`search_term`),
|
|
INDEX `idx_searched_at` (`searched_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- User Sessions (for analytics)
|
|
CREATE TABLE IF NOT EXISTS `user_sessions` (
|
|
`session_id` VARCHAR(255) NOT NULL,
|
|
`ip_address` VARCHAR(45) DEFAULT NULL,
|
|
`user_agent` TEXT DEFAULT NULL,
|
|
`started_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
`last_activity` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
`pages_viewed` INT DEFAULT 1,
|
|
`referrer` VARCHAR(255) DEFAULT NULL,
|
|
`country` VARCHAR(2) DEFAULT NULL,
|
|
`is_bot` BOOLEAN DEFAULT FALSE,
|
|
PRIMARY KEY (`session_id`),
|
|
INDEX `idx_started_at` (`started_at`),
|
|
INDEX `idx_last_activity` (`last_activity`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Service Worker Cache Log
|
|
CREATE TABLE IF NOT EXISTS `sw_cache_log` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`event_type` VARCHAR(50) NOT NULL,
|
|
`resource_url` VARCHAR(255) DEFAULT NULL,
|
|
`cache_status` VARCHAR(20) DEFAULT NULL,
|
|
`response_time` INT DEFAULT NULL,
|
|
`timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
`user_agent` TEXT DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
INDEX `idx_event_type` (`event_type`),
|
|
INDEX `idx_timestamp` (`timestamp`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Insert default data
|
|
INSERT IGNORE INTO `contact_submissions`
|
|
(`name`, `email`, `company`, `service`, `message`, `status`)
|
|
VALUES
|
|
('Test User', 'test@example.com', 'Test Company', 'data-cleaning', 'This is a test submission', 'new');
|
|
|
|
-- Create database views for analytics
|
|
CREATE OR REPLACE VIEW `daily_contact_stats` AS
|
|
SELECT
|
|
DATE(submitted_at) as date,
|
|
COUNT(*) as total_submissions,
|
|
COUNT(DISTINCT email) as unique_contacts,
|
|
SUM(CASE WHEN status = 'converted' THEN 1 ELSE 0 END) as conversions
|
|
FROM contact_submissions
|
|
WHERE submitted_at >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)
|
|
GROUP BY DATE(submitted_at)
|
|
ORDER BY date DESC;
|
|
|
|
CREATE OR REPLACE VIEW `popular_services` AS
|
|
SELECT
|
|
service,
|
|
COUNT(*) as request_count,
|
|
COUNT(DISTINCT email) as unique_requesters
|
|
FROM contact_submissions
|
|
WHERE service IS NOT NULL
|
|
AND submitted_at >= DATE_SUB(CURRENT_DATE, INTERVAL 90 DAY)
|
|
GROUP BY service
|
|
ORDER BY request_count DESC;
|
|
|
|
-- Create stored procedure for analytics
|
|
DELIMITER //
|
|
CREATE PROCEDURE GetMonthlyStats(IN target_month DATE)
|
|
BEGIN
|
|
SELECT
|
|
'Contact Submissions' as metric,
|
|
COUNT(*) as value
|
|
FROM contact_submissions
|
|
WHERE YEAR(submitted_at) = YEAR(target_month)
|
|
AND MONTH(submitted_at) = MONTH(target_month)
|
|
|
|
UNION ALL
|
|
|
|
SELECT
|
|
'Quote Requests' as metric,
|
|
COUNT(*) as value
|
|
FROM quote_requests
|
|
WHERE YEAR(submitted_at) = YEAR(target_month)
|
|
AND MONTH(submitted_at) = MONTH(target_month)
|
|
|
|
UNION ALL
|
|
|
|
SELECT
|
|
'Page Views' as metric,
|
|
COUNT(*) as value
|
|
FROM site_analytics
|
|
WHERE YEAR(visit_time) = YEAR(target_month)
|
|
AND MONTH(visit_time) = MONTH(target_month);
|
|
END //
|
|
DELIMITER ;
|
|
|
|
SET FOREIGN_KEY_CHECKS = 1; |