632 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			MySQL
		
	
	
	
	
	
		
		
			
		
	
	
			632 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			MySQL
		
	
	
	
	
	
|  | CREATE DATABASE  IF NOT EXISTS `candidb_main` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
 | ||
|  | USE `candidb_main`;
 | ||
|  | -- MySQL dump 10.13  Distrib 8.0.38, for Win64 (x86_64)
 | ||
|  | --
 | ||
|  | -- Host: localhost    Database: candidb_main
 | ||
|  | -- ------------------------------------------------------
 | ||
|  | -- Server version	8.0.39
 | ||
|  | 
 | ||
|  | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
 | ||
|  | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
 | ||
|  | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
 | ||
|  | /*!50503 SET NAMES utf8 */;
 | ||
|  | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
 | ||
|  | /*!40103 SET TIME_ZONE='+00:00' */;
 | ||
|  | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
 | ||
|  | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
 | ||
|  | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 | ||
|  | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 | ||
|  | 
 | ||
|  | --
 | ||
|  | -- Dumping events for database 'candidb_main'
 | ||
|  | --
 | ||
|  | 
 | ||
|  | --
 | ||
|  | -- Dumping routines for database 'candidb_main'
 | ||
|  | --
 | ||
|  | /*!50003 DROP FUNCTION IF EXISTS `can_create_job` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` FUNCTION `can_create_job`(user_uuid VARCHAR(36)) RETURNS tinyint(1)
 | ||
|  |     READS SQL DATA
 | ||
|  |     DETERMINISTIC
 | ||
|  | BEGIN
 | ||
|  |     DECLARE current_jobs INT DEFAULT 0;
 | ||
|  |     DECLARE max_jobs INT DEFAULT 100; -- Hard limit of 100 jobs
 | ||
|  |     
 | ||
|  |     -- Get current job count
 | ||
|  |     SELECT COALESCE(jobs_created, 0) INTO current_jobs
 | ||
|  |     FROM user_usage 
 | ||
|  |     WHERE user_id = user_uuid;
 | ||
|  |     
 | ||
|  |     -- Return TRUE if under limit
 | ||
|  |     RETURN current_jobs < max_jobs;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP FUNCTION IF EXISTS `get_all_users` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` FUNCTION `get_all_users`() RETURNS json
 | ||
|  |     READS SQL DATA
 | ||
|  |     DETERMINISTIC
 | ||
|  | BEGIN
 | ||
|  |     DECLARE result JSON;
 | ||
|  |     
 | ||
|  |     SELECT JSON_ARRAYAGG(
 | ||
|  |         JSON_OBJECT(
 | ||
|  |             'id', id,
 | ||
|  |             'email', email,
 | ||
|  |             'first_name', first_name,
 | ||
|  |             'last_name', last_name,
 | ||
|  |             'role', role,
 | ||
|  |             'company_name', company_name,
 | ||
|  |             'is_active', is_active,
 | ||
|  |             'last_login_at', last_login_at,
 | ||
|  |             'email_verified_at', email_verified_at,
 | ||
|  |             'created_at', created_at
 | ||
|  |         )
 | ||
|  |     ) INTO result
 | ||
|  |     FROM users 
 | ||
|  |     WHERE deleted_at IS NULL
 | ||
|  |     ORDER BY created_at DESC;
 | ||
|  |     
 | ||
|  |     RETURN result;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP FUNCTION IF EXISTS `get_token_usage_summary` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` FUNCTION `get_token_usage_summary`(user_uuid VARCHAR(36)) RETURNS json
 | ||
|  |     READS SQL DATA
 | ||
|  |     DETERMINISTIC
 | ||
|  | BEGIN
 | ||
|  |     DECLARE total_purchased INT DEFAULT 0;
 | ||
|  |     DECLARE total_used INT DEFAULT 0;
 | ||
|  |     DECLARE total_available INT DEFAULT 0;
 | ||
|  |     DECLARE result JSON;
 | ||
|  |     
 | ||
|  |     -- Get total purchased tokens
 | ||
|  |     SELECT COALESCE(SUM(quantity), 0) INTO total_purchased
 | ||
|  |     FROM interview_tokens 
 | ||
|  |     WHERE user_id = user_uuid;
 | ||
|  |     
 | ||
|  |     -- Get total used tokens
 | ||
|  |     SELECT COALESCE(SUM(tokens_used), 0) INTO total_used
 | ||
|  |     FROM interview_tokens 
 | ||
|  |     WHERE user_id = user_uuid;
 | ||
|  |     
 | ||
|  |     -- Get total available tokens
 | ||
|  |     SELECT COALESCE(SUM(tokens_remaining), 0) INTO total_available
 | ||
|  |     FROM interview_tokens 
 | ||
|  |     WHERE user_id = user_uuid 
 | ||
|  |     AND status = 'active'
 | ||
|  |     AND (expires_at IS NULL OR expires_at > NOW());
 | ||
|  |     
 | ||
|  |     -- Build JSON result
 | ||
|  |     SET result = JSON_OBJECT(
 | ||
|  |         'total_purchased', total_purchased,
 | ||
|  |         'total_used', total_used,
 | ||
|  |         'total_available', total_available,
 | ||
|  |         'utilization_percentage', CASE 
 | ||
|  |             WHEN total_purchased > 0 THEN ROUND((total_used / total_purchased) * 100, 2)
 | ||
|  |             ELSE 0 
 | ||
|  |         END
 | ||
|  |     );
 | ||
|  |     
 | ||
|  |     RETURN result;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP FUNCTION IF EXISTS `get_user_statistics` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` FUNCTION `get_user_statistics`(user_uuid VARCHAR(36)) RETURNS json
 | ||
|  |     READS SQL DATA
 | ||
|  |     DETERMINISTIC
 | ||
|  | BEGIN
 | ||
|  |     DECLARE result JSON;
 | ||
|  |     DECLARE user_usage_data JSON;
 | ||
|  |     DECLARE token_summary JSON;
 | ||
|  |     
 | ||
|  |     -- Get usage data
 | ||
|  |     SELECT JSON_OBJECT(
 | ||
|  |         'jobs_created', COALESCE(jobs_created, 0),
 | ||
|  |         'interviews_completed', COALESCE(interviews_completed, 0),
 | ||
|  |         'tokens_purchased', COALESCE(tokens_purchased, 0),
 | ||
|  |         'tokens_used', COALESCE(tokens_used, 0)
 | ||
|  |     ) INTO user_usage_data
 | ||
|  |     FROM user_usage 
 | ||
|  |     WHERE user_id = user_uuid;
 | ||
|  |     
 | ||
|  |     -- Get token summary
 | ||
|  |     SELECT get_token_usage_summary(user_uuid) INTO token_summary;
 | ||
|  |     
 | ||
|  |     -- Build result
 | ||
|  |     SET result = JSON_OBJECT(
 | ||
|  |         'usage', user_usage_data,
 | ||
|  |         'tokens', token_summary
 | ||
|  |     );
 | ||
|  |     
 | ||
|  |     RETURN result;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP FUNCTION IF EXISTS `has_available_tokens` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` FUNCTION `has_available_tokens`(user_uuid VARCHAR(36)) RETURNS tinyint(1)
 | ||
|  |     READS SQL DATA
 | ||
|  |     DETERMINISTIC
 | ||
|  | BEGIN
 | ||
|  |     DECLARE available_tokens INT DEFAULT 0;
 | ||
|  |     
 | ||
|  |     -- Get available tokens (active and not expired)
 | ||
|  |     SELECT COALESCE(SUM(tokens_remaining), 0) INTO available_tokens
 | ||
|  |     FROM interview_tokens 
 | ||
|  |     WHERE user_id = user_uuid 
 | ||
|  |     AND status = 'active'
 | ||
|  |     AND (expires_at IS NULL OR expires_at > NOW());
 | ||
|  |     
 | ||
|  |     -- Return TRUE if has available tokens
 | ||
|  |     RETURN available_tokens > 0;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP FUNCTION IF EXISTS `is_admin` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` FUNCTION `is_admin`(user_uuid VARCHAR(36)) RETURNS tinyint(1)
 | ||
|  |     READS SQL DATA
 | ||
|  |     DETERMINISTIC
 | ||
|  | BEGIN
 | ||
|  |     DECLARE user_role VARCHAR(20) DEFAULT NULL;
 | ||
|  |     
 | ||
|  |     SELECT role INTO user_role
 | ||
|  |     FROM users 
 | ||
|  |     WHERE id = user_uuid AND is_active = TRUE;
 | ||
|  |     
 | ||
|  |     RETURN user_role = 'admin';
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP PROCEDURE IF EXISTS `add_tokens_to_user` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` PROCEDURE `add_tokens_to_user`(
 | ||
|  |     IN p_user_id VARCHAR(36),
 | ||
|  |     IN p_quantity INT,
 | ||
|  |     IN p_price_per_token DECIMAL(10,2),
 | ||
|  |     IN p_admin_id VARCHAR(36),
 | ||
|  |     OUT p_success BOOLEAN,
 | ||
|  |     OUT p_message VARCHAR(255)
 | ||
|  | )
 | ||
|  | BEGIN
 | ||
|  |     DECLARE v_total_price DECIMAL(10,2);
 | ||
|  |     DECLARE v_token_id VARCHAR(36);
 | ||
|  |     
 | ||
|  |     DECLARE EXIT HANDLER FOR SQLEXCEPTION
 | ||
|  |     BEGIN
 | ||
|  |         ROLLBACK;
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'An error occurred while adding tokens';
 | ||
|  |     END;
 | ||
|  |     
 | ||
|  |     -- Check if admin
 | ||
|  |     IF NOT is_admin(p_admin_id) THEN
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'Access denied: Admin privileges required';
 | ||
|  |     ELSE
 | ||
|  |         -- Check if user exists
 | ||
|  |         IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
 | ||
|  |             SET p_success = FALSE;
 | ||
|  |             SET p_message = 'User not found';
 | ||
|  |         ELSE
 | ||
|  |             -- Calculate total price
 | ||
|  |             SET v_total_price = p_quantity * p_price_per_token;
 | ||
|  |             
 | ||
|  |             -- Create token record
 | ||
|  |             SET v_token_id = UUID();
 | ||
|  |             
 | ||
|  |             INSERT INTO interview_tokens (
 | ||
|  |                 id, user_id, token_type, quantity, price_per_token, 
 | ||
|  |                 total_price, status, purchased_at
 | ||
|  |             ) VALUES (
 | ||
|  |                 v_token_id, p_user_id, 
 | ||
|  |                 CASE WHEN p_quantity = 1 THEN 'single' ELSE 'bulk' END,
 | ||
|  |                 p_quantity, p_price_per_token, v_total_price, 
 | ||
|  |                 'active', NOW()
 | ||
|  |             );
 | ||
|  |             
 | ||
|  |             -- Create payment record (admin-granted)
 | ||
|  |             INSERT INTO payment_records (
 | ||
|  |                 user_id, interview_token_id, token_package_id, 
 | ||
|  |                 amount, status, payment_method, payment_reference
 | ||
|  |             ) VALUES (
 | ||
|  |                 p_user_id, v_token_id, NULL, v_total_price, 
 | ||
|  |                 'paid', 'admin_granted', CONCAT('ADMIN_', p_admin_id, '_', NOW())
 | ||
|  |             );
 | ||
|  |             
 | ||
|  |             SET p_success = TRUE;
 | ||
|  |             SET p_message = CONCAT('Successfully added ', p_quantity, ' tokens to user');
 | ||
|  |         END IF;
 | ||
|  |     END IF;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP PROCEDURE IF EXISTS `change_user_password` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` PROCEDURE `change_user_password`(
 | ||
|  |     IN p_user_id VARCHAR(36),
 | ||
|  |     IN p_new_password_hash VARCHAR(255),
 | ||
|  |     IN p_admin_id VARCHAR(36),
 | ||
|  |     OUT p_success BOOLEAN,
 | ||
|  |     OUT p_message VARCHAR(255)
 | ||
|  | )
 | ||
|  | BEGIN
 | ||
|  |     DECLARE EXIT HANDLER FOR SQLEXCEPTION
 | ||
|  |     BEGIN
 | ||
|  |         ROLLBACK;
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'An error occurred while changing password';
 | ||
|  |     END;
 | ||
|  |     
 | ||
|  |     -- Check if admin
 | ||
|  |     IF NOT is_admin(p_admin_id) THEN
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'Access denied: Admin privileges required';
 | ||
|  |     ELSE
 | ||
|  |         -- Check if user exists
 | ||
|  |         IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
 | ||
|  |             SET p_success = FALSE;
 | ||
|  |             SET p_message = 'User not found';
 | ||
|  |         ELSE
 | ||
|  |             -- Update password
 | ||
|  |             UPDATE users SET
 | ||
|  |                 password_hash = p_new_password_hash,
 | ||
|  |                 updated_at = NOW()
 | ||
|  |             WHERE id = p_user_id;
 | ||
|  |             
 | ||
|  |             SET p_success = TRUE;
 | ||
|  |             SET p_message = 'Password changed successfully';
 | ||
|  |         END IF;
 | ||
|  |     END IF;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP PROCEDURE IF EXISTS `create_user` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` PROCEDURE `create_user`(
 | ||
|  |     IN p_email VARCHAR(255),
 | ||
|  |     IN p_password_hash VARCHAR(255),
 | ||
|  |     IN p_first_name VARCHAR(100),
 | ||
|  |     IN p_last_name VARCHAR(100),
 | ||
|  |     IN p_role ENUM('admin', 'recruiter'),
 | ||
|  |     IN p_company_name VARCHAR(255),
 | ||
|  |     IN p_admin_id VARCHAR(36),
 | ||
|  |     OUT p_user_id VARCHAR(36),
 | ||
|  |     OUT p_success BOOLEAN,
 | ||
|  |     OUT p_message VARCHAR(255)
 | ||
|  | )
 | ||
|  | BEGIN
 | ||
|  |     DECLARE EXIT HANDLER FOR SQLEXCEPTION
 | ||
|  |     BEGIN
 | ||
|  |         ROLLBACK;
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'An error occurred while creating user';
 | ||
|  |     END;
 | ||
|  |     
 | ||
|  |     -- Check if admin
 | ||
|  |     IF NOT is_admin(p_admin_id) THEN
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'Access denied: Admin privileges required';
 | ||
|  |     ELSE
 | ||
|  |         -- Check if email already exists
 | ||
|  |         IF EXISTS (SELECT 1 FROM users WHERE email = p_email AND deleted_at IS NULL) THEN
 | ||
|  |             SET p_success = FALSE;
 | ||
|  |             SET p_message = 'Email already exists';
 | ||
|  |         ELSE
 | ||
|  |             -- Create user
 | ||
|  |             SET p_user_id = UUID();
 | ||
|  |             
 | ||
|  |             INSERT INTO users (
 | ||
|  |                 id, email, password_hash, first_name, last_name, 
 | ||
|  |                 role, company_name, is_active, email_verified_at
 | ||
|  |             ) VALUES (
 | ||
|  |                 p_user_id, p_email, p_password_hash, p_first_name, p_last_name,
 | ||
|  |                 p_role, p_company_name, TRUE, NOW()
 | ||
|  |             );
 | ||
|  |             
 | ||
|  |             -- Initialize usage tracking
 | ||
|  |             INSERT INTO user_usage (user_id) VALUES (p_user_id);
 | ||
|  |             
 | ||
|  |             SET p_success = TRUE;
 | ||
|  |             SET p_message = 'User created successfully';
 | ||
|  |         END IF;
 | ||
|  |     END IF;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP PROCEDURE IF EXISTS `deactivate_user` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` PROCEDURE `deactivate_user`(
 | ||
|  |     IN p_user_id VARCHAR(36),
 | ||
|  |     IN p_admin_id VARCHAR(36),
 | ||
|  |     OUT p_success BOOLEAN,
 | ||
|  |     OUT p_message VARCHAR(255)
 | ||
|  | )
 | ||
|  | BEGIN
 | ||
|  |     DECLARE EXIT HANDLER FOR SQLEXCEPTION
 | ||
|  |     BEGIN
 | ||
|  |         ROLLBACK;
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'An error occurred while deactivating user';
 | ||
|  |     END;
 | ||
|  |     
 | ||
|  |     -- Check if admin
 | ||
|  |     IF NOT is_admin(p_admin_id) THEN
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'Access denied: Admin privileges required';
 | ||
|  |     ELSE
 | ||
|  |         -- Check if user exists
 | ||
|  |         IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
 | ||
|  |             SET p_success = FALSE;
 | ||
|  |             SET p_message = 'User not found';
 | ||
|  |         ELSE
 | ||
|  |             -- Deactivate user
 | ||
|  |             UPDATE users SET
 | ||
|  |                 is_active = FALSE,
 | ||
|  |                 updated_at = NOW()
 | ||
|  |             WHERE id = p_user_id;
 | ||
|  |             
 | ||
|  |             SET p_success = TRUE;
 | ||
|  |             SET p_message = 'User deactivated successfully';
 | ||
|  |         END IF;
 | ||
|  |     END IF;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP PROCEDURE IF EXISTS `get_system_statistics` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` PROCEDURE `get_system_statistics`(
 | ||
|  |     IN p_admin_id VARCHAR(36),
 | ||
|  |     OUT p_success BOOLEAN,
 | ||
|  |     OUT p_message VARCHAR(255),
 | ||
|  |     OUT p_statistics JSON
 | ||
|  | )
 | ||
|  | BEGIN
 | ||
|  |     DECLARE v_total_users INT DEFAULT 0;
 | ||
|  |     DECLARE v_active_users INT DEFAULT 0;
 | ||
|  |     DECLARE v_total_jobs INT DEFAULT 0;
 | ||
|  |     DECLARE v_total_interviews INT DEFAULT 0;
 | ||
|  |     DECLARE v_total_tokens_purchased INT DEFAULT 0;
 | ||
|  |     DECLARE v_total_tokens_used INT DEFAULT 0;
 | ||
|  |     DECLARE v_total_revenue DECIMAL(10,2) DEFAULT 0;
 | ||
|  |     
 | ||
|  |     DECLARE EXIT HANDLER FOR SQLEXCEPTION
 | ||
|  |     BEGIN
 | ||
|  |         ROLLBACK;
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'An error occurred while getting statistics';
 | ||
|  |     END;
 | ||
|  |     
 | ||
|  |     -- Check if admin
 | ||
|  |     IF NOT is_admin(p_admin_id) THEN
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'Access denied: Admin privileges required';
 | ||
|  |     ELSE
 | ||
|  |         -- Get statistics
 | ||
|  |         SELECT COUNT(*) INTO v_total_users FROM users WHERE deleted_at IS NULL;
 | ||
|  |         SELECT COUNT(*) INTO v_active_users FROM users WHERE is_active = TRUE AND deleted_at IS NULL;
 | ||
|  |         SELECT COALESCE(SUM(jobs_created), 0) INTO v_total_jobs FROM user_usage;
 | ||
|  |         SELECT COALESCE(SUM(interviews_completed), 0) INTO v_total_interviews FROM user_usage;
 | ||
|  |         SELECT COALESCE(SUM(tokens_purchased), 0) INTO v_total_tokens_purchased FROM user_usage;
 | ||
|  |         SELECT COALESCE(SUM(tokens_used), 0) INTO v_total_tokens_used FROM user_usage;
 | ||
|  |         SELECT COALESCE(SUM(amount), 0) INTO v_total_revenue FROM payment_records WHERE status = 'paid';
 | ||
|  |         
 | ||
|  |         -- Build statistics JSON
 | ||
|  |         SET p_statistics = JSON_OBJECT(
 | ||
|  |             'total_users', v_total_users,
 | ||
|  |             'active_users', v_active_users,
 | ||
|  |             'total_jobs', v_total_jobs,
 | ||
|  |             'total_interviews', v_total_interviews,
 | ||
|  |             'total_tokens_purchased', v_total_tokens_purchased,
 | ||
|  |             'total_tokens_used', v_total_tokens_used,
 | ||
|  |             'total_revenue', v_total_revenue,
 | ||
|  |             'generated_at', NOW()
 | ||
|  |         );
 | ||
|  |         
 | ||
|  |         SET p_success = TRUE;
 | ||
|  |         SET p_message = 'Statistics retrieved successfully';
 | ||
|  |     END IF;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!50003 DROP PROCEDURE IF EXISTS `update_user` */;
 | ||
|  | /*!50003 SET @saved_cs_client      = @@character_set_client */ ;
 | ||
|  | /*!50003 SET @saved_cs_results     = @@character_set_results */ ;
 | ||
|  | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
 | ||
|  | /*!50003 SET character_set_client  = utf8mb4 */ ;
 | ||
|  | /*!50003 SET character_set_results = utf8mb4 */ ;
 | ||
|  | /*!50003 SET collation_connection  = utf8mb4_0900_ai_ci */ ;
 | ||
|  | /*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
 | ||
|  | /*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ;
 | ||
|  | DELIMITER ;;
 | ||
|  | CREATE DEFINER=`root`@`localhost` PROCEDURE `update_user`(
 | ||
|  |     IN p_user_id VARCHAR(36),
 | ||
|  |     IN p_email VARCHAR(255),
 | ||
|  |     IN p_first_name VARCHAR(100),
 | ||
|  |     IN p_last_name VARCHAR(100),
 | ||
|  |     IN p_role ENUM('admin', 'recruiter'),
 | ||
|  |     IN p_company_name VARCHAR(255),
 | ||
|  |     IN p_is_active BOOLEAN,
 | ||
|  |     IN p_admin_id VARCHAR(36),
 | ||
|  |     OUT p_success BOOLEAN,
 | ||
|  |     OUT p_message VARCHAR(255)
 | ||
|  | )
 | ||
|  | BEGIN
 | ||
|  |     DECLARE EXIT HANDLER FOR SQLEXCEPTION
 | ||
|  |     BEGIN
 | ||
|  |         ROLLBACK;
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'An error occurred while updating user';
 | ||
|  |     END;
 | ||
|  |     
 | ||
|  |     -- Check if admin
 | ||
|  |     IF NOT is_admin(p_admin_id) THEN
 | ||
|  |         SET p_success = FALSE;
 | ||
|  |         SET p_message = 'Access denied: Admin privileges required';
 | ||
|  |     ELSE
 | ||
|  |         -- Check if user exists
 | ||
|  |         IF NOT EXISTS (SELECT 1 FROM users WHERE id = p_user_id AND deleted_at IS NULL) THEN
 | ||
|  |             SET p_success = FALSE;
 | ||
|  |             SET p_message = 'User not found';
 | ||
|  |         ELSE
 | ||
|  |             -- Update user
 | ||
|  |             UPDATE users SET
 | ||
|  |                 email = p_email,
 | ||
|  |                 first_name = p_first_name,
 | ||
|  |                 last_name = p_last_name,
 | ||
|  |                 role = p_role,
 | ||
|  |                 company_name = p_company_name,
 | ||
|  |                 is_active = p_is_active,
 | ||
|  |                 updated_at = NOW()
 | ||
|  |             WHERE id = p_user_id;
 | ||
|  |             
 | ||
|  |             SET p_success = TRUE;
 | ||
|  |             SET p_message = 'User updated successfully';
 | ||
|  |         END IF;
 | ||
|  |     END IF;
 | ||
|  | END ;;
 | ||
|  | DELIMITER ;
 | ||
|  | /*!50003 SET sql_mode              = @saved_sql_mode */ ;
 | ||
|  | /*!50003 SET character_set_client  = @saved_cs_client */ ;
 | ||
|  | /*!50003 SET character_set_results = @saved_cs_results */ ;
 | ||
|  | /*!50003 SET collation_connection  = @saved_col_connection */ ;
 | ||
|  | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 | ||
|  | 
 | ||
|  | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 | ||
|  | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
 | ||
|  | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
 | ||
|  | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 | ||
|  | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
 | ||
|  | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 | ||
|  | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 | ||
|  | 
 | ||
|  | -- Dump completed on 2025-09-16 20:22:32
 |