# AFINET Portal - Docker Setup

## Quick Start

```bash
# 1. Clone the repository
git clone <repository-url>
cd afinet

# 2. Configure environment
cp afinet-portal-backend/.env.example afinet-portal-backend/.env
nano afinet-portal-backend/.env
# Update database, Odoo, and email settings

# 3. Start all services
docker-compose up -d

# 4. Run migrations
docker-compose exec backend php artisan migrate

# 5. Access the application
# Frontend: http://localhost:3000
# Backend API: http://localhost:8000
# phpMyAdmin: http://localhost:8080
```

## Services

The Docker setup includes:

| Service | Container | Port | Description |
|---------|-----------|------|-------------|
| **frontend** | afinet-frontend | 3000 | Next.js frontend |
| **backend** | afinet-backend | 8000 | Laravel API |
| **scheduler** | afinet-scheduler | - | Background task scheduler |
| **db** | afinet-db | 3306 | MySQL database |
| **phpmyadmin** | afinet-phpmyadmin | 8080 | Database management |

## Scheduler Service

The scheduler service runs continuously and syncs data from Odoo every 5 minutes:
- Quotations
- Invoices
- Sales Orders

**No additional setup required!** It starts automatically with `docker-compose up -d`.

## Common Commands

### Start/Stop Services

```bash
# Start all services
docker-compose up -d

# Stop all services
docker-compose down

# Restart all services
docker-compose restart

# Start specific service
docker-compose up -d scheduler

# Stop specific service
docker-compose stop scheduler
```

### View Logs

```bash
# All services
docker-compose logs -f

# Specific service
docker-compose logs -f scheduler
docker-compose logs -f backend

# Last 100 lines
docker-compose logs --tail=100 scheduler
```

### Execute Commands

```bash
# Laravel artisan commands
docker-compose exec backend php artisan migrate
docker-compose exec backend php artisan cache:clear
docker-compose exec backend php artisan tinker

# Scheduler commands
docker-compose exec scheduler php artisan schedule:list
docker-compose exec scheduler php artisan sync:data quotations

# Access container shell
docker-compose exec backend bash
docker-compose exec scheduler bash
```

### Check Status

```bash
# View running containers
docker-compose ps

# View resource usage
docker stats

# Check specific service
docker-compose ps scheduler
```

## Scheduler Management

### Check if scheduler is running

```bash
docker-compose ps scheduler
```

### View scheduler logs

```bash
docker-compose logs -f scheduler
```

### Manually trigger sync

```bash
docker-compose exec scheduler php artisan sync:data quotations
docker-compose exec scheduler php artisan sync:data invoices
docker-compose exec scheduler php artisan sync:data orders
```

### Restart scheduler

```bash
docker-compose restart scheduler
```

## Development Workflow

### Update Code

```bash
# Pull latest changes
git pull

# Rebuild and restart
docker-compose build
docker-compose up -d

# Or rebuild specific service
docker-compose build scheduler
docker-compose up -d scheduler
```

### Database Operations

```bash
# Run migrations
docker-compose exec backend php artisan migrate

# Rollback migrations
docker-compose exec backend php artisan migrate:rollback

# Seed database
docker-compose exec backend php artisan db:seed

# Access database via phpMyAdmin
# Open: http://localhost:8080
# User: afinet_user
# Password: Aywhvoudf9&E
```

### Clear Caches

```bash
docker-compose exec backend php artisan cache:clear
docker-compose exec backend php artisan config:clear
docker-compose exec backend php artisan route:clear
docker-compose exec backend php artisan view:clear
```

## Troubleshooting

### Scheduler not syncing

```bash
# Check if scheduler is running
docker-compose ps scheduler

# View logs
docker-compose logs scheduler

# Restart scheduler
docker-compose restart scheduler

# Manually test sync
docker-compose exec scheduler php artisan sync:data quotations --verbose
```

### Database connection errors

```bash
# Check if database is running
docker-compose ps db

# Test connection
docker-compose exec backend php artisan tinker
>>> DB::connection()->getPdo();
```

### Port already in use

```bash
# Change ports in docker-compose.yml
# For example, change "3000:3000" to "3001:3000"
```

### Container won't start

```bash
# View logs
docker-compose logs [service-name]

# Rebuild container
docker-compose build [service-name]
docker-compose up -d [service-name]
```

## Production Deployment

### 1. Update Environment

```bash
# Edit .env for production
nano afinet-portal-backend/.env

# Set:
APP_ENV=production
APP_DEBUG=false
SIMULATE_PACKAGE_PRICING=false
```

### 2. Build and Start

```bash
# Build images
docker-compose build

# Start services
docker-compose up -d

# Run migrations
docker-compose exec backend php artisan migrate --force
```

### 3. Verify

```bash
# Check all services are running
docker-compose ps

# Check scheduler logs
docker-compose logs scheduler

# Test sync
docker-compose exec scheduler php artisan sync:data quotations
```

### 4. Monitor

```bash
# View logs
docker-compose logs -f

# Check resource usage
docker stats

# Set up health checks (optional)
# See info/DOCKER_SCHEDULER_SETUP.md
```

## Backup

### Database Backup

```bash
# Backup database
docker-compose exec db mysqldump -u afinet_user -p'Aywhvoudf9&E' afinet_portal > backup_$(date +%Y%m%d).sql

# Restore database
docker-compose exec -T db mysql -u afinet_user -p'Aywhvoudf9&E' afinet_portal < backup_20240101.sql
```

### Volume Backup

```bash
# Backup MySQL data volume
docker run --rm -v afinet_mysql_data:/data -v $(pwd):/backup ubuntu tar czf /backup/mysql_backup.tar.gz /data
```

## Environment Variables

Key variables in `afinet-portal-backend/.env`:

```env
# Application
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com

# Database (matches docker-compose.yml)
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=afinet_portal
DB_USERNAME=afinet_user
DB_PASSWORD=Aywhvoudf9&E

# Odoo Integration
ODOO_URL=https://your-odoo-instance.com
ODOO_DB=your_odoo_database
ODOO_USERNAME=your_odoo_user
ODOO_PASSWORD=your_odoo_password

# Email
MAIL_FROM_ADDRESS=your_email@gmail.com
COMPANY_MAIL=company@afinet.africa

# Pricing Mode
SIMULATE_PACKAGE_PRICING=false
```

## Documentation

- **Docker Scheduler Setup**: `info/DOCKER_SCHEDULER_SETUP.md`
- **Quick Reference**: `info/QUICK_REFERENCE.md`
- **Reality Mode**: `info/REALITY_MODE_IMPLEMENTATION.md`
- **Production Deployment**: `info/PRODUCTION_DEPLOYMENT.md`

## Support

For issues or questions:
- Check logs: `docker-compose logs -f`
- View documentation in `info/` directory
- Contact: tech@afinet.africa
