from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from pathlib import Path
from datetime import datetime

SRC=Path(r'C:\xampp\htdocs\audit\dokumentasi\Dokumentasi_Sistem_Dashboard_Audit_MAINPP_Lengkap.docx')
OUT=Path(r'C:\xampp\htdocs\audit\dokumentasi\Dokumentasi_Sistem_Dashboard_Audit_MAINPP_25_Halaman_Dengan_Carta_Alir.docx')
FLOW=Path(r'C:\xampp\htdocs\audit\dokumentasi\carta_alir_pengurusan_audit_terperinci.png')
BLUE=RGBColor(15,76,129); GREEN=RGBColor(15,118,110); DARK=RGBColor(15,23,42); MUTED=RGBColor(100,116,139)

def shade_cell(cell, fill):
    tcPr=cell._tc.get_or_add_tcPr(); shd=OxmlElement('w:shd'); shd.set(qn('w:fill'), fill); tcPr.append(shd)
def cell_text(cell,text,bold=False,color=None):
    cell.text=''; p=cell.paragraphs[0]; r=p.add_run(str(text)); r.bold=bold; r.font.name='Arial'; r.font.size=Pt(9.2)
    if color: r.font.color.rgb=color
    cell.vertical_alignment=WD_CELL_VERTICAL_ALIGNMENT.CENTER
def style_table(tbl):
    tbl.alignment=WD_TABLE_ALIGNMENT.LEFT; tbl.style='Table Grid'
    for i,row in enumerate(tbl.rows):
        for cell in row.cells:
            if i==0: shade_cell(cell,'F8FBFF')
            for p in cell.paragraphs:
                for r in p.runs:
                    r.font.name='Arial'; r.font.size=Pt(9.2)
                    if i==0: r.bold=True; r.font.color.rgb=BLUE
def heading(doc,text,level=1):
    p=doc.add_heading(text,level)
    for r in p.runs: r.font.name='Arial'; r.font.color.rgb=BLUE if level<=2 else DARK
    return p
def para(doc,text):
    p=doc.add_paragraph(text); p.paragraph_format.line_spacing=1.08; p.paragraph_format.space_after=Pt(6); return p
def bullet(doc,text):
    p=doc.add_paragraph(style='List Bullet'); p.add_run(text); return p
def num(doc,text):
    p=doc.add_paragraph(style='List Number'); p.add_run(text); return p
def add_table(doc,headers,rows):
    tbl=doc.add_table(rows=1,cols=len(headers))
    for i,h in enumerate(headers): cell_text(tbl.cell(0,i),h,True,BLUE)
    for row in rows:
        cells=tbl.add_row().cells
        for i,v in enumerate(row): cell_text(cells[i],v,bold=(i==0 and len(headers)<=3))
    style_table(tbl); doc.add_paragraph(); return tbl

doc=Document(str(SRC))
# normalize styles
for s in ['Normal','Title','Subtitle','Heading 1','Heading 2','Heading 3']:
    doc.styles[s].font.name='Arial'

# Add detailed flowchart near end as appendix-style but before expanded explanations
doc.add_page_break()
heading(doc,'26. Carta Alir Terperinci Pengurusan Audit',1)
para(doc,'Carta alir ini disediakan dalam bentuk menegak seperti carta proses rasmi. Ia menunjukkan peranan Admin Audit, Bahagian/Unit, Pentadbir Sistem dan Sistem dari mula login sehingga audit selesai. Simbol berlian menunjukkan keputusan sistem seperti semakan tarikh mula, tarikh akhir dan status maklum balas.')
doc.add_picture(str(FLOW), height=Inches(7.45))
doc.paragraphs[-1].alignment=WD_ALIGN_PARAGRAPH.CENTER

# Add long explanations as continuous documentation. The goal is 25+ useful pages
# without forcing every short section onto a fresh page.
sections=[
('27. Penerangan Terperinci Aliran Login dan Kawalan Sesi', [
'Semasa pengguna membuka sistem, proses login menjadi pintu kawalan pertama sebelum sebarang modul boleh dicapai. Sistem menerima emel dan kata laluan, kemudian membuat semakan ke atas jadual users. Semakan bukan hanya tertumpu kepada padanan kata laluan, tetapi turut mengambil kira status kelulusan dan status akaun. Ini penting kerana pengguna yang masih pending, ditolak atau dinyahaktifkan tidak sepatutnya boleh masuk ke dashboard walaupun emel dan kata laluan adalah betul.',
'Selepas login berjaya, sistem menyimpan maklumat penting di dalam session seperti user_id, nama, emel, role dan jabatan. Maklumat session ini digunakan oleh hampir semua modul untuk menentukan paparan, filter data, capaian modul dan log transaksi. Session juga mempunyai mekanisme amaran tamat sesi supaya akaun tidak dibiarkan aktif terlalu lama tanpa kawalan.',
'Kawalan sesi turut disambung dengan fungsi keepalive. Apabila amaran sesi tamat dipaparkan, pengguna boleh memilih untuk meneruskan sesi atau log keluar. Jika sesi diteruskan, sistem mengemaskini masa aktiviti terakhir dan memuat semula halaman. Ini membantu mengurangkan risiko pengguna kehilangan kerja kerana sesi tamat secara mengejut.'
]),
('28. Penerangan Terperinci Dashboard Mengikut Role', [
'Dashboard bukan sekadar halaman utama, tetapi menjadi pusat pemantauan status audit. Untuk Pentadbir Sistem dan Admin Audit, dashboard memaparkan statistik keseluruhan seperti jumlah audit, bilangan isu belum selesai, bilangan isu selesai dan tugasan semasa. Carta palang memaparkan perbandingan isu selesai dan belum selesai mengikut bahagian/unit.',
'Untuk Pengguna Biasa, dashboard difokuskan kepada bahagian pengguna tersebut sahaja. Kad jumlah audit memaparkan audit yang ditugaskan kepada bahagian pengguna, manakala kad isu belum selesai dan isu selesai hanya mengambil kira status audit_assignment bahagian tersebut. Pendekatan ini menjadikan dashboard lebih relevan dan mengelakkan pengguna biasa melihat statistik yang tidak berkaitan dengan tanggungjawab bahagian mereka.',
'Carta pai digunakan untuk memberi gambaran ringkas nisbah isu selesai dan belum selesai. Carta bar pula membantu pentadbir mengenal pasti bahagian yang mempunyai isu belum selesai paling banyak. Gabungan kad statistik dan carta menjadikan dashboard sesuai untuk pemantauan harian serta mesyuarat ringkas status audit.'
]),
('29. Penerangan Terperinci Daftar Maklumat Audit', [
'Modul daftar maklumat audit digunakan untuk mencipta rekod audit baharu. Admin Audit atau pengguna yang mempunyai capaian create akan memasukkan perkara audit, tarikh mula, tarikh akhir, ringkasan perkara audit, lampiran dan tindakan bahagian. Bahagian yang dipilih akan direkodkan dalam jadual audit_form_assignments.',
'Tarikh mula dan tarikh akhir memainkan peranan penting kerana ia mengawal bila bahagian boleh menghantar maklum balas. Jika tarikh mula belum tiba, sistem menghalang maklum balas daripada dihantar. Jika tarikh akhir telah tamat, sistem juga menghalang kemaskini maklum balas. Ini memastikan semua tindakan mematuhi tempoh audit yang ditetapkan.',
'Selepas audit didaftarkan, sistem menghantar notifikasi kepada pengguna dalam bahagian yang ditugaskan. Notifikasi ini membantu memastikan bahagian menyedari terdapat tindakan baharu tanpa perlu menyemak dashboard secara manual setiap masa.'
]),
('30. Penerangan Terperinci Maklum Balas Audit', [
'Maklum balas audit merupakan komponen utama yang menghubungkan bahagian terlibat dengan Admin Audit. Pengguna dalam bahagian yang ditugaskan boleh menghantar ringkasan, maklum balas lengkap dan lampiran sokongan. Rekod ini disimpan dalam jadual audit_feedbacks dan dikaitkan dengan audit_forms melalui audit_form_id.',
'Sistem memastikan hanya bahagian yang terlibat boleh mencipta maklum balas bagi audit tersebut. Jika maklum balas telah wujud, sistem akan mengemaskini rekod sedia ada dan tarikh updated_at akan menjadi tarikh hantar terkini. Ini membolehkan senarai maklum balas audit memaparkan tarikh kemaskini sebenar, bukan hanya tarikh pertama kali diisi.',
'Jika Admin Audit memberi catatan audit, bahagian boleh menggunakan catatan tersebut sebagai panduan untuk membuat pembetulan. Proses ini mewujudkan kitaran komunikasi antara audit dan bahagian sehingga maklum balas diterima sebagai memuaskan.'
]),
('31. Penerangan Terperinci Catatan Audit dan Kelulusan Audit', [
'Catatan audit digunakan oleh Admin Audit untuk memberi komen, arahan pembetulan atau pengesahan terhadap maklum balas bahagian. Catatan ini disimpan bersama maklumat siapa yang memberi catatan dan masa catatan diberikan. Apabila catatan disimpan, sistem menghantar notifikasi kepada pengguna dalam bahagian berkaitan.',
'Kelulusan audit dibuat mengikut bahagian, bukan secara umum sahaja. Ini bermaksud setiap bahagian yang ditugaskan boleh mempunyai status berbeza. Status Perlu Kemaskini menunjukkan isu masih belum selesai, manakala status Selesai Audit menunjukkan bahagian tersebut telah memenuhi keperluan audit.',
'Pengiraan bilangan isu selesai dan belum selesai bergantung kepada status audit_approval_status di audit_form_assignments. Jika semua bahagian untuk sesuatu audit telah selesai, audit tersebut boleh dianggap selesai dari sudut operasi. Jika masih ada sekurang-kurangnya satu bahagian belum selesai, audit tersebut masih dikira mempunyai isu belum selesai.'
]),
('32. Penerangan Terperinci Notifikasi', [
'Notifikasi membantu pengguna mengetahui tindakan yang perlu dibuat tanpa bergantung sepenuhnya kepada semakan manual. Sistem menyimpan notifikasi dalam jadual notifications dengan maklumat user_id, type, title, message, link, status dibaca dan masa dicipta.',
'Notifikasi tugasan audit dihantar apabila audit didaftarkan kepada bahagian tertentu. Notifikasi catatan audit dihantar apabila Admin Audit memberikan catatan kepada maklum balas bahagian. Notifikasi ini dipaparkan pada ikon loceng di header dan juga boleh dilihat dalam halaman Notifikasi.',
'Halaman Notifikasi menyediakan ringkasan jumlah notifikasi, notifikasi belum dibaca dan notifikasi sudah dibaca. Pengguna boleh memilih notifikasi untuk ditandakan sebagai dibaca atau dipadam. Reka bentuk ini membantu pengguna mengurus maklumat tindakan dengan lebih teratur.'
]),
('33. Penerangan Terperinci Capaian Bahagian dan Capaian Pengguna', [
'Capaian bahagian membolehkan Pentadbir Sistem menetapkan permission kepada semua pengguna dalam satu bahagian. Tetapan ini sesuai apabila semua pengguna dalam bahagian mempunyai tugas yang sama. Permission yang disediakan ialah Create, Read, Update, Delete dan Rollback, bergantung kepada modul.',
'Capaian pengguna pula digunakan apabila terdapat pengecualian khas untuk seorang pengguna. Jika rekod capaian pengguna wujud bagi modul dan action tertentu, sistem akan menggunakan tetapan pengguna tersebut dan mengatasi tetapan bahagian. Ini memberi fleksibiliti tanpa perlu mencipta role baharu untuk kes kecil.',
'Rollback disediakan supaya perubahan capaian bahagian boleh dikembalikan kepada snapshot sebelumnya. Ciri ini penting kerana tetapan permission yang salah boleh menyebabkan pengguna tidak dapat mengakses modul penting atau mendapat akses yang terlalu luas.'
]),
('34. Penerangan Terperinci Pengurusan Pengguna', [
'Modul pengurusan pengguna meliputi daftar pengguna, pengurusan pendaftaran, senarai pengguna, kemaskini role dan status akaun. Pengguna baharu yang mendaftar perlu melalui status kelulusan sebelum boleh login. Pentadbir boleh meluluskan atau menolak pendaftaran melalui modul Pengurusan Pendaftaran.',
'Senarai Pengguna memaparkan maklumat seperti nama, IC, emel, role, bahagian, status akaun dan status kelulusan. Admin Audit tidak dibenarkan mengubah role Pentadbir Sistem sebagai perlindungan struktur pentadbiran. Ini memastikan role tertinggi tidak boleh diubah oleh pihak yang tidak sepatutnya.',
'Status akaun active atau inactive digunakan untuk membenarkan atau menyekat login tanpa perlu memadam rekod pengguna. Pendekatan ini lebih baik kerana sejarah transaksi dan rekod berkaitan pengguna masih kekal dalam sistem.'
]),
('35. Penerangan Terperinci Reset Kata Laluan', [
'Fungsi lupa kata laluan bermula dengan pengguna memasukkan emel dan nombor kad pengenalan. Sistem akan menyemak sama ada padanan tersebut wujud dalam jadual users dan akaun berada dalam keadaan aktif. Jika semakan gagal, proses reset tidak diteruskan.',
'Jika semakan berjaya, sistem menjana kod verifikasi dan menyimpan hash kod tersebut dalam jadual password_reset_codes. Kod asal dihantar melalui email SMTP kepada pengguna. Kod mempunyai tempoh sah tertentu supaya tidak boleh digunakan selepas tamat masa.',
'Pengguna perlu memasukkan kod verifikasi yang betul sebelum dibenarkan menetapkan kata laluan baharu. Selepas kata laluan baharu disimpan, kod ditanda sebagai telah digunakan. Ini mengurangkan risiko kod lama digunakan semula oleh pihak lain.'
]),
('36. Penerangan Terperinci Transaksi Log Pengguna', [
'Transaksi log pengguna berfungsi sebagai audit trail kepada aktiviti penting sistem. Setiap aktiviti seperti login, daftar audit, kemaskini audit, simpan maklum balas, perubahan capaian dan tindakan pentadbiran boleh direkodkan bersama nama, jabatan, role dan masa aktiviti.',
'Log ini membantu pentadbir membuat semakan apabila berlaku isu seperti perubahan data yang tidak dijangka, akses tidak sah atau pertikaian berkaitan siapa yang melakukan tindakan tertentu. Walaupun log bukan pengganti kawalan keselamatan, ia adalah lapisan penting untuk pemantauan dan akauntabiliti.',
'Dalam persekitaran production, log perlu disimpan dengan polisi retention yang jelas. Contohnya, log boleh disimpan sekurang-kurangnya satu tahun atau mengikut keperluan organisasi. Jika saiz log meningkat, arkib berkala boleh dibuat tanpa menghapuskan rekod penting.'
]),
('37. Penerangan Terperinci Struktur Fail Sistem', [
'Struktur fail sistem dibina menggunakan PHP biasa dengan fail proses yang berasingan daripada fail paparan. Fail includes/app.php mengandungi sambungan database, bootstrap schema, fungsi semakan role, fungsi notifikasi, fungsi capaian dan fungsi umum lain. Fail includes/layout.php pula mengurus header, sidebar, modal sesi dan skrip layout.',
'Fail seperti dashboard.php, senarai_maklumat_audit.php dan capaian_pengguna.php bertindak sebagai halaman paparan utama. Fail proses seperti proses_daftar_maklumat_audit.php, proses_maklum_balas_audit.php dan proses_capaian_pengguna.php bertanggungjawab memproses data POST dan mengemaskini database.',
'Folder uploads digunakan untuk menyimpan lampiran audit dan maklum balas. Oleh sebab lampiran disimpan sebagai fail, backup sistem mesti merangkumi database dan folder uploads. Jika hanya database dibackup, pautan lampiran akan wujud tetapi fail sebenar mungkin hilang.'
]),
('38. Penerangan Terperinci Database dan Relasi', [
'Database audit_system menggunakan jadual users sebagai pusat identiti pengguna. Jadual audit_forms menyimpan rekod audit, manakala audit_form_assignments menyimpan bahagian yang ditugaskan kepada audit. Struktur ini membolehkan satu audit ditugaskan kepada banyak bahagian.',
'Jadual audit_feedbacks menyimpan maklum balas daripada pengguna atau bahagian yang berkaitan. Jadual audit_form_attachments dan audit_feedback_attachments menyimpan metadata lampiran seperti path dan nama fail. Fail sebenar berada dalam folder uploads.',
'Jadual department_access_permissions dan user_access_permissions membentuk lapisan authorization. Jadual notifications menyimpan notifikasi, password_reset_codes menyimpan kod reset kata laluan, dan user_transaction_logs menyimpan rekod aktiviti sistem.'
]),
('39. Penerangan Terperinci Keselamatan', [
'Keselamatan sistem bermula daripada kawalan login dan password hash. Password tidak disimpan dalam bentuk asal, sebaliknya disimpan sebagai hash. Semakan login dilakukan menggunakan password_verify supaya password asal tidak perlu didedahkan.',
'Kawalan role dan permission memastikan pengguna hanya boleh mencapai fungsi yang dibenarkan. Pentadbir Sistem mempunyai capaian penuh, manakala Admin Audit dan Pengguna Biasa tertakluk kepada capaian modul. Capaian individu boleh digunakan untuk kes pengecualian.',
'Sistem juga perlu dilindungi pada peringkat deployment. Penggunaan HTTPS, password yang kuat, backup berkala, kawalan akses server dan permission folder uploads adalah langkah penting sebelum sistem digunakan secara rasmi.'
]),
('40. Penerangan Terperinci Deployment Production', [
'Sebelum sistem dipindahkan ke production, pentadbir perlu memastikan versi PHP dan MySQL serasi dengan kod sistem. Folder audit perlu diletakkan dalam document root server dan konfigurasi database perlu disemak supaya sambungan berjaya.',
'Fail audit_system.sql boleh digunakan untuk menyediakan database awal. Sistem juga mempunyai bootstrap schema dalam includes/app.php yang membantu mencipta atau mengemaskini jadual. Walau bagaimanapun, untuk production, import SQL yang terkawal lebih disarankan supaya perubahan schema boleh direkodkan.',
'Selepas deployment, pentadbir perlu menukar password lalai admin dan superadmin, menguji SMTP, memastikan folder uploads boleh ditulis, dan menguji fungsi utama seperti login, daftar audit, maklum balas, notifikasi, reset password dan capaian pengguna.'
]),
('41. Penerangan Terperinci UAT', [
'Ujian penerimaan pengguna atau UAT perlu dilakukan sebelum sistem digunakan secara rasmi. UAT bertujuan memastikan fungsi sistem memenuhi keperluan pengguna sebenar dan bukan hanya lulus dari sudut teknikal. Setiap modul utama perlu diuji menggunakan akaun yang berbeza mengikut role.',
'Contoh ujian termasuk login akaun aktif, semakan akaun inactive, daftar audit baharu, isi maklum balas dalam tempoh, cuba isi maklum balas selepas tarikh akhir, beri catatan audit, tukar status Selesai Audit, ubah capaian bahagian dan reset kata laluan.',
'Keputusan UAT perlu direkodkan. Jika terdapat isu, pembetulan perlu dibuat dan ujian diulang. UAT dianggap selesai apabila fungsi kritikal berjalan dengan baik dan pengguna utama bersetuju sistem boleh digunakan.'
]),
('42. Penerangan Terperinci Backup dan Disaster Recovery', [
'Backup sistem perlu merangkumi dua komponen utama iaitu database audit_system dan folder uploads. Database menyimpan rekod audit, pengguna, capaian dan log, manakala folder uploads menyimpan lampiran audit dan maklum balas. Kedua-duanya saling bergantung.',
'Backup boleh dibuat secara harian untuk database dan berkala untuk folder uploads bergantung kepada kadar penggunaan sistem. Salinan backup perlu disimpan di lokasi berasingan daripada server utama supaya masih boleh digunakan jika server mengalami kerosakan.',
'Disaster recovery perlu diuji dengan melakukan proses restore ke persekitaran ujian. Ujian restore memastikan backup bukan sahaja wujud, tetapi benar-benar boleh digunakan untuk mengembalikan sistem kepada keadaan operasi.'
]),
('43. Penerangan Terperinci Penyelenggaraan Berkala', [
'Penyelenggaraan berkala perlu melibatkan semakan akaun pengguna, status akaun, role, permission bahagian dan permission individu. Akaun yang tidak lagi digunakan perlu dinyahaktifkan supaya tidak menjadi risiko keselamatan.',
'Pentadbir juga perlu menyemak transaksi log untuk mengenal pasti aktiviti luar biasa. Jika terdapat aktiviti yang mencurigakan, tindakan seperti menukar password, menyemak permission dan menyemak log server perlu dibuat.',
'Selain itu, folder uploads perlu dipantau supaya saiz storage tidak membesar tanpa kawalan. Jika organisasi mempunyai polisi arkib, lampiran lama boleh dipindahkan ke storan arkib dengan rekod yang jelas.'
]),
('44. Penerangan Terperinci Risiko Operasi', [
'Risiko operasi utama sistem audit termasuk kehilangan data, permission yang salah, penggunaan password lemah, kegagalan SMTP dan folder uploads tidak boleh ditulis. Setiap risiko ini boleh memberi kesan langsung kepada operasi pengguna.',
'Permission yang terlalu luas boleh menyebabkan pengguna mengubah data yang bukan tanggungjawab mereka. Permission yang terlalu ketat pula boleh menyebabkan kerja audit terganggu kerana pengguna tidak boleh membuka modul yang diperlukan. Oleh itu, semakan permission berkala sangat penting.',
'Kegagalan SMTP akan memberi kesan kepada fungsi lupa kata laluan. Jika email tidak dihantar, pengguna tidak dapat reset password sendiri dan pentadbir perlu membantu secara manual. Oleh itu, konfigurasi SMTP perlu diuji selepas sebarang perubahan server.'
]),
('45. Penerangan Terperinci Cadangan Penambahbaikan Masa Hadapan', [
'Antara penambahbaikan yang boleh dipertimbangkan ialah integrasi Single Sign-On atau LDAP supaya pengguna boleh login menggunakan akaun organisasi. Ini mengurangkan keperluan mengurus password berasingan dalam sistem audit.',
'Sistem juga boleh ditambah fungsi laporan PDF atau Excel untuk memudahkan pelaporan kepada pihak pengurusan. Laporan boleh merangkumi bilangan audit mengikut tempoh, status isu mengikut bahagian, tempoh maklum balas dan audit yang lewat tindakan.',
'Penambahbaikan lain termasuk notifikasi email untuk tugasan audit, had saiz lampiran, audit trail lebih terperinci untuk perubahan status, dan dashboard trend bulanan bagi memantau prestasi penyelesaian isu audit.'
]),
('46. Kesimpulan Dokumentasi', [
'Dokumentasi yang lebih terperinci ini menerangkan aspek fungsi, proses, kawalan, database, keselamatan, deployment dan penyelenggaraan Dashboard Audit MAINPP. Ia boleh digunakan sebagai rujukan pembangunan, latihan pengguna, UAT dan penyelenggaraan sistem.',
'Dengan adanya carta alir terperinci, pentadbir dan pengguna boleh memahami proses audit secara visual. Dengan adanya penerangan panjang bagi setiap modul, pasukan teknikal dan pengguna operasi mempunyai rujukan yang lebih jelas untuk mengendalikan sistem dengan konsisten.',
'Dokumen ini juga boleh dikemaskini dari semasa ke semasa apabila terdapat perubahan proses kerja, penambahan modul atau pindaan dasar keselamatan organisasi.'
])]

def add_operational_detail(doc, title):
    para(doc, 'Dari sudut operasi harian, bahagian ini perlu difahami sebagai sebahagian daripada kawalan kerja audit yang berulang. Setiap tindakan yang dibuat oleh pengguna akan memberi kesan kepada paparan dashboard, rekod status, notifikasi dan laporan yang digunakan oleh pentadbir. Oleh itu, pengguna perlu memastikan maklumat yang dimasukkan adalah tepat, ringkas dan boleh disemak semula oleh pihak audit.')
    para(doc, 'Dari sudut kawalan dalaman, proses ini perlu mempunyai sempadan capaian yang jelas. Pengguna hanya patut melihat dan mengemaskini rekod yang berkaitan dengan peranan atau bahagian mereka. Pentadbir pula bertanggungjawab memastikan capaian tidak terlalu longgar, tidak terlalu terhad dan selari dengan keperluan tugas sebenar.')
    para(doc, 'Dari sudut penyelenggaraan sistem, perubahan berkaitan modul ini perlu diuji menggunakan beberapa role berbeza seperti Pentadbir Sistem, Admin Audit dan Pengguna Biasa. Ujian rentas role penting kerana satu perubahan kecil pada paparan atau permission boleh memberi kesan berbeza kepada pengguna yang berlainan.')

for idx, (title, paras) in enumerate(sections):
    if idx > 0:
        doc.add_paragraph()
    heading(doc,title,1)
    for text in paras:
        para(doc,text)
    add_operational_detail(doc, title)
    if 'SOP' in title or 'UAT' in title or 'Backup' in title or 'Penyelenggaraan' in title:
        para(doc,'Perkara penting yang perlu dipastikan:')
        for b in ['Semua tindakan kritikal perlu mempunyai rekod atau bukti yang boleh disemak semula.', 'Pengguna perlu mengikut role dan capaian yang telah ditetapkan.', 'Sebarang isu operasi perlu direkodkan supaya pembetulan boleh dibuat secara sistematik.']:
            bullet(doc,b)

# Add a detailed checklist table near end
doc.add_paragraph()
heading(doc,'47. Checklist Operasi Sistem',1)
add_table(doc,['Kategori','Semakan','Status Cadangan'],[
('Login','Akaun aktif boleh login dan akaun inactive ditolak.','Wajib diuji'),
('Audit','Daftar audit, edit audit dan tugasan bahagian berfungsi.','Wajib diuji'),
('Maklum Balas','Bahagian boleh isi maklum balas dalam tempoh audit.','Wajib diuji'),
('Tarikh','Maklum balas disekat sebelum mula dan selepas tamat.','Wajib diuji'),
('Notifikasi','Notifikasi tugasan dan catatan audit muncul di header.','Wajib diuji'),
('Capaian','Permission bahagian dan pengguna individu berfungsi.','Wajib diuji'),
('Reset Password','Kod verifikasi dihantar dan password baru boleh disimpan.','Wajib diuji'),
('Backup','Database dan uploads mempunyai salinan backup.','Wajib disediakan'),
('Keselamatan','Password lalai ditukar dan HTTPS diaktifkan.','Wajib production'),
])

doc.save(OUT)
print(OUT)
