# Système de Backup - SaadikERP

## Vue d'ensemble

Le système de backup de SaadikERP permet de sauvegarder automatiquement les bases de données du module de comptabilité. Il offre deux modes de fonctionnement avec des options avancées :

1. **Backup Manuel** : Exécution immédiate d'un backup d'une base spécifique
2. **Backup Planifié** : Exécution automatique selon un planning défini

## 🆕 Nouvelles Fonctionnalités

### **Sélection de Base de Données**
- **Choix individuel** : Sauvegarde d'une seule base de données à la fois
- **Détection automatique** : Liste des bases récupérées depuis `of_accounts.db_database`
- **Informations détaillées** : Nombre de tables et description de chaque base

### **Emplacement de Backup**
- **Stockage local** : Sauvegarde dans le dossier `backups/comptabilite/`
- **Serveur distant** : Transfert automatique vers un serveur FTP/SFTP
- **Configuration flexible** : Support des protocoles FTP et SFTP

## Fonctionnalités

### Backup Manuel
- **Sélection de base** : Choisir une base de données spécifique
- **Options configurables** :
  - ☑️ Inclure la structure des tables
  - ☑️ Inclure les données
  - ☐ Compresser le backup (ZIP)
- **Emplacement** : Local ou serveur distant
- **Interface utilisateur** intuitive avec SweetAlert2

### Backup Planifié
- **Base de données** : Sélection d'une base spécifique
- **Planification flexible** :
  - **Quotidien** : Backup tous les jours à une heure spécifique
  - **Hebdomadaire** : Backup un jour spécifique de la semaine
  - **Mensuel** : Backup un jour spécifique du mois
- **Emplacement** : Local ou serveur distant configurable
- **Gestion de la rétention** des fichiers
- **Notifications par email** (optionnel)
- **Exécution automatique** via cron job

### Gestion des Backups
- **Historique complet** des backups effectués
- **Téléchargement** des fichiers de backup (local uniquement)
- **Suppression** des anciens backups
- **Logs détaillés** d'exécution
- **Suivi des backups distants** avec fichiers de référence

## Installation

### 1. Créer les tables de base de données

Exécutez le script SQL `create_backup_tables.sql` dans votre base de données principale (`saadikerp`) :

```sql
source create_backup_tables.sql;
```

**Note** : Les nouvelles colonnes `database_name`, `backup_location` et `remote_config` ont été ajoutées.

### 2. Créer le dossier de backup

Le système créera automatiquement les dossiers nécessaires :
- `backups/comptabilite/` : Backups locaux
- `backups/temp/` : Fichiers temporaires pour transferts distants

### 3. Configurer le cron job (pour les backups planifiés)

Ajoutez cette ligne à votre crontab pour exécuter le script toutes les 5 minutes :

```bash
# Éditer le crontab
crontab -e

# Ajouter cette ligne
*/5 * * * * /usr/bin/php /path/to/saadikERP_secured/cron_backup_scheduler.php
```

**Note** : Remplacez `/path/to/saadikERP_secured/` par le chemin réel vers votre installation.

## Utilisation

### Accès au système de backup

1. Connectez-vous à SaadikERP avec un compte administrateur
2. Accédez au module de comptabilité
3. Cliquez sur le bouton **"Backup Base de Données"** (icône base de données)

### Interface utilisateur

Le système de backup s'ouvre dans une modal avec trois onglets :

#### 1. Backup Manuel
- **Sélection de base** : Dropdown avec toutes les bases disponibles
- **Informations de la base** : Nom, description, nombre de tables
- **Options de backup** :
  - ☑️ Inclure la structure des tables
  - ☑️ Inclure les données
  - ☐ Compresser le backup (ZIP)
- **Emplacement** :
  - 🖥️ **Local** : Stockage dans le dossier local
  - 🌐 **Distant** : Configuration FTP/SFTP
- **Bouton** : "Lancer le Backup Maintenant"

#### 2. Backup Planifié
- **Base de données** : Sélection d'une base spécifique
- **Fréquence** : Quotidien, Hebdomadaire, Mensuel
- **Configuration** :
  - Heure de backup (format 24h)
  - Jour de la semaine (pour hebdomadaire)
  - Jour du mois (pour mensuel)
  - Rétention des backups (7, 30, 90, 365 jours)
  - Email de notification (optionnel)
- **Emplacement** : Local ou serveur distant avec configuration complète
- **Bouton** : "Enregistrer la Planification"

#### 3. Historique
- **Tableau des backups** :
  - Date de création
  - Type (manuel/planifié)
  - Base de données
  - Nombre de bases sauvegardées
  - Statut (succès/échec)
  - Actions (télécharger/supprimer)

## Configuration Serveur Distant

### Paramètres FTP/SFTP
- **Serveur** : Adresse du serveur (ex: ftp.example.com)
- **Nom d'utilisateur** : Identifiant de connexion
- **Mot de passe** : Mot de passe de connexion
- **Chemin distant** : Dossier de destination (ex: /backups/)
- **Port** : Port de connexion (21 pour FTP, 22 pour SFTP)
- **Protocole** : FTP ou SFTP (changement automatique du port)

### Sécurité
- **FTP** : Connexion en mode passif
- **SFTP** : Connexion SSH2 sécurisée
- **Validation** : Vérification des paramètres avant exécution

## Configuration technique

### Structure des bases de données

Le système détecte automatiquement les bases de données à sauvegarder en interrogeant la table `of_accounts` du module comptabilité :

```sql
SELECT DISTINCT db_database FROM of_accounts WHERE db_database IS NOT NULL AND db_database != '';
```

### Commandes mysqldump

Le système utilise `mysqldump` avec les options suivantes :
- `--complete-insert` : Inserts complets pour faciliter la restauration
- `--single-transaction` : Cohérence des données
- `--routines` : Procédures stockées
- `--triggers` : Déclencheurs

### Gestion des fichiers

- **Format** : `.sql` pour les dumps individuels, `.zip` pour les backups complets
- **Nommage** : `{base}_{timestamp}.sql` ou `backup_{base}_{timestamp}.zip`
- **Stockage local** : Dossier `backups/comptabilite/`
- **Stockage distant** : Serveur FTP/SFTP configuré
- **Fichiers de référence** : `.ref` pour les backups distants
- **Nettoyage** : Suppression automatique selon la politique de rétention

## Sécurité

### Permissions
- Seuls les administrateurs peuvent accéder au système de backup
- Vérification du module actif (uniquement pour la comptabilité)
- Validation des paramètres de serveur distant

### Validation des données
- Vérification de l'existence des bases de données
- Validation des paramètres de planification
- Gestion des erreurs avec messages utilisateur
- Vérification des connexions distantes

## Maintenance

### Logs
- **Logs utilisateur** : Interface web avec SweetAlert2
- **Logs système** : Fichier `backups/backup_cron.log`
- **Logs base de données** : Tables `backup_history` et `backup_execution_logs`

### Nettoyage automatique
- Suppression des anciens backups selon la politique de rétention
- Nettoyage des logs d'exécution
- Gestion de l'espace disque
- Nettoyage des fichiers temporaires

### Surveillance
- Vérification de l'état des planifications
- Alertes en cas d'échec
- Suivi des performances
- Monitoring des transferts distants

## Dépannage

### Problèmes courants

#### 1. Erreur "mysqldump command not found"
**Solution** : Installer MySQL Client ou ajouter le chemin vers mysqldump dans le PATH

#### 2. Erreur de permissions sur le dossier de backup
**Solution** : Vérifier les permissions du dossier `backups/comptabilite/`

#### 3. Backups planifiés ne s'exécutent pas
**Solution** : 
- Vérifier que le cron job est actif
- Vérifier les logs dans `backups/backup_cron.log`
- Vérifier que les tables de planification existent

#### 4. Erreur de connexion à la base de données
**Solution** : Vérifier la configuration dans `connexion/connexion.php`

#### 5. Erreur de transfert distant
**Solution** :
- Vérifier les paramètres FTP/SFTP
- Tester la connexion manuellement
- Vérifier les permissions du dossier distant
- Contrôler les logs de connexion

### Vérification du système

```bash
# Tester l'exécution manuelle du script
php cron_backup_scheduler.php

# Vérifier les logs
tail -f backups/backup_cron.log

# Vérifier les tables
mysql -u username -p saadikerp -e "SHOW TABLES LIKE 'backup%';"

# Tester la connexion FTP
ftp ftp.example.com

# Tester la connexion SFTP
sftp username@example.com
```

## Support

Pour toute question ou problème :
1. Vérifiez les logs système
2. Consultez la documentation
3. Testez les connexions distantes
4. Contactez l'équipe de support

---

**Version** : 2.0  
**Dernière mise à jour** : <?php echo date('Y-m-d'); ?>  
**Compatibilité** : SaadikERP 2.0+  
**Nouvelles fonctionnalités** : Sélection de base unique, backup distant FTP/SFTP
