# Installed Packages Configuration

This document describes all the packages installed for the E-DRMS HQ Laravel backend and their configuration.

## Installed Packages

### 1. Laravel Sanctum (v4.3)
**Purpose**: API authentication for SPA and mobile applications

**Installation**:
```bash
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
```

**Configuration**:
- Config file: `config/sanctum.php`
- Migration published to: `database/migrations/`
- User model updated with `HasApiTokens` trait
- Middleware configured in `bootstrap/app.php`
- API routes enabled in `routes/api.php`

**Usage**:
```php
// In User model
use Laravel\Sanctum\HasApiTokens;

// Generate token
$token = $user->createToken('token-name')->plainTextToken;

// Protect routes
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});
```

### 2. mPDF (v8.3)
**Purpose**: PDF generation for documents (invoices, reports, certificates, etc.)

**Installation**:
```bash
composer require mpdf/mpdf
```

**Configuration**:
- Config file: `config/pdf.php`
- Storage path: `storage/app/public/pdfs/`
- Templates path: `resources/views/pdf/`

**Usage**:
```php
use Mpdf\Mpdf;

$mpdf = new Mpdf([
    'format' => 'A4',
    'orientation' => 'P',
]);

$mpdf->WriteHTML($html);
$mpdf->Output('document.pdf', 'D'); // D for download, F for save to file
```

**Features**:
- Multi-language support (UTF-8)
- Custom fonts support
- Header and footer templates
- Watermarks
- Page numbering

### 3. PhpSpreadsheet (v5.7)
**Purpose**: Excel file generation for reports and data exports

**Installation**:
```bash
composer require phpoffice/phpspreadsheet
```

**Configuration**:
- Config file: `config/excel.php`
- Storage path: `storage/app/public/excel/`

**Usage**:
```php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World!');

$writer = new Xlsx($spreadsheet);
$writer->save('hello_world.xlsx');
```

**Features**:
- Multiple sheet support
- Cell formatting (colors, fonts, borders)
- Formulas and calculations
- Charts and graphs
- Multiple format support (Xlsx, Xls, Csv)

### 4. SimpleSoftwareIO/simple-qrcode (v4.2)
**Purpose**: QR code generation for permits and canteen payments

**Installation**:
```bash
composer require simplesoftwareio/simple-qrcode
```

**Configuration**:
- Config file: `config/qrcode.php`
- HMAC secret for security: Uses APP_KEY by default

**Usage**:
```php
use SimpleSoftwareIO\QrCode\Facades\QrCode;

// Generate QR code
$qrCode = QrCode::size(300)
    ->format('png')
    ->errorCorrection('H')
    ->generate('QR Code content');

// Generate with HMAC signature
$data = json_encode([
    'permit_id' => 123,
    'student_id' => 456,
    'timestamp' => time(),
]);
$signature = hash_hmac('sha256', $data, config('qrcode.hmac_secret'));
$payload = base64_encode($data . '|' . $signature);

$qrCode = QrCode::size(300)->generate($payload);
```

**Features**:
- Multiple formats (PNG, SVG, EPS)
- Error correction levels (L, M, Q, H)
- Custom colors and sizes
- Logo embedding support

### 5. Laravel Queue
**Purpose**: Background job processing for async tasks

**Configuration**:
- Config file: `config/queue.php`
- Default connection: `database` (configured in .env)
- Queue tables created via migrations

**Usage**:
```php
// Dispatch a job
ProcessInvoice::dispatch($invoice);

// Dispatch with delay
ProcessInvoice::dispatch($invoice)->delay(now()->addMinutes(10));

// Run queue worker
php artisan queue:work

// Run queue listener (auto-reload)
php artisan queue:listen
```

**Queue Connections Available**:
- `sync`: Synchronous (for testing)
- `database`: Database-backed queue (default)
- `redis`: Redis-backed queue (recommended for production)
- `sqs`: Amazon SQS
- `beanstalkd`: Beanstalkd

## Environment Variables

Add these to your `.env` file for custom configuration:

```env
# Sanctum
SANCTUM_STATEFUL_DOMAINS=localhost,localhost:3000,127.0.0.1:3000

# Queue
QUEUE_CONNECTION=database

# QR Code
QRCODE_SIZE=300
QRCODE_ERROR_CORRECTION=H
QRCODE_HMAC_SECRET="${APP_KEY}"

# PDF
PDF_DEFAULT_FONT=dejavusans
PDF_DEFAULT_FONT_SIZE=10
PDF_ORIENTATION=P
PDF_FORMAT=A4

# Excel
EXCEL_DEFAULT_FORMAT=Xlsx
EXCEL_AUTO_SIZE_COLUMNS=true
```

## Service Providers

All packages are auto-discovered by Laravel. No manual service provider registration needed.

## Next Steps

1. Run migrations to create Sanctum tables:
   ```bash
   php artisan migrate
   ```

2. Create service classes for:
   - `App\Services\Auth\AuthenticationService`
   - `App\Services\Document\PDFGenerationService`
   - `App\Services\Document\ExcelGenerationService`
   - `App\Services\QR\QRCodeService`

3. Create queue jobs for background processing:
   - `App\Jobs\GeneratePDFJob`
   - `App\Jobs\GenerateExcelJob`
   - `App\Jobs\SendNotificationJob`

## Testing

Test each package installation:

```bash
# Test Sanctum
php artisan tinker
>>> $user = App\Models\User::first();
>>> $token = $user->createToken('test')->plainTextToken;

# Test Queue
php artisan queue:work --once

# Test mPDF (create a test route)
# Test PhpSpreadsheet (create a test route)
# Test QR Code (create a test route)
```

## Documentation Links

- [Laravel Sanctum](https://laravel.com/docs/11.x/sanctum)
- [mPDF Documentation](https://mpdf.github.io/)
- [PhpSpreadsheet Documentation](https://phpspreadsheet.readthedocs.io/)
- [Simple QR Code](https://www.simplesoftware.io/#/docs/simple-qrcode)
- [Laravel Queues](https://laravel.com/docs/11.x/queues)
