From 201595912fab1087763999cb7db348e0e402bd6f Mon Sep 17 00:00:00 2001 From: Saufi Date: Tue, 19 May 2026 20:47:08 +0800 Subject: [PATCH] tukar nama MB Ipoh Perak kepada MBIP --- manual/Manual_Pengguna_eCert_MBIP.docx | Bin 0 -> 41307 bytes manual/generate_manual.py | 722 ++++++++++++++++++ manual/~$nual_Pengguna_eCert_MBIP.docx | Bin 0 -> 162 bytes .../views/admin/programs/_form.blade.php | 2 +- .../views/admin/programs/_form.blade.php.bak | 174 +++++ .../views/auth/forgot-password.blade.php | 6 +- src/resources/views/auth/login.blade.php | 6 +- .../views/auth/reset-password.blade.php | 6 +- .../views/public/checkin/show.blade.php | 2 +- 9 files changed, 907 insertions(+), 11 deletions(-) create mode 100644 manual/Manual_Pengguna_eCert_MBIP.docx create mode 100644 manual/generate_manual.py create mode 100644 manual/~$nual_Pengguna_eCert_MBIP.docx create mode 100644 src/resources/views/admin/programs/_form.blade.php.bak diff --git a/manual/Manual_Pengguna_eCert_MBIP.docx b/manual/Manual_Pengguna_eCert_MBIP.docx new file mode 100644 index 0000000000000000000000000000000000000000..d02d9bd69cca5447c744193387dbc69b8c5b9101 GIT binary patch literal 41307 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 literal 0 HcmV?d00001 diff --git a/manual/generate_manual.py b/manual/generate_manual.py new file mode 100644 index 0000000..5c340a9 --- /dev/null +++ b/manual/generate_manual.py @@ -0,0 +1,722 @@ +""" +Penjana Manual Pengguna eCert MBIP +Format: Microsoft Word (.docx) +""" + +from docx import Document +from docx.shared import Pt, Cm, RGBColor, Inches +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.table import WD_TABLE_ALIGNMENT +from docx.oxml.ns import qn +from docx.oxml import OxmlElement +import datetime + +BASE_URL = "https://mysijil.mbip.my" + +doc = Document() + +# ── Margin halaman ──────────────────────────────────────────────────────────── +for section in doc.sections: + section.top_margin = Cm(2.5) + section.bottom_margin = Cm(2.5) + section.left_margin = Cm(3.0) + section.right_margin = Cm(2.5) + +# ── Helpers ─────────────────────────────────────────────────────────────────── +def add_heading(text, level=1): + h = doc.add_heading(text, level=level) + h.runs[0].font.color.rgb = RGBColor(0x1a, 0x3a, 0x6b) + return h + +def add_body(text): + p = doc.add_paragraph(text) + p.runs[0].font.size = Pt(11) + return p + +def add_bullet(text): + p = doc.add_paragraph(text, style='List Bullet') + p.runs[0].font.size = Pt(11) + return p + +def add_screenshot_box(caption, url, height_cm=7): + """Kotak placeholder untuk tangkapan skrin.""" + doc.add_paragraph() + + # Jadual satu sel sebagai kotak + tbl = doc.add_table(rows=1, cols=1) + tbl.alignment = WD_TABLE_ALIGNMENT.CENTER + cell = tbl.cell(0, 0) + + # Warna latar + tc = cell._tc + tcPr = tc.get_or_add_tcPr() + shd = OxmlElement('w:shd') + shd.set(qn('w:val'), 'clear') + shd.set(qn('w:color'), 'auto') + shd.set(qn('w:fill'), 'EEF2FF') + tcPr.append(shd) + + # Tinggi sel + trPr = tbl.rows[0]._tr.get_or_add_trPr() + trHeight = OxmlElement('w:trHeight') + trHeight.set(qn('w:val'), str(int(height_cm * 567))) + trHeight.set(qn('w:hRule'), 'exact') + trPr.append(trHeight) + + # Teks dalam kotak + p = cell.paragraphs[0] + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = p.add_run(f"\n\n[ TANGKAPAN SKRIN ]\n\n{caption}") + run.font.size = Pt(10) + run.font.color.rgb = RGBColor(0x64, 0x74, 0x8B) + run.font.italic = True + + # Label URL + p2 = doc.add_paragraph() + p2.alignment = WD_ALIGN_PARAGRAPH.CENTER + run2 = p2.add_run(f"URL: {url}") + run2.font.size = Pt(9) + run2.font.color.rgb = RGBColor(0x1a, 0x56, 0xa0) + run2.font.italic = True + doc.add_paragraph() + +def add_note(text): + p = doc.add_paragraph() + p.add_run("Nota: ").bold = True + run = p.add_run(text) + run.font.size = Pt(10) + run.font.italic = True + p.paragraph_format.left_indent = Cm(0.5) + +def page_break(): + doc.add_page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# HALAMAN TAJUK +# ═══════════════════════════════════════════════════════════════════════════════ +doc.add_paragraph() +doc.add_paragraph() +doc.add_paragraph() + +t = doc.add_paragraph("eCert MBIP") +t.alignment = WD_ALIGN_PARAGRAPH.CENTER +r = t.runs[0] +r.font.size = Pt(32) +r.font.bold = True +r.font.color.rgb = RGBColor(0x1a, 0x3a, 0x6b) + +t2 = doc.add_paragraph("Sistem Pengurusan Sijil Digital") +t2.alignment = WD_ALIGN_PARAGRAPH.CENTER +r2 = t2.runs[0] +r2.font.size = Pt(18) +r2.font.color.rgb = RGBColor(0x1a, 0x3a, 0x6b) + +doc.add_paragraph() + +t3 = doc.add_paragraph("MANUAL PENGGUNA — PENTADBIR") +t3.alignment = WD_ALIGN_PARAGRAPH.CENTER +r3 = t3.runs[0] +r3.font.size = Pt(16) +r3.font.bold = True +r3.font.color.rgb = RGBColor(0x55, 0x55, 0x55) + +doc.add_paragraph() +doc.add_paragraph() + +t4 = doc.add_paragraph("Majlis Bandaraya Ipoh Perak (MBIP)") +t4.alignment = WD_ALIGN_PARAGRAPH.CENTER +t4.runs[0].font.size = Pt(12) + +t5 = doc.add_paragraph(f"Versi 1.0 · {datetime.date.today().strftime('%B %Y')}") +t5.alignment = WD_ALIGN_PARAGRAPH.CENTER +t5.runs[0].font.size = Pt(11) +t5.runs[0].font.color.rgb = RGBColor(0x88, 0x88, 0x88) + +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# ISI KANDUNGAN (placeholder manual) +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("Isi Kandungan", level=1) + +toc_items = [ + ("1", "Pengenalan"), + ("2", "Log Masuk ke Sistem"), + ("3", "Dashboard Utama"), + ("4", "Pengurusan Program"), + (" 4.1", "Cipta Program Baru"), + (" 4.2", "Kemaskini Maklumat Program"), + (" 4.3", "Tetapan Check-in dan Muat Turun"), + (" 4.4", "Publish dan Tutup Program"), + ("5", "Pengurusan Peserta"), + (" 5.1", "Lihat Senarai Peserta"), + (" 5.2", "Tambah Peserta Satu-Satu"), + (" 5.3", "Import Peserta dari Excel"), + (" 5.4", "Export Senarai Peserta"), + ("6", "Kod QR Check-in"), + ("7", "Template Sijil"), + (" 7.1", "Muat Naik Template"), + (" 7.2", "Konfigurasi Kedudukan Teks"), + (" 7.3", "Jana Pratonton Sijil"), + ("8", "Soalselidik Program"), + ("9", "Pengurusan Sijil"), + ("10", "Statistik Program"), + ("11", "Set Soalselidik"), + (" 11.1", "Cipta Set Soalselidik"), + (" 11.2", "Tambah dan Urus Soalan"), + ("12", "Pengurusan Pengguna (Super Admin)"), + ("13", "Profil Pengguna"), +] + +for num, title in toc_items: + p = doc.add_paragraph() + p.paragraph_format.left_indent = Cm(0.5) if num.startswith(" ") else Cm(0) + r = p.add_run(f"{num.strip()} {title}") + r.font.size = Pt(11) + +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 1: PENGENALAN +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("1. Pengenalan") +add_body( + "eCert MBIP ialah sistem pengurusan sijil digital yang dibangunkan untuk Majlis Bandaraya Ipoh Perak (MBIP). " + "Sistem ini membolehkan pentadbir mengurus program, menguruskan peserta, menjana sijil digital secara automatik, " + "dan mengumpul maklum balas peserta melalui soalselidik dalam talian." +) +doc.add_paragraph() +add_body("Fungsi utama sistem:") +add_bullet("Pengurusan program dan peserta") +add_bullet("Check-in peserta melalui kod QR") +add_bullet("Jana dan hantar sijil digital secara automatik") +add_bullet("Pengurusan template sijil") +add_bullet("Kutipan maklum balas melalui soalselidik") +add_bullet("Laporan statistik kehadiran dan penyertaan") +doc.add_paragraph() +add_body("Manual ini ditujukan kepada pentadbir sistem (Admin dan Super Admin) untuk menggunakan semua fungsi yang tersedia.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 2: LOG MASUK +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("2. Log Masuk ke Sistem") +add_body("Untuk mengakses sistem eCert MBIP, pentadbir perlu log masuk menggunakan alamat emel dan kata laluan yang telah diberikan.") +doc.add_paragraph() +add_body("Langkah-langkah log masuk:") +add_bullet(f"Buka pelayar web dan pergi ke: {BASE_URL}/login") +add_bullet("Masukkan Alamat Emel yang berdaftar.") +add_bullet("Masukkan Kata Laluan.") +add_bullet("Klik butang Log Masuk.") +doc.add_paragraph() + +add_screenshot_box( + "Halaman Log Masuk — Borang emel dan kata laluan", + f"{BASE_URL}/login" +) + +add_note( + "Jika terlupa kata laluan, klik pautan 'Terlupa Kata Laluan?' di bawah borang log masuk. " + "Pautan set semula kata laluan akan dihantar ke alamat emel yang didaftarkan." +) +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 3: DASHBOARD +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("3. Dashboard Utama") +add_body( + "Selepas log masuk, pentadbir akan dibawa ke halaman Dashboard. Dashboard memaparkan ringkasan aktiviti sistem " + "termasuk jumlah program aktif, jumlah peserta, dan sijil yang dijana." +) +doc.add_paragraph() +add_body("Elemen pada Dashboard:") +add_bullet("Jumlah program yang sedang aktif") +add_bullet("Senarai program terkini") +add_bullet("Pautan pantas ke fungsi utama") + +add_screenshot_box( + "Dashboard Utama — Ringkasan statistik dan senarai program", + f"{BASE_URL}/admin/dashboard" +) + +add_body("Bar navigasi di sebelah kiri (sidebar) menyediakan akses pantas ke semua modul sistem.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 4: PENGURUSAN PROGRAM +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("4. Pengurusan Program") +add_body( + "Modul Program adalah teras sistem eCert MBIP. Setiap program mewakili satu acara atau kursus yang dianjurkan. " + "Pentadbir boleh mencipta, mengemaskini, dan mengurus status program dari modul ini." +) + +add_screenshot_box( + "Senarai Program — Semua program yang telah dicipta", + f"{BASE_URL}/admin/programs" +) + +# 4.1 +add_heading("4.1 Cipta Program Baru", level=2) +add_body("Langkah-langkah mencipta program baru:") +add_bullet("Klik butang + Cipta Program di halaman Senarai Program.") +add_bullet("Isi maklumat program:") + +fields_program = [ + ("Tajuk Program", "Nama program atau acara (wajib)"), + ("Penerangan", "Huraian ringkas program"), + ("Tarikh Mula / Tamat", "Tarikh pelaksanaan program"), + ("Lokasi", "Tempat program diadakan"), + ("Benarkan Walk-in", "Aktifkan jika peserta luar dibenarkan daftar semasa check-in"), +] +for field, desc in fields_program: + p = doc.add_paragraph() + p.paragraph_format.left_indent = Cm(1) + r1 = p.add_run(f"{field}: ") + r1.bold = True + r1.font.size = Pt(11) + p.add_run(desc).font.size = Pt(11) + +add_bullet("Klik Simpan untuk menyimpan program.") + +add_screenshot_box( + "Borang Cipta Program Baru — Isi maklumat program", + f"{BASE_URL}/admin/programs/create" +) + +# 4.2 +add_heading("4.2 Kemaskini Maklumat Program", level=2) +add_body( + "Untuk mengedit program sedia ada, klik ikon Edit (pensel) pada senarai program atau klik nama program " + "kemudian pilih tab Butiran." +) +add_screenshot_box( + "Halaman Butiran Program — Tab maklumat, peserta, template, soalselidik, sijil", + f"{BASE_URL}/admin/programs/{{uuid}}" +) + +# 4.3 +add_heading("4.3 Tetapan Check-in dan Muat Turun", level=2) +add_body("Pentadbir perlu menetapkan waktu check-in dan tempoh muat turun sijil dalam tetapan program:") + +settings_table = [ + ("Mula Check-in", "Tarikh dan masa check-in dibuka untuk peserta"), + ("Tamat Check-in", "Tarikh dan masa check-in ditutup"), + ("Mula Muat Turun Sijil", "Peserta boleh muat turun sijil selepas tempoh ini"), + ("Tamat Muat Turun Sijil", "Tempoh muat turun sijil tamat"), +] +for field, desc in settings_table: + p = doc.add_paragraph() + p.paragraph_format.left_indent = Cm(1) + r1 = p.add_run(f"{field}: ") + r1.bold = True + r1.font.size = Pt(11) + p.add_run(desc).font.size = Pt(11) + +add_note("Semua masa menggunakan waktu Malaysia (MYT, UTC+8).") + +# 4.4 +add_heading("4.4 Publish dan Tutup Program", level=2) +add_body("Program perlu di-publish sebelum peserta dapat menggunakan pautan check-in QR.") +add_bullet("Klik butang Publish untuk mengaktifkan program. Status bertukar kepada Aktif.") +add_bullet("Klik butang Tutup untuk menamatkan program. Peserta tidak lagi dapat check-in.") +add_note("Program yang telah ditutup tidak boleh dibuka semula secara automatik.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 5: PENGURUSAN PESERTA +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("5. Pengurusan Peserta") +add_body("Modul Peserta membolehkan pentadbir mengurus senarai peserta bagi setiap program.") + +# 5.1 +add_heading("5.1 Lihat Senarai Peserta", level=2) +add_body("Klik tab Peserta dalam halaman butiran program untuk melihat semua peserta berdaftar.") +add_body("Maklumat yang dipaparkan:") +add_bullet("Nama peserta") +add_bullet("No. Kad Pengenalan") +add_bullet("Status check-in (Hadir / Belum Hadir)") +add_bullet("Status sijil (Belum Jana / Dijana / Dihantar)") +add_bullet("Sumber pendaftaran (Pra-daftar / Walk-in)") + +add_screenshot_box( + "Senarai Peserta — Status kehadiran dan sijil setiap peserta", + f"{BASE_URL}/admin/programs/{{uuid}}/participants" +) + +# 5.2 +add_heading("5.2 Tambah Peserta Satu-Satu", level=2) +add_body("Untuk menambah peserta secara manual:") +add_bullet("Klik butang + Tambah Peserta.") +add_bullet("Isi Nama Penuh dan No. Kad Pengenalan (12 digit).") +add_bullet("Isi maklumat tambahan jika perlu (emel, telefon, agensi).") +add_bullet("Klik Simpan.") + +add_screenshot_box( + "Borang Tambah Peserta — Isi maklumat peserta", + f"{BASE_URL}/admin/programs/{{uuid}}/participants/create" +) + +# 5.3 +add_heading("5.3 Import Peserta dari Excel", level=2) +add_body("Untuk mendaftar ramai peserta sekaligus:") +add_bullet("Klik butang Import Excel.") +add_bullet("Muat turun templat Excel yang disediakan.") +add_bullet("Isi maklumat peserta dalam templat (Nama, No. KP, Emel, Telefon, Agensi).") +add_bullet("Muat naik semula fail Excel yang telah diisi.") +add_bullet("Semak ringkasan import dan klik Sahkan.") + +add_screenshot_box( + "Halaman Import Peserta — Muat naik fail Excel", + f"{BASE_URL}/admin/programs/{{uuid}}/participants/import" +) +add_note("Sistem akan abaikan baris yang No. KP-nya sudah wujud dalam program yang sama.") + +# 5.4 +add_heading("5.4 Export Senarai Peserta", level=2) +add_body("Klik butang Export Excel untuk memuat turun senarai lengkap peserta beserta status check-in dan sijil ke dalam fail Excel.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 6: KOD QR CHECK-IN +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("6. Kod QR Check-in") +add_body( + "Setiap program mempunyai Kod QR unik yang digunakan peserta untuk check-in. " + "Peserta mengimbas kod ini menggunakan telefon pintar untuk mendaftarkan kehadiran." +) +add_body("Cara menjana dan menggunakan Kod QR:") +add_bullet("Klik tab Kod QR dalam halaman butiran program.") +add_bullet("Klik Jana QR Code jika belum dijana.") +add_bullet("Paparkan Kod QR pada skrin besar atau cetak untuk peserta mengimbas.") +add_bullet("Klik Muat Turun untuk menyimpan imej Kod QR.") + +add_screenshot_box( + "Halaman Kod QR — Jana, papar, dan muat turun QR Code", + f"{BASE_URL}/admin/programs/{{uuid}}/qr" +) + +add_note( + "Kod QR boleh dinyahaktifkan (Deactivate) dan dijana semula jika diperlukan. " + "Kod lama tidak akan berfungsi selepas dinyahaktifkan." +) +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 7: TEMPLATE SIJIL +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("7. Template Sijil") +add_body( + "Modul Template Sijil membolehkan pentadbir menyediakan reka bentuk sijil yang akan digunakan " + "untuk menjana sijil digital peserta." +) + +# 7.1 +add_heading("7.1 Muat Naik Template", level=2) +add_body("Langkah-langkah muat naik template sijil:") +add_bullet("Klik tab Template Sijil dalam halaman butiran program.") +add_bullet("Klik butang Pilih Fail dan pilih imej template (format JPG atau PNG, maksimum 10MB).") +add_bullet("Resolusi disyorkan: 1754 × 1240 piksel (A4 landscape) atau 1240 × 1754 piksel (portrait).") +add_bullet("Klik Muat Naik.") + +add_screenshot_box( + "Halaman Muat Naik Template — Pilih fail imej sijil", + f"{BASE_URL}/admin/programs/{{uuid}}/template" +) + +# 7.2 +add_heading("7.2 Konfigurasi Kedudukan Teks", level=2) +add_body( + "Selepas template dimuat naik, pentadbir perlu menetapkan kedudukan teks pada sijil. " + "Koordinat dikira dari sudut kiri atas imej (piksel)." +) +add_body("Medan yang boleh dikonfigurasi:") + +config_fields = [ + ("Nama Peserta", "Kedudukan X, Y, saiz font, warna, dan penjajaran (kiri/tengah/kanan)"), + ("No. IC", "Saiz font No. IC yang dipaparkan di bawah nama"), + ("No. Sijil (Pilihan)", "Aktifkan togol 'Papar' untuk menambah No. Sijil pada sijil. Tetapkan kedudukan X, Y."), +] +for field, desc in config_fields: + p = doc.add_paragraph() + p.paragraph_format.left_indent = Cm(1) + r1 = p.add_run(f"{field}: ") + r1.bold = True + r1.font.size = Pt(11) + p.add_run(desc).font.size = Pt(11) + +add_bullet("Klik Simpan Konfigurasi untuk menyimpan tetapan.") + +add_screenshot_box( + "Konfigurasi Template — Tetapkan kedudukan teks nama dan No. Sijil", + f"{BASE_URL}/admin/programs/{{uuid}}/template" +) + +# 7.3 +add_heading("7.3 Jana Pratonton Sijil", level=2) +add_body("Untuk menyemak kedudukan teks sebelum menjana sijil sebenar:") +add_bullet("Masukkan nama contoh dalam kotak Jana Pratonton.") +add_bullet("Klik butang Pratonton.") +add_bullet("Imej pratonton akan dipaparkan dengan teks pada koordinat yang ditetapkan.") +add_note("Pratonton menggunakan nilai koordinat terkini walaupun belum disimpan.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 8: SOALSELIDIK PROGRAM +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("8. Soalselidik Program") +add_body( + "Pentadbir boleh mengaitkan set soalselidik dengan program. Peserta akan diminta mengisi soalselidik " + "selepas check-in sebelum sijil boleh dimuat turun." +) +add_body("Cara mengaitkan soalselidik dengan program:") +add_bullet("Klik tab Soalselidik dalam halaman butiran program.") +add_bullet("Pilih Set Soalselidik yang ingin digunakan daripada senarai tersedia.") +add_bullet("Klik Lampirkan Soalselidik.") +add_bullet("Klik Sahkan untuk mengesahkan penggunaan soalselidik ini.") +add_bullet("Klik Pratonton untuk melihat soalan yang akan dijawab peserta.") + +add_screenshot_box( + "Halaman Soalselidik Program — Lampirkan dan pratonton soalselidik", + f"{BASE_URL}/admin/programs/{{uuid}}/questionnaire" +) + +add_note("Soalselidik yang telah disahkan tidak boleh ditukar. Sah kan hanya apabila sudah pasti.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 9: PENGURUSAN SIJIL +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("9. Pengurusan Sijil") +add_body( + "Modul Sijil membolehkan pentadbir menjana dan menghantar sijil digital kepada semua peserta yang hadir." +) +add_body("Fungsi yang tersedia:") +add_bullet("Jana Semua Sijil — Menjana sijil untuk semua peserta yang telah check-in.") +add_bullet("Hantar Emel Semua — Menghantar sijil kepada peserta melalui emel secara pukal.") +add_body("Status sijil setiap peserta:") + +status_sijil = [ + ("Belum Jana", "Sijil belum dijana untuk peserta ini"), + ("Dijana", "Sijil sudah dijana dan sedia untuk dihantar"), + ("Dihantar", "Sijil telah dihantar melalui emel"), + ("Dimuat Turun", "Peserta telah memuat turun sijil mereka"), +] +for status, desc in status_sijil: + p = doc.add_paragraph() + p.paragraph_format.left_indent = Cm(1) + r1 = p.add_run(f"{status}: ") + r1.bold = True + r1.font.size = Pt(11) + p.add_run(desc).font.size = Pt(11) + +add_screenshot_box( + "Halaman Sijil — Senarai sijil dan fungsi jana/hantar pukal", + f"{BASE_URL}/admin/programs/{{uuid}}/certificates" +) + +add_note("Pastikan template sijil telah dikonfigurasi terlebih dahulu sebelum menjana sijil.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 10: STATISTIK PROGRAM +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("10. Statistik Program") +add_body( + "Halaman Statistik memaparkan data analitik terperinci bagi setiap program. " + "Pentadbir boleh memantau prestasi program melalui laporan yang disediakan." +) +add_body("Data yang dipaparkan:") +add_bullet("Jumlah peserta berdaftar vs. jumlah yang hadir") +add_bullet("Pecahan mengikut sesi (Slot masa check-in)") +add_bullet("Pecahan mengikut sumber pendaftaran (Pra-daftar / Walk-in)") +add_bullet("Status sijil (Dijana, Dihantar, Dimuat Turun)") +add_bullet("Keputusan soalselidik (jika soalselidik dikaitkan)") + +add_screenshot_box( + "Halaman Statistik — Graf dan data analitik program", + f"{BASE_URL}/admin/programs/{{uuid}}/statistics" +) + +add_body("Klik butang Export Excel untuk memuat turun laporan statistik dalam format Excel.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 11: SET SOALSELIDIK +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("11. Set Soalselidik") +add_body( + "Modul Set Soalselidik membolehkan pentadbir membina borang soalan yang boleh digunakan semula " + "merentasi pelbagai program." +) + +add_screenshot_box( + "Senarai Set Soalselidik — Semua set yang telah dicipta", + f"{BASE_URL}/admin/questionnaires" +) + +# 11.1 +add_heading("11.1 Cipta Set Soalselidik", level=2) +add_body("Langkah-langkah mencipta set soalselidik baru:") +add_bullet("Klik butang + Cipta Set Soalselidik.") +add_bullet("Masukkan Nama Set dan Penerangan (pilihan).") +add_bullet("Klik Simpan.") + +add_screenshot_box( + "Borang Cipta Set Soalselidik — Nama dan penerangan", + f"{BASE_URL}/admin/questionnaires/create" +) + +# 11.2 +add_heading("11.2 Tambah dan Urus Soalan", level=2) +add_body("Selepas set dicipta, tambah soalan melalui halaman butiran set soalselidik.") +add_body("Jenis soalan yang tersedia:") + +jenis_soalan = [ + ("Tajuk (Seksyen)", "Pengepala bahagian — boleh menjadi parent kepada soalan Rating"), + ("Rating (1-5)", "Penilaian skala 1 hingga 5 — mesti diletakkan di bawah Tajuk"), + ("Pilihan Tunggal", "Peserta pilih satu jawapan sahaja"), + ("Pilihan Berganda", "Peserta boleh pilih lebih dari satu jawapan"), + ("Teks Pendek", "Jawapan dalam satu baris"), + ("Teks Panjang", "Jawapan berbilang baris"), +] +for jenis, desc in jenis_soalan: + p = doc.add_paragraph() + p.paragraph_format.left_indent = Cm(1) + r1 = p.add_run(f"{jenis}: ") + r1.bold = True + r1.font.size = Pt(11) + p.add_run(desc).font.size = Pt(11) + +add_screenshot_box( + "Halaman Set Soalselidik — Senarai soalan dan borang tambah soalan", + f"{BASE_URL}/admin/questionnaires/{{id}}" +) + +add_body("Ciri-ciri tambahan:") +add_bullet("Soalan Rating: Pentadbir boleh tetapkan label teks untuk setiap nilai (1-5) pada peringkat Tajuk.") +add_bullet("Susunan soalan boleh diubah dengan seret-dan-lepas (drag-and-drop).") +add_bullet("Soalan Rating tidak boleh dipindahkan keluar dari Tajuk induknya.") +add_bullet("Tetapkan soalan sebagai Wajib atau tidak wajib.") + +add_note( + "Set soalselidik perlu di-Publish sebelum boleh dikaitkan dengan program. " + "Selepas di-Publish, soalan tidak boleh diubah." +) +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 12: PENGURUSAN PENGGUNA (SUPER ADMIN) +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("12. Pengurusan Pengguna") +add_body( + "Modul ini hanya boleh diakses oleh Super Admin. " + "Super Admin boleh mencipta dan mengurus akaun pentadbir lain dalam sistem." +) +add_body("Fungsi yang tersedia:") +add_bullet("Lihat senarai semua pentadbir") +add_bullet("Cipta akaun pentadbir baru") +add_bullet("Kemaskini maklumat pentadbir") +add_bullet("Padam akaun pentadbir") + +add_screenshot_box( + "Halaman Pengurusan Pengguna — Senarai pentadbir (Super Admin sahaja)", + f"{BASE_URL}/admin/users" +) + +add_body("Jenis peranan pengguna:") +add_bullet("Super Admin — Akses penuh termasuk Pengurusan Pengguna") +add_bullet("Admin Program — Akses kepada semua program dan soalselidik, kecuali Pengurusan Pengguna") + +add_note("Setiap sistem perlu sekurang-kurangnya satu akaun Super Admin yang aktif.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# BAB 13: PROFIL PENGGUNA +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("13. Profil Pengguna") +add_body( + "Setiap pentadbir boleh mengurus maklumat akaun peribadi mereka melalui halaman Profil. " + "Klik nama pengguna atau butang Profil di bar navigasi kiri untuk mengakses halaman ini." +) +add_body("Fungsi yang tersedia:") + +add_heading("Tukar Alamat Emel", level=2) +add_bullet("Masukkan Kata Laluan Semasa untuk pengesahan.") +add_bullet("Masukkan Emel Baru.") +add_bullet("Klik Kemaskini Emel.") + +add_heading("Tukar Kata Laluan", level=2) +add_bullet("Masukkan Kata Laluan Semasa.") +add_bullet("Masukkan Kata Laluan Baru (minimum 8 aksara).") +add_bullet("Masukkan semula Kata Laluan Baru untuk pengesahan.") +add_bullet("Klik Tukar Kata Laluan.") + +add_screenshot_box( + "Halaman Profil — Tukar emel dan kata laluan", + f"{BASE_URL}/admin/profile" +) + +add_note("Kata laluan baru mestilah sekurang-kurangnya 8 aksara. Simpan kata laluan di tempat yang selamat.") +page_break() + + +# ═══════════════════════════════════════════════════════════════════════════════ +# LAMPIRAN: ALIRAN KERJA SISTEM +# ═══════════════════════════════════════════════════════════════════════════════ +add_heading("Lampiran: Aliran Kerja Tipikal") +add_body("Berikut adalah urutan langkah yang disyorkan untuk menjalankan sebuah program dari mula hingga selesai:") + +workflow = [ + ("1", "Cipta Set Soalselidik", "Bina soalan maklum balas di Modul Set Soalselidik dan publish."), + ("2", "Cipta Program", "Isi maklumat program, tarikh, dan tetapan check-in."), + ("3", "Import Peserta", "Muat naik senarai peserta melalui Excel."), + ("4", "Muat Naik Template Sijil", "Upload reka bentuk sijil dan konfigurasi kedudukan teks."), + ("5", "Lampirkan Soalselidik", "Kaitkan set soalselidik dengan program dan sahkan."), + ("6", "Publish Program", "Aktifkan program supaya peserta boleh check-in."), + ("7", "Jana & Papar Kod QR", "Paparkan QR Code semasa acara untuk peserta mengimbas."), + ("8", "Pantau Statistik", "Semak kehadiran dan maklum balas dalam masa nyata."), + ("9", "Jana dan Hantar Sijil", "Selepas program tamat, jana sijil dan hantar melalui emel."), +] + +tbl = doc.add_table(rows=1, cols=3) +tbl.style = 'Table Grid' +hdr = tbl.rows[0].cells +hdr[0].text = "Langkah" +hdr[1].text = "Tindakan" +hdr[2].text = "Penerangan" +for cell in hdr: + cell.paragraphs[0].runs[0].bold = True + cell.paragraphs[0].runs[0].font.size = Pt(10) + +for step, action, desc in workflow: + row = tbl.add_row().cells + row[0].text = step + row[1].text = action + row[2].text = desc + for cell in row: + cell.paragraphs[0].runs[0].font.size = Pt(10) + +doc.add_paragraph() +add_body(f"Untuk sokongan teknikal, hubungi pentadbir sistem atau lawati: {BASE_URL}") + +# ── Simpan dokumen ───────────────────────────────────────────────────────────── +output_path = r"C:\Users\User\Aplikasi\ecert\manual\Manual_Pengguna_eCert_MBIP.docx" +doc.save(output_path) +print(f"Manual berjaya dijana: {output_path}") diff --git a/manual/~$nual_Pengguna_eCert_MBIP.docx b/manual/~$nual_Pengguna_eCert_MBIP.docx new file mode 100644 index 0000000000000000000000000000000000000000..1a25f7e1d59f52aeb66b0a135f14b04d090c5283 GIT binary patch literal 162 zcmWf2%*ahlQ3y^fP0LhpOiED*O3cX2Wgq}V85|ih7;+gB8B!P&7=nRxDMK1VCXnsO zkOUSB0*Yk-MNo}mf|?t>5W?tIznj(g{0^hu%-#L#%@`P#vwU9P3FN<+BP=@=sN`TH G?*;%Nq#u<4 literal 0 HcmV?d00001 diff --git a/src/resources/views/admin/programs/_form.blade.php b/src/resources/views/admin/programs/_form.blade.php index 6fe660f..2e5ec33 100644 --- a/src/resources/views/admin/programs/_form.blade.php +++ b/src/resources/views/admin/programs/_form.blade.php @@ -39,7 +39,7 @@ + placeholder="Contoh: Dewan Utama MBIP"> @error('location')
{{ $message }}
@enderror diff --git a/src/resources/views/admin/programs/_form.blade.php.bak b/src/resources/views/admin/programs/_form.blade.php.bak new file mode 100644 index 0000000..6fe660f --- /dev/null +++ b/src/resources/views/admin/programs/_form.blade.php.bak @@ -0,0 +1,174 @@ +{{-- + Shared form partial. + Variables expected: + $program — Program model (or null for create) + $action — form action URL + $method — PUT for edit, omit for create (POST) +--}} +
+ @csrf + @isset($method) @method($method) @endisset + +
+ + {{-- ── Maklumat Asas ── --}} +
+
+
+ Maklumat Asas +
+
+
+
+ + + @error('title')
{{ $message }}
@enderror +
+ +
+ + + @error('organizer')
{{ $message }}
@enderror +
+ +
+ + + @error('location')
{{ $message }}
@enderror +
+ +
+ + + @error('description')
{{ $message }}
@enderror +
+
+
+
+
+ + {{-- ── Tarikh & Masa ── --}} +
+
+
+ Tarikh & Masa +
+
+
+
+ + + @error('start_date')
{{ $message }}
@enderror +
+
+ + + @error('end_date')
{{ $message }}
@enderror +
+ +

Tempoh Check-In (kosongkan jika tidak ditetapkan)

+ +
+ + + @error('checkin_start_at')
{{ $message }}
@enderror +
+
+ + + @error('checkin_end_at')
{{ $message }}
@enderror +
+ +

Tempoh Download eCert (kosongkan jika tidak ditetapkan)

+ +
+ + + @error('ecert_download_start_at')
{{ $message }}
@enderror +
+
+ + + @error('ecert_download_end_at')
{{ $message }}
@enderror +
+
+
+
+
+ + {{-- ── Tetapan Kehadiran ── --}} +
+
+
+ Tetapan Kehadiran +
+
+
+
+
+ + allow_walk_in ?? true) ? 'checked' : '' }}> + +
+
Orang luar boleh daftar sendiri semasa program.
+
+ +
+ + + @error('default_staff_session')
{{ $message }}
@enderror +
+ +
+ + + @error('default_external_session')
{{ $message }}
@enderror +
+
+
+
+
+ + {{-- ── Butang Submit ── --}} +
+ + Batal + + +
+
+
diff --git a/src/resources/views/auth/forgot-password.blade.php b/src/resources/views/auth/forgot-password.blade.php index e6d9898..b1c84c3 100644 --- a/src/resources/views/auth/forgot-password.blade.php +++ b/src/resources/views/auth/forgot-password.blade.php @@ -3,7 +3,7 @@ - Terlupa Kata Laluan — eCert MBIP + Terlupa Kata Laluan — mySijil@MBIP @vite(['resources/css/app.css', 'resources/js/app.js'])