From 6ebcbc24c0733c1602a9ac8b4dbb95d2bd32cd67 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 6 Aug 2026 14:59:48 +0700 Subject: [PATCH] feat: add update status functionality for transactions with corresponding UI actions --- .../Admin/Manage/TransactionController.php | 9 +++++ .../Admin/Manage/TransactionService.php | 7 ++++ .../pages/admin/manage/transaction/index.tsx | 6 ++++ .../manage/transaction/transaction-card.tsx | 36 ++++++++++++++++++- 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/Manage/TransactionController.php b/app/Http/Controllers/Admin/Manage/TransactionController.php index 93a3174..cb6061c 100644 --- a/app/Http/Controllers/Admin/Manage/TransactionController.php +++ b/app/Http/Controllers/Admin/Manage/TransactionController.php @@ -76,4 +76,13 @@ public function destroy(Order $transaction): RedirectResponse 'admin.manage.transactions.index' ); } + + public function updateStatus(Order $transaction): RedirectResponse + { + return $this->handleAction( + fn () => $this->service->updateStatus($transaction, request('status')), + 'Status transaksi berhasil diperbarui.', + 'admin.manage.transactions.index' + ); + } } diff --git a/app/Services/Admin/Manage/TransactionService.php b/app/Services/Admin/Manage/TransactionService.php index 0f9106c..f7055cf 100644 --- a/app/Services/Admin/Manage/TransactionService.php +++ b/app/Services/Admin/Manage/TransactionService.php @@ -358,6 +358,13 @@ public function delete(Order $order): bool }); } + public function updateStatus(Order $order, string $status): Order + { + $order->update(['status' => $status]); + + return $order; + } + private function buildItemRows(array $items, string $stockType, string $priceType, $now, int &$subtotal, int &$totalCost): array { $resolvedPriceType = $stockType === ProductStockQuality::REJECT->value diff --git a/resources/js/pages/admin/manage/transaction/index.tsx b/resources/js/pages/admin/manage/transaction/index.tsx index 1f5fcae..2329387 100644 --- a/resources/js/pages/admin/manage/transaction/index.tsx +++ b/resources/js/pages/admin/manage/transaction/index.tsx @@ -31,6 +31,7 @@ import { create as transactionCreate, index as transactionIndex, edit as transactionEdit, + updateStatus as transactionUpdateStatus, } from '@/routes/admin/manage/transactions'; import type { Transaction } from './columns'; import { TransactionCardRow } from './transaction-card'; @@ -147,6 +148,10 @@ export default function TransactionIndex({ }); } + function handleUpdateStatus(transaction: Transaction, status: string) { + router.patch(transactionUpdateStatus.url(transaction.id), { status }); + } + const filterToolbar = ( setDeleting(t)} + onUpdateStatus={(t, status) => handleUpdateStatus(t, status)} /> )} renderSubContent={(transaction) => ( diff --git a/resources/js/pages/admin/manage/transaction/transaction-card.tsx b/resources/js/pages/admin/manage/transaction/transaction-card.tsx index 47ef428..faec082 100644 --- a/resources/js/pages/admin/manage/transaction/transaction-card.tsx +++ b/resources/js/pages/admin/manage/transaction/transaction-card.tsx @@ -5,7 +5,7 @@ import { Card, CardContent } from '@/components/ui/card'; import { useCan } from '@/hooks/use-can'; import { formatDateTime, formatNumber } from '@/lib/format'; import { formatCurrency } from '@/lib/utils'; -import { ChevronDown, Pencil, Trash2 } from 'lucide-react'; +import { CheckCircle, ChevronDown, Pencil, Send, Trash2, XCircle } from 'lucide-react'; import type { Transaction } from './columns'; const STATUS_BADGE_CLASSES: Record = { @@ -23,6 +23,7 @@ export type TransactionCardRowParams = { onToggleExpand: () => void; onEdit: (transaction: Transaction) => void; onDelete: (transaction: Transaction) => void; + onUpdateStatus: (transaction: Transaction, status: string) => void; }; export function TransactionCardRow({ @@ -32,6 +33,7 @@ export function TransactionCardRow({ onToggleExpand, onEdit, onDelete, + onUpdateStatus, }: TransactionCardRowParams) { const { can } = useCan(); const items = transaction.order_items ?? []; @@ -183,6 +185,38 @@ export function TransactionCardRow({ , + onClick: () => onUpdateStatus(transaction, 'processing'), + }, + ] + : []), + ...((transaction.status === 'pending' || transaction.status === 'processing') && can('orders.update') + ? [ + { + label: 'Selesai', + icon: , + onClick: () => onUpdateStatus(transaction, 'completed'), + }, + { + label: 'Dibatalkan', + icon: , + onClick: () => onUpdateStatus(transaction, 'cancelled'), + }, + ] + : []), + ...(transaction.status === 'completed' && can('orders.update') + ? [ + { + label: 'Refund', + icon: , + onClick: () => onUpdateStatus(transaction, 'refunded'), + }, + ] + : []), { label: 'Edit', icon: ,