feat: Version 3.5.2 - Configuration Stripe et gestion des immeubles

- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD)
  * DEV: Clés TEST Pierre (mode test)
  * REC: Clés TEST Client (mode test)
  * PROD: Clés LIVE Client (mode live)
- Ajout de la gestion des bases de données immeubles/bâtiments
  * Configuration buildings_database pour DEV/REC/PROD
  * Service BuildingService pour enrichissement des adresses
- Optimisations pages et améliorations ergonomie
- Mises à jour des dépendances Composer
- Nettoyage des fichiers obsolètes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
pierre
2025-11-09 18:26:27 +01:00
parent 21657a3820
commit 2f5946a184
812 changed files with 142105 additions and 25992 deletions

View File

@@ -0,0 +1,34 @@
-- ========================================
-- Script SIMPLE d'ajout de contraintes UNIQUE
-- Pour tables avec peu de données (pas de suppression de doublons)
-- Date: 2025-10-10
-- ========================================
USE pra_geo;
-- Vérifier d'abord s'il y a des doublons
SELECT 'Vérification doublons ope_users...' as status;
SELECT fk_operation, fk_user, COUNT(*) as count
FROM ope_users
GROUP BY fk_operation, fk_user
HAVING count > 1;
SELECT 'Vérification doublons ope_users_sectors...' as status;
SELECT fk_operation, fk_user, fk_sector, COUNT(*) as count
FROM ope_users_sectors
GROUP BY fk_operation, fk_user, fk_sector
HAVING count > 1;
-- Ajouter les contraintes UNIQUE directement
-- Si des doublons existent, MySQL retournera une erreur explicite
ALTER TABLE ope_users
ADD UNIQUE KEY `idx_operation_user` (`fk_operation`, `fk_user`);
ALTER TABLE ope_users_sectors
ADD UNIQUE KEY `idx_operation_user_sector` (`fk_operation`, `fk_user`, `fk_sector`);
-- Vérification
SHOW INDEX FROM ope_users WHERE Key_name = 'idx_operation_user';
SHOW INDEX FROM ope_users_sectors WHERE Key_name = 'idx_operation_user_sector';
SELECT 'TERMINÉ ✓' as status;

View File

@@ -0,0 +1,59 @@
-- ========================================
-- Script d'ajout de contraintes UNIQUE
-- Pour éviter les doublons dans ope_users et ope_users_sectors
-- Date: 2025-10-10
-- ========================================
USE pra_geo;
-- ========================================
-- 1. TABLE ope_users
-- ========================================
-- Vérifier et supprimer les doublons existants avant d'ajouter la contrainte
-- (Garde la première occurrence, supprime les duplicatas)
DELETE ou1 FROM ope_users ou1
INNER JOIN ope_users ou2
WHERE ou1.id > ou2.id
AND ou1.fk_operation = ou2.fk_operation
AND ou1.fk_user = ou2.fk_user;
-- Ajouter la contrainte UNIQUE sur (fk_operation, fk_user)
ALTER TABLE ope_users
ADD UNIQUE KEY `idx_operation_user` (`fk_operation`, `fk_user`);
-- ========================================
-- 2. TABLE ope_users_sectors
-- ========================================
-- Vérifier et supprimer les doublons existants avant d'ajouter la contrainte
-- (Garde la première occurrence, supprime les duplicatas)
DELETE ous1 FROM ope_users_sectors ous1
INNER JOIN ope_users_sectors ous2
WHERE ous1.id > ous2.id
AND ous1.fk_operation = ous2.fk_operation
AND ous1.fk_user = ous2.fk_user
AND ous1.fk_sector = ous2.fk_sector;
-- Ajouter la contrainte UNIQUE sur (fk_operation, fk_user, fk_sector)
ALTER TABLE ope_users_sectors
ADD UNIQUE KEY `idx_operation_user_sector` (`fk_operation`, `fk_user`, `fk_sector`);
-- ========================================
-- Vérification
-- ========================================
-- Vérifier les contraintes ajoutées
SHOW INDEX FROM ope_users WHERE Key_name = 'idx_operation_user';
SHOW INDEX FROM ope_users_sectors WHERE Key_name = 'idx_operation_user_sector';
-- Compter les doublons restants (devrait retourner 0 lignes)
SELECT fk_operation, fk_user, COUNT(*) as count
FROM ope_users
GROUP BY fk_operation, fk_user
HAVING count > 1;
SELECT fk_operation, fk_user, fk_sector, COUNT(*) as count
FROM ope_users_sectors
GROUP BY fk_operation, fk_user, fk_sector
HAVING count > 1;

View File

@@ -0,0 +1,70 @@
-- ========================================
-- Script OPTIMISÉ d'ajout de contraintes UNIQUE
-- Pour tables avec beaucoup de données
-- Date: 2025-10-10
-- ========================================
USE pra_geo;
-- ========================================
-- OPTION 1 : Compter les doublons d'abord
-- ========================================
SELECT 'Analyse des doublons dans ope_users...' as status;
SELECT COUNT(*) as total_rows,
COUNT(DISTINCT fk_operation, fk_user) as unique_combinations,
COUNT(*) - COUNT(DISTINCT fk_operation, fk_user) as duplicates
FROM ope_users;
SELECT 'Analyse des doublons dans ope_users_sectors...' as status;
SELECT COUNT(*) as total_rows,
COUNT(DISTINCT fk_operation, fk_user, fk_sector) as unique_combinations,
COUNT(*) - COUNT(DISTINCT fk_operation, fk_user, fk_sector) as duplicates
FROM ope_users_sectors;
-- ========================================
-- OPTION 2 : Supprimer RAPIDEMENT les doublons
-- Créer une table temporaire avec les IDs à garder
-- ========================================
-- Pour ope_users
CREATE TEMPORARY TABLE ope_users_to_keep AS
SELECT MIN(id) as id_to_keep, fk_operation, fk_user
FROM ope_users
GROUP BY fk_operation, fk_user;
-- Supprimer tous les doublons (plus rapide avec NOT IN + subquery)
DELETE FROM ope_users
WHERE id NOT IN (SELECT id_to_keep FROM ope_users_to_keep);
DROP TEMPORARY TABLE ope_users_to_keep;
-- Pour ope_users_sectors
CREATE TEMPORARY TABLE ope_users_sectors_to_keep AS
SELECT MIN(id) as id_to_keep, fk_operation, fk_user, fk_sector
FROM ope_users_sectors
GROUP BY fk_operation, fk_user, fk_sector;
DELETE FROM ope_users_sectors
WHERE id NOT IN (SELECT id_to_keep FROM ope_users_sectors_to_keep);
DROP TEMPORARY TABLE ope_users_sectors_to_keep;
-- ========================================
-- OPTION 3 : Ajouter les contraintes UNIQUE
-- ========================================
ALTER TABLE ope_users
ADD UNIQUE KEY `idx_operation_user` (`fk_operation`, `fk_user`);
ALTER TABLE ope_users_sectors
ADD UNIQUE KEY `idx_operation_user_sector` (`fk_operation`, `fk_user`, `fk_sector`);
-- ========================================
-- Vérification finale
-- ========================================
SHOW INDEX FROM ope_users WHERE Key_name = 'idx_operation_user';
SHOW INDEX FROM ope_users_sectors WHERE Key_name = 'idx_operation_user_sector';
SELECT 'TERMINÉ - Contraintes UNIQUE ajoutées avec succès' as status;

View File

@@ -0,0 +1,181 @@
-- =========================================================
-- Script de vidage des tables de données (PRODUCTION)
-- Option B : Vider TOUTES les tables SAUF x_* et entité 1
-- Conserve les tables de référence x_*
-- Conserve l'entité id=1 (super admins) et ses users/opérations
-- Date: 2025-10-09
-- =========================================================
-- Désactiver les contraintes de clés étrangères temporairement
SET FOREIGN_KEY_CHECKS = 0;
-- =========================================================
-- TABLES CHAT
-- =========================================================
TRUNCATE TABLE chat_read_receipts;
TRUNCATE TABLE chat_messages;
TRUNCATE TABLE chat_participants;
TRUNCATE TABLE chat_rooms;
-- =========================================================
-- TABLES EMAIL
-- =========================================================
TRUNCATE TABLE email_queue;
TRUNCATE TABLE email_counter;
-- =========================================================
-- TABLES SÉCURITÉ
-- =========================================================
TRUNCATE TABLE sec_failed_login_attempts;
TRUNCATE TABLE sec_blocked_ips;
TRUNCATE TABLE sec_alerts;
TRUNCATE TABLE sec_performance_metrics;
-- =========================================================
-- TABLES STRIPE
-- =========================================================
TRUNCATE TABLE stripe_webhooks;
TRUNCATE TABLE stripe_payment_history;
TRUNCATE TABLE stripe_refunds;
TRUNCATE TABLE stripe_terminal_readers;
TRUNCATE TABLE stripe_android_certified_devices;
-- NOTE: stripe_accounts conservé car lié à entites via FK
-- =========================================================
-- TABLES DONNÉES MÉTIER (conserver entité 1)
-- =========================================================
-- 1. Supprimer les devices des users (sauf entité 1)
DELETE FROM user_devices
WHERE fk_user IN (SELECT id FROM users WHERE fk_entite != 1);
-- 2. Supprimer les sessions (sauf users entité 1)
DELETE FROM z_sessions
WHERE fk_user IN (SELECT id FROM users WHERE fk_entite != 1);
-- 3. Supprimer les médias (sauf entité 1)
DELETE FROM medias WHERE fk_entite != 1;
-- 4. Supprimer les comptes Stripe (sauf entité 1)
DELETE FROM stripe_accounts WHERE fk_entite != 1;
-- 5. Supprimer l'historique des passages (sauf entité 1)
DELETE FROM ope_pass_histo
WHERE fk_pass IN (
SELECT id FROM ope_pass
WHERE fk_operation IN (
SELECT id FROM operations WHERE fk_entite != 1
)
);
-- 6. Supprimer les passages (sauf ceux des opérations de l'entité 1)
DELETE FROM ope_pass
WHERE fk_operation IN (
SELECT id FROM operations WHERE fk_entite != 1
);
-- 7. Supprimer les associations users-sectors (sauf entité 1)
DELETE FROM ope_users_sectors
WHERE fk_operation IN (
SELECT id FROM operations WHERE fk_entite != 1
);
-- 8. Supprimer les associations users-operations (sauf entité 1)
DELETE FROM ope_users
WHERE fk_operation IN (
SELECT id FROM operations WHERE fk_entite != 1
);
-- 9. Supprimer les adresses de secteurs (sauf entité 1)
DELETE FROM sectors_adresses
WHERE fk_sector IN (
SELECT id FROM ope_sectors WHERE fk_operation IN (
SELECT id FROM operations WHERE fk_entite != 1
)
);
-- 10. Supprimer les secteurs (sauf ceux de l'entité 1)
DELETE FROM ope_sectors
WHERE fk_operation IN (
SELECT id FROM operations WHERE fk_entite != 1
);
-- 11. Supprimer les opérations (sauf celles de l'entité 1)
DELETE FROM operations WHERE fk_entite != 1;
-- 12. Supprimer les utilisateurs (sauf ceux de l'entité 1)
DELETE FROM users WHERE fk_entite != 1;
-- 13. Supprimer les entités (sauf l'entité 1)
DELETE FROM entites WHERE id != 1;
-- 14. Vider la table params (paramètres globaux)
TRUNCATE TABLE params;
-- Réactiver les contraintes de clés étrangères
SET FOREIGN_KEY_CHECKS = 1;
-- =========================================================
-- VÉRIFICATIONS POST-VIDAGE
-- =========================================================
SELECT '========================================' as '';
SELECT '=== TABLES DE DONNÉES (après vidage) ===' as '';
SELECT '========================================' as '';
SELECT 'entites' as table_name, COUNT(*) as count FROM entites
UNION ALL SELECT 'users', COUNT(*) FROM users
UNION ALL SELECT 'operations', COUNT(*) FROM operations
UNION ALL SELECT 'ope_sectors', COUNT(*) FROM ope_sectors
UNION ALL SELECT 'ope_pass', COUNT(*) FROM ope_pass
UNION ALL SELECT 'medias', COUNT(*) FROM medias
UNION ALL SELECT 'user_devices', COUNT(*) FROM user_devices
UNION ALL SELECT 'z_sessions', COUNT(*) FROM z_sessions;
SELECT '' as '';
SELECT '========================================' as '';
SELECT '=== TABLES CHAT (doivent être vides) ===' as '';
SELECT '========================================' as '';
SELECT 'chat_rooms' as table_name, COUNT(*) as count FROM chat_rooms
UNION ALL SELECT 'chat_messages', COUNT(*) FROM chat_messages
UNION ALL SELECT 'chat_participants', COUNT(*) FROM chat_participants
UNION ALL SELECT 'chat_read_receipts', COUNT(*) FROM chat_read_receipts;
SELECT '' as '';
SELECT '========================================' as '';
SELECT '=== TABLES STRIPE (vides sauf accounts) ===' as '';
SELECT '========================================' as '';
SELECT 'stripe_accounts' as table_name, COUNT(*) as count FROM stripe_accounts
UNION ALL SELECT 'stripe_webhooks', COUNT(*) FROM stripe_webhooks
UNION ALL SELECT 'stripe_terminal_readers', COUNT(*) FROM stripe_terminal_readers
UNION ALL SELECT 'stripe_android_certified_devices', COUNT(*) FROM stripe_android_certified_devices;
SELECT '' as '';
SELECT '========================================' as '';
SELECT '=== ENTITÉ 1 (doit être conservée) ===' as '';
SELECT '========================================' as '';
SELECT id, encrypted_name, encrypted_email, chk_active FROM entites WHERE id = 1;
SELECT '' as '';
SELECT 'Nombre de users entité 1:' as info, COUNT(*) as count FROM users WHERE fk_entite = 1;
SELECT 'Nombre d\'opérations entité 1:' as info, COUNT(*) as count FROM operations WHERE fk_entite = 1;
SELECT '' as '';
SELECT '========================================' as '';
SELECT '=== TABLES x_* (doivent être remplies) ===' as '';
SELECT '========================================' as '';
SELECT 'x_devises' as table_name, COUNT(*) as count FROM x_devises
UNION ALL SELECT 'x_pays', COUNT(*) FROM x_pays
UNION ALL SELECT 'x_regions', COUNT(*) FROM x_regions
UNION ALL SELECT 'x_departements', COUNT(*) FROM x_departements
UNION ALL SELECT 'x_villes', COUNT(*) FROM x_villes
UNION ALL SELECT 'x_departements_contours', COUNT(*) FROM x_departements_contours
UNION ALL SELECT 'x_entites_types', COUNT(*) FROM x_entites_types
UNION ALL SELECT 'x_types_passages', COUNT(*) FROM x_types_passages
UNION ALL SELECT 'x_types_reglements', COUNT(*) FROM x_types_reglements
UNION ALL SELECT 'x_users_roles', COUNT(*) FROM x_users_roles
UNION ALL SELECT 'x_users_titres', COUNT(*) FROM x_users_titres;