MIF_E31221305/TA_website/app/Http/Controllers/Admin/WithdrawalController.php

257 lines
8.9 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Services\ApiService;
use Illuminate\Support\Facades\Log;
class WithdrawalController extends Controller
{
/**
* API Service
*
* @var ApiService
*/
protected $apiService;
/**
* Constructor
*
* @param ApiService $apiService
*/
public function __construct(ApiService $apiService)
{
$this->apiService = $apiService;
}
/**
* Display a listing of pending withdrawals.
*
* @return \Illuminate\Http\Response
*/
public function pending()
{
try {
$response = $this->apiService->get('admin/withdrawals/pending');
if ($response->successful()) {
$withdrawals = $response->json()['data'] ?? [];
return view('admin.withdrawals.pending', compact('withdrawals'));
}
// Jika response error 401, redirect ke login
if ($response->status() === 401) {
return redirect()->route('admin.login')
->with('error', 'Sesi anda telah berakhir. Silakan login kembali.');
}
// Jika terjadi error lain
return back()->with('error', 'Gagal memuat data penarikan: ' . ($response->json()['message'] ?? 'Unknown error'));
} catch (\Exception $e) {
Log::error('Withdrawal Pending Error:', [
'message' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return back()->with('error', 'Terjadi kesalahan saat memuat data penarikan');
}
}
/**
* Display a listing of processed withdrawals history.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function history(Request $request)
{
try {
// Siapkan query parameters
$query = [];
// Filter berdasarkan status
if ($request->filled('status')) {
$query['status'] = $request->status;
}
// Pencarian
if ($request->filled('search')) {
$query['search'] = $request->search;
}
// Filter rentang tanggal
if ($request->filled('from_date')) {
$query['from_date'] = $request->from_date;
}
if ($request->filled('to_date')) {
$query['to_date'] = $request->to_date;
}
// Pengurutan
if ($request->filled('sort_by')) {
$query['sort_by'] = $request->sort_by;
}
if ($request->filled('sort_order')) {
$query['sort_order'] = $request->sort_order;
}
// Paginasi
if ($request->filled('per_page')) {
$query['per_page'] = $request->per_page;
}
// Halaman saat ini
if ($request->filled('page')) {
$query['page'] = $request->page;
}
$response = $this->apiService->get('admin/withdrawals/history', $query);
if ($response->successful()) {
$withdrawalHistory = $response->json()['data'] ?? [];
return view('admin.withdrawals.history', compact('withdrawalHistory'));
}
// Jika response error 401, redirect ke login
if ($response->status() === 401) {
return redirect()->route('admin.login')
->with('error', 'Sesi anda telah berakhir. Silakan login kembali.');
}
// Jika terjadi error lain
return back()->with('error', 'Gagal memuat riwayat penarikan: ' . ($response->json()['message'] ?? 'Unknown error'));
} catch (\Exception $e) {
Log::error('Withdrawal History Error:', [
'message' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return back()->with('error', 'Terjadi kesalahan saat memuat riwayat penarikan');
}
}
/**
* Show the form for processing a withdrawal.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function showProcess($id)
{
try {
// Ambil semua data withdrawal pending
$response = $this->apiService->get('admin/withdrawals/pending');
if ($response->successful()) {
$withdrawals = $response->json()['data'] ?? [];
// Cari withdrawal dengan ID yang sesuai
$withdrawal = null;
foreach ($withdrawals as $item) {
if ($item['id'] == $id) {
$withdrawal = $item;
break;
}
}
if ($withdrawal) {
return view('admin.withdrawals.process', compact('withdrawal'));
}
// Jika tidak ditemukan
return redirect()->route('admin.withdrawals.pending')
->with('error', 'Penarikan dengan ID tersebut tidak ditemukan');
}
// Jika response error 401, redirect ke login
if ($response->status() === 401) {
return redirect()->route('admin.login')
->with('error', 'Sesi anda telah berakhir. Silakan login kembali.');
}
// Jika terjadi error lain
return redirect()->route('admin.withdrawals.pending')
->with('error', 'Gagal memuat data penarikan: ' . ($response->json()['message'] ?? 'Unknown error'));
} catch (\Exception $e) {
Log::error('Withdrawal Show Process Error:', [
'message' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return redirect()->route('admin.withdrawals.pending')
->with('error', 'Terjadi kesalahan saat memuat data penarikan');
}
}
/**
* Process the specified withdrawal request.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function process(Request $request, $id)
{
try {
// Validasi request sesuai dengan API yang diupdate
$request->validate([
'status' => 'required|in:completed,rejected',
'rejection_reason' => 'required_if:status,rejected',
'proof_of_payment' => 'required_if:status,completed|file|mimes:jpeg,png,jpg,pdf|max:2048',
]);
// Persiapkan data untuk API
$data = [
'status' => $request->status,
'rejection_reason' => $request->rejection_reason,
];
// Siapkan file bukti pembayaran jika ada
if ($request->status === 'completed' && $request->hasFile('proof_of_payment')) {
$response = $this->apiService->post("admin/withdrawals/{$id}/process", $data, [
'proof_of_payment' => $request->file('proof_of_payment')
]);
} else {
$response = $this->apiService->post("admin/withdrawals/{$id}/process", $data);
}
if ($response->successful()) {
$statusMessage = $request->status === 'completed' ? 'diselesaikan' : 'ditolak';
return redirect()->route('admin.withdrawals.pending')
->with('success', "Penarikan berhasil {$statusMessage}");
}
// Jika response error 401, redirect ke login
if ($response->status() === 401) {
return redirect()->route('admin.login')
->with('error', 'Sesi anda telah berakhir. Silakan login kembali.');
}
// Jika terjadi error validasi
if ($response->status() === 422) {
return back()->withErrors($response->json()['data'] ?? [])
->withInput();
}
// Jika terjadi error lain
return back()->with('error', 'Gagal memproses penarikan: ' . ($response->json()['message'] ?? 'Unknown error'))
->withInput();
} catch (\Exception $e) {
Log::error('Withdrawal Process Error:', [
'message' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return back()->with('error', 'Terjadi kesalahan saat memproses penarikan')
->withInput();
}
}
}