Pergerakan Stok

Catat waste, pemakaian non-penjualan, dan koreksi input. Untuk koreksi periodik gunakan Stock Opname.

@canany(['inventory.movements.create', 'inventory.movements.manage', 'inventory.manage']) @endcanany

Stock Opname

Koreksi berkala berdasarkan hitung fisik (selisih sistem vs fisik).

Waste / Pemakaian

Kejadian harian seperti rusak/expired, staff meal, sampling, produksi/prep.

Penyesuaian

Koreksi input (mis. salah satuan), bukan pengganti waste/opname.

@forelse ($movements as $movement) @php $qty = (float) $movement->quantity; $qtyText = \App\Support\Number\QuantityFormatter::format(abs($qty)); $ingredientUnit = (string) ($movement->ingredient?->unit ?? ''); $when = $movement->happened_at ?? $movement->created_at; $typeLabel = $typeOptions[$movement->type] ?? (string) $movement->type; $typeBadgeClass = match ((string) $movement->type) { 'purchase' => 'bg-success-50 text-success-600 border-success-200 dark:bg-success-500/10 dark:text-success-500 dark:border-success-500/20', 'sale_consumption' => 'bg-error-50 text-error-600 border-error-200 dark:bg-error-500/10 dark:text-error-500 dark:border-error-500/20', 'sale_reversal' => 'bg-success-50 text-success-600 border-success-200 dark:bg-success-500/10 dark:text-success-500 dark:border-success-500/20', 'usage' => 'bg-error-50 text-error-600 border-error-200 dark:bg-error-500/10 dark:text-error-500 dark:border-error-500/20', 'waste' => 'bg-error-50 text-error-600 border-error-200 dark:bg-error-500/10 dark:text-error-500 dark:border-error-500/20', 'adjustment' => 'bg-brand-50 text-brand-600 border-brand-200 dark:bg-brand-500/10 dark:text-brand-400 dark:border-brand-500/20', 'opname_adjustment' => 'bg-warning-50 text-warning-700 border-warning-200 dark:bg-warning-500/10 dark:text-warning-400 dark:border-warning-500/20', default => 'bg-gray-50 text-gray-700 border-gray-200 dark:bg-white/[0.03] dark:text-gray-300 dark:border-gray-800', }; $refType = (string) ($movement->reference_type ?? ''); $refId = (int) ($movement->reference_id ?? 0); $refCode = $refType !== '' && $refId > 0 ? (string) (($refCodes[$refType][$refId] ?? '') ?: '') : ''; $refText = $refType !== '' && $refId > 0 ? $refType.'#'.$refId : '-'; if ($refType === 'transactions' && $refCode !== '') { $refText = 'Transaksi '.$refCode; } elseif ($refType === 'purchases' && $refCode !== '') { $refText = 'Pembelian '.$refCode; } elseif ($refType === 'stock_opnames' && $refCode !== '') { $refText = 'Opname '.$refCode; } $refUrl = null; if ($refType === 'transactions' && $refId) { $refUrl = route('transactions.show', ['transaction' => $refId]); } elseif ($refType === 'purchases' && $refId) { $refUrl = route('purchases.edit', ['purchase' => $refId]); } elseif ($refType === 'stock_opnames' && $refId) { $refUrl = route('stock-opnames.edit', ['stockOpname' => $refId]); } @endphp @empty @endforelse
Waktu Bahan Tipe Supplier Qty Harga/unit Ref Aksi

{{ optional($when)->format('d M Y') }}

{{ $movement->ingredient?->name ?? '-' }}

{{ $typeLabel }}

{{ $movement->note }}

{{ $movement->supplier?->name ?? '-' }}

{{ $qty < 0 ? '-' : '+' }}{{ $qtyText }}{{ $ingredientUnit !== '' ? ' '.$ingredientUnit : '' }}

{{ $movement->unit_cost !== null ? 'Rp'.number_format((float) $movement->unit_cost, 0, ',', '.') : '-' }}

@if ($refUrl) {{ $refText }} @else

{{ $refText }}

@endif
@canany(['inventory.movements.delete', 'inventory.movements.manage', 'inventory.manage']) @if ($canDelete && $movement->reference_type === null && $movement->reference_id === null) @else

-

@endif @else

-

@endcanany
{{ $movements->links('livewire.pagination.admin') }}
@if ($createMovementModalOpen) @endif @if ($deleteConfirmOpen) @endif