@extends('layouts.app', ['title' => 'Detail RPS']) @section('content') @php $qualityMeta = data_get($rps->ai_draft_payload, 'pipeline_meta.quality_meta', []); $consistencyReport = data_get($qualityMeta, 'consistency_report', []); $evidenceTrace = data_get($qualityMeta, 'evidence_trace', []); $sectionQuality = collect(data_get($consistencyReport, 'per_section', [])); $meetingValidation = collect(data_get($consistencyReport, 'per_meeting', []))->keyBy('week_number'); $traceCounts = [ 'cpl' => count($evidenceTrace['cpl_items'] ?? []), 'cpmk' => count($evidenceTrace['cpmk_items'] ?? []), 'sub_cpmk' => count($evidenceTrace['sub_cpmk_items'] ?? []), 'meetings' => count($evidenceTrace['meetings'] ?? []), ]; $statusLabels = [ 'siap' => 'Siap', 'cukup' => 'Cukup', 'kurang' => 'Kurang', 'tidak_layak_generate' => 'Tidak layak generate', 'aman' => 'Aman', 'perlu_cek' => 'Perlu Cek', 'kurang_bukti' => 'Kurang Bukti', 'unknown' => 'Belum Dinilai', ]; $sectionPriority = [ 'kurang_bukti' => 0, 'perlu_cek' => 1, 'aman' => 2, 'unknown' => 3, ]; $sectionQuality = $sectionQuality ->sortBy(function ($section, $key) use ($sectionPriority) { $statusKey = $section['status'] ?? 'unknown'; return [ $sectionPriority[$statusKey] ?? 99, $section['label'] ?? ($key === 'study_materials' ? 'Bahan Kajian' : strtoupper((string) $key)), ]; }) ->map(fn ($section) => $section); $topPrioritySectionKey = $sectionQuality->keys()->first(); $generateGate = $generateReadiness['gate'] ?? ['status' => 'open', 'can_generate_full' => true]; @endphp
Edit Dokumen Referensi PDF Profil Mata Kuliah AI Cek Kesiapan Generate Buat RPS Manual Baru
@csrf
@csrf
Manual Paste JSON AI @if (is_array($rps->ai_draft_payload)) Review Usulan AI Audit Bukti Generate @endif @if ($rps->status === 'final' && ! $rps->is_ai_exemplar)
@csrf
@elseif ($rps->is_ai_exemplar)
@csrf
@endif Preview Template Export PDF Export Word

{{ $rps->course_name }}

{{ $rps->study_program_name }} | {{ $rps->course_code ?: 'Tanpa kode' }} | Status {{ strtoupper($rps->status) }}

Kode Dokumen
{{ $rps->document_code ?: '-' }}
Rumpun MK
{{ $rps->course_group ?: '-' }}
SKS / Semester
{{ $rps->sks ?: '-' }} SKS (T: {{ $rps->sks_theory ?: '-' }}, P: {{ $rps->sks_practice ?: '-' }}) / {{ $rps->semester ?: '-' }}
Pengembang RPS
{{ $rps->developer_name ?: '-' }}
Koordinator RMK
{{ $rps->rmk_coordinator_name ?: '-' }}
Ketua PRODI
{{ $rps->head_of_study_program_name ?: '-' }}

Alur Dokumen Ini

Dokumen ini dapat dilanjutkan ke editor untuk penyesuaian isi sebelum dipreview dan diexport ke PDF berdasarkan template RPS akhir.

@if (isset($approvedExemplars, $templateReference))

Exemplar AI dan Template Kampus

Status Exemplar Dokumen Ini
{{ $rps->is_ai_exemplar ? 'YA' : 'Tidak' }}
Exemplar Mata Kuliah Ini
{{ $approvedExemplars->count() }}
Template Kampus
{{ data_get($templateReference, 'template_identity.document_title', 'RPS') }} / {{ data_get($templateReference, 'template_identity.orientation', '-') }}

Acuan format generator saat ini mengikuti template kampus: `{{ collect(data_get($templateReference, 'reference_documents', []))->implode('`, `') }}`.

@if ($approvedExemplars->isNotEmpty())
@foreach ($approvedExemplars as $item) @endforeach
RPS Exemplar Kode / Semester Disetujui
{{ $item->course_name }} {{ $item->course_code ?: '-' }} / {{ $item->semester ?: '-' }} {{ optional($item->ai_exemplar_approved_at)->format('d-m-Y H:i') ?: '-' }}
@endif
@endif @if (isset($aiCourseProfile, $generateReadiness)) @php $profileStatus = $generateReadiness['status'] ?? 'tidak_layak_generate'; $profileStatusLabel = $generateReadiness['status_label'] ?? ($statusLabels[$profileStatus] ?? ucfirst(str_replace('_', ' ', $profileStatus))); $officialCourse = $aiCourseProfile['official_course'] ?? []; $gateStatus = $generateGate['status'] ?? 'open'; @endphp
Buka Profil Mata Kuliah AI Buka Kesiapan Generate

Fondasi AI Generate

Bagian ini menunjukkan apakah mata kuliah sudah punya profil resmi yang cukup kuat untuk dijadikan dasar generate RPS.

Status Kesiapan
{{ $profileStatusLabel }}
Skor
{{ $generateReadiness['score'] ?? 0 }}/100
CPL Resmi
{{ count($officialCourse['cpl_codes'] ?? []) }}
CPMK Resmi
{{ count($officialCourse['cpmk_items'] ?? []) }}
Bahan Kajian
{{ count($officialCourse['study_material_lines'] ?? []) }}
Baris Matriks
{{ count($officialCourse['matrix_rows'] ?? []) }}
Referensi PDF
{{ $rps->referenceDocuments->count() }}
Konflik
{{ count($generateReadiness['conflicts'] ?? []) }}
@if ($gateStatus !== 'open')
{{ $generateGate['title'] ?? 'Peringatan Generate' }}
{{ $generateGate['message'] ?? '' }} @if (! empty($generateGate['reasons'])) @endif
@endif
@endif

Usulan AI

Tahap ini memakai hasil ekstraksi PDF + draft RPS saat ini untuk menyusun usulan yang lebih lengkap, termasuk pertemuan 1–16. Usulan AI tidak langsung menimpa draft sampai tombol `Terapkan Usulan AI` dijalankan.

Status
{{ strtoupper($rps->ai_generation_status ?? 'idle') }}
Model
{{ $rps->ai_model ?: '-' }}
Waktu Generate
{{ optional($rps->ai_generated_at)->format('d-m-Y H:i') ?: '-' }}
Response ID
{{ $rps->ai_response_id ?: '-' }}
Error
{{ $rps->ai_generation_error ?: '-' }}
@if (is_array($rps->ai_draft_payload))
Bagian Ringkasan Usulan
Deskripsi MK {{ $rps->ai_draft_payload['course_description'] ?? '-' }}
Bahan Kajian {{ collect($rps->ai_draft_payload['study_material_lines'] ?? [])->implode('; ') ?: '-' }}
CPL / CPMK / Sub-CPMK CPL: {{ count($rps->ai_draft_payload['cpl_items'] ?? []) }}, CPMK: {{ count($rps->ai_draft_payload['cpmk_items'] ?? []) }}, Sub-CPMK: {{ count($rps->ai_draft_payload['sub_cpmk_items'] ?? []) }}
Pustaka Utama: {{ count($rps->ai_draft_payload['main_references'] ?? []) }}, Pendukung: {{ count($rps->ai_draft_payload['supporting_references'] ?? []) }}
Rencana Mingguan {{ count($rps->ai_draft_payload['meetings'] ?? []) }} usulan pertemuan
Buka Halaman Review AI
@csrf
Review CPMK
@csrf
@csrf
Review Bahan Kajian
@csrf
@csrf
Review Pekan 1–16
@csrf
@endif
@if ($consistencyReport !== [])

Validator Konsistensi

Laporan ini mengecek apakah draft AI sudah cukup konsisten sebelum Bapak lanjut ke edit atau export.

Status
{{ strtoupper((string) ($consistencyReport['status'] ?? '-')) }}
Isu
{{ data_get($consistencyReport, 'summary.issues', 0) }}
Peringatan
{{ data_get($consistencyReport, 'summary.warnings', 0) }}
Lolos Cek
{{ data_get($consistencyReport, 'summary.passes', 0) }}
@if ($sectionQuality->isNotEmpty())
@foreach ($sectionQuality as $key => $section) @php $statusKey = $section['status'] ?? 'unknown'; $sectionLabel = $section['label'] ?? ($key === 'study_materials' ? 'Bahan Kajian' : strtoupper((string) $key)); $isPriorityFocus = $topPrioritySectionKey === $key && in_array($statusKey, ['kurang_bukti', 'perlu_cek'], true); @endphp
{{ $sectionLabel }} {{ $generateReadiness['status_label'] ?? ($statusLabels[$statusKey] ?? ucfirst(str_replace('_', ' ', $statusKey))) }}
@if (! empty($section['notes']))
@foreach ($section['notes'] as $note)
{{ $note }}
@endforeach
@endif
@if ($key === 'cpmk') Review CPMK @elseif ($key === 'study_materials') Review Bahan Kajian @elseif ($key === 'meetings') Review Pekan 1–16 @endif
@endforeach
@endif @if (! empty($consistencyReport['issues']))

Isu Utama

@endif @if (! empty($consistencyReport['warnings']))

Peringatan

@endif @if (! empty($consistencyReport['passes']))

Lolos Cek

@endif
@endif @if ($evidenceTrace !== [])

Evidence Trace

Jejak sumber ini menunjukkan dari mana AI mengambil dasar untuk menyusun isi RPS.

CPL Terlacak
{{ $traceCounts['cpl'] }}
CPMK Terlacak
{{ $traceCounts['cpmk'] }}
Sub-CPMK Terlacak
{{ $traceCounts['sub_cpmk'] }}
Pekan Terlacak
{{ $traceCounts['meetings'] }}
@forelse (collect($evidenceTrace['cpl_items'] ?? [])->take(4) as $item) @empty @endforelse @foreach (collect($evidenceTrace['cpmk_items'] ?? [])->take(4) as $item) @endforeach @foreach (collect($evidenceTrace['meetings'] ?? [])->take(4) as $item) @endforeach
Bagian Nilai Dasar/Sumber
CPL {{ $item['code'] ?? '-' }} {{ $item['description'] ?? '' }} {{ data_get($item, 'sources.curriculum_match') ?: '-' }} @if (filled(data_get($item, 'sources.rationale')))
{{ data_get($item, 'sources.rationale') }} @endif
Belum ada jejak CPL yang tersimpan.
CPMK {{ $item['code'] ?? '-' }} {{ $item['description'] ?? '' }} {{ data_get($item, 'sources.curriculum_match') ?: '-' }} @if (filled(data_get($item, 'sources.rationale')))
{{ data_get($item, 'sources.rationale') }} @endif
Pekan {{ $item['week_number'] ?? '-' }} {{ $item['study_material'] ?: ($item['sub_cpmk'] ?? '-') }} {{ data_get($item, 'sources.topic_evidence') ?: '-' }} @if (filled(data_get($item, 'sources.rationale')))
{{ data_get($item, 'sources.rationale') }} @endif
@endif

Referensi PDF

Dokumen yang statusnya `COMPLETED` bisa dipetakan semi-otomatis ke draft RPS tanpa menghapus isian manual yang sudah ada.

@forelse ($rps->referenceDocuments as $document) @empty @endforelse
Judul Jenis Status File Aksi
{{ $document->title }} {{ str_replace('_', ' ', strtoupper($document->document_type)) }} {{ strtoupper($document->extraction_status) }} {{ $document->original_filename }} Lihat | Unduh
Belum ada referensi PDF.

CPL / CPMK / Sub-CPMK

@foreach (['cpl' => 'CPL Prodi', 'cpmk' => 'CPMK', 'sub_cpmk' => 'Sub-CPMK'] as $type => $label)

{{ $label }}

@forelse ($rps->learningOutcomes->where('type', $type) as $item)
{{ $item->code ?: 'Tanpa kode' }}
{{ $item->description }}
@empty

Belum ada data {{ $label }}.

@endforelse
@endforeach

Deskripsi dan Pustaka

Deskripsi Singkat MK
{{ $rps->course_description ?: '-' }}

Bahan Kajian
{{ $rps->study_materials ?: '-' }}

Mata Kuliah Syarat
{{ $rps->prerequisite_course ?: '-' }}

Pustaka Utama

Pustaka Pendukung

Penandatangan

@forelse ($rps->approvals as $approval) @empty @endforelse
Peran Nama Identitas Tanggal
{{ $approval->role_name }} {{ $approval->signer_name ?: '-' }} {{ $approval->signer_identifier ?: '-' }} {{ optional($approval->approval_date)->format('d-m-Y') ?: '-' }}
Belum ada data penandatangan.

Rencana Pembelajaran Semester Mingguan

@foreach ($rps->meetings as $meeting) @php $meetingCheck = $meetingValidation->get($meeting->week_number, []); $meetingStatus = (string) ($meetingCheck['status'] ?? '-'); $meetingNotes = $meetingCheck['notes'] ?? []; $meetingStatusClass = match ($meetingStatus) { 'aman' => 'status-aman', 'perlu_cek' => 'status-perlu-cek', 'kurang_bukti' => 'status-kurang-bukti', default => 'status-unknown', }; @endphp @endforeach
Mg ke- Status Jenis Kemampuan Akhir Tiap Tahapan Belajar (Sub-CPMK) Indikator Kriteria dan Teknik Pembelajaran Luring Pembelajaran Daring Materi Pembelajaran [Pustaka] Bobot Penilaian (%)
{{ $meeting->week_number }} {{ strtoupper(str_replace('_', ' ', $meetingStatus)) }} @if (! empty($meetingNotes)) {{ collect($meetingNotes)->take(2)->implode(' ') }} @endif {{ strtoupper($meeting->session_type) }} {{ $meeting->sub_cpmk ?: '-' }} {{ $meeting->indicator ?: '-' }} {{ $meeting->assessment_criteria ?: '-' }}
{{ $meeting->assessment_form ?: '-' }}
{{ $meeting->offline_activity ?: '-' }} {{ $meeting->online_activity ?: '-' }} {{ $meeting->study_material ?: '-' }} {{ $meeting->assessment_weight !== null ? rtrim(rtrim(number_format((float) $meeting->assessment_weight, 2, '.', ''), '0'), '.') : '-' }}
@endsection