# PRÉPARATION PRODUCTION - Process Email Queue + Permissions Suppression Passages

## 📅 Date de mise en production prévue : _____________

## 🎯 Objectif
1. Mettre en place le système de traitement automatique de la queue d'emails pour l'envoi des reçus fiscaux de dons.
2. Ajouter le champ de permission pour autoriser les membres à supprimer des passages.

## ✅ Prérequis
- [ ] Backup de la base de données effectué
- [ ] Accès SSH au serveur PROD
- [ ] Accès à la base de données PROD
- [ ] Droits pour éditer le crontab

## 📝 Fichiers à déployer
Les fichiers suivants doivent être présents sur le serveur PROD :
- `/scripts/cron/process_email_queue.php`
- `/scripts/cron/process_email_queue_with_daily_log.sh`
- `/scripts/cron/test_email_queue.php`
- `/src/Services/ReceiptPDFGenerator.php` (nouveau)
- `/src/Services/ReceiptService.php` (mis à jour)
- `/src/Core/MonitoredDatabase.php` (mis à jour)
- `/src/Controllers/EntiteController.php` (mis à jour)
- `/src/Controllers/LoginController.php` (mis à jour)
- `/scripts/sql/add_chk_user_delete_pass.sql` (nouveau)

---

## 🔧 ÉTAPES DE MISE EN PRODUCTION

### 1️⃣ Mise à jour de la base de données

Se connecter à la base de données PROD et exécuter :

```sql
-- Vérifier d'abord la structure actuelle de email_queue
DESCRIBE email_queue;

-- Ajouter les champs manquants pour email_queue si nécessaire
ALTER TABLE `email_queue` 
ADD COLUMN IF NOT EXISTS `sent_at` TIMESTAMP NULL DEFAULT NULL 
COMMENT 'Date/heure d\'envoi effectif de l\'email'
AFTER `status`;

ALTER TABLE `email_queue` 
ADD COLUMN IF NOT EXISTS `error_message` TEXT NULL DEFAULT NULL 
COMMENT 'Message d\'erreur en cas d\'échec'
AFTER `attempts`;

-- Ajouter les index pour optimiser les performances
ALTER TABLE `email_queue` 
ADD INDEX IF NOT EXISTS `idx_status_attempts` (`status`, `attempts`);

ALTER TABLE `email_queue` 
ADD INDEX IF NOT EXISTS `idx_sent_at` (`sent_at`);

-- Vérifier les modifications email_queue
DESCRIBE email_queue;

-- ⚠️ IMPORTANT : Ajouter le nouveau champ chk_user_delete_pass dans entites
source /var/www/geosector/api/scripts/sql/add_chk_user_delete_pass.sql;
```

### 2️⃣ Test du script avant mise en production

```bash
# Se connecter au serveur PROD
ssh user@prod-server

# Aller dans le répertoire de l'API
cd /var/www/geosector/api

# Rendre les scripts exécutables
chmod +x scripts/cron/process_email_queue.php
chmod +x scripts/cron/test_email_queue.php

# Tester l'état de la queue (lecture seule)
php scripts/cron/test_email_queue.php

# Si tout est OK, faire un test d'envoi sur 1 email
# (modifier temporairement BATCH_SIZE à 1 dans le script si nécessaire)
php scripts/cron/process_email_queue.php
```

### 3️⃣ Configuration du CRON avec logs journaliers

```bash
# Rendre le script wrapper exécutable
chmod +x /var/www/geosector/api/scripts/cron/process_email_queue_with_daily_log.sh

# Éditer le crontab
crontab -e

# Ajouter cette ligne pour exécution toutes les 5 minutes avec logs journaliers
*/5 * * * * /var/www/geosector/api/scripts/cron/process_email_queue_with_daily_log.sh

# Sauvegarder et quitter (:wq sous vi/vim)

# Vérifier que le cron est bien enregistré
crontab -l | grep email_queue

# Vérifier que le service cron est actif
systemctl status cron
```

**Note** : Les logs seront créés automatiquement dans `/var/www/geosector/api/logs/` avec le format : `email_queue_20250820.log`, `email_queue_20250821.log`, etc. Les logs de plus de 30 jours sont supprimés automatiquement.

### 4️⃣ Surveillance post-déploiement

Pendant les premières heures après la mise en production :

```bash
# Surveiller les logs en temps réel (fichier du jour)
tail -f /var/www/geosector/api/logs/email_queue_$(date +%Y%m%d).log

# Vérifier le statut de la queue
php scripts/cron/test_email_queue.php

# Compter les emails traités
mysql -u geo_app_user_prod -p geo_app -e "
SELECT status, COUNT(*) as count 
FROM email_queue 
WHERE DATE(created_at) = CURDATE() 
GROUP BY status;"

# Vérifier les erreurs éventuelles
mysql -u geo_app_user_prod -p geo_app -e "
SELECT id, to_email, subject, attempts, error_message 
FROM email_queue 
WHERE status='failed' 
ORDER BY created_at DESC 
LIMIT 10;"
```

---

## 🚨 ROLLBACK (si nécessaire)

En cas de problème, voici comment revenir en arrière :

```bash
# 1. Stopper le cron
crontab -e
# Commenter la ligne du process_email_queue

# 2. Marquer les emails en attente pour traitement manuel
mysql -u geo_app_user_prod -p geo_app -e "
UPDATE email_queue 
SET status='pending', attempts=0 
WHERE status='failed' AND DATE(created_at) = CURDATE();"

# 3. Informer l'équipe pour traitement manuel si nécessaire
```

---

## 📊 VALIDATION POST-DÉPLOIEMENT

### Critères de succès :
- [ ] Aucune erreur dans les logs
- [ ] Les emails sont envoyés dans les 5 minutes
- [ ] Les reçus PDF sont correctement attachés
- [ ] Le champ `date_sent_recu` est mis à jour dans `ope_pass`
- [ ] Pas d'accumulation d'emails en status 'pending'

### Commandes de vérification :

```bash
# Statistiques générales
mysql -u geo_app_user_prod -p geo_app -e "
SELECT 
    status,
    COUNT(*) as count,
    MIN(created_at) as oldest,
    MAX(created_at) as newest
FROM email_queue
GROUP BY status;"

# Vérifier les passages avec reçus envoyés aujourd'hui
mysql -u geo_app_user_prod -p geo_app -e "
SELECT COUNT(*) as recus_envoyes_aujourdhui
FROM ope_pass
WHERE DATE(date_sent_recu) = CURDATE();"

# Performance du cron (dernières exécutions du jour)
tail -20 /var/www/geosector/api/logs/email_queue_$(date +%Y%m%d).log | grep "Traitement terminé"
```

---

## 📞 CONTACTS EN CAS DE PROBLÈME

- **Responsable technique** : _____________
- **DBA** : _____________
- **Support O2Switch** : support@o2switch.fr

---

## 📋 NOTES IMPORTANTES

1. **Limite d'envoi** : 1500 emails/heure max (limite O2Switch)
2. **Batch size** : 50 emails par exécution (toutes les 5 min = 600/heure max)
3. **Lock file** : `/tmp/process_email_queue.lock` empêche l'exécution simultanée
4. **Nettoyage auto** : Les emails envoyés > 30 jours sont supprimés automatiquement

## 🔒 SÉCURITÉ

- Les mots de passe SMTP ne sont jamais loggués
- Les emails en erreur conservent le message d'erreur pour diagnostic
- Le PDF est envoyé en pièce jointe encodée en base64

---

## ✅ CHECKLIST FINALE

### Email Queue :
- [ ] Table email_queue mise à jour (sent_at, error_message, index)
- [ ] Scripts cron testés avec succès
- [ ] Cron configuré et actif
- [ ] Logs accessibles et fonctionnels
- [ ] Premier batch d'emails envoyé avec succès

### Permissions Suppression Passages :
- [ ] Champ chk_user_delete_pass ajouté dans la table entites
- [ ] EntiteController.php mis à jour pour gérer le nouveau champ
- [ ] LoginController.php mis à jour pour retourner le champ dans amicale
- [ ] Test de modification de permissions via l'interface admin

### Général :
- [ ] Documentation mise à jour
- [ ] Équipe informée de la mise en production

---

**Date de mise en production** : _______________
**Validé par** : _______________
**Signature** : _______________