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