File manager - Edit - /home/webapp69.cm.in.th/u69319090028/Shop/views/admin/payments/index.php
Back
<?php /** * Admin Payment Index * Route: GET /admin/payments */ $statusOptions = [ 'all' => 'ทุกสถานะ', 'pending' => 'รอชำระ', 'awaiting_verification' => 'รอตรวจสอบ', 'confirmed' => 'ยืนยันแล้ว', 'failed' => 'ล้มเหลว', 'expired' => 'หมดอายุ', 'cancelled' => 'ยกเลิก', 'refund_pending' => 'รอคืนเงิน', 'refunded' => 'คืนเงินแล้ว', ]; $methodOptions = ['all' => 'ทุกวิธี', 'PromptPay' => 'PromptPay', 'BankTransfer' => 'Bank Transfer', 'COD' => 'COD']; function paymentStatusBadge(string $s): string { switch ($s) { case 'pending': return '<span class="badge bg-warning text-dark">รอชำระ</span>'; case 'awaiting_verification': return '<span class="badge bg-primary">รอตรวจสอบ</span>'; case 'confirmed': return '<span class="badge bg-success">ยืนยันแล้ว</span>'; case 'failed': return '<span class="badge bg-danger">ล้มเหลว</span>'; case 'expired': return '<span class="badge bg-secondary">หมดอายุ</span>'; case 'cancelled': return '<span class="badge bg-secondary">ยกเลิก</span>'; case 'refund_pending': return '<span class="badge" style="background:#f59e0b;">รอคืนเงิน</span>'; case 'refunded': return '<span class="badge bg-info text-dark">คืนเงินแล้ว</span>'; default: return '<span class="badge bg-light text-dark border">' . e($s) . '</span>'; } } ?> <div class="d-flex justify-content-between align-items-start mb-4 gap-2 flex-wrap"> <div> <h4 class="fw-bold mb-1 text-dark"><i class="bi bi-credit-card me-2 text-primary"></i>การชำระเงิน</h4> <p class="text-muted small mb-0">ตรวจสอบและจัดการรายการชำระเงินทั้งหมด</p> </div> <a href="<?= url('/admin/payments/accounts') ?>" class="btn btn-sm btn-outline-primary"> <i class="bi bi-bank me-1"></i>จัดการบัญชีรับเงิน </a> </div> <!-- KPI Stats --> <div class="row g-3 mb-4"> <?php $kpis = [ ['label' => 'รอตรวจสอบ', 'val' => (int)($stats['awaiting'] ?? 0), 'icon' => 'hourglass-split', 'cls' => 'text-primary'], ['label' => 'ยืนยันแล้ว', 'val' => (int)($stats['confirmed'] ?? 0), 'icon' => 'check-circle', 'cls' => 'text-success'], ['label' => 'รอคืนเงิน', 'val' => (int)($stats['refunds'] ?? 0), 'icon' => 'arrow-return-left','cls' => 'text-warning'], ['label' => 'ยอดยืนยันวันนี้','val' => '฿' . number_format((float)($stats['today_amount'] ?? 0), 0), 'icon' => 'graph-up', 'cls' => 'text-info'], ]; ?> <?php foreach ($kpis as $k): ?> <div class="col-6 col-md-3"> <div class="card border-0 shadow-sm h-100"> <div class="card-body d-flex align-items-center gap-3 py-3"> <div class="rounded-2 p-2" style="background:#f1f5f9;"> <i class="bi bi-<?= $k['icon'] ?> <?= $k['cls'] ?> fs-5"></i> </div> <div> <div class="fw-bold fs-5 text-dark"><?= $k['val'] ?></div> <div class="text-muted" style="font-size:.75rem;"><?= $k['label'] ?></div> </div> </div> </div> </div> <?php endforeach; ?> </div> <!-- Filter Bar --> <div class="card border-0 shadow-sm mb-3"> <div class="card-body py-2 px-3"> <form method="GET" action="<?= url('/admin/payments') ?>" class="d-flex flex-wrap gap-2 align-items-end"> <div> <label class="form-label small fw-bold mb-1 text-muted">สถานะ</label> <select name="status" class="form-select form-select-sm" style="min-width:150px;"> <?php foreach ($statusOptions as $val => $lbl): ?> <option value="<?= $val ?>" <?= ($filters['status'] ?? 'all') === $val ? 'selected' : '' ?>><?= $lbl ?></option> <?php endforeach; ?> </select> </div> <div> <label class="form-label small fw-bold mb-1 text-muted">วิธีชำระ</label> <select name="method" class="form-select form-select-sm" style="min-width:130px;"> <?php foreach ($methodOptions as $val => $lbl): ?> <option value="<?= $val ?>" <?= ($filters['method'] ?? 'all') === $val ? 'selected' : '' ?>><?= $lbl ?></option> <?php endforeach; ?> </select> </div> <div> <label class="form-label small fw-bold mb-1 text-muted">จาก</label> <input type="date" name="date_from" class="form-control form-control-sm" value="<?= e($filters['date_from'] ?? '') ?>"> </div> <div> <label class="form-label small fw-bold mb-1 text-muted">ถึง</label> <input type="date" name="date_to" class="form-control form-select-sm" value="<?= e($filters['date_to'] ?? '') ?>"> </div> <div class="flex-grow-1"> <label class="form-label small fw-bold mb-1 text-muted">ค้นหา</label> <input type="text" name="q" class="form-control form-control-sm" placeholder="Order No / ชื่อ / อีเมล..." value="<?= e($filters['q'] ?? '') ?>"> </div> <button class="btn btn-primary btn-sm px-3"> <i class="bi bi-search me-1"></i>ค้นหา </button> <?php if (!empty(array_filter($filters))): ?> <a href="<?= url('/admin/payments') ?>" class="btn btn-outline-secondary btn-sm">ล้าง</a> <?php endif; ?> </form> </div> </div> <!-- Payments Table --> <div class="card border-0 shadow-sm"> <div class="card-body p-0"> <?php if (empty($payments)): ?> <div class="text-center py-5 text-muted"> <i class="bi bi-credit-card" style="font-size:2.5rem;"></i> <p class="mt-3 mb-0">ไม่พบรายการชำระเงิน</p> </div> <?php else: ?> <div class="table-responsive"> <table class="table align-middle mb-0 small"> <thead class="table-light"> <tr> <th class="ps-3">Order No</th> <th>ลูกค้า</th> <th class="text-end">ยอด</th> <th>วิธีชำระ</th> <th>สถานะ</th> <th class="text-center">รอตรวจสอบ</th> <th>วันที่</th> <th class="pe-3"></th> </tr> </thead> <tbody> <?php foreach ($payments as $pmt): ?> <tr> <td class="ps-3"> <code class="text-primary fw-bold"><?= e($pmt['order_no']) ?></code> </td> <td> <div class="fw-medium text-dark"><?= e($pmt['customer_name']) ?></div> <div class="text-muted" style="font-size:.75rem;"><?= e($pmt['customer_email']) ?></div> </td> <td class="text-end fw-bold text-dark">฿<?= number_format((float)$pmt['amount'], 2) ?></td> <td class="text-muted"> <?php $method = $pmt['payment_method']; if ($method === 'PromptPay') { echo '<i class="bi bi-qr-code me-1"></i>PromptPay'; } elseif ($method === 'BankTransfer') { echo '<i class="bi bi-bank me-1"></i>Bank'; } elseif ($method === 'COD') { echo '<i class="bi bi-truck me-1"></i>COD'; } else { echo e($method); } ?> </td> <td><?= paymentStatusBadge($pmt['payment_status']) ?></td> <td class="text-center"> <?php if ((int)$pmt['pending_attempts'] > 0): ?> <span class="badge bg-warning text-dark rounded-pill"><?= (int)$pmt['pending_attempts'] ?></span> <?php else: ?> <span class="text-muted">—</span> <?php endif; ?> </td> <td class="pe-3 text-end"> <?php if ((int)$pmt['pending_attempts'] > 0 || $pmt['payment_status'] === 'awaiting_verification'): ?> <a href="<?= url('/admin/payments/' . e($pmt['order_no'])) ?>" class="btn btn-primary btn-sm px-2 py-1 fw-bold"> <i class="bi bi-check-circle me-1"></i>ตรวจสลิป </a> <?php else: ?> <a href="<?= url('/admin/payments/' . e($pmt['order_no'])) ?>" class="btn btn-outline-secondary btn-sm px-2 py-1" title="ดูรายละเอียด"> <i class="bi bi-eye"></i> </a> <?php endif; ?> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <!-- Pagination --> <?php if ($totalPages > 1): ?> <div class="px-3 py-2 border-top d-flex justify-content-between align-items-center small text-muted"> <span>แสดง <?= count($payments) ?> จาก <?= $total ?> รายการ</span> <div class="d-flex gap-1"> <?php for ($p = 1; $p <= $totalPages; $p++): ?> <?php $url = url('/admin/payments?' . http_build_query(array_merge($filters, ['page' => $p]))); ?> <a href="<?= $url ?>" class="btn btn-sm <?= $p === $page ? 'btn-primary' : 'btn-outline-secondary' ?>"><?= $p ?></a> <?php endfor; ?> </div> </div> <?php endif; ?> <?php endif; ?> </div> </div>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.23 |
proxy
|
phpinfo
|
Settings