# 📦 Guide de Déploiement Local avec Synchronisation

Ce guide vous explique comment déployer l'application Pressing Yehiya en local avec synchronisation automatique vers la base de données en ligne.

## 🎯 Architecture

L'application utilise deux bases de données:
- **Base locale (SQLite)**: Pour travailler hors ligne
- **Base distante (MySQL)**: Serveur en ligne pour stocker les données de manière centralisée

La synchronisation se fait automatiquement quand une connexion internet est disponible.

---

## 📋 Prérequis

1. **PHP 8.2 ou supérieur**
2. **Composer** (gestionnaire de dépendances PHP)
3. **Node.js et NPM** (pour les assets frontend)
4. **Extension PHP SQLite** activée
5. **Accès aux informations de connexion** de la base de données distante

---

## 🚀 Installation Initiale

### Étape 1: Cloner ou copier l'application

```bash
cd C:\Softsys
# Si vous avez déjà le dossier, passez à l'étape suivante
```

### Étape 2: Installer les dépendances

```bash
cd pressing_yehiya
composer install
npm install
```

### Étape 3: Configuration de l'environnement

1. Copier le fichier d'exemple de configuration locale:

```bash
copy .env.local.example .env
```

2. Modifier le fichier `.env` avec vos informations:

```env
# Base de données LOCALE
DB_CONNECTION=sqlite
DB_DATABASE=C:\Softsys\pressing_yehiya\database\database.sqlite

# Base de données DISTANTE (informations de votre serveur en ligne)
REMOTE_DB_DRIVER=mysql
REMOTE_DB_HOST=votre-serveur-en-ligne.com
REMOTE_DB_PORT=3306
REMOTE_DB_DATABASE=pressing_db
REMOTE_DB_USERNAME=votre_utilisateur
REMOTE_DB_PASSWORD=votre_mot_de_passe
```

### Étape 4: Créer la base de données locale

```bash
# Créer le fichier de base de données SQLite
type nul > database\database.sqlite

# Générer la clé de l'application
php artisan key:generate

# Exécuter les migrations
php artisan migrate
```

### Étape 5: Première synchronisation (récupérer les données en ligne)

**⚠️ IMPORTANT**: Cette commande va télécharger toutes les données depuis votre serveur en ligne vers votre base locale.

```bash
php artisan sync:from-remote
```

Cette commande va:
- Se connecter à votre base de données distante
- Télécharger toutes les données (clients, dépôts, paiements, etc.)
- Les enregistrer dans votre base SQLite locale

### Étape 6: Compiler les assets

```bash
npm run build
```

---

## 🎮 Utilisation Quotidienne

### Démarrer l'application

```bash
php artisan serve
```

L'application sera accessible à: `http://localhost:8000`

### Démarrer le système de synchronisation automatique

Dans un nouveau terminal:

```bash
php artisan queue:work
```

**Note**: Gardez cette fenêtre ouverte. Elle gère la synchronisation automatique en arrière-plan.

---

## 🔄 Commandes de Synchronisation

### Vérifier le statut de synchronisation

```bash
php artisan sync:status
```

Affiche:
- État de la connexion (en ligne/hors ligne)
- Nombre d'enregistrements en attente
- Dernière synchronisation

### Synchroniser manuellement vers le serveur

```bash
php artisan sync:to-remote
```

Envoie toutes les modifications locales vers le serveur en ligne.

### Récupérer les données du serveur

```bash
php artisan sync:from-remote
```

**⚠️ ATTENTION**: Cette commande écrase vos données locales avec celles du serveur!

---

## 🔧 Configuration Avancée

### Synchronisation automatique programmée

Pour une synchronisation automatique toutes les 15 minutes, ajoutez dans `app/Console/Kernel.php`:

```php
protected function schedule(Schedule $schedule): void
{
    $schedule->job(new \App\Jobs\AutoSyncJob())
             ->everyFifteenMinutes()
             ->when(function () {
                 return app(\App\Services\SyncService::class)->isOnline();
             });
}
```

Puis démarrez le scheduler:

```bash
php artisan schedule:work
```

---

## 📊 Comment fonctionne la synchronisation?

### Mode Hors Ligne
1. Vous travaillez normalement (créer clients, dépôts, etc.)
2. Toutes les modifications sont enregistrées dans la base locale
3. Elles sont aussi enregistrées dans une file d'attente pour synchronisation

### Mode En Ligne
1. Le système détecte automatiquement la connexion internet
2. Les modifications en attente sont envoyées au serveur distant
3. Les données sont synchronisées automatiquement

### Modèles synchronisés automatiquement

Pour activer la synchronisation automatique sur un modèle, ajoutez le trait `Syncable`:

```php
use App\Traits\Syncable;

class Customer extends Model
{
    use Syncable; // Ajouter cette ligne
    
    // ... reste du code
}
```

---

## 🐛 Dépannage

### La synchronisation ne fonctionne pas

1. Vérifier la connexion:
```bash
php artisan sync:status
```

2. Vérifier les logs:
```bash
tail -f storage/logs/laravel.log
```

3. Tester la connexion distante:
```bash
php artisan tinker
>>> app(\App\Services\SyncService::class)->testRemoteConnection()
```

### Erreur "Database locked" (SQLite)

SQLite ne supporte qu'une seule écriture à la fois. Solutions:
- Fermer les autres connexions à la base
- Réduire le nombre de workers: `php artisan queue:work --tries=1 --timeout=30`

### Les données ne se synchronisent pas

1. Vérifier que le queue worker est actif
2. Vérifier que le modèle utilise le trait `Syncable`
3. Vérifier les logs de synchronisation dans la table `sync_logs`

---

## 📝 Notes Importantes

1. **Sauvegarde**: Faites régulièrement une copie de `database/database.sqlite`
2. **Connexion**: Le système détecte automatiquement la connexion internet
3. **Conflits**: En cas de conflit, les données du serveur ont priorité
4. **Performance**: SQLite est parfait pour un usage local/petit volume

---

## 🔐 Sécurité

1. **Ne jamais commiter** le fichier `.env` dans Git
2. **Chiffrer** les sauvegardes de la base SQLite si elles contiennent des données sensibles
3. **Utiliser HTTPS** pour la connexion au serveur distant
4. **Limiter les tentatives** de connexion au serveur distant

---

## 📞 Support

Pour toute question ou problème:
1. Vérifier les logs: `storage/logs/laravel.log`
2. Vérifier le statut: `php artisan sync:status`
3. Consulter la documentation Laravel sur les queues

---

## 📚 Ressources

- [Documentation Laravel Queues](https://laravel.com/docs/queues)
- [Documentation SQLite](https://www.sqlite.org/docs.html)
- [Laravel Database: Multiple Connections](https://laravel.com/docs/database#using-multiple-database-connections)
