@extends('layouts.app') @section('content') @php $totalOrders = method_exists($orders, 'total') ? $orders->total() : $orders->count(); $summary = $summary ?? [ 'total_finished' => $totalOrders, 'total_picked_up' => 0, 'avg_duration_text' => '-', 'today_finished' => 0, ]; $topOperatorMonth = $topOperatorMonth ?? null; $topDesignerMonth = $topDesignerMonth ?? null; $topFinishingMonth = $topFinishingMonth ?? null; $performanceStats = collect($performanceStats ?? []); $operators = $operators ?? collect(); $designers = $designers ?? collect(); $finishingOperators = $finishingOperators ?? collect(); $formatDuration = function ($start, $finish) { if (!$start || !$finish) return '-'; $duration = $start->diff($finish); $text = ''; if ($duration->h > 0) $text .= $duration->h . 'j '; if ($duration->i > 0) $text .= $duration->i . 'm'; return trim($text) ?: '< 1m'; }; $productionStatusMeta = function ($order) { $pickedUpAt = data_get($order, 'picked_up_at'); $finishedAt = data_get($order, 'finished_at'); $finishingAt = data_get($order, 'finishing_started_at') ?? data_get($order, 'started_finishing_at'); $startedAt = data_get($order, 'started_at'); $designerId = data_get($order, 'designer_id'); $operatorId = data_get($order, 'operator_id'); $finishingOperatorId = data_get($order, 'finishing_operator_id'); $rawStatus = strtolower((string) (data_get($order, 'production_status') ?? data_get($order, 'status') ?? '')); if ($pickedUpAt || in_array($rawStatus, ['picked_up', 'taken', 'diambil', 'sudah_diambil'], true)) { return [ 'label' => 'Sudah Diambil', 'step' => 'Order sudah diserahkan ke pelanggan', 'class' => 'bg-success-100 text-success-700 dark:bg-success-500/20 dark:text-success-400', 'dot' => 'bg-success-500', ]; } if ($finishedAt || in_array($rawStatus, ['finished', 'completed', 'done', 'selesai'], true)) { return [ 'label' => 'Selesai', 'step' => 'Produksi selesai, menunggu diambil', 'class' => 'bg-blue-light-100 text-blue-light-700 dark:bg-blue-light-500/20 dark:text-blue-light-400', 'dot' => 'bg-blue-light-500', ]; } if ($finishingAt || $finishingOperatorId || str_contains($rawStatus, 'finishing')) { return [ 'label' => 'Proses Finishing', 'step' => 'Sedang dikerjakan bagian finishing', 'class' => 'bg-purple-100 text-purple-700 dark:bg-purple-500/20 dark:text-purple-400', 'dot' => 'bg-purple-500', ]; } if ($startedAt || $operatorId || str_contains($rawStatus, 'print') || str_contains($rawStatus, 'cetak') || str_contains($rawStatus, 'process')) { return [ 'label' => 'Proses Cetak', 'step' => 'Sedang dikerjakan operator mesin', 'class' => 'bg-warning-100 text-warning-700 dark:bg-warning-500/20 dark:text-warning-400', 'dot' => 'bg-warning-500', ]; } if ($designerId || str_contains($rawStatus, 'design') || str_contains($rawStatus, 'desain')) { return [ 'label' => 'Proses Desain', 'step' => 'Sedang dikerjakan designer', 'class' => 'bg-brand-100 text-brand-700 dark:bg-brand-500/20 dark:text-brand-400', 'dot' => 'bg-brand-500', ]; } if (in_array($rawStatus, ['cancelled', 'canceled', 'batal'], true)) { return [ 'label' => 'Dibatalkan', 'step' => 'Order dibatalkan', 'class' => 'bg-error-100 text-error-700 dark:bg-error-500/20 dark:text-error-400', 'dot' => 'bg-error-500', ]; } return [ 'label' => 'Menunggu Proses', 'step' => 'Belum mulai produksi', 'class' => 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300', 'dot' => 'bg-gray-400', ]; }; $productionStageOptions = [ '' => 'Semua Status Proses', 'waiting' => 'Menunggu Proses', 'design' => 'Proses Desain', 'printing' => 'Proses Cetak', 'finishing' => 'Proses Finishing', 'finished' => 'Selesai', 'picked_up' => 'Sudah Diambil', ]; $insightText = 'Belum ada insight performa bulan ini.'; if ($topOperatorMonth && data_get($topOperatorMonth, 'name')) { $insightText = data_get($topOperatorMonth, 'name') . ' memimpin performa operator bulan ini dengan ' . data_get($topOperatorMonth, 'total', 0) . ' pekerjaan selesai.'; } @endphp {{-- AI Summary --}}

Total Order Ditampilkan

{{ number_format($summary['total_finished'] ?? 0) }}

Termasuk proses berjalan & selesai

Sudah Diambil

{{ number_format($summary['total_picked_up'] ?? 0) }}

Order selesai yang sudah pickup

Rata-rata Durasi Produksi

{{ $summary['avg_duration_text'] ?? '-' }}

Dari mulai cetak sampai selesai

Selesai Hari Ini

{{ number_format($summary['today_finished'] ?? 0) }}

Output produksi hari ini

{{-- AI Insight --}}

AI Performance Insight

Ringkasan Performa Tim Produksi

{{ $insightText }}

Kembali ke Antrian Produksi
{{-- Top Performer Cards --}}

Top Designer Bulan Ini

{{ data_get($topDesignerMonth, 'name', '-') }}

{{ number_format(data_get($topDesignerMonth, 'total', 0)) }} pekerjaan

Top Operator Mesin Bulan Ini

{{ data_get($topOperatorMonth, 'name', '-') }}

{{ number_format(data_get($topOperatorMonth, 'total', 0)) }} pekerjaan

Top Operator Finishing Bulan Ini

{{ data_get($topFinishingMonth, 'name', '-') }}

{{ number_format(data_get($topFinishingMonth, 'total', 0)) }} pekerjaan

Riwayat & Proses Produksi

Pantau order yang sedang diproses, finishing, selesai, hingga sudah diambil.

{{-- Filter --}}
Reset
{{-- Data table --}}
@forelse($orders as $order) @php $processMeta = $productionStatusMeta($order); @endphp @empty @endforelse
Invoice File Pelanggan Designer Operator Mesin Operator Finishing Status Proses Pembayaran / Pickup Waktu Aksi
{{ $order->invoice_number }} @if(!empty($order->size) || !empty($order->qty))
{{ $order->size ?? '-' }} @if(!empty($order->qty)) | {{ $order->qty }} pcs @endif @endif
{{ $order->file_name ?? '-' }}
{{ $order->customer_name }} {{ $order->designer->name ?? '-' }} {{ $order->operator->name ?? '-' }} {{ $order->finishingOperator->name ?? '-' }}
{{ $processMeta['label'] }} {{ $processMeta['step'] }}
{{ $order->getPaymentStatusLabel() }} {{ $order->getPickupStatusLabel() }}
@if($order->finished_at) Selesai: {{ $order->finished_at?->format('d M Y H:i') }} @elseif($order->started_at) Mulai: {{ $order->started_at?->format('d M Y H:i') }} @else - @endif
Durasi: @if($order->finished_at) {{ $formatDuration($order->started_at, $order->finished_at) }} @elseif($order->started_at) {{ $formatDuration($order->started_at, now()) }} @else - @endif
@if(auth()->user()->isOperator()) @else @if($order->canMarkAsPickedUp())
@csrf
@endif @endif
Tidak ada data riwayat produksi.
@if($orders->hasPages())
{{ $orders->links() }}
@endif
{{-- Leaderboard --}}

Performa Karyawan

Leaderboard operator berdasarkan output kerja.

Live Summary
@forelse($performanceStats as $index => $staff) @empty @endforelse
Rank Nama Hari Ini Bulan Ini Total Rata-rata Durasi
@if($index === 0) #1 Top @elseif($index === 1) #2 @elseif($index === 2) #3 @else #{{ $index + 1 }} @endif
{{ data_get($staff, 'name', '-') }}
{{ number_format(data_get($staff, 'today_count', 0)) }} {{ number_format(data_get($staff, 'month_count', 0)) }} {{ number_format(data_get($staff, 'total_count', 0)) }} {{ data_get($staff, 'avg_duration_text', '-') }}
Belum ada data performa karyawan.
@endsection