# Sistem Outlet Restokita dengan Zip Password

Sistem ini memungkinkan Anda untuk mengelola outlet dan membuat file zip yang dienkripsi dengan password yang di-generate berdasarkan MAC address dan salt.

## Fitur Utama

1. **Manajemen Outlet**: CRUD untuk outlet dengan MAC address unik
2. **Generate Zip dengan Password**: Membuat file zip yang dienkripsi dengan password
3. **Password Generation**: Password di-generate berdasarkan kombinasi MAC address, salt, dan app key
4. **Download Zip**: Download file zip yang sudah dibuat
5. **Password Retrieval**: Mendapatkan password untuk outlet tertentu

## Struktur Database

### Tabel `outlets`

| Kolom | Tipe | Deskripsi |
|-------|------|-----------|
| id | bigint | Primary key |
| name | string | Nama outlet |
| mac_address | string | MAC address (unique) |
| zip_file_path | string | Path ke file zip (nullable) |
| password_hash | string | Hash dari password |
| salt | string | Salt untuk generate password |
| description | text | Deskripsi outlet (nullable) |
| status | enum | Status outlet (active/inactive) |
| created_at | timestamp | Waktu dibuat |
| updated_at | timestamp | Waktu diupdate |

## Cara Kerja Password

Password di-generate menggunakan formula:
```
password = SHA256(mac_address + salt + app_key)
```

Dimana:
- `mac_address`: MAC address outlet (format: XX:XX:XX:XX:XX:XX)
- `salt`: Random string 32 karakter
- `app_key`: Laravel application key dari config

## API Endpoints

### 1. CRUD Outlet

#### GET /api/outlets
Mendapatkan semua outlet
```json
{
    "success": true,
    "data": [
        {
            "id": 1,
            "name": "Outlet Jakarta Pusat",
            "mac_address": "00:1B:44:11:3A:B7",
            "zip_file_path": null,
            "password_hash": "...",
            "salt": "...",
            "description": "Outlet utama di Jakarta Pusat",
            "status": "active",
            "created_at": "2025-08-01T04:59:20.000000Z",
            "updated_at": "2025-08-01T04:59:20.000000Z"
        }
    ]
}
```

#### POST /api/outlets
Membuat outlet baru
```json
{
    "name": "Outlet Baru",
    "mac_address": "00:1B:44:11:3A:BA",
    "description": "Outlet baru",
    "status": "active"
}
```

#### GET /api/outlets/{id}
Mendapatkan detail outlet

#### PUT /api/outlets/{id}
Update outlet

#### DELETE /api/outlets/{id}
Hapus outlet

### 2. Zip Management

#### POST /api/outlets/{id}/generate-zip
Generate zip file dengan password
```json
{
    "files": [
        "/path/to/file1.txt",
        "/path/to/file2.txt"
    ],
    "zip_name": "custom_name.zip"
}
```

Response:
```json
{
    "success": true,
    "message": "Zip file created successfully",
    "data": {
        "outlet": {...},
        "zip_path": "outlets/outlet_1_1627834567.zip",
        "password": "generated_password_hash"
    }
}
```

#### GET /api/outlets/{id}/download-zip
Download zip file

#### GET /api/outlets/{id}/password
Mendapatkan password untuk outlet
```json
{
    "success": true,
    "data": {
        "outlet_id": 1,
        "outlet_name": "Outlet Jakarta Pusat",
        "password": "generated_password_hash",
        "mac_address": "00:1B:44:11:3A:B7"
    }
}
```

## Setup dan Instalasi

### 1. Jalankan Migration
```bash
php artisan migrate
```

### 2. Jalankan Seeder
```bash
php artisan db:seed
```

### 3. Generate App Key (jika belum)
```bash
php artisan key:generate
```

## Contoh Penggunaan

### 1. Membuat Outlet Baru
```bash
curl -X POST http://localhost:8000/api/outlets \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Outlet Test",
    "mac_address": "00:1B:44:11:3A:BB",
    "description": "Outlet untuk testing"
  }'
```

### 2. Generate Zip dengan Password
```bash
curl -X POST http://localhost:8000/api/outlets/1/generate-zip \
  -H "Content-Type: application/json" \
  -d '{
    "files": [
      "storage/app/test-files/sample1.txt",
      "storage/app/test-files/sample2.txt"
    ]
  }'
```

### 3. Download Zip File
```bash
curl -O -J http://localhost:8000/api/outlets/1/download-zip
```

### 4. Dapatkan Password
```bash
curl http://localhost:8000/api/outlets/1/password
```

## Keamanan

1. **Password Hash**: Password di-hash menggunakan Laravel Hash facade
2. **Salt**: Setiap outlet memiliki salt unik untuk mencegah rainbow table attack
3. **MAC Address Validation**: MAC address divalidasi menggunakan regex
4. **File Validation**: File yang akan di-zip divalidasi keberadaannya

## File Storage

- Zip files disimpan di: `storage/app/outlets/`
- Test files disimpan di: `storage/app/test-files/`

## Troubleshooting

### Error: ZipArchive not available
Pastikan extension `zip` sudah terinstall di PHP:
```bash
sudo apt-get install php-zip
```

### Error: Permission denied
Pastikan direktori storage memiliki permission yang benar:
```bash
chmod -R 755 storage/
```

### Error: File not found
Pastikan file yang akan di-zip ada dan path-nya benar.

## Testing

Untuk testing, gunakan file sample yang sudah disediakan:
- `storage/app/test-files/sample1.txt`
- `storage/app/test-files/sample2.txt` 