MODUL API SERVICE CI3 -> LARAVEL IVMEDIA SMM
================================================

Modul ini adalah port Laravel dari empat view CI3:
- api_service/index.php  -> daftar, sortir, dan filter API Service
- api_service/add.php    -> tambah konfigurasi API Service
- api_service/detail.php -> detail konfigurasi
- api_service/edit.php   -> edit konfigurasi

Fungsi yang tersedia:
1. Daftar, sortir, filter, detail, tambah, edit, dan hapus API Service.
2. Parameter request dinamis.
3. API key, provider ID, dan provider secret dibaca otomatis dari providers.json.
4. Mapping respons ID, kategori, nama, deskripsi, min, max, harga, type, refill, dan average time.
5. Tes API tanpa menampilkan kredensial.
6. Ambil dan sinkron layanan langsung ke tabel smm dan categories.
7. Perhitungan rate, profit, replace text, auto nologin, dan auto delete mengikuti data provider IVMEDIA SMM.

PEMASANGAN
==========
1. Backup seluruh file website dan database.
2. Upload lalu extract ZIP ke folder Laravel yang sama dengan file artisan.
3. Pertahankan file .env milik hosting. Paket final tidak membawa .env.
4. Jika tabel api_services dan api_service_params belum ada, jalankan:

   php artisan migrate --force

   Alternatif tanpa Terminal: import database/api_service_laravel.sql melalui phpMyAdmin.

5. Pastikan folder berikut ada dan dapat ditulis PHP:
   storage/framework/views
   storage/framework/cache/data
   storage/framework/sessions
   storage/logs
   bootstrap/cache

6. Jalankan:

   php artisan optimize:clear
   composer dump-autoload -o

7. Buka:

   /admin/konfigurasi/api-service

CATATAN PARAMETER
=================
- Custom Value: nilai ditulis manual, misalnya action=services.
- API Key Provider: nilai otomatis dari providers.json -> provider_key.
- ID Provider: nilai otomatis dari providers.json -> provider_id.
- Secret Provider: nilai otomatis dari providers.json -> provider_secret.

Jangan menuliskan API key/secret sebagai Custom Value. Gunakan tipe otomatis agar kredensial tidak tampil di halaman admin.

PENANGANAN HTTP 404 SAAT SINKRONISASI
=====================================
Saat tombol Sinkron ditekan, URL pada api_services.end_point dicoba terlebih
dahulu. Jika provider mengembalikan HTTP 404, modul otomatis mencoba kembali
endpoint layanan lama pada providers.json -> endpoint.service (jika ada).
Parameter action dan kredensial yang belum diisi di API Service juga diambil
dari permintaan.service pada providers.json.

Jika kedua URL tetap 404, pesan admin sekarang menampilkan URL yang dipakai
dan sebagian balasan provider. Periksa hal berikut pada konfigurasi provider:

1. API URL harus URL endpoint daftar layanan, bukan URL halaman website atau
   URL dashboard provider.
2. Gunakan method sesuai dokumentasi provider (umumnya POST).
3. Parameter harus memakai nama asli provider, misalnya key dan action.
4. Pastikan endpoint.service pada pengaturan Provider benar-benar masih aktif.

Setelah upload versi ini, jalankan:

   php artisan optimize:clear
   composer dump-autoload -o

PENANGANAN CURL ERROR 28 / TIMEOUT JAP
======================================
Versi ini menaikkan batas respons provider dari 30 menjadi 120 detik dan
memaksa koneksi API Service memakai IPv4. Pengaturan ini mengatasi shared
hosting yang memiliki jalur IPv6 tidak stabil dan provider dengan daftar
layanan besar yang memerlukan waktu lebih lama untuk membuat respons JSON.

Konfigurasi JustAnotherPanel (JAP) yang benar:

- API URL: https://justanotherpanel.com/api/v2
- Method: POST
- Parameter key: tipe "API Key Provider"
- Parameter action: tipe "Custom Value", nilai "services"
- Response Data Service: dikosongkan karena respons JAP berupa array utama
- Service ID: service
- Category: category
- Service Name: name
- Min: min
- Max: max
- Price: rate
- Type: type
- Refill: refill (opsional)
- Average Time: average_time (opsional)

Versi ini juga mengenali array root JAP secara otomatis walaupun konfigurasi
lama masih berisi `data` atau `services`; setelah upload, cukup buka Edit API
Service lalu simpan kembali dengan RESPONSE DATA SERVICE kosong agar
konfigurasinya rapi.

Setelah upload, wajib jalankan php artisan optimize:clear agar config timeout
baru terbaca. Nilai dapat disesuaikan melalui .env tanpa mengubah source:

   API_SERVICE_CONNECT_TIMEOUT=20
   API_SERVICE_REQUEST_TIMEOUT=120
   API_SERVICE_REQUEST_ATTEMPTS=1
   API_SERVICE_FORCE_IPV4=true

Proses Add All juga sudah dioptimalkan. Layanan baru disimpan secara batch,
layanan yang tidak berubah tidak ditulis ulang, dan ID layanan ganda dalam
respons provider tidak akan membuat baris duplikat baru.

Jika setelah 120 detik tetap muncul pesan bahwa provider tidak merespons,
masalah berada di luar Laravel: JAP sedang lambat/memblokir IP hosting atau
provider hosting memblokir koneksi outbound HTTPS ke justanotherpanel.com.
Minta hosting menguji koneksi outbound TCP 443 dari server ke domain tersebut.
