Payment Gateway

Pengaturan Midtrans

Kelola kredensial, batas keamanan transaksi, dan pembebanan biaya pembayaran.

{{ $is_production ? 'PRODUKSI' : 'SANDBOX' }}
Dipakai untuk top up saldo wali. Dapatkan Server Key dan Client Key dari Midtrans Dashboard → Settings → Access Keys. Gunakan kredensial Sandbox terlebih dahulu untuk uji coba sebelum mengaktifkan mode produksi. Nilai yang Anda kirim tidak langsung aktif. Pengaturan saat ini tetap digunakan sampai pengasuh menyetujui pengajuan dalam waktu 24 jam.
@if ($jumlahPengasuh === 0) @endif @if ($pengajuanTerakhir && in_array($pengajuanTerakhir->status, ['pending', 'rejected'], true))

Pengajuan terakhir #{{ $pengajuanTerakhir->id }}

{{ match($pengajuanTerakhir->status) { 'pending' => 'Menunggu persetujuan pengasuh', 'approved' => 'Disetujui dan sudah aktif', 'rejected' => 'Ditolak pengasuh', 'expired' => 'Kedaluwarsa', default => 'Dibatalkan oleh pengajuan baru' } }}

@if ($pengajuanTerakhir->review_note)

Catatan: {{ $pengajuanTerakhir->review_note }}

@endif
{{ strtoupper($pengajuanTerakhir->status) }}
@endif {{-- Ringkasan sekilas - status pill mencerminkan pengaturan yang sudah tersimpan (bukan draf form yang belum disimpan), supaya admin bisa langsung tahu kondisi saat ini tanpa scroll baca satu-satu. --}}
{{ $is_production ? 'Mode Produksi' : 'Mode Sandbox' }} {{ $has_server_key ? 'Kredensial Tersimpan' : 'Kredensial Belum Diatur' }} Top Up: {{ $biaya_dibebankan_wali_topup ? 'Biaya ke Wali' : 'Biaya ke Pondok' }} Tagihan: {{ $biaya_dibebankan_wali_tagihan ? 'Biaya ke Wali' : 'Biaya ke Pondok' }}

Kredensial API

Server Key & Client Key dari akun Midtrans pondok.

Batas Transaksi

Jaring pengaman untuk pemindahan saldo, bukan aturan bisnis.

Saat wali memilih bayar tagihan dari saldo, pembayaran ditolak kalau hasilnya akan membuat saldo santri turun di bawah angka ini — wali diarahkan memakai opsi "Bayar Langsung via Midtrans" sebagai gantinya. Berlaku juga untuk transfer antar santri dan bayar kantin. Top up saldo sendiri tidak terpengaruh angka ini — top up selalu masuk penuh ke saldo.

Batas atas satu kali top up, transfer antar santri, bayar kantin, atau bayar tagihan dari saldo — jaring pengaman kalau ada salah ketik nominal (kelebihan nol), bukan aturan bisnis. Tidak membatasi jumlah tagihan yang di-generate maupun total transaksi santri secara keseluruhan.

Biaya Midtrans

Sesuaikan dengan kontrak merchant Midtrans Anda.

@php $channelBiaya = [ 'bni_va' => ['label' => 'Virtual Account BNI', 'icon' => 'bank'], 'bca_va' => ['label' => 'Virtual Account BCA', 'icon' => 'bank'], 'bri_va' => ['label' => 'Virtual Account BRI', 'icon' => 'bank'], 'qris' => ['label' => 'QRIS', 'icon' => 'qr'], ]; $adaBiayaTersimpan = collect($biayaTersimpan)->sum('nilai') > 0; @endphp {{-- Data yang benar-benar tersimpan sekarang, terpisah dari form di bawahnya yang bisa saja sedang berisi draf perubahan yang belum disimpan. --}} @if ($adaBiayaTersimpan)

Pengaturan tersimpan saat ini

@foreach ($channelBiaya as $kode => $info) @php $nilai = $biayaTersimpan[$kode]['nilai'] ?? 0; @endphp @if ($nilai > 0) {{ $info['label'] }}: {{ $biayaTersimpan[$kode]['tipe'] === 'persen' ? rtrim(rtrim(number_format($nilai, 2, ',', '.'), '0'), ',').'%' : 'Rp'.number_format($nilai, 0, ',', '.') }} @endif @endforeach

Ditanggung (Top Up): {{ $dibebankanWaliTopupTersimpan ? 'Wali (ditambahkan saat checkout)' : 'Pondok (beban operasional)' }}

Ditanggung (Bayar Tagihan via Midtrans): {{ $dibebankanWaliTagihanTersimpan ? 'Wali (ditambahkan saat checkout)' : 'Pondok (beban operasional)' }}

@endif Midtrans memotong biaya transaksi sebelum dana masuk ke rekening pondok. Isi angkanya sesuai kontrak merchant Midtrans Anda (cek di Midtrans Dashboard). Biarkan 0 kalau belum tahu angkanya — top up tetap berjalan normal, hanya saja biayanya belum tercatat. Nilai pada top up yang sudah dibuat tidak berubah lagi meski pengaturan ini diubah setelahnya.

Siapa yang menanggung biaya - bisa diatur berbeda per tujuan

@foreach ($channelBiaya as $kode => $info) {{-- wire:model (bukan @entangle) tetap jadi satu-satunya sumber kebenaran yang benar-benar tersimpan ke server - mekanisme yang sama persis dipakai setiap field lain di form ini. x-data di sini murni salinan LOKAL untuk menggerakkan tampilan toggle terpilih & pratinjau real-time saja, diisi awal dari nilai PHP saat ini dan disinkron lewat x-model yang berjalan berdampingan dengan wire:model pada elemen yang sama (keduanya mendengarkan event input/change secara independen). --}}
@if ($info['icon'] === 'bank') @else @endif

{{ $info['label'] }}

{{-- Segmented toggle, bukan yang disembunyikan lewat sr-only memicu perilaku bawaan browser "scroll elemen yang baru difokus ke tampilan" begitu diklik - dalam struktur nested-scroll begini itu jadi salah lompat/scroll ke posisi lain. Tombol biasa tidak punya kuirk ini sama sekali. $wire.set() menggantikan wire:model pada elemen yang sudah tidak ada lagi. --}}
@error("biaya_{$kode}_nilai")

{{ $message }}

@enderror {{-- Pratinjau langsung di sisi klien (tanpa round-trip Livewire tiap ketikan) supaya admin bisa merasakan dampak angkanya seketika. --}}

Contoh: top up Rp100.000 → biaya

@endforeach

Konfirmasi

Mencegah perubahan pengaturan pembayaran kalau sesi Anda diambil alih.