diff --git a/app/Models/ProductVariant.php b/app/Models/ProductVariant.php index ab81321..91d8d69 100644 --- a/app/Models/ProductVariant.php +++ b/app/Models/ProductVariant.php @@ -15,7 +15,7 @@ use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; -#[Appends(['formatted_name'])] +#[Appends(['formatted_name', 'formatted_stock'])] #[Guarded(['id'])] #[ScopedBy([ProductVariantScope::class])] class ProductVariant extends Model implements HasMedia @@ -34,7 +34,14 @@ protected function casts(): array protected function formattedName(): Attribute { return Attribute::make( - get: fn () => ucfirst($this->name), + get: fn() => ucfirst($this->name), + ); + } + + protected function formattedStock(): Attribute + { + return Attribute::make( + get: fn() => number_format($this->stock, 0, ',', '.'), ); } diff --git a/resources/js/pages/admin/manage/restock/restock-sub-row.tsx b/resources/js/pages/admin/manage/restock/restock-sub-row.tsx index 790d1ce..c865484 100644 --- a/resources/js/pages/admin/manage/restock/restock-sub-row.tsx +++ b/resources/js/pages/admin/manage/restock/restock-sub-row.tsx @@ -7,6 +7,7 @@ import { TableHeader, TableRow, } from '@/components/ui/table'; +import { Fragment } from 'react'; import { formatNumber } from '@/lib/format'; import { formatCurrency } from '@/lib/utils'; import type { Restock } from './columns'; @@ -14,8 +15,20 @@ import type { Restock } from './columns'; export function RestockItemSubRow({ restock }: { restock: Restock }) { const items = restock.restock_items ?? []; + const groupedByProduct = items.reduce( + (acc, item) => { + const name = item.product_variant?.product?.name ?? 'Tanpa Produk'; + if (!acc[name]) acc[name] = []; + acc[name].push(item); + return acc; + }, + {} as Record, + ); + + let counter = 0; + return ( -
+
@@ -23,7 +36,6 @@ export function RestockItemSubRow({ restock }: { restock: Restock }) { No Foto - Produk Varian Harga Modal @@ -36,49 +48,94 @@ export function RestockItemSubRow({ restock }: { restock: Restock }) { {items.length === 0 ? ( Tidak ada item. ) : ( - items.map((item, index) => ( - - - {index + 1} - - - {item.product_variant?.photo_url ? ( - - ) : ( -
- N/A -
- )} -
- - {item.product_variant?.product?.name ?? '-'} - - - {item.product_variant?.name ?? '-'} - - - {formatCurrency(item.unit_price)} - - - {formatNumber(item.quantity)} - - - {formatCurrency(item.subtotal)} - -
- )) + Object.entries(groupedByProduct).map( + ([productName, groupItems]) => { + const totalQty = groupItems.reduce( + (sum, item) => sum + (item.quantity ?? 0), + 0, + ); + const totalSubtotal = groupItems.reduce( + (sum, item) => sum + (item.subtotal ?? 0), + 0, + ); + + return ( + + + + {productName} + + + {formatNumber(totalQty)} + + + {formatCurrency(totalSubtotal)} + + + {groupItems.map((item) => { + counter++; + return ( + + + {counter} + + + {item.product_variant + ?.photo_url ? ( + + ) : ( +
+ N/A +
+ )} +
+ + {item.product_variant + ?.name ?? '-'} + + + {formatCurrency( + item.unit_price, + )} + + + {formatNumber( + item.quantity, + )} + + + {formatCurrency( + item.subtotal, + )} + +
+ ); + })} +
+ ); + }, + ) )}
diff --git a/resources/js/pages/admin/master/product/columns.tsx b/resources/js/pages/admin/master/product/columns.tsx index a0ccfc7..89c7536 100644 --- a/resources/js/pages/admin/master/product/columns.tsx +++ b/resources/js/pages/admin/master/product/columns.tsx @@ -1,16 +1,16 @@ -import { router } from '@inertiajs/react'; -import type { ColumnDef } from '@tanstack/react-table'; -import { ChevronRight, Pencil, Trash2 } from 'lucide-react'; import { RowActions } from '@/components/row-actions'; import { Button } from '@/components/ui/button'; import { Switch } from '@/components/ui/switch'; import { formatNumber } from '@/lib/format'; -import { formatCurrency } from '@/lib/utils'; +import { router } from '@inertiajs/react'; +import type { ColumnDef } from '@tanstack/react-table'; +import { ChevronRight, Pencil, Trash2 } from 'lucide-react'; export type ProductVariant = { id: number; name: string; stock: number; + formatted_stock: string reject_stock: number; retail_stock: number; photo_urls: string[]; diff --git a/resources/js/pages/admin/master/product/variant/transfer-stock-dialog.tsx b/resources/js/pages/admin/master/product/variant/transfer-stock-dialog.tsx index 632070e..466981a 100644 --- a/resources/js/pages/admin/master/product/variant/transfer-stock-dialog.tsx +++ b/resources/js/pages/admin/master/product/variant/transfer-stock-dialog.tsx @@ -67,7 +67,7 @@ export function TransferStockDialog({ Stok Bagus Tersedia

- {variant.stock} + {variant.formatted_stock}