# Jatelindo VA Step 1

Endpoint universal:

```text
POST /api/jatelindo/va
Content-Type: application/json
```

Endpoint membaca `bit3`:

- `380000`: inquiry
- `170000`: payment/topup
- `171000`: advice

Request wajib dikirim dalam JSON ISO8583-like dengan field utama `mti`, `bit2`, `bit3`, `bit4`, `bit7`, `bit11`, `bit12`, `bit13`, `bit15`, `bit18`, `bit32`, `bit37`, `bit41`, `bit48`, `bit49`, `bit63`. Untuk payment/advice, `bit62` juga wajib.

## VA Number

Parser VA terpusat di `App\Services\JatelindoVa\JatelindoVaNumberService`.

Konfigurasi default Mandiri OFF-US:

```text
008 + 88017 + 004 + customer_va
```

`bit48` PDF tetap memakai `No_VA` internal fixed length 16. Jika request suatu saat membawa display VA eksternal, parser akan menghapus prefix yang sesuai config dan menyimpan normalized customer VA.

## Tables

Migration menambahkan:

- `va_jatelindo_registry`: mapping VA ke anggota/customer dan rekening simpanan tujuan.
- `va_jatelindo_transactions`: idempotency payment/advice dan referensi posting internal.
- `va_jatelindo_logs`: raw request/response dan payload penting untuk audit.

Jalankan:

```bash
php spark migrate
php spark db:seed JatelindoVaDemoSeeder
```

Seeder memakai `internal_account = TAB-DEMO-001`. Ganti ke rekening simpanan yang benar sebelum test payment sukses.

## Signature

PDF menjelaskan `bit63 = sha256(nova + amount + password_web)`.

Config:

- `VA_JATELINDO_SIGNATURE_MODE=dummy`: untuk local test, request signature tidak ditolak.
- `VA_JATELINDO_SIGNATURE_MODE=strict`: verifikasi SHA-256 memakai `VA_JATELINDO_SIGNATURE_SECRET`.
- `VA_JATELINDO_EXTERNAL_VA_PREFIX_STRATEGY=configured_prefix`: display VA dibaca dari prefix bank + I-PAY + mitra yang terpusat di config.

## Idempotency

Payment/advice memakai dua key:

- `idempotency_key`: `bit3|bit11|bit37|normalized_va|bit4|bit7`
- `bank_reference_key`: `bit11|bit37|normalized_va|bit4|bit7`

Retry payment yang sama dan advice atas payment yang sudah tercatat tidak melakukan posting ulang.

## Manual Test

Sample request ada di `postman/jatelindo-va/`.

```bash
curl -X POST http://localhost/devapi/public/api/jatelindo/va \
  -H "Content-Type: application/json" \
  --data-binary @postman/jatelindo-va/inquiry-success.json
```

Skenario:

- `inquiry-success.json`: VA aktif.
- `inquiry-not-found.json`: response `14`.
- `payment-success.json`: posting simpanan dan response `00`.
- `payment-duplicate.json`: duplicate aman, response `00`, tidak posting ulang.
- `advice-success.json`: jika payment sudah ada, response `00` tanpa posting ulang.
- `advice-duplicate.json`: replay advice, response `00`.
- `payment-nominal-mismatch.json`: response `51`.
- `inquiry-blocked.json` dan `inquiry-expired.json`: response `43`.

Untuk production, isi source account jurnal:

```text
VA_JATELINDO_SOURCE_ACCOUNT=
VA_JATELINDO_ADMIN_ACCOUNT=
```

Jika source account kosong, service tetap mencatat mutasi `trxkastabungan`, tetapi jurnal `transddb` dilewati agar tidak membuat jurnal tidak seimbang.
