CIA/e-voting-system/docker/populate_past_elections.sql
E-Voting Developer 8baabf528c feat: Implement Historique and Upcoming Votes pages with styling and data fetching
- Added HistoriquePage component to display user's voting history with detailed statistics and vote cards.
- Created UpcomingVotesPage component to show upcoming elections with a similar layout.
- Developed CSS styles for both pages to enhance visual appeal and responsiveness.
- Integrated API calls to fetch user's votes and upcoming elections.
- Added a rebuild script for Docker environment setup and data restoration.
- Created a Python script to populate the database with sample data for testing.
2025-11-06 05:12:03 +01:00

421 lines
18 KiB
SQL

-- ================================================================
-- Population de la base de données avec élections passées
-- 10 élections passées avec ~600 utilisateurs et leurs votes
-- ================================================================
-- Désactiver les contraintes temporairement
SET FOREIGN_KEY_CHECKS=0;
-- ================================================================
-- 1. Créer les 10 élections passées
-- ================================================================
INSERT INTO elections (name, description, start_date, end_date, elgamal_p, elgamal_g, is_active, results_published)
VALUES
('Présidentielle 2020', 'Election présidentielle - Tour 1', '2020-04-10 08:00:00', '2020-04-10 20:00:00', 23, 5, FALSE, TRUE),
('Législatives 2020', 'Elections législatives nationales', '2020-06-07 08:00:00', '2020-06-07 19:00:00', 23, 5, FALSE, TRUE),
('Européennes 2019', 'Elections au Parlement européen', '2019-05-26 08:00:00', '2019-05-26 20:00:00', 23, 5, FALSE, TRUE),
('Régionales 2021', 'Elections régionales et départementales', '2021-06-20 08:00:00', '2021-06-20 20:00:00', 23, 5, FALSE, TRUE),
('Municipales 2020', 'Elections municipales', '2020-03-15 08:00:00', '2020-03-15 19:00:00', 23, 5, FALSE, TRUE),
('Référendum 2022', 'Référendum constitutionnel', '2022-09-04 08:00:00', '2022-09-04 20:00:00', 23, 5, FALSE, TRUE),
('Sénatoriales 2020', 'Election du Sénat', '2020-09-27 08:00:00', '2020-09-27 19:00:00', 23, 5, FALSE, TRUE),
('Présidentielle 2022', 'Election présidentielle - 2022', '2022-04-10 08:00:00', '2022-04-10 20:00:00', 23, 5, FALSE, TRUE),
('Locales 2023', 'Elections locales complémentaires', '2023-02-12 08:00:00', '2023-02-12 19:00:00', 23, 5, FALSE, TRUE),
('Référendum 2023', 'Référendum sur la réforme', '2023-07-09 08:00:00', '2023-07-09 20:00:00', 23, 5, FALSE, TRUE);
-- ================================================================
-- 2. Créer des candidats simples pour chaque élection (3-5 par élection)
-- ================================================================
-- Election 1: Présidentielle 2020
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(1, 'Candidat A', 'Parti de gauche', 1),
(1, 'Candidat B', 'Parti de centre', 2),
(1, 'Candidat C', 'Parti de droite', 3),
(1, 'Candidat D', 'Parti écologiste', 4);
-- Election 2: Législatives 2020
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(2, 'Liste 1', 'Coalition de gauche', 1),
(2, 'Liste 2', 'Majorité sortante', 2),
(2, 'Liste 3', 'Opposition', 3);
-- Election 3: Européennes 2019
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(3, 'Liste PS', 'Socialistes', 1),
(3, 'Liste LREM', 'Libéraux', 2),
(3, 'Liste LR', 'Conservateurs', 3),
(3, 'Liste Verts', 'Écologistes', 4),
(3, 'Liste RN', 'Populistes', 5);
-- Election 4: Régionales 2021
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(4, 'Région 1 - Liste A', 'Sortante', 1),
(4, 'Région 1 - Liste B', 'Opposition', 2),
(4, 'Région 1 - Liste C', 'Alternative', 3);
-- Election 5: Municipales 2020
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(5, 'Ville - Liste Sortante', 'Équipe en place', 1),
(5, 'Ville - Liste A', 'Opposition', 2),
(5, 'Ville - Liste B', 'Alternatif', 3);
-- Election 6: Référendum 2022
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(6, 'OUI', 'Pour la réforme', 1),
(6, 'NON', 'Contre la réforme', 2);
-- Election 7: Sénatoriales 2020
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(7, 'Sénateur 1', 'Parti A', 1),
(7, 'Sénateur 2', 'Parti B', 2),
(7, 'Sénateur 3', 'Parti C', 3);
-- Election 8: Présidentielle 2022
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(8, 'Sortant', 'Président sortant', 1),
(8, 'Challenger 1', 'Candidat A', 2),
(8, 'Challenger 2', 'Candidat B', 3),
(8, 'Challenger 3', 'Candidat C', 4);
-- Election 9: Locales 2023
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(9, 'Commune A', 'Liste 1', 1),
(9, 'Commune A', 'Liste 2', 2);
-- Election 10: Référendum 2023
INSERT INTO candidates (election_id, name, description, `order`)
VALUES
(10, 'OUI', 'Approbation', 1),
(10, 'NON', 'Rejet', 2),
(10, 'BLANC', 'Vote blanc', 3);
-- ================================================================
-- 3. Créer ~600 utilisateurs et leurs votes
-- ================================================================
-- Utilisateurs pour l'élection 1 (100 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e1_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election1_', seq.id) as last_name,
CONCAT('CNI_E1_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2020-04-10 20:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
(SELECT 0 UNION SELECT 1) t4,
(SELECT @row:=-1) t0
) seq
WHERE seq.id < 100;
-- Utilisateurs pour l'élection 2 (100 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e2_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election2_', seq.id) as last_name,
CONCAT('CNI_E2_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2020-06-07 19:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
(SELECT 0 UNION SELECT 1) t4,
(SELECT @row:=99) t0
) seq
WHERE seq.id < 200;
-- Utilisateurs pour l'élection 3 (100 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e3_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election3_', seq.id) as last_name,
CONCAT('CNI_E3_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2019-05-26 20:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
(SELECT 0 UNION SELECT 1) t4,
(SELECT @row:=199) t0
) seq
WHERE seq.id < 300;
-- Utilisateurs pour l'élection 4 (100 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e4_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election4_', seq.id) as last_name,
CONCAT('CNI_E4_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2021-06-20 20:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
(SELECT 0 UNION SELECT 1) t4,
(SELECT @row:=299) t0
) seq
WHERE seq.id < 400;
-- Utilisateurs pour l'élection 5 (100 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e5_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election5_', seq.id) as last_name,
CONCAT('CNI_E5_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2020-03-15 19:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
(SELECT 0 UNION SELECT 1) t4,
(SELECT @row:=399) t0
) seq
WHERE seq.id < 500;
-- Utilisateurs pour l'élection 6 (60 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e6_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election6_', seq.id) as last_name,
CONCAT('CNI_E6_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2022-09-04 20:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 0 UNION SELECT 1 UNION SELECT 2) t3,
(SELECT @row:=499) t0
) seq
WHERE seq.id < 560;
-- Utilisateurs pour l'élection 7 (50 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e7_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election7_', seq.id) as last_name,
CONCAT('CNI_E7_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2020-09-27 19:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2) t2,
(SELECT @row:=559) t0
) seq
WHERE seq.id < 610;
-- Utilisateurs pour l'élection 8 (50 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e8_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election8_', seq.id) as last_name,
CONCAT('CNI_E8_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2022-04-10 20:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2) t2,
(SELECT @row:=609) t0
) seq
WHERE seq.id < 660;
-- Utilisateurs pour l'élection 9 (50 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e9_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election9_', seq.id) as last_name,
CONCAT('CNI_E9_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2023-02-12 19:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2) t2,
(SELECT @row:=659) t0
) seq
WHERE seq.id < 710;
-- Utilisateurs pour l'élection 10 (50 utilisateurs)
INSERT INTO voters (email, password_hash, first_name, last_name, citizen_id, has_voted, created_at)
SELECT
CONCAT('user_e10_', LPAD(seq.id, 3, '0'), '@voting.local') as email,
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5EQzS4xjT/rYa' as password_hash,
CONCAT('FirstName', seq.id) as first_name,
CONCAT('Election10_', seq.id) as last_name,
CONCAT('CNI_E10_', LPAD(seq.id, 4, '0')) as citizen_id,
TRUE as has_voted,
DATE_SUB('2023-07-09 20:00:00', INTERVAL FLOOR(RAND() * 1000) MINUTE) as created_at
FROM (
SELECT @row := @row + 1 as id FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2) t2,
(SELECT @row:=709) t0
) seq
WHERE seq.id < 760;
-- ================================================================
-- 4. Créer les votes pour chaque utilisateur
-- ================================================================
-- Votes pour l'élection 1
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
1 as election_id,
(1 + (v.id % 4)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 1))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_1'), 256) as ballot_hash,
DATE_SUB('2020-04-10 20:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e1_%';
-- Votes pour l'élection 2
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
2 as election_id,
(5 + (v.id % 3)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 2))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_2'), 256) as ballot_hash,
DATE_SUB('2020-06-07 19:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e2_%';
-- Votes pour l'élection 3
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
3 as election_id,
(8 + (v.id % 5)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 3))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_3'), 256) as ballot_hash,
DATE_SUB('2019-05-26 20:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e3_%';
-- Votes pour l'élection 4
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
4 as election_id,
(13 + (v.id % 3)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 4))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_4'), 256) as ballot_hash,
DATE_SUB('2021-06-20 20:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e4_%';
-- Votes pour l'élection 5
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
5 as election_id,
(16 + (v.id % 3)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 5))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_5'), 256) as ballot_hash,
DATE_SUB('2020-03-15 19:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e5_%';
-- Votes pour l'élection 6
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
6 as election_id,
(19 + (v.id % 2)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 6))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_6'), 256) as ballot_hash,
DATE_SUB('2022-09-04 20:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e6_%';
-- Votes pour l'élection 7
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
7 as election_id,
(21 + (v.id % 3)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 7))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_7'), 256) as ballot_hash,
DATE_SUB('2020-09-27 19:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e7_%';
-- Votes pour l'élection 8
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
8 as election_id,
(24 + (v.id % 4)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 8))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_8'), 256) as ballot_hash,
DATE_SUB('2022-04-10 20:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e8_%';
-- Votes pour l'élection 9
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
9 as election_id,
(28 + (v.id % 2)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 9))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_9'), 256) as ballot_hash,
DATE_SUB('2023-02-12 19:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e9_%';
-- Votes pour l'élection 10
INSERT INTO votes (voter_id, election_id, candidate_id, encrypted_vote, ballot_hash, timestamp)
SELECT
v.id as voter_id,
10 as election_id,
(30 + (v.id % 3)) as candidate_id,
CONCAT('0x', MD5(CONCAT('vote_', v.id, '_', 10))) as encrypted_vote,
SHA2(CONCAT('ballot_', v.id, '_10'), 256) as ballot_hash,
DATE_SUB('2023-07-09 20:00:00', INTERVAL FLOOR(RAND() * 720) MINUTE) as timestamp
FROM voters v
WHERE v.email LIKE 'user_e10_%';
-- Réactiver les contraintes
SET FOREIGN_KEY_CHECKS=1;
-- ================================================================
-- Confirmation
-- ================================================================
SELECT 'Population complète!' as status;
SELECT COUNT(*) as total_voters FROM voters;
SELECT COUNT(*) as total_elections FROM elections;
SELECT COUNT(*) as total_votes FROM votes;