diff --git a/app/Http/Controllers/Admin/Manage/OrderController.php b/app/Http/Controllers/Admin/Manage/OrderController.php index b665627..00ddb00 100644 --- a/app/Http/Controllers/Admin/Manage/OrderController.php +++ b/app/Http/Controllers/Admin/Manage/OrderController.php @@ -36,6 +36,13 @@ public function index(Request $request): Response ]); } + public function show(Order $order): Response + { + return Inertia::render('admin/manage/orders/Show', [ + 'order' => $this->orderService->findForShow($order), + ]); + } + public function create(Request $request): Response { $user = $request->user(); diff --git a/app/Services/Manage/OrderService.php b/app/Services/Manage/OrderService.php index 2b090b0..42be869 100644 --- a/app/Services/Manage/OrderService.php +++ b/app/Services/Manage/OrderService.php @@ -197,6 +197,40 @@ public function findForEdit(Order $order): Order return $order; } + public function findForShow(Order $order): Order + { + $order->load([ + 'customer:id,name,phone_number,address', + 'createdBy.profile', + 'marketing.profile', + 'items.productVariant.product:id,name', + 'items.productVariant.media', + 'cashTransaction:id,amount,description,created_at', + ]); + + $order->items->each(function (OrderItem $item): void { + $variant = $item->productVariant; + + if ($variant) { + $item->setAttribute('product_name', $variant->product?->name); + $item->setAttribute('variant_name', $variant->name); + $variant->setAttribute( + 'images', + MediaPresenter::collection($variant, 'images'), + ); + } + }); + + $availableActions = collect($order->status->availableActions()) + ->values() + ->all(); + + $order->setAttribute('available_actions', $availableActions); + $order->setAttribute('is_editable', $order->status->isEditable()); + + return $order; + } + /** * @return list> */ diff --git a/resources/js/components/admin/manage/orders/data-table-actions.vue b/resources/js/components/admin/manage/orders/data-table-actions.vue index 0f6e7a1..539f623 100644 --- a/resources/js/components/admin/manage/orders/data-table-actions.vue +++ b/resources/js/components/admin/manage/orders/data-table-actions.vue @@ -1,6 +1,6 @@ + + diff --git a/resources/js/types/order.ts b/resources/js/types/order.ts index d0318b1..12cd3c9 100644 --- a/resources/js/types/order.ts +++ b/resources/js/types/order.ts @@ -114,6 +114,98 @@ export type OrderEditItem = { }>; }; +export type OrderDetail = { + id: number; + order_number: string; + channel: string; + channel_label: string; + price_type: string; + price_type_label: string; + payment_type: string; + payment_type_label: string; + is_affiliate: boolean; + status: string; + status_label: string; + is_editable: boolean; + available_actions: OrderStatusAction[]; + tiktok_order_id: string | null; + shopee_order_id: string | null; + subtotal: number; + subtotal_formatted: string; + discount: number; + discount_formatted: string; + shipping_cost: number; + shipping_cost_formatted: string; + total_amount: number; + total_amount_formatted: string; + notes: string | null; + created_at_formatted: string; + customer?: { + id: number; + name: string; + phone_number: string | null; + address: string | null; + } | null; + created_by?: { + id: number; + username: string; + profile?: { + full_name: string; + } | null; + }; + marketing?: { + id: number; + username: string; + profile?: { + full_name: string; + } | null; + } | null; + items: Array<{ + id: number; + product_name: string; + variant_name: string; + stock_quality: string; + stock_quality_label?: string; + quantity: number; + quantity_formatted: string; + unit_price: number; + unit_price_formatted: string; + subtotal: number; + subtotal_formatted: string; + product_variant?: { + id: number; + name: string; + images?: MediaItem[]; + product?: { + id: number; + name: string; + }; + }; + }>; + cash_transaction?: { + id: number; + amount: number; + description: string; + created_at: string; + } | null; + marketplace_settings_snapshot?: { + platform: string; + is_affiliate: boolean; + base_amount: number; + total_fee_amount: number; + net_amount: number; + fees: Record; + results: Record; + } | null; +}; + export type PaginatedOrders = { data: OrderListItem[]; current_page: number; diff --git a/routes/web.php b/routes/web.php index 8303483..bd691d3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -239,6 +239,8 @@ ->middleware('permission:'.Permission::ORDERS_CREATE->value) ->name('store'); + Route::get('{order}', [OrderController::class, 'show'])->name('show'); + Route::get('{order}/edit', [OrderController::class, 'edit']) ->middleware('permission:'.Permission::ORDERS_UPDATE->value) ->name('edit');