# API Import Lokasi Kantor

## 1. Import Data Kantor

```
POST /api/branches/import
Content-Type: multipart/form-data
Authorization: Bearer {token}
```

### Request Parameters

| Field | Type | Required | Keterangan |
|-------|------|----------|------------|
| `file` | File | ✅ | File CSV/Excel (.csv, .txt, .xlsx, .xls). Maks 5MB |
| `mode` | String | ❌ | `insert` (default) atau `upsert` |

**Mode:**
- `insert` — Semua baris ditambahkan sebagai data baru
- `upsert` — Jika kombinasi `kode_kantor` + `nama_lokasi` sudah ada, maka update. Jika belum ada, insert baru

### Format Kolom File

| Kolom | Required | Tipe | Keterangan |
|-------|----------|------|------------|
| `kode_kantor` | ✅ | String | Kode kantor (alias: `kode`, `branch_code`, `code`, `kd_kantor`) |
| `nama_kantor` | ❌ | String | Nama kantor (alias: `kantor`, `branch_name`, `office`, `nama`) |
| `nama_lokasi` | ❌ | String | Nama lokasi (alias: `lokasi`, `location`, `location_name`) |
| `alamat` | ❌ | String | Alamat (alias: `address`, `alamat_kantor`) |
| `latitude` | ✅ | Numeric | Latitude -90 s/d 90 (alias: `lat`) |
| `longitude` | ✅ | Numeric | Longitude -180 s/d 180 (alias: `lng`, `long`, `lon`) |
| `radius` | ❌ | Integer | Radius geofence dalam meter, default 50 (alias: `rad`) |

### Contoh File CSV

```csv
kode_kantor,nama_kantor,nama_lokasi,alamat,latitude,longitude,radius
001,Kantor Pusat,Gedung Utama,Jl. Merdeka No. 1,-6.1751,106.8650,50
001,Kantor Pusat,Gudang,Jl. Merdeka No. 1A,-6.1760,106.8655,30
002,Cabang Bandung,Gedung Utama,Jl. Braga No. 10,-6.9175,107.6191,50
```

### Response Sukses (200)

```json
{
    "rcode": "00",
    "message": "Import selesai",
    "data": {
        "total_rows": 3,
        "imported": 2,
        "updated": 1,
        "skipped": 0
    }
}
```

### Response Sukses dengan Error Baris (200)

```json
{
    "rcode": "00",
    "message": "Import selesai",
    "data": {
        "total_rows": 5,
        "imported": 3,
        "updated": 0,
        "skipped": 2,
        "errors": [
            "Baris 3: latitude wajib diisi dan harus angka (contoh: -6.1751)",
            "Baris 5: kode_kantor wajib diisi"
        ]
    }
}
```

### Response Error — Validation (422)

```json
{
    "rcode": "01",
    "message": "Validation error",
    "errors": {
        "file": ["The file field is required."]
    }
}
```

### Response Error — File Kosong (422)

```json
{
    "rcode": "01",
    "message": "File kosong atau format tidak sesuai"
}
```

### Response Error — Server (500)

```json
{
    "rcode": "99",
    "message": "Error import: [detail error]"
}
```

---

## 2. Download Template CSV

```
GET /api/branches/template
Authorization: Bearer {token}
```

### Response

File download `template_import_kantor.csv` dengan isi:

```csv
kode_kantor,nama_kantor,nama_lokasi,alamat,latitude,longitude,radius
001,Kantor Pusat,Gedung Utama,Jl. Contoh No. 1,-6.1751,106.8650,50
```

---

## Catatan Teknis

- **CSV**: Langsung didukung tanpa dependency tambahan
- **Excel (.xlsx/.xls)**: Memerlukan `composer require phpoffice/phpspreadsheet`
- Header kolom **case-insensitive** dan mendukung alias (lihat tabel di atas)
- Baris kosong di file otomatis di-skip
- Validasi koordinat: latitude (-90 ~ 90), longitude (-180 ~ 180)
- Kolom `radius` default **50 meter** jika tidak diisi
- Kolom `is_active` otomatis diset `true` untuk semua import
- Error ditampilkan maksimal **10 baris pertama** agar response tidak terlalu besar
