feat(admin): manual deposit recording, transaction export, ticket filters
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
40bf6b54f9
commit
0cdf224309
@@ -3,12 +3,15 @@
|
||||
namespace App\Http\Controllers\Api\Admin\Transaction;
|
||||
|
||||
use App\Enums\TransactionStatus;
|
||||
use App\Http\Controllers\Api\Admin\Transaction\Concerns\ExportsTransactions;
|
||||
use App\Http\Controllers\Api\Admin\Transaction\Concerns\RecordsManualDeposits;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Mail\Customer\ManualDepositStatus;
|
||||
use App\Models\Customer;
|
||||
use App\Models\Notification;
|
||||
use App\Models\Log;
|
||||
use App\Models\Transaction;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -18,6 +21,9 @@ use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class AdminTransactionController extends Controller
|
||||
{
|
||||
use ExportsTransactions;
|
||||
use RecordsManualDeposits;
|
||||
|
||||
public function pendingCount(): JsonResponse
|
||||
{
|
||||
$count = Transaction::where('type', 'manual')
|
||||
@@ -30,23 +36,7 @@ class AdminTransactionController extends Controller
|
||||
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$query = Transaction::with('customer')
|
||||
->where('type', 'manual')
|
||||
->orderByDesc('created_at');
|
||||
|
||||
if ($request->filled('status')) {
|
||||
$query->where('status', $request->integer('status'));
|
||||
}
|
||||
|
||||
if ($request->filled('filter')) {
|
||||
$search = $request->string('filter')->trim();
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('public_code', 'like', "%{$search}%")
|
||||
->orWhereHas('customer', fn($c) => $c
|
||||
->where('fullname', 'like', "%{$search}%")
|
||||
->orWhere('email', 'like', "%{$search}%"));
|
||||
});
|
||||
}
|
||||
$query = $this->filteredQuery($request->only(['filter', 'status']))->with('user');
|
||||
|
||||
$perPage = $request->integer('per_page', 15);
|
||||
$paginated = $query->paginate($perPage);
|
||||
@@ -66,6 +56,7 @@ class AdminTransactionController extends Controller
|
||||
'status_label' => TransactionStatus::from((int) $t->status)->label(),
|
||||
'proof_image' => $t->proof_image_urls[0] ?? null,
|
||||
'created_at' => $t->created_at?->toISOString(),
|
||||
'created_by' => $t->user?->name ?: $t->user?->username,
|
||||
'customer' => $t->customer ? [
|
||||
'uuid' => $t->customer->uuid,
|
||||
'fullname' => $t->customer->fullname,
|
||||
@@ -331,6 +322,42 @@ class AdminTransactionController extends Controller
|
||||
return response()->json(['error' => false, 'message' => 'Đã xoá giao dịch']);
|
||||
}
|
||||
|
||||
private function filteredQuery(array $filters): Builder
|
||||
{
|
||||
$query = Transaction::with('customer')
|
||||
->where('type', 'manual')
|
||||
->orderByDesc('created_at');
|
||||
|
||||
$status = $filters['status'] ?? null;
|
||||
if ($status !== null && $status !== '' && $status !== []) {
|
||||
$query->whereIn('status', array_map('intval', (array) $status));
|
||||
}
|
||||
|
||||
$search = trim((string) ($filters['filter'] ?? ''));
|
||||
if ($search !== '') {
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('public_code', 'like', "%{$search}%")
|
||||
->orWhereHas('customer', fn($c) => $c
|
||||
->where('fullname', 'like', "%{$search}%")
|
||||
->orWhere('email', 'like', "%{$search}%"));
|
||||
});
|
||||
}
|
||||
|
||||
if (! empty($filters['customer_id'])) {
|
||||
$query->where('customer_id', (int) $filters['customer_id']);
|
||||
}
|
||||
|
||||
if (! empty($filters['date_from'])) {
|
||||
$query->whereDate('created_at', '>=', $filters['date_from']);
|
||||
}
|
||||
|
||||
if (! empty($filters['date_to'])) {
|
||||
$query->whereDate('created_at', '<=', $filters['date_to']);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
private function releasePending(Customer $customer, Transaction $transaction, int $amount): void
|
||||
{
|
||||
if ($transaction->proof_image) {
|
||||
|
||||
Reference in New Issue
Block a user