MIF_E31220412/resources/views/admin/verifikasi-pembayaran.blade...

281 lines
13 KiB
PHP

@extends('layouts.app')
@section('title', 'Verifikasi Pembayaran - INUFA')
@section('header', 'Verifikasi Pembayaran')
@section('content')
<div class="bg-white p-6 rounded-lg shadow-lg">
<h2 class="text-xl font-bold mb-4">Daftar Pembayaran yang Perlu Diverifikasi</h2>
@if(isset($sewas) && count($sewas) > 0)
<div class="overflow-x-auto">
<table class="min-w-full bg-white">
<thead>
<tr class="bg-gray-100">
<th class="py-3 px-4 text-left">No</th>
<th class="py-3 px-4 text-left">Pemesan</th>
<th class="py-3 px-4 text-left">Paket</th>
<th class="py-3 px-4 text-left">Total Harga</th>
<th class="py-3 px-4 text-left">Nominal Pembayaran</th>
<th class="py-3 px-4 text-left">Status Pembayaran</th>
<th class="py-3 px-4 text-left">Tanggal Pembayaran</th>
<th class="py-3 px-4 text-left">Lokasi Acara</th>
<th class="py-3 px-4 text-left">Kota Tujuan</th>
<th class="py-3 px-4 text-left">Ongkir</th>
<th class="py-3 px-4 text-left">Status</th>
<th class="py-3 px-4 text-left">Bukti Pembayaran</th>
<th class="py-3 px-4 text-left">Jaminan</th>
<th class="py-3 px-4 text-left">Catatan</th>
<th class="py-3 px-4 text-left">Aksi</th>
</tr>
</thead>
<tbody>
@foreach($sewas as $index => $sewa)
<tr class="border-b hover:bg-gray-50">
<td class="py-3 px-4">{{ $index + 1 }}</td>
<td class="py-3 px-4">
{{ $sewa->user->nama }}<br>
<span class="text-sm text-gray-500">{{ $sewa->user->email }}</span>
</td>
<td class="py-3 px-4">{{ $sewa->paket->nama_paket }}</td>
<td class="py-3 px-4">Rp {{ number_format($sewa->total_harga, 0, ',', '.') }}</td>
<td class="py-3 px-4">
@if($sewa->nominal_pembayaran)
Rp {{ number_format($sewa->nominal_pembayaran, 0, ',', '.') }}
@else
<span class="text-gray-500">-</span>
@endif
</td>
<td class="py-3 px-4">
@if($sewa->nominal_pembayaran)
@if($sewa->nominal_pembayaran >= $sewa->total_harga)
<span class="px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs font-semibold">
Lunas
</span>
@else
<span class="px-2 py-1 bg-yellow-100 text-yellow-800 rounded-full text-xs font-semibold">
DP {{ number_format(($sewa->nominal_pembayaran / $sewa->total_harga) * 100, 0) }}%
</span>
@endif
@else
<span class="px-2 py-1 bg-red-100 text-red-800 rounded-full text-xs font-semibold">
Belum Bayar
</span>
@endif
</td>
<td class="py-3 px-4">{{ date('d/m/Y H:i', strtotime($sewa->tanggal_pembayaran)) }}</td>
<td class="py-3 px-4">
<span class="text-sm">{{ $sewa->lokasi }}</span>
</td>
<td class="py-3 px-4">
@if($sewa->kota)
<span class="text-sm font-medium">{{ $sewa->kota->nama_kota }}</span>
@else
<span class="text-gray-500">-</span>
@endif
</td>
<td class="py-3 px-4">
@if($sewa->ongkir)
<span class="text-sm">Rp {{ number_format($sewa->ongkir, 0, ',', '.') }}</span>
@else
<span class="text-gray-500">-</span>
@endif
</td>
<td class="py-3 px-4">
<span class="px-2 py-1 rounded-full text-xs font-semibold
@if($sewa->status == 'pending') bg-yellow-100 text-yellow-800
@elseif($sewa->status == 'dibatalkan') bg-red-100 text-red-800
@endif">
@if($sewa->status == 'dibatalkan')
Dibatalkan oleh Penyewa
@else
Menunggu Verifikasi
@endif
</span>
</td>
<td class="py-3 px-4">
<a href="{{ Storage::url($sewa->bukti_pembayaran) }}" target="_blank"
class="text-blue-600 hover:text-blue-800">
Lihat Bukti
</a>
</td>
<td class="py-3 px-4">
@if($sewa->foto_jaminan)
<div class="space-y-1">
<p class="text-sm text-gray-600">{{ ucfirst($sewa->jenis_jaminan) }}</p>
<a href="{{ Storage::url($sewa->foto_jaminan) }}" target="_blank"
class="text-blue-600 hover:text-blue-800">
Lihat Jaminan
</a>
</div>
@else
<span class="text-gray-400">Belum ada</span>
@endif
</td>
<td class="py-3 px-4">
@if($sewa->catatan)
<span class="text-sm text-gray-600">{{ $sewa->catatan }}</span>
@else
<span class="text-gray-400">-</span>
@endif
</td>
<td class="py-3 px-4">
@if($sewa->status != 'dibatalkan')
<div class="space-y-2">
<div class="flex space-x-2">
<form action="{{ route('admin.verifikasi.approve', $sewa->id) }}" method="POST" class="inline">
@csrf
<button type="submit"
class="bg-green-500 text-white px-3 py-1 rounded hover:bg-green-600">
Setujui
</button>
</form>
<form action="{{ route('admin.verifikasi.reject', $sewa->id) }}" method="POST" class="inline reject-form">
@csrf
<button type="button"
class="bg-red-500 text-white px-3 py-1 rounded hover:bg-red-600 open-reject-modal"
data-sewa-id="{{ $sewa->id }}">
Tolak
</button>
</form>
</div>
<!-- Tombol Chat -->
<a href="{{ route('chat.show', $sewa->user_id) }}"
class="inline-flex items-center justify-center w-full px-3 py-1 bg-blue-500 text-white rounded hover:bg-blue-600">
<svg class="h-4 w-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" />
</svg>
Chat dengan Penyewa
</a>
</div>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<div class="text-center py-8">
<p class="text-gray-500">Tidak ada pembayaran yang perlu diverifikasi</p>
</div>
@endif
</div>
<!-- Modal Penolakan -->
<div id="rejectModal" class="fixed inset-0 flex items-center justify-center z-50 hidden bg-black bg-opacity-40">
<div class="bg-white rounded-lg shadow-lg p-6 w-full max-w-md">
<h3 class="text-lg font-bold mb-4">Pilih Alasan Penolakan</h3>
<form id="rejectReasonForm" method="POST">
@csrf
<input type="hidden" name="sewa_id" id="modalSewaId">
<div class="mb-4">
<select name="alasan_penolakan" id="alasan_penolakan" class="w-full border rounded px-3 py-2">
<option value="">-- Pilih Alasan --</option>
</select>
</div>
<div class="mb-4" id="alasanLainnyaDiv" style="display:none;">
<input type="text"
name="alasan_lainnya"
id="alasan_lainnya"
class="w-full border rounded px-3 py-2"
placeholder="Tulis alasan lain..."
maxlength="255">
</div>
<div class="flex justify-end space-x-2">
<button type="button" id="closeRejectModal" class="px-4 py-2 bg-gray-300 rounded hover:bg-gray-400">Batal</button>
<button type="submit" class="px-4 py-2 bg-red-500 text-white rounded hover:bg-red-600">Tolak</button>
</div>
</form>
</div>
</div>
<script>
// Opsi alasan penolakan fallback jika API tidak tersedia
const FALLBACK_ALASAN = [
'Bukti pembayaran tidak valid',
'Jaminan tidak sesuai',
'Data tidak lengkap',
'Lainnya'
];
// Load alasan penolakan dari server
async function loadAlasanPenolakan() {
try {
const response = await fetch('/admin/verifikasi/alasan-penolakan');
if (!response.ok) {
throw new Error('API tidak tersedia');
}
const data = await response.json();
const select = document.getElementById('alasan_penolakan');
select.innerHTML = '<option value="">-- Pilih Alasan --</option>';
data.alasan_penolakan.forEach(alasan => {
const option = document.createElement('option');
option.value = alasan;
option.textContent = alasan;
select.appendChild(option);
});
} catch (error) {
console.error('Error loading alasan penolakan:', error);
// Gunakan fallback jika API tidak tersedia
const select = document.getElementById('alasan_penolakan');
select.innerHTML = '<option value="">-- Pilih Alasan --</option>';
FALLBACK_ALASAN.forEach(alasan => {
const option = document.createElement('option');
option.value = alasan;
option.textContent = alasan;
select.appendChild(option);
});
}
}
// Load alasan penolakan saat halaman dimuat
document.addEventListener('DOMContentLoaded', loadAlasanPenolakan);
document.querySelectorAll('.open-reject-modal').forEach(btn => {
btn.addEventListener('click', function() {
document.getElementById('rejectModal').classList.remove('hidden');
document.getElementById('modalSewaId').value = this.getAttribute('data-sewa-id');
// Set form action
const sewaId = this.getAttribute('data-sewa-id');
document.getElementById('rejectReasonForm').action = `/admin/verifikasi/${sewaId}/reject`;
});
});
document.getElementById('closeRejectModal').onclick = function() {
document.getElementById('rejectModal').classList.add('hidden');
};
document.getElementById('alasan_penolakan').onchange = function() {
if (this.value === 'Lainnya') {
document.getElementById('alasanLainnyaDiv').style.display = 'block';
} else {
document.getElementById('alasanLainnyaDiv').style.display = 'none';
}
};
document.getElementById('rejectReasonForm').onsubmit = function(e) {
const alasan = document.getElementById('alasan_penolakan').value;
const alasanLainnya = document.getElementById('alasan_lainnya').value;
if (!alasan) {
alert('Silakan pilih alasan penolakan!');
e.preventDefault();
return false;
}
if (alasan === 'Lainnya' && !alasanLainnya.trim()) {
alert('Silakan isi alasan lainnya!');
e.preventDefault();
return false;
}
return true;
};
</script>
@endsection