@section('page-title', 'Dashboard') @section('page-subtitle', 'Selamat datang di Sistem Disposisi KOPASSUS') @php $isPimpinanOnly = auth()->user() && ( in_array(auth()->user()->role, ['pimpinan_tertinggi', 'pimpinan_staf', 'pimpinan_satuan', 'pimpinan_2']) || auth()->user()->isPanglima() || auth()->user()->isWakilPanglima() ); // Gunakan method dari User model untuk konsistensi $isPanglima = auth()->user() ? auth()->user()->isPanglima() : false; $isWakilPimpinan = auth()->user() ? auth()->user()->isWakilPanglima() : false; // Pimpinan cards: Mohon Disposisi, Mohon TTD, optional Tembusan (Wakil Panglima), optional Mohon Koreksi, optional Riwayat $showMohonKoreksi = !$isPanglima; $showTembusanCard = $isWakilPimpinan; $showMonitorSminCard = $isWakilPimpinan; $showRiwayatDisposisiCard = isset($disposisiHistoryPimpinan) && $disposisiHistoryPimpinan; $pimpinanCardCount = 2 + ($showTembusanCard ? 1 : 0) + ($showMonitorSminCard ? 1 : 0) + ($showMohonKoreksi ? 1 : 0) + ($showRiwayatDisposisiCard ? 1 : 0); $pimpinanStatColClass = $pimpinanCardCount >= 5 ? 'col' : ($pimpinanCardCount === 4 ? 'col-3' : ($pimpinanCardCount === 3 ? 'col-4' : 'col-6')); $pimpinanContentColClass = 'col-md-12'; // Hitung oldest pending date untuk auto-expand logic $oldestDisposisiPending = null; $oldestTembusanPending = null; $oldestTtdPending = null; $oldestKoreksiPending = null; if ($isPimpinanOnly && isset($recentSuratMasukDisposisi)) { $pendingDisposisi = $recentSuratMasukDisposisi->filter(fn($s) => ($s->disposisi_status ?? 'pending') === 'pending'); if ($pendingDisposisi->isNotEmpty()) { $oldestDisposisiPending = $pendingDisposisi->min(fn($s) => $s->created_at ?? $s->tanggal_surat); } } if ($isPimpinanOnly && isset($recentSuratMasukTembusan)) { if ($recentSuratMasukTembusan->isNotEmpty()) { $oldestTembusanPending = $recentSuratMasukTembusan->min(fn($s) => $s->created_at ?? $s->tanggal_surat); } } if ($isPimpinanOnly && isset($recentSuratKeluarTtd)) { $pendingTtd = $recentSuratKeluarTtd->filter(fn($s) => ($s->ttd_status ?? 'pending') === 'pending'); if ($pendingTtd->isNotEmpty()) { $oldestTtdPending = $pendingTtd->min(fn($s) => $s->created_at); } } if ($isPimpinanOnly && isset($recentSuratKeluarKoreksi)) { $pendingKoreksi = $recentSuratKeluarKoreksi->filter(fn($s) => ($s->koreksi_status ?? 'pending') === 'pending'); if ($pendingKoreksi->isNotEmpty()) { $oldestKoreksiPending = $pendingKoreksi->min(fn($s) => $s->created_at); } } @endphp
@if($isPimpinanOnly) {{-- ========== PIMPINAN DASHBOARD ========== --}} @if(auth()->user()->isPanglima() || auth()->user()->isWakilPanglima() || auth()->user()->canManagePanglimaSchedule()) @endif
MOHON DISPOSISIDISPO
{{ $stats['pimpinan']['mohon_disposisi'] ?? 0 }}
{{ $stats['pimpinan']['mohon_disposisi_selesai'] ?? 0 }} selesai
@if($showTembusanCard)
SURAT TEMBUSAN
{{ $stats['pimpinan']['mohon_tembusan'] ?? 0 }}
informasi tembusan masuk
@endif @if($showMonitorSminCard)
MONITOR PANGLIMAPGL
{{ $stats['wapang_monitor_smin_ke_panglima'] ?? 0 }}
surat masuk diarahkan ke Panglima
@endif
MOHON TANDA TANGANTTD
{{ $stats['pimpinan']['mohon_ttd'] ?? 0 }}
{{ $stats['pimpinan']['mohon_ttd_selesai'] ?? 0 }} selesai
@if($showMohonKoreksi)
MOHON KOREKSI
{{ $stats['pimpinan']['mohon_koreksi'] ?? 0 }}
{{ $stats['pimpinan']['mohon_koreksi_selesai'] ?? 0 }} selesai
@endif @if($showRiwayatDisposisiCard)
RIWAYAT DISPOSISIDISPO
{{ $disposisiHistoryPimpinan->total() }}
total disposisi Anda
@endif
Mohon Disposisi
@if(!$isPanglima)@endif @if(!$isPanglima)@endif @php // Sort: items needing action (Menunggu) first, then completed (Selesai) $sortedSuratMasukDisposisi = $recentSuratMasukDisposisi->sortBy(function($surat) { $isPending = ($surat->disposisi_status ?? 'pending') === 'pending'; $disposisiByCurrentUser = $surat->disposisi->where('pengirim_id', auth()->id()); $hasAnyDisposisi = $disposisiByCurrentUser->isNotEmpty(); $hasOpenDisposisi = $disposisiByCurrentUser->contains(function($disp) { return strtolower((string) $disp->status) !== 'selesai'; }); $isNeedAction = $isPending && (!$hasAnyDisposisi || $hasOpenDisposisi); // Return 0 for items needing action (sort first), 1 for completed return $isNeedAction ? 0 : 1; }); @endphp @forelse($sortedSuratMasukDisposisi as $surat) @php $isPending = ($surat->disposisi_status ?? 'pending') === 'pending'; // Cek disposisi user saat ini: // tetap "Menunggu" jika user belum disposisi atau disposisi user belum selesai. $disposisiByCurrentUserDash = $surat->disposisi->where('pengirim_id', auth()->id()); $hasAnyDisposisiDash = $disposisiByCurrentUserDash->isNotEmpty(); $hasOpenDisposisiDash = $disposisiByCurrentUserDash->contains(function($disp) { return strtolower((string) $disp->status) !== 'selesai'; }); $isNeedActionDash = $isPending && (!$hasAnyDisposisiDash || $hasOpenDisposisiDash); // Tandai item yang belum bisa diproses pimpinan karena masih di tahap TU. $isWaitingTuStage = $isNeedActionDash && ( strtolower((string) ($surat->status ?? '')) === 'menunggu_agenda' || ( (bool) ($surat->is_from_disposisi ?? false) && strtolower((string) (optional($surat->sourceDisposisi)->status_agenda ?? '')) === 'menunggu_agenda' ) ); // Wakil pimpinan: ke detail agar bisa pilih disposisi atau selesaikan $isWakilUser = auth()->user()->isWakilPanglima() || auth()->user()->isWakilPimpinanStafSatuan(); if ($isNeedActionDash) { if ($isWakilUser) { $url = route('surat-masuk.show', $surat->id); $icon = 'eye'; $title = 'Lihat Detail'; $btnClass = 'btn-kopassus'; } else { $url = route('disposisi.create', ['surat_masuk_id' => $surat->id]); $icon = 'pencil-square'; $title = 'Buat Disposisi'; $btnClass = 'btn-kopassus'; } } else { $url = route('surat-masuk.show', $surat->id); $icon = 'eye'; $title = 'Lihat Detail'; $btnClass = 'btn-outline-secondary'; } @endphp @if(!$isPanglima) @endif @if(!$isPanglima) @endif @empty @endforelse
No. AgendaNomor Surat Tanggal Asal PerihalTujuanStatus Aksi
@if($surat->nomor_agenda) {{ $surat->nomor_agenda }} @else - @endif @if($surat->is_kilat) KILAT
@endif {{ Str::limit($surat->nomor_surat, $isPanglima ? 35 : 25) }}
{{ $surat->tanggal_surat ? $surat->tanggal_surat->format('d/m/Y') : '-' }} {{ Str::limit($surat->asal_surat_short ?? $surat->asal_surat, $isPanglima ? 25 : 18) }} {{ Str::limit($surat->perihal, $isPanglima ? 80 : 40) }} @php $dashInstruksis = $surat->relationLoaded('disposisi') ? $surat->disposisi->flatMap->instruksis->unique('id') : collect(); @endphp @if($dashInstruksis->isNotEmpty())
@foreach($dashInstruksis->take(3) as $instruksi) {{ $instruksi->nama_instruksi }} @endforeach @if($dashInstruksis->count() > 3) +{{ $dashInstruksis->count() - 3 }} @endif
@endif
@if($surat->tujuanAkhir) {{ Str::limit($surat->tujuanAkhir->jabatan_with_satuan ?? '-', 18) }} @else - @endif @if($isNeedActionDash) @if($isWaitingTuStage) Menunggu TU @else Menunggu @endif @else Selesai @endif

Belum ada data disposisi

Surat Tembusan
@if(!$isPanglima)@endif @if(!$isPanglima)@endif @forelse($recentSuratMasukTembusan ?? collect([]) as $surat) @php $url = route('surat-masuk.show', $surat->id); @endphp @if(!$isPanglima) @endif @if(!$isPanglima) @endif @empty @endforelse
No. AgendaNomor Surat Tanggal Asal PerihalTujuanStatus Aksi
@if($surat->nomor_agenda) {{ $surat->nomor_agenda }} @else - @endif {{ Str::limit($surat->nomor_surat, $isPanglima ? 35 : 25) }} {{ $surat->tanggal_surat ? $surat->tanggal_surat->format('d/m/Y') : '-' }} {{ Str::limit($surat->asal_surat_short ?? $surat->asal_surat, $isPanglima ? 25 : 18) }} {{ Str::limit($surat->perihal, $isPanglima ? 80 : 40) }} @if($surat->tujuanAkhir) {{ Str::limit($surat->tujuanAkhir->jabatan_with_satuan ?? '-', 18) }} @else - @endif Tembusan

Belum ada surat tembusan

@if($showMonitorSminCard)
Monitor Surat Masuk ke Panglima
@forelse($monitorSuratMasukWapang ?? collect([]) as $surat) @php $url = route('surat-masuk.show', $surat->id); @endphp @empty @endforelse
No. Agenda Nomor Surat Tanggal Asal Perihal Tujuan Status Aksi
@if($surat->nomor_agenda) {{ $surat->nomor_agenda }} @else - @endif {{ Str::limit($surat->nomor_surat, 30) }} {{ $surat->tanggal_surat ? $surat->tanggal_surat->format('d/m/Y') : '-' }} {{ Str::limit($surat->asal_surat_short ?? $surat->asal_surat, 20) }} {{ Str::limit($surat->perihal, 60) }} @if($surat->tujuanAkhir) {{ Str::limit($surat->tujuanAkhir->jabatan_with_satuan ?? '-', 20) }} @else - @endif @if($surat->isDiagendakan()) Siap Panglima @else {{ $surat->status_label ?? $surat->status }} @endif

Belum ada surat masuk ke Panglima

@if(isset($monitorSuratMasukWapang) && method_exists($monitorSuratMasukWapang, 'hasPages') && $monitorSuratMasukWapang->hasPages())
{{ $monitorSuratMasukWapang->appends(['panel' => 'monitor_smin'])->links() }}
@endif
@endif
Mohon Tanda Tangan
@if(!$isPanglima)@endif @if($isPanglima)@endif @forelse($recentSuratKeluarTtd as $index => $surat) @php $url = route('surat-keluar-workflow.show', $surat->id); $isPending = ($surat->ttd_status ?? 'pending') === 'pending'; $btnClass = $isPending ? 'btn-danger' : 'btn-outline-secondary'; $btnTitle = $isPending ? 'Lihat & Tanda Tangani' : 'Lihat Detail'; // Get counter paraf approvers $approvers = $surat->approvals() ->with('approver') ->orderBy('level') ->get() ->map(function($approval) { $status = $approval->status === 'approved' ? '✓' : ($approval->status === 'rejected' ? '✗' : '○'); $jabatan = $approval->approver ? ($approval->approver->jabatan_short ?? $approval->approver->jabatan ?? $approval->approver->name) : '(deleted)'; return $status . ' ' . $jabatan; }) ->join(', '); @endphp @if($isPanglima) @else @endif @if(!$isPanglima) @endif @if($isPanglima) @endif @empty @endforelse
No {{ $isPanglima ? 'Nomor Surat' : 'Nomor Draft' }} Satuan PembuatPenanda TanganPerihalPemberi Counter Paraf Status Aksi
{{ $index + 1 }} @if($surat->nomor_surat) {{ $surat->nomor_surat }} @else Akan dinomeri di {{ $surat->numbering_by_setum ? 'SETUM' : ($surat->creator->satuan ?? 'Satuan') }} @endif {{ $surat->nomor_draft ?? '-' }}{{ $surat->creator->satuan ?? '-' }}{{ Str::limit($surat->finalSigner->jabatan_short ?? $surat->finalSigner->jabatan ?? '-', 18) }}{{ $surat->perihal ?: '-' }}{{ $approvers ?: '-' }} @if($isPending) Menunggu @else Selesai @endif

Belum ada data TTD

@if($showMohonKoreksi)
Mohon Koreksi
@forelse($recentSuratKeluarKoreksi as $index => $surat) @php $url = route('surat-keluar-workflow.show', $surat->id); $isPending = ($surat->koreksi_status ?? 'pending') === 'pending'; $btnClass = $isPending ? 'btn-info' : 'btn-outline-secondary'; $btnTitle = $isPending ? 'Lihat & Koreksi' : 'Lihat Detail'; // Get counter paraf approvers $approversKoreksi = $surat->approvals() ->with('approver') ->orderBy('level') ->get() ->map(function($approval) { $status = $approval->status === 'approved' ? '✓' : ($approval->status === 'rejected' ? '✗' : '○'); $jabatan = $approval->approver ? ($approval->approver->jabatan_short ?? $approval->approver->jabatan ?? $approval->approver->name) : '(deleted)'; return $status . ' ' . $jabatan; }) ->join(', '); @endphp @empty @endforelse
No Nomor Draft Satuan Pembuat Penanda Tangan Pemberi Counter Paraf Status Aksi
{{ $index + 1 }} {{ $surat->nomor_draft ?? '-' }} {{ $surat->creator->satuan ?? '-' }} {{ Str::limit($surat->finalSigner->jabatan_short ?? $surat->finalSigner->jabatan ?? '-', 18) }} {{ $approversKoreksi ?: '-' }} @if($isPending) Menunggu @else Selesai @endif

Belum ada data koreksi

@endif @if($showRiwayatDisposisiCard)
Riwayat Disposisi
@if(request()->filled('hist_dari') || request()->filled('hist_sampai') || request()->filled('hist_nomor_agenda') || request()->filled('hist_nomor_surat_masuk')) Reset @endif
@forelse($disposisiHistoryPimpinan as $index => $histDisp) @php $sm = $histDisp->suratMasuk; $tglDisp = $histDisp->tanggal_disposisi ?? $histDisp->created_at; $kepadaLabels = $histDisp->kepadaUsers->map(function ($u) { return $u->jabatan_short ?? $u->jabatan ?? $u->name; })->filter()->take(4); $histUrl = $sm ? route('disposisi.show', $histDisp) : '#'; @endphp @empty @endforelse
No Tgl. Disposisi Nomor Surat Tgl. Surat Asal Perihal Kepada Status Aksi
{{ ($disposisiHistoryPimpinan->currentPage() - 1) * $disposisiHistoryPimpinan->perPage() + $loop->iteration }} {{ $tglDisp ? $tglDisp->format('d/m/Y') : '-' }} @if($sm && $sm->is_kilat) @endif {{ $sm ? Str::limit($sm->nomor_surat, 28) : '-' }} {{ $sm && $sm->tanggal_surat ? $sm->tanggal_surat->format('d/m/Y') : '-' }} {{ $sm ? Str::limit($sm->asal_surat_short ?? $sm->asal_surat, 20) : '-' }} {{ $sm ? Str::limit($sm->perihal, 55) : '-' }} @if($kepadaLabels->isNotEmpty()) {{ $kepadaLabels->join(', ') }} @if($histDisp->kepadaUsers->count() > 4) +{{ $histDisp->kepadaUsers->count() - 4 }} @endif @else - @endif {{ ucfirst($histDisp->status ?? '-') }} @if($sm) @else - @endif

Belum ada riwayat disposisi yang Anda buat.

@if($disposisiHistoryPimpinan->hasPages()) @endif
@endif
@else {{-- ========== REGULAR USER DASHBOARD ========== --}} @if(auth()->user()->isPanglima() || auth()->user()->isWakilPanglima() || auth()->user()->canManagePanglimaSchedule()) @endif {{-- Quick Actions - hanya untuk Operator --}} @if(auth()->user()->isOperator() || auth()->user()->isOperatorTU()) @endif @php $statsCardCount = 3 + (auth()->user()->isWakilPanglima() ? 1 : 0) + (auth()->user()->isKASMIN() || auth()->user()->isPAURMIN() || auth()->user()->isOperatorSmin() ? 1 : 0) + (auth()->user()->isOperatorUrtuudSetum() ? 1 : 0); $statsCardColsLg = min(max($statsCardCount, 1), 4); @endphp
@if(auth()->user()->isWakilPanglima()) @endif @php $perluAksiSuratMasuk = $stats['surat_masuk']['perlu_aksi'] ?? 0; $perluAksiSuratKeluar = $stats['surat_keluar']['perlu_aksi'] ?? 0; $totalPerluAksi = $perluAksiSuratMasuk + $perluAksiSuratKeluar; // Determine smart redirect URL // - If only Surat Keluar → go to Surat Keluar // - If only Surat Masuk → go to Surat Masuk // - If both → go to whichever has the oldest pending item if ($perluAksiSuratMasuk > 0 && $perluAksiSuratKeluar > 0) { // Both have items - compare oldest dates $oldestMasuk = isset($oldestSuratMasukPerluAksi) ? \Carbon\Carbon::parse($oldestSuratMasukPerluAksi) : null; $oldestKeluar = isset($oldestSuratKeluarPerluAksi) ? \Carbon\Carbon::parse($oldestSuratKeluarPerluAksi) : null; if ($oldestMasuk && $oldestKeluar) { // Go to whichever is oldest (waiting longest) $perluAksiUrl = $oldestMasuk->lt($oldestKeluar) ? route('surat-masuk.index', ['status' => 'perlu_aksi_saya']) : route('surat-keluar-workflow.index', ['status' => 'perlu_aksi_saya']); } else { // Fallback: default to surat masuk $perluAksiUrl = route('surat-masuk.index', ['status' => 'perlu_aksi_saya']); } } elseif ($perluAksiSuratKeluar > 0) { // Only Surat Keluar $perluAksiUrl = route('surat-keluar-workflow.index', ['status' => 'perlu_aksi_saya']); } else { // Only Surat Masuk (or none) $perluAksiUrl = route('surat-masuk.index', ['status' => 'perlu_aksi_saya']); } @endphp {{-- Card Disposisi Pang/Wapang (Kasmin & Paurmin) --}} @if(auth()->user()->isKASMIN() || auth()->user()->isPAURMIN() || auth()->user()->isOperatorSmin()) @php // Gunakan counter dari controller: jumlah surat masuk // hasil disposisi Pang/Wapang pada tahun berjalan. $totalDisposisiPangwapang = $stats['disposisi_pangwapang_tahun_ini'] ?? 0; @endphp @endif {{-- Card Disposisi Pang/Wapang ke Grup/Satuan (Operator URTUUD SETUM) --}} @if(auth()->user()->isOperatorUrtuudSetum()) @php $totalDisposisiPangwapangGrupSat = $stats['disposisi_pangwapang_grup_sat_tahun_ini'] ?? 0; @endphp @endif {{-- Card Overdue - Hidden for now
Overdue
{{ $stats['disposisi']['overdue'] }}
Melewati batas waktu
--}}
Surat Masuk Terbaru
@php // IDs yang ada di tabel (untuk cek apakah parent ada di tabel) $idsInTable = $recentSuratMasuk->pluck('id')->toArray(); // Precompute parent IDs that have child surat dari DISPOSISI (bukan dari storeAgenda) $parentIdsInList = $recentSuratMasuk->filter(fn($s) => $s->parent_surat_id && $s->is_from_disposisi)->pluck('parent_surat_id')->unique(); // Count ALL children per root parent for accordion toggle // Termasuk storeAgenda children dan disposisi children $rootChildCount = []; foreach ($recentSuratMasuk as $s) { if ($s->parent_surat_id) { $rootId = ($s->parentSurat && $s->parentSurat->parent_surat_id) ? $s->parentSurat->parent_surat_id : $s->parent_surat_id; $rootChildCount[$rootId] = ($rootChildCount[$rootId] ?? 0) + 1; } } // Parent is "Sudah Didisposisi" once any branch has a disposisi child. $storeAgendaByParent = []; foreach ($recentSuratMasuk as $s) { if ($s->parent_surat_id && !$s->is_from_disposisi) { $storeAgendaByParent[$s->parent_surat_id][] = $s->id; } } $disposisidChildIds = $recentSuratMasuk->filter(fn($s) => $s->parent_surat_id && $s->is_from_disposisi) ->pluck('parent_surat_id')->unique(); $alreadyDisposisiParentIds = $parentIdsInList->values(); foreach ($storeAgendaByParent as $parentId => $childIds) { $hasDisposedChild = collect($childIds)->contains(fn($id) => $disposisidChildIds->contains($id)); if ($hasDisposedChild) { $alreadyDisposisiParentIds->push($parentId); } } $alreadyDisposisiParentIds = $alreadyDisposisiParentIds->unique()->values(); @endphp @forelse($recentSuratMasuk as $surat) @php // Normal surat masuk $url = route('surat-masuk.show', $surat->id); $icon = 'eye'; $title = 'Lihat Detail'; $isMohonDiselesaikan = false; $isMohonTanggapan = false; $isSelesaiForUser = false; $isPerluDilengkapi = false; $isTeruskanKeSesIT = false; $isHiddenAction = false; // General rule: jika tujuan surat BUKAN dirinya dan BUKAN superiornya // maka hide semua tombol aksi (view only) — KECUALI staf monitoring SMIN // (KASMIN/PAURMIN/operator SMIN) yang wajib punya akses baca/lihat detail $tujuanId = $surat->tujuan_akhir_id; $myId = auth()->id(); $mySuperiorId = auth()->user()->superior_id; $tujuanBukanUntukSaya = $tujuanId != $myId && $tujuanId != $mySuperiorId; if ($tujuanBukanUntukSaya) { if (!auth()->user()->isKASMIN() && !auth()->user()->isPAURMIN() && !auth()->user()->isOperatorSmin()) { $isHiddenAction = true; } } // Check if user is TU IT (not TU Bagian) $isTUIT = auth()->user()->isTU() && strtoupper(auth()->user()->satuan ?? '') === 'IT' && !auth()->user()->isTUBagian(); // Untuk TU: Cek semua disposisi yang ditujukan ke TU untuk surat ini if (auth()->user()->isTU()) { $disposisiForTU = $surat->disposisi() ->whereHas('kepadaUsers', function($q) { $q->where('user_id', auth()->id()); }) ->where('status', '!=', 'selesai') ->latest() ->first(); if ($disposisiForTU) { $pengirim = $disposisiForTU->dariUser; $userSatuan = auth()->user()->satuan; $pengirimSatuan = $pengirim->satuan ?? null; $isFromSuperior = $disposisiForTU->pengirim_id === auth()->user()->superior_id; $isFromSameSatuan = $pengirimSatuan === $userSatuan; $isFromPangwapang = $pengirim && ($pengirim->isPanglima() || $pengirim->isWakilPanglima()); if ($isFromSuperior || $isFromSameSatuan) { $isMohonDiselesaikan = true; $url = route('surat-masuk.show', $surat->id); $icon = 'clipboard-data'; $title = 'Proses Disposisi'; } elseif ($isFromPangwapang) { // Disposisi dari Panglima/Wapang ke TU // Hanya tampilkan aksi jika tujuan surat = superior TU (Wadansat/Dansat) // Jika tujuan = Panglima → hide, TU tidak perlu aksi $isTujuanSuperior = $surat->tujuan_akhir_id == auth()->user()->superior_id; if ($isTujuanSuperior) { if ($disposisiForTU->status_agenda === 'menunggu_agenda') { $isPerluDilengkapi = true; $url = route('surat-masuk.show', $surat->id); $icon = 'eye'; $title = 'Lihat Detail Surat'; } else { $isMohonDiselesaikan = true; $url = route('surat-masuk.show', $surat->id); $icon = 'clipboard-data'; $title = 'Proses Disposisi'; } } // Jika bukan superior → general isHiddenAction sudah handle } else { $isPerluDilengkapi = true; $url = route('surat-masuk.show', $surat->id); $icon = 'eye'; $title = 'Lihat Detail Surat'; } } // Cek surat dari disposisi yang ditujukan ke TU if (!$isMohonDiselesaikan && !$isMohonTanggapan && !$isPerluDilengkapi && !$isSelesaiForUser && $surat->is_from_disposisi && $surat->tujuan_akhir_id == auth()->id()) { if (in_array($surat->status, ['pending', 'diproses'])) { $isMohonDiselesaikan = true; $icon = 'clipboard-data'; $title = 'Proses Surat'; } elseif ($surat->status === 'selesai') { $isSelesaiForUser = true; } } // Jika surat perlu dilengkapi lembar disposisinya if (!$isMohonDiselesaikan && !$isMohonTanggapan && !$isPerluDilengkapi && !$isSelesaiForUser && !$disposisiForTU) { if ($surat->status === 'menunggu_agenda') { $isResponsibleTU = $surat->tujuan_akhir_id == auth()->user()->superior_id || $surat->tujuan_akhir_id == auth()->id(); if ($isResponsibleTU) { // TU IT hanya teruskan ke SES IT, bukan lengkapi lembar disposisi if ($isTUIT) { $isTeruskanKeSesIT = true; } else { $isPerluDilengkapi = true; } $url = route('surat-masuk.show', $surat->id); $icon = 'eye'; $title = 'Lihat Detail Surat'; } } } } // Untuk semua user: Cek apakah user menerima disposisi untuk surat ini if (!$isPerluDilengkapi && !$isMohonDiselesaikan && !$isMohonTanggapan && !$isSelesaiForUser && !$isHiddenAction) { // Cek disposisi dimana user adalah penerima (semua status termasuk selesai) $disposisiForUser = $surat->disposisi() ->whereHas('kepadaUsers', function($q) { $q->where('user_id', auth()->id()); }) ->latest() ->first(); // Juga cek via tujuan_akhir_id (surat dari disposisi) $isDisposisiRecipient = ($disposisiForUser !== null) || ($surat->is_from_disposisi && $surat->tujuan_akhir_id == auth()->id()); if ($isDisposisiRecipient) { // Disposisi sudah selesai untuk user ini? $disposisiSelesai = $disposisiForUser && strtolower($disposisiForUser->status) === 'selesai'; // User sudah disposisi ke bawahan? $recipientAlreadyDisposisi = \App\Models\Disposisi::where('surat_masuk_id', $surat->id) ->where('pengirim_id', auth()->id()) ->exists(); if ($disposisiSelesai || $recipientAlreadyDisposisi) { // Disposisi sudah selesai atau sudah diteruskan → selesai untuk user ini $isSelesaiForUser = true; } elseif (in_array($surat->status, ['pending', 'diproses', 'diagendakan'])) { $recipientUser = auth()->user(); $recipientHasSubordinates = $recipientUser->hasSubordinates(); $recipientCanCreateDisposisi = $recipientUser->canCreateDisposisi(); if ($recipientHasSubordinates && $recipientCanCreateDisposisi) { // Punya 2 opsi: disposisi ke bawahan ATAU selesaikan $isMohonTanggapan = true; } else { // Hanya bisa selesaikan (tidak bisa disposisi lagi) $isMohonDiselesaikan = true; } $url = route('surat-masuk.show', $surat->id); $icon = 'clipboard-data'; $title = 'Proses Surat'; } elseif ($surat->status === 'selesai') { $isSelesaiForUser = true; } } } @endphp @php // Cek child surat: apakah semua disposisi chain sudah selesai if (!$isSelesaiForUser && !$isMohonDiselesaikan && !$isMohonTanggapan && !$isPerluDilengkapi && !$isHiddenAction) { $allDisposisiOnSurat = $surat->disposisi()->get(); if ($allDisposisiOnSurat->isNotEmpty()) { $allPengirimIds = $allDisposisiOnSurat->pluck('pengirim_id')->unique(); $leafDisposisi = $allDisposisiOnSurat->filter(function($d) use ($allPengirimIds) { return !$d->kepadaUsers->pluck('id')->intersect($allPengirimIds)->isNotEmpty(); }); if ($leafDisposisi->isNotEmpty() && $leafDisposisi->every(fn($d) => strtolower($d->status) === 'selesai')) { $isSelesaiForUser = true; } } } // Row highlighting logic // Jika hidden action → force view-only if ($isHiddenAction) { $isPerluDilengkapi = false; $isMohonDiselesaikan = false; $isMohonTanggapan = false; $isTeruskanKeSesIT = false; $url = route('surat-masuk.show', $surat->id); $icon = 'eye'; $title = 'Lihat Detail'; } $rowClass = ''; if ($isTeruskanKeSesIT) { $rowClass = 'row-teruskan-ses-it'; } elseif ($isPerluDilengkapi) { $rowClass = 'row-perlu-dilengkapi'; } elseif ($isMohonDiselesaikan || $isMohonTanggapan) { $rowClass = 'table-warning bg-warning bg-opacity-10'; } elseif ($surat->is_kilat) { $rowClass = 'table-danger bg-danger bg-opacity-10'; } elseif ($surat->status === 'draft') { $rowClass = 'table-warning bg-warning bg-opacity-10'; } // Add parent-child visual grouping class $isChildRow = false; $childRootId = null; $hasDisposisiFollowUp = $alreadyDisposisiParentIds->contains($surat->id) || $surat->sudahPernahDidisposisi(); if ($surat->is_from_disposisi || ($surat->parent_surat_id && !$parentIdsInList->contains($surat->id))) { $childRootId = ($surat->parentSurat && $surat->parentSurat->parent_surat_id) ? $surat->parentSurat->parent_surat_id : $surat->parent_surat_id; // Hanya jadikan child row jika parent root ada di tabel if ($childRootId && in_array($childRootId, $idsInTable)) { $rowClass .= ' row-from-disposisi'; $isChildRow = true; } } elseif ($surat->parent_surat_id && $parentIdsInList->contains($surat->id)) { $childRootId = $surat->parent_surat_id; if (in_array($childRootId, $idsInTable)) { $rowClass .= ' row-from-disposisi'; $isChildRow = true; } } elseif ($hasDisposisiFollowUp || isset($storeAgendaByParent[$surat->id])) { $rowClass .= ' row-parent-disposisi'; } $isParentRow = isset($rootChildCount[$surat->id]); $childCount = $rootChildCount[$surat->id] ?? 0; @endphp @empty @endforelse
Nomor Surat Perihal Kepada Tanggal Disposisi Status Aksi

Tidak ada data

{{-- Kumpulan Disposisi Pang/Wapang (khusus Kasmin & Paurmin) --}} @if(auth()->user()->isKASMIN() || auth()->user()->isPAURMIN() || auth()->user()->isOperatorSmin())
Disposisi Panglima / Wapang
@php $listDisposisiPangwapang = isset($disposisiPangwapang) ? $disposisiPangwapang : collect(); @endphp @forelse($listDisposisiPangwapang->take(10) as $disposisi) @php $surat = $disposisi->suratMasuk; $url = $surat ? route('surat-masuk.show', $surat->id) : '#'; $kepadaNames = $disposisi->kepadaUsers->map(function($u) { return $u->jabatan_with_satuan ?? $u->jabatan ?? $u->name; })->implode(', '); @endphp @empty @endforelse
Nomor Surat Perihal Kepada Tanggal Disposisi Aksi
@if($surat) {{ Str::limit($surat->nomor_surat ?? $surat->nomor_agenda ?? '-', 30) }} @else - @endif @if($surat) {{ Str::limit($surat->perihal ?? '-', 50) }} @else Surat tidak tersedia @endif {{ Str::limit($kepadaNames, 40) ?: '-' }} {{ optional($disposisi->tanggal_disposisi)->format('d/m/Y H:i') ?? $disposisi->created_at->format('d/m/Y H:i') }} @if($surat) @else - @endif

Belum ada disposisi dari Panglima/Wapang.

@endif {{-- Kumpulan Disposisi Pang/Wapang ke Grup/Satuan (Operator URTUUD SETUM) --}} @if(auth()->user()->isOperatorUrtuudSetum())
Disposisi Panglima / Wapang ke Grup & Satuan
@php $listDisposisiPangwapangGrupSat = isset($disposisiPangwapangGrupSat) ? $disposisiPangwapangGrupSat : collect(); @endphp @forelse($listDisposisiPangwapangGrupSat->take(10) as $disposisi) @php $grupSatRoles = \App\Models\User::setumMonitoredGrupSatJabatanRoles(); $suratTurunan = $disposisi->generatedSuratMasuk ->filter(fn($s) => in_array(optional($s->tujuanAkhir)->jabatan_role, $grupSatRoles, true)) ->first(); $surat = $suratTurunan ?? $disposisi->suratMasuk; $url = $surat ? route('surat-masuk.show', $surat->id) : '#'; $kepadaNames = $disposisi->generatedSuratMasuk ->filter(fn($s) => in_array(optional($s->tujuanAkhir)->jabatan_role, $grupSatRoles, true)) ->map(fn($s) => $s->tujuanAkhir->jabatan_with_satuan ?? $s->tujuanAkhir->jabatan ?? $s->tujuanAkhir->name ?? '-') ->unique() ->implode(', '); $sudahDidisposisi = $suratTurunan && $suratTurunan->disposisi->count() > 0; @endphp @empty @endforelse
Nomor Surat Perihal Kepada Tanggal Disposisi Status Aksi
@if($surat) {{ Str::limit($surat->nomor_surat ?? $surat->nomor_agenda ?? '-', 30) }} @else - @endif @if($surat) {{ Str::limit($surat->perihal ?? '-', 50) }} @else Surat tidak tersedia @endif {{ Str::limit($kepadaNames, 40) ?: '-' }} {{ optional($disposisi->tanggal_disposisi)->format('d/m/Y H:i') ?? $disposisi->created_at->format('d/m/Y H:i') }} @if($sudahDidisposisi) Sudah Didisposisi @else Menunggu @endif @if($surat) @else - @endif

Belum ada disposisi Pang/Wapang ke Grup/Satuan.

@endif
Surat Keluar Terbaru
@forelse($recentSuratKeluar as $surat) @php // Ambil approver dengan pangkat terendah yang masih pending $lowestApprover = $surat->isPendingApproval() ? $surat->lowestPendingApprover : null; @endphp @empty @endforelse
Nomor Perihal Status Aksi
{{ $surat->nomor_surat ?? $surat->nomor_draft }}
{{ $surat->creator->jabatan_with_satuan ?? '-' }}
{{ $surat->perihal ? Str::limit($surat->perihal, 35) : '-' }} {{ $surat->status_label }} {{-- Show waiting at which position --}} @if($surat->isPendingApproval() && $lowestApprover)
di {{ $lowestApprover->jabatan_with_satuan ?? $lowestApprover->jabatan ?? $lowestApprover->name }} @elseif($surat->isPendingSignature() && $surat->finalSigner)
di {{ $surat->finalSigner->jabatan_with_satuan ?? $surat->finalSigner->jabatan ?? $surat->finalSigner->name }} @elseif($surat->isPendingOpSminForward())
di Operator SMIN {{ $surat->creator?->satuan ?? '' }} @elseif($surat->isPendingTuForward())
di TU {{ $surat->creator?->satuan ?? '' }} @elseif($surat->isPendingPaurminForward())
di PAURMIN @elseif($surat->isPendingKasminForward())
di KASMIN @elseif($surat->isPendingWapangApproval())
di Wakil Panglima @elseif($surat->isPendingPangwapangSignature() && $surat->finalSigner)
di {{ $surat->finalSigner->jabatan_with_satuan ?? $surat->finalSigner->jabatan ?? 'Pangwapang' }} @elseif($surat->isPendingNumbering()) @php $responsibleTuDash = $surat->getResponsibleTuForNumbering(); @endphp
@if($responsibleTuDash) di {{ $responsibleTuDash->jabatan_with_satuan ?? $responsibleTuDash->jabatan ?? 'TU' }} @else di TU {{ $surat->creator?->satuan ?? '' }} @endif @elseif($surat->isPendingSesItReview())
di SES IT @elseif($surat->isPendingSetumNumbering())
di SETUM @elseif($surat->isRevisionRequired())
Dikembalikan Panglima - menunggu revisi pembuat @endif

Tidak ada data

@endif