{{-- ============================================================ PAGE: Parliament QA (Soal Jawab Parlimen) — kod penuh dalam Page Content Sumber data : content_parliament_qa (+ translations, categories, documents) Reka bentuk : ikut https://www.nres.gov.my/Parlimen/Pages/default.aspx Nota : logik + markup + CSS semuanya di sini — TIADA komponen. Parameter : tab=soaljawab|kamarkhas|mqt|ruu|carian|arkib dewan, parlimen, penggal, sesi → pilih sesi id → butiran soalan + jawapan q, jenis, category, year → Carian Parlimen / Arkib ============================================================ --}} @php /** * Halaman frontend: Soal Jawab Parlimen (NRES) — kod penuh dalam Page Content * Sumber data: content_parliament_qa (+ translations, categories, documents) * Reka bentuk mengikut portal asal: /Parlimen/Pages/default.aspx * * Parameter URL: * tab soaljawab | kamarkhas | mqt | ruu | carian | arkib * dewan kod ref PARLIAMENT_DEWAN (DEWAN_RAKYAT | DEWAN_NEGARA) * parlimen nombor Parlimen (cth. 15) * penggal nombor Penggal (cth. 5) * sesi nombor Mesyuarat (1 | 2 | 3) * id id rekod → papar soalan + jawapan penuh * q, category, jenis, year untuk Carian Parlimen & Arkib */ $baseUrl = url()->current(); $ref = fn (string $cat) => \App\Models\Backend\Ref::where('cat', $cat)->orderBy('sort')->pluck('descr', 'code'); $questionTypes = $ref('PARLIAMENT_QUESTION_TYPE'); $dewanNames = $ref('PARLIAMENT_DEWAN'); $categoryNames = $ref('PARLIAMENT_CATEGORY'); $typeNames = $ref('PARLIAMENT_QA_TYPE'); // Susunan dewan ikut ref `PARLIAMENT_DEWAN` (Dewan Rakyat dahulu, bukan ikut abjad). $dewanOrder = array_flip(array_keys($dewanNames->all())); $typeTabs = [ 'soaljawab' => 'SOAL_JAWAB', 'kamarkhas' => 'KAMAR_KHAS', 'mqt' => 'MQT', 'ruu' => 'RUU', ]; $tabLabels = [ 'soaljawab' => t('Parliament QA'), 'kamarkhas' => t('pq.tab_special'), 'mqt' => t('pq.tab_mqt'), 'ruu' => t('pq.tab_bill'), 'carian' => t('pq.tab_search'), 'arkib' => t('Arkib'), ]; $tab = (string) request()->query('tab', 'soaljawab'); if (! array_key_exists($tab, $tabLabels)) { $tab = 'soaljawab'; } $detailId = (int) request()->query('id', 0); $dewan = (string) request()->query('dewan', ''); $parlimen = request()->query('parlimen'); $penggal = request()->query('penggal'); $sesi = request()->query('sesi'); $keyword = trim((string) request()->query('q', '')); $category = (string) request()->query('category', ''); $jenis = (string) request()->query('jenis', ''); $year = (string) request()->query('year', ''); $hasSession = $dewan !== '' && $parlimen !== null && $penggal !== null && $sesi !== null; $type = $typeTabs[$tab] ?? 'SOAL_JAWAB'; $sessionParams = $hasSession ? [ 'dewan' => $dewan, 'parlimen' => (int) $parlimen, 'penggal' => (int) $penggal, 'sesi' => (int) $sesi, ] : []; $urlWith = function (array $params = []) use ($baseUrl) { $clean = array_filter($params, fn ($value) => $value !== null && $value !== ''); return $clean === [] ? $baseUrl : $baseUrl.'?'.http_build_query($clean); }; $translate = fn ($item) => $item->translations->firstWhere('parliament_qa_translation_language', $lang) ?? $item->translations->firstWhere('parliament_qa_translation_main', 1) ?? $item->translations->first(); $questionText = function ($item) use ($translate) { $translation = $translate($item); return trim((string) ($translation->parliament_qa_translation_question ?? '')) ?: (string) ($translation->parliament_qa_translation_title ?? ''); }; $sesiLabel = fn ($number) => match ($number !== null ? (int) $number : null) { 1 => 'Mesyuarat Pertama', 2 => 'Mesyuarat Kedua', 3 => 'Mesyuarat Ketiga', default => $number !== null ? 'Mesyuarat '.$number : '', }; $sessionLabel = fn ($row) => implode(' | ', array_filter([ $row->parliament_qa_parlimen !== null ? 'Parlimen '.$row->parliament_qa_parlimen : null, $row->parliament_qa_penggal !== null ? 'Penggal '.$row->parliament_qa_penggal : null, $sesiLabel($row->parliament_qa_sesi), ])); $itemCategoryNames = fn ($item) => $item->categories ->pluck('parliament_qa_category_code') ->filter() ->map(fn ($code) => $categoryNames[$code] ?? $code) ->implode(', '); $records = fn () => \App\Models\Backend\ContentParliamentQa::with(['translations', 'categories', 'documents']) ->where('parliament_qa_status', 'PUBLISHED'); $detail = $detailId > 0 ? $records()->find($detailId) : null; $items = null; $typeDocs = null; if (! $detail && $hasSession && isset($typeTabs[$tab])) { $items = $records() ->where('parliament_qa_type', $type) ->where('parliament_qa_dewan', $dewan) ->where('parliament_qa_parlimen', (int) $parlimen) ->where('parliament_qa_penggal', (int) $penggal) ->where('parliament_qa_sesi', (int) $sesi) ->orderBy('parliament_qa_sort') ->orderBy('parliament_qa_no') ->paginate(10) ->withQueryString(); } $results = null; if (! $detail && $tab === 'carian' && ($keyword !== '' || $category !== '' || $jenis !== '' || $year !== '')) { $results = $records() ->when($keyword !== '', fn ($q) => $q->where(function ($sub) use ($keyword) { $sub->where('parliament_qa_no', 'like', "%{$keyword}%") ->orWhere('parliament_qa_member', 'like', "%{$keyword}%") ->orWhere('parliament_qa_area', 'like', "%{$keyword}%") ->orWhereHas('translations', fn ($t) => $t ->where('parliament_qa_translation_title', 'like', "%{$keyword}%") ->orWhere('parliament_qa_translation_question', 'like', "%{$keyword}%") ->orWhere('parliament_qa_translation_answer', 'like', "%{$keyword}%")); })) ->when($jenis !== '', fn ($q) => $q->where('parliament_qa_question_type', $jenis)) ->when($category !== '', fn ($q) => $q->whereHas( 'categories', fn ($c) => $c->where('parliament_qa_category_code', $category) )) ->when($year !== '', fn ($q) => $q->where('parliament_qa_year', (int) $year)) ->orderByDesc('parliament_qa_year') ->orderBy('parliament_qa_sort') ->paginate(10) ->withQueryString(); } $sessionGroups = collect(); $currentSession = null; $sessionQuery = fn () => \App\Models\Backend\ContentParliamentQa::query() ->where('parliament_qa_status', 'PUBLISHED') ->selectRaw('parliament_qa_type, parliament_qa_dewan, parliament_qa_parlimen, parliament_qa_penggal, parliament_qa_sesi, parliament_qa_year, count(*) as total') ->groupBy('parliament_qa_type', 'parliament_qa_dewan', 'parliament_qa_parlimen', 'parliament_qa_penggal', 'parliament_qa_sesi', 'parliament_qa_year'); if (! $detail && $tab === 'arkib') { // Hanya rekod berasaskan SESI (ada Dewan + Sesi) — rekod dokumen // (Kamar Khas/MQT/RUU) tiada kedua-duanya, jadi dikecualikan. $sessionGroups = $sessionQuery() ->whereNotNull('parliament_qa_dewan') ->whereNotNull('parliament_qa_sesi') ->when($year !== '', fn ($q) => $q->where('parliament_qa_year', (int) $year)) ->orderByDesc('parliament_qa_year') ->orderByDesc('parliament_qa_parlimen') ->orderByDesc('parliament_qa_penggal') ->orderBy('parliament_qa_sesi') ->get() ->groupBy('parliament_qa_dewan') ->sortBy(fn ($rows, $code) => $dewanOrder[$code] ?? 99); } elseif (! $detail && ! $hasSession && isset($typeTabs[$tab])) { // Portal NRES (default.aspx) senaraikan sesi SEMASA sahaja — parlimen/penggal // terbaharu — termasuk Mesyuarat Pertama/Kedua/Ketiga yang belum ada soalan. $currentSession = $sessionQuery() ->where('parliament_qa_type', $type) ->whereNotNull('parliament_qa_parlimen') ->whereNotNull('parliament_qa_penggal') ->orderByDesc('parliament_qa_parlimen') ->orderByDesc('parliament_qa_penggal') ->first(); $rows = $sessionQuery() ->where('parliament_qa_type', $type) ->when($currentSession, fn ($q) => $q ->where('parliament_qa_parlimen', $currentSession->parliament_qa_parlimen) ->where('parliament_qa_penggal', $currentSession->parliament_qa_penggal)) ->get(); $lookup = []; foreach ($rows as $row) { $lookup[$row->parliament_qa_dewan.'|'.(int) $row->parliament_qa_sesi] = $row; } $sesiNumbers = array_values(array_unique(array_merge( [1, 2, 3], $rows->pluck('parliament_qa_sesi')->filter()->map(fn ($n) => (int) $n)->all() ))); sort($sesiNumbers); $sessionGroups = collect(); // Tab tanpa sebarang data (cth. MQT/RUU) → biar keadaan "tiada sesi", // bukan 6 baris kosong. if ($currentSession) { foreach (array_keys($dewanOrder) as $dewanCode) { $group = collect(); foreach ($sesiNumbers as $sesiNo) { $row = $lookup[$dewanCode.'|'.$sesiNo] ?? null; $group->push((object) [ 'parliament_qa_type' => $type, 'parliament_qa_dewan' => $dewanCode, 'parliament_qa_parlimen' => $currentSession->parliament_qa_parlimen ?? null, 'parliament_qa_penggal' => $currentSession->parliament_qa_penggal ?? null, 'parliament_qa_sesi' => $sesiNo, 'parliament_qa_year' => $row->parliament_qa_year ?? ($currentSession->parliament_qa_year ?? null), 'total' => (int) ($row->total ?? 0), ]); } $sessionGroups->put($dewanCode, $group); } } // Jenis berasaskan dokumen (Kamar Khas / MQT / RUU) tiada Dewan/Sesi — // paparkan senarai PDF sebaliknya. if (! $currentSession) { $typeDocs = $records() ->where('parliament_qa_type', $type) ->orderByDesc('parliament_qa_date') ->orderByDesc('parliament_qa_year') ->orderBy('parliament_qa_sort') ->paginate(15) ->withQueryString(); } } $years = \App\Models\Backend\ContentParliamentQa::where('parliament_qa_status', 'PUBLISHED') ->whereNotNull('parliament_qa_year') ->distinct() ->orderByDesc('parliament_qa_year') ->pluck('parliament_qa_year'); $latestYear = $years->first(); @endphp
{{ t('pq.title_prefix') }} {{ $latestYear ?: date('Y') }}

{{ $tabLabels[$tab] }}

{{ t('pq.hero_desc') }}

@if($detail) @php $translation = $translate($detail); $backUrl = $urlWith(array_merge(['tab' => $tab], $sessionParams)); $metaRows = array_filter([ 'Pertanyaan' => $questionTypes[$detail->parliament_qa_question_type] ?? null, 'Dewan' => $dewanNames[$detail->parliament_qa_dewan] ?? null, 'Parlimen' => $detail->parliament_qa_parlimen !== null ? 'Parlimen '.$detail->parliament_qa_parlimen : null, 'Penggal' => $detail->parliament_qa_penggal !== null ? 'Penggal '.$detail->parliament_qa_penggal : null, 'Sesi' => $sesiLabel($detail->parliament_qa_sesi) ?: null, 'Tarikh Persidangan' => $detail->parliament_qa_date?->format('d F Y'), 'Tahun Persidangan' => $detail->parliament_qa_year, 'Kategori' => $itemCategoryNames($detail) ?: null, 'Nombor Soalan' => $detail->parliament_qa_no, 'Ahli / Senator' => $detail->parliament_qa_member, 'Kawasan' => $detail->parliament_qa_area, 'Kementerian' => $detail->parliament_qa_minister, ], fn ($value) => filled($value)); $attachments = collect(); if (filled($detail->parliament_qa_file)) { $attachments->push(['label' => 'Jawapan (PDF)', 'file' => $detail->parliament_qa_file]); } foreach ($detail->documents as $document) { if (filled($document->parliament_qa_document_file)) { $attachments->push([ 'label' => $document->parliament_qa_document_label ?: basename($document->parliament_qa_document_file), 'file' => $document->parliament_qa_document_file, ]); } } @endphp
Kembali ke senarai
@if(filled($detail->parliament_qa_question_type)) {{ $questionTypes[$detail->parliament_qa_question_type] ?? $detail->parliament_qa_question_type }} @endif @if(filled($detail->parliament_qa_no)) No. Soalan : {{ $detail->parliament_qa_no }} @endif
@if(filled($translation->parliament_qa_translation_title ?? null))

{{ $translation->parliament_qa_translation_title }}

@endif
@foreach($metaRows as $label => $value)
{{ $label }}
{{ $value }}
@endforeach

Soalan

{!! nl2br(e($translation->parliament_qa_translation_question ?? '')) !!}

Jawapan

@if(filled($translation->parliament_qa_translation_answer ?? null))
{!! nl2br(e($translation->parliament_qa_translation_answer)) !!}
@else

Jawapan bertulis belum tersedia untuk rekod ini.

@endif
@if($attachments->isNotEmpty())

Attachments

@endif
@elseif($tab === 'carian') @elseif($items) @php $activeSession = $items->first(); $sessionTitle = $activeSession ? implode(' | ', array_filter([ $dewanNames[$activeSession->parliament_qa_dewan] ?? $activeSession->parliament_qa_dewan, $activeSession->parliament_qa_parlimen !== null ? 'Parlimen '.$activeSession->parliament_qa_parlimen : null, $activeSession->parliament_qa_penggal !== null ? 'Penggal '.$activeSession->parliament_qa_penggal : null, $sesiLabel($activeSession->parliament_qa_sesi), ])) : ($dewanNames[$dewan] ?? $dewan); @endphp
{{ $typeNames[$type] ?? $type }}

{{ $sessionTitle }}

Senarai Sesi
@if($items->isNotEmpty())
{{ $items->total() }} rekod dalam sesi ini
@foreach($items as $item) @php /* Kad satu rekod Parlimen — gaya portal (Jenis Soalan / Kategori / No. Soalan / teks soalan). */ $detailUrl = $urlWith(array_merge(['tab' => $tab, 'id' => $item->parliament_qa_id], $sessionParams)); $detailLabel = in_array($item->parliament_qa_type, ['SOAL_JAWAB', 'MQT'], true) ? 'Papar Jawapan' : 'Lihat Butiran'; @endphp

Jenis Soalan : {{ $questionTypes[$item->parliament_qa_question_type] ?? '—' }} Kategori : {{ $itemCategoryNames($item) ?: '—' }} @if(filled($item->parliament_qa_year)) Tahun : {{ $item->parliament_qa_year }} @endif @if($tab === 'arkib' && filled($item->parliament_qa_type)) Jenis : {{ $typeNames[$item->parliament_qa_type] ?? $item->parliament_qa_type }} @endif

No. Soalan : {{ $item->parliament_qa_no ?: '—' }}

{{ \Illuminate\Support\Str::limit($questionText($item), 340) }}

{{ $dewanNames[$item->parliament_qa_dewan] ?? '' }}@if($item->parliament_qa_date) · {{ $item->parliament_qa_date->format('d/m/Y') }}@endif {{ $detailLabel }}
@endforeach
@if($items->hasPages()) @endif @else

Tiada rekod untuk sesi ini

Pilih sesi lain atau gunakan Carian Parlimen untuk mencari soalan tertentu.

@endif
@else @if($tab === 'arkib')
Semua Tahun @foreach($years as $option) {{ $option }} @endforeach
@endif @if($typeDocs && $typeDocs->isNotEmpty())

Dokumen {{ $tabLabels[$tab] }}

Klik untuk membuka dokumen (PDF).

@foreach($typeDocs as $doc) @php $docTitle = $translate($doc)?->parliament_qa_translation_title ?: basename((string) $doc->parliament_qa_file); @endphp
{{ $docTitle }} @if($doc->parliament_qa_date) {{ $doc->parliament_qa_date->format('d/m/Y') }} @endif @if($doc->parliament_qa_year) · {{ $doc->parliament_qa_year }} @endif
@endforeach
@if($typeDocs->hasPages()) @endif @elseif($sessionGroups->isEmpty())

Tiada sesi direkodkan

Rekod Parlimen akan dipaparkan di sini selepas dimasukkan melalui CMS.

@else @if($tab !== 'arkib')

{{ t('pq.session_house') }}

@if($currentSession)

Sesi semasa: Parlimen {{ $currentSession->parliament_qa_parlimen }} | Penggal {{ $currentSession->parliament_qa_penggal }} · Sesi terdahulu dalam Arkib

@endif @endif
@foreach($sessionGroups as $dewanCode => $rows) @foreach($rows as $row) @php $rowTab = $tab === 'arkib' ? (array_search($row->parliament_qa_type, $typeTabs, true) ?: 'soaljawab') : $tab; @endphp @if($loop->first) @endif @endforeach @endforeach
Dewan Sesi
{{ $dewanNames[$dewanCode] ?? $dewanCode }} {{ $sessionLabel($row) }} @if($tab === 'arkib') {{ $typeNames[$row->parliament_qa_type] ?? $row->parliament_qa_type }} @endif @if((int) $row->total > 0) {{ $row->total }} rekod @else belum ada rekod @endif
@endif @endif