@extends('layouts.app') @section('title', 'Invoice - GTGStore') @section('description', 'Detail invoice dan status pembayaran GTGStore.') @section('robots', 'noindex, nofollow') @section('canonical', route('invoice.show', $order->public_token)) @section('content')
Invoice @php $invoiceTokenDisplay = strlen($order->public_token) > 26 ? substr($order->public_token, 0, 14) . '…' . substr($order->public_token, -9) : $order->public_token; @endphp

{{ $invoiceTokenDisplay }}

Detail transaksi dan pembayaran aman melalui GTGStore.

{{ $order->status }}
{{-- Salin ID dan link terpisah, supaya tiap bagian bisa ditempel sendiri (misal ID buat konfirmasi cepat, link buat dibagikan) tanpa format gabungan yang berantakan saat ditempel di WhatsApp. --}}
@if (in_array($order->status, ['PAID', 'FULFILLING', 'DELIVERED', 'DELIVERED_MANUAL'], true)) @php $supportMessage = rawurlencode( 'Halo Admin GTGStore, saya membutuhkan bantuan untuk invoice ' . $order->public_token . '.' ); @endphp

Terima kasih atas pembelian Anda!

Pembayaran sudah kami terima. Jika ada kendala pada akun atau pengiriman, tim admin siap membantu.

Hubungi Admin via WhatsApp
@endif @if ($order->status === 'PENDING_PAYMENT') @php $isExpiredQrisAwaitingReconciliation = in_array($order->paymentGatewayProvider(), ['dompetx', 'belibayar', 'binderpay'], true) && filled($order->payment_reference) && $order->qris_expired_at?->isPast(); @endphp
Pembayaran Aman

Bayar dengan QRIS

@if ($order->hasUsableQris()) @php $isSandboxQris = str_starts_with((string) $order->qris_payment_string, 'DUMMY-QRIS-'); @endphp @if ($isSandboxQris)

Mode simulasi lokal - QR di bawah bukan QRIS asli. Gunakan php artisan pakasir:simulate-payment {{ $order->public_token }} untuk mensimulasikan pembayaran berhasil.

@endif

Scan pakai aplikasi e-wallet atau mobile banking apa pun yang mendukung QRIS.

Transaksi terlindungi Status diperbarui otomatis
@else @if ($isExpiredQrisAwaitingReconciliation)

QRIS sudah kedaluwarsa. Kami sedang memastikan status pembayaran terakhir. Halaman ini akan diperbarui otomatis.

@else

{{ $order->qris_generation_status === 'creating' ? 'QRIS masih sedang disiapkan. Tunggu sebentar lalu coba lagi.' : 'QRIS belum berhasil dibuat. Silakan coba lagi.' }}

@csrf
@endif @endif
@endif
Produk {{ $order->productName() }}
@if ($order->variantName())
{{ $order->variantOptionName() ?: 'Variant' }} {{ $order->variantLabel() }}
@endif @foreach ($order->checkoutAnswerRows() as $answer)
{{ $answer['label'] }} {{ $answer['value'] }}
@endforeach @unless ($order->isRobuxOrder())
Nama Pemesan {{ $order->customer_name }}
@else
Nomor WhatsApp {{ $order->customer_whatsapp }}
@endunless @if ($order->isRobuxOrder())
Jumlah Robux {{ number_format($order->robuxAmount() ?? 0, 0, ',', '.') }} Robux
@elseif ($order->isBatch())
Jumlah {{ $order->quantity }} {{ strtolower(\App\Models\Product::unitLabelForType($order->productType())) }}
@endif
Harga Produk Rp {{ number_format($order->price_at_order, 0, ',', '.') }}
@if ($order->discount_amount > 0)
Voucher {{ $order->voucher_code_snapshot }} - Rp {{ number_format($order->discount_amount, 0, ',', '.') }}
Total Setelah Diskon Rp {{ number_format($order->payableAmount(), 0, ',', '.') }}
@endif @if ($order->status === 'PENDING_PAYMENT' && $order->qris_fee)
Biaya QRIS Rp {{ number_format($order->qris_fee, 0, ',', '.') }}
Total Pembayaran

Sudah termasuk biaya transaksi QRIS.

Rp {{ number_format($order->qris_total_payment ?? $order->payableAmount(), 0, ',', '.') }}
@endif
Kedaluwarsa @if ($order->status === 'PENDING_PAYMENT') {{-- Countdown realtime di-render JS dari data-expires-at (lihat script di bawah). Teks statis jadi fallback kalau JS belum jalan (mis. sesaat sebelum hydrate) atau browser tidak mendukung. --}} {{ $order->expires_at->format('d M Y, H:i') }} WIB @else {{ $order->expires_at->format('d M Y, H:i') }} WIB @endif
@if ($order->status === 'DELIVERED') @php // Batasi kartu yang benar-benar dirender di halaman ke 2 unit // pertama -- sengaja bukan disembunyikan lewat CSS/collapse, // tapi memang tidak dirender sama sekali, supaya halaman tetap // ringkas untuk order dengan banyak unit. Sisanya tetap bisa // didapat lewat tombol "Salin Semua" di bawah. $visibleLinks = $order->stockLinks->take(2); $hiddenCount = max(0, $order->stockLinks->count() - $visibleLinks->count()); $isLinkInvite = $order->productType() === 'link_invite'; $unitLabel = \App\Models\Product::unitLabelForType($order->productType()); $unitLabelLower = strtolower($unitLabel); // Data delivery bisa disalin baik untuk pembelian satuan maupun // batch. Batch tetap memakai label "Salin Semua", sedangkan // satuan memakai label yang lebih langsung sesuai tipe unit. $showCopyDelivery = $order->stockLinks->isNotEmpty(); // Format rapi untuk clipboard: header nama produk + jumlah, // lalu tiap unit dipisah baris kosong dengan label unit ke-N // (mis. "Akun 1", "Kode Redeem 2") supaya begitu ditempel ke // WhatsApp, customer/admin langsung bisa membedakan unit // satu dengan yang lain. $copyAllText = collect([$order->productName() . ($order->isBatch() ? ' - ' . $order->quantity . ' ' . $unitLabel : '')]) ->concat($order->stockLinks->map(function ($link, $index) use ($unitLabel) { $payload = $link->deliveryPayload(); $lines = collect($payload) ->map(fn ($value, $key) => ucwords(str_replace('_', ' ', $key)) . ': ' . $value) ->implode("\n"); return "\n{$unitLabel} " . ($index + 1) . "\n" . $lines; })) ->implode("\n"); $deliveryNoteEntries = collect([ 'product' => $deliveryNoteDocuments['product'] ?? null, 'variant' => $deliveryNoteDocuments['variant'] ?? null, ])->filter(); $deliveryNoteTextEntries = collect([ 'product' => $deliveryNotePlainText['product'] ?? '', 'variant' => $deliveryNotePlainText['variant'] ?? '', ])->filter(fn ($text) => trim((string) $text) !== ''); if ($deliveryNoteTextEntries->isNotEmpty()) { $multipleNotes = $deliveryNoteTextEntries->count() > 1; $copyNoteText = $deliveryNoteTextEntries ->map(function ($text, $type) use ($multipleNotes, $order) { if (! $multipleNotes) { return $text; } $label = $type === 'product' ? 'Panduan Produk' : 'Panduan Variant' . ($order->variantName() ? ' - ' . $order->variantName() : ''); return $label . "\n" . $text; }) ->implode("\n\n"); $copyAllText .= "\n\nNOTES\n" . $copyNoteText; } @endphp

Detail Pengiriman{{ $order->isBatch() ? ' - ' . $order->quantity . ' ' . $unitLabel : '' }}

@forelse ($visibleLinks as $link) @php $payload = $link->deliveryPayload(); @endphp
@if ($order->isBatch())

{{ $unitLabel }} {{ $loop->iteration }}

@endif @forelse ($payload as $key => $value)
{{ ucwords(str_replace('_', ' ', $key)) }} @if ($isLinkInvite && preg_match('/^https?:\/\//i', (string) $value)) Buka Link → @else {{ $value }} @endif
@empty

Detail pengiriman kosong.

@endforelse
@empty

Detail pengiriman belum tersedia.

@endforelse @if ($hiddenCount > 0)

+ {{ $hiddenCount }} {{ $unitLabelLower }} lagi tersembunyi

@endif @if ($deliveryNoteEntries->isNotEmpty())

Notes

@foreach ($deliveryNoteEntries as $type => $document)
@if ($deliveryNoteEntries->count() > 1)

{{ $type === 'product' ? 'Panduan Produk' : 'Panduan Variant' . ($order->variantName() ? ' · ' . $order->variantName() : '') }}

@endif
@include('invoice.partials.delivery-note-document', ['document' => $document])
@endforeach
@endif @if ($showCopyDelivery) @endif @elseif ($order->status === 'DELIVERED_MANUAL')

Pesanan ini sudah diselesaikan oleh admin secara manual. Kalau kamu belum menerima detail/akses melalui WhatsApp, silakan hubungi kami dengan menyertakan ID invoice di atas.

@elseif ($order->status === 'PAID' && $order->requiresManualFulfillment())

Pembayaran berhasil. Pesanan ini diproses secara manual - tim kami akan menghubungi kamu melalui WhatsApp segera.

@elseif ($order->status === 'PENDING_PAYMENT')

Menunggu pembayaran. Halaman ini otomatis diperbarui begitu pembayaran terkonfirmasi.

@elseif ($order->status === 'FULFILLMENT_FAILED')

Pembayaran berhasil, tapi pengiriman otomatis sempat gagal. Tim kami sedang menindaklanjuti pesanan ini secara manual.

@elseif ($order->status === 'EXPIRED')

Invoice ini sudah kedaluwarsa. Silakan checkout ulang lewat halaman produk untuk mendapatkan invoice baru.

@elseif ($order->status === 'REFUNDED')

Pesanan ini telah direfund.

@endif
@if ($order->status === 'PENDING_PAYMENT' && $order->hasUsableQris()) @endif @endsection