﻿import docx
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
import os

def set_cell_background(cell, fill_hex):
    tcPr = cell._element.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'), fill_hex)
    tcPr.append(shd)

def set_cell_margins(cell, top=120, bottom=120, left=150, right=150):
    tcPr = cell._element.get_or_add_tcPr()
    tcMar = OxmlElement('w:tcMar')
    for m, val in [('top', top), ('bottom', bottom), ('left', left), ('right', right)]:
        node = OxmlElement(f'w:{m}')
        node.set(qn('w:w'), str(val))
        node.set(qn('w:type'), 'dxa')
        tcMar.append(node)
    tcPr.append(tcMar)

def create_report():
    doc = docx.Document()

    # à¸•à¸±à¹‰à¸‡à¸„à¹ˆà¸²à¸à¸£à¸°à¸”à¸²à¸© A4 à¸¡à¸²à¸•à¸£à¸à¸²à¸™à¸£à¸²à¸¢à¸‡à¸²à¸™à¸§à¸´à¸Šà¸²à¸à¸²à¸£ (à¸‹à¹‰à¸²à¸¢ 1.5 à¸™à¸´à¹‰à¸§, à¸‚à¸§à¸²/à¸šà¸™/à¸¥à¹ˆà¸²à¸‡ 1.0 à¸™à¸´à¹‰à¸§)
    for section in doc.sections:
        section.page_width = Inches(8.27)
        section.page_height = Inches(11.69)
        section.left_margin = Inches(1.5)
        section.right_margin = Inches(1.0)
        section.top_margin = Inches(1.5)
        section.bottom_margin = Inches(1.0)

    # Style à¸¡à¸²à¸•à¸£à¸à¸²à¸™ TH Sarabun PSK / New (à¹€à¸™à¸·à¹‰à¸­à¸«à¸² 16 à¸›à¸à¸•à¸´)
    style = doc.styles['Normal']
    font = style.font
    font.name = 'TH Sarabun PSK'
    font.size = Pt(16)
    font.color.rgb = RGBColor(0, 0, 0)
    style.paragraph_format.line_spacing = 1.15
    style.paragraph_format.space_after = Pt(4)

    # Helper: à¸«à¸±à¸§à¸‚à¹‰à¸­à¹ƒà¸«à¸à¹ˆ 18 à¸•à¸±à¸§à¸«à¸™à¸²
    def add_main_header(text, center=False):
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER if center else WD_ALIGN_PARAGRAPH.LEFT
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(18)
        run.font.bold = True
        p.paragraph_format.space_before = Pt(6)
        p.paragraph_format.space_after = Pt(6)
        return p

    # Helper: à¸«à¸±à¸§à¸‚à¹‰à¸­à¸¢à¹ˆà¸­à¸¢ 16 à¸•à¸±à¸§à¸«à¸™à¸²
    def add_sub_header(text):
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(16)
        run.font.bold = True
        p.paragraph_format.space_before = Pt(4)
        p.paragraph_format.space_after = Pt(4)
        return p

    # Helper: à¸‚à¹‰à¸­à¸„à¸§à¸²à¸¡à¹€à¸™à¸·à¹‰à¸­à¸«à¸² 16 à¸•à¸±à¸§à¸›à¸à¸•à¸´
    def add_body(text, indent=True):
        p = doc.add_paragraph()
        if indent:
            p.paragraph_format.first_line_indent = Inches(0.5)
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(16)
        run.font.bold = False
        p.paragraph_format.space_after = Pt(4)
        return p

    # ================= PAGE 1: à¸«à¸™à¹‰à¸²à¸›à¸à¸™à¸­à¸ =================
    p_logo = doc.add_paragraph()
    p_logo.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p_logo.paragraph_format.space_before = Pt(30)
    r_logo = p_logo.add_run("[ à¸žà¸·à¹‰à¸™à¸—à¸µà¹ˆà¸ªà¸³à¸«à¸£à¸±à¸šà¸§à¸²à¸‡à¸•à¸£à¸²à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“à¹Œà¸ªà¸–à¸²à¸™à¸¨à¸¶à¸à¸©à¸² ]\n\n")
    r_logo.font.name = 'TH Sarabun PSK'
    r_logo.font.size = Pt(14)
    r_logo.font.italic = True

    p_title = doc.add_paragraph()
    p_title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r1 = p_title.add_run("à¸£à¸²à¸¢à¸‡à¸²à¸™à¹‚à¸„à¸£à¸‡à¸‡à¸²à¸™\n")
    r1.font.name = 'TH Sarabun PSK'
    r1.font.size = Pt(20)
    r1.font.bold = True

    r2 = p_title.add_run("à¸£à¸°à¸šà¸šà¸šà¸£à¸´à¸«à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¹à¸¥à¸°à¸ªà¸±à¹ˆà¸‡à¸­à¸²à¸«à¸²à¸£à¸­à¸­à¸™à¹„à¸¥à¸™à¹Œà¸­à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸°\nSME Restaurant OS (SmartDine Architecture)\n\n\n")
    r2.font.name = 'TH Sarabun PSK'
    r2.font.size = Pt(18)
    r2.font.bold = True

    p_author = doc.add_paragraph()
    p_author.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p_author.paragraph_format.space_before = Pt(50)
    r_a = p_author.add_run("à¸œà¸¹à¹‰à¸ˆà¸±à¸”à¸—à¸³\nà¸™à¸²à¸¢ à¸ªà¸´à¸›à¸›à¸à¸£ à¸§à¸‡à¸„à¹Œà¸žà¸£à¸«à¸¡\nà¸£à¸«à¸±à¸ªà¸™à¸±à¸à¸¨à¸¶à¸à¸©à¸² 020 à¸£à¸°à¸”à¸±à¸šà¸Šà¸±à¹‰à¸™ à¸›à¸§à¸ª.1\n\n\n")
    r_a.font.name = 'TH Sarabun PSK'
    r_a.font.size = Pt(16)
    r_a.font.bold = True

    p_teach = doc.add_paragraph()
    p_teach.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r_t = p_teach.add_run("à¸„à¸£à¸¹à¸—à¸µà¹ˆà¸›à¸£à¸¶à¸à¸©à¸²à¹‚à¸„à¸£à¸‡à¸‡à¸²à¸™\nà¸­à¸²à¸ˆà¸²à¸£à¸¢à¹Œ à¸à¸¤à¸©à¸“à¸° à¸¡à¸µà¸ªà¸¸à¸‚\n\n\n")
    r_t.font.name = 'TH Sarabun PSK'
    r_t.font.size = Pt(16)
    r_t.font.bold = True

    p_foot = doc.add_paragraph()
    p_foot.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r_f = p_foot.add_run("à¸ à¸²à¸„à¹€à¸£à¸µà¸¢à¸™à¸—à¸µà¹ˆ 1 à¸›à¸µà¸à¸²à¸£à¸¨à¸¶à¸à¸©à¸² 2567\nà¸ªà¸³à¸™à¸±à¸à¸‡à¸²à¸™à¸„à¸“à¸°à¸à¸£à¸£à¸¡à¸à¸²à¸£à¸à¸²à¸£à¸­à¸²à¸Šà¸µà¸§à¸¨à¸¶à¸à¸©à¸² (à¸ªà¸­à¸¨.)")
    r_f.font.name = 'TH Sarabun PSK'
    r_f.font.size = Pt(16)
    r_f.font.bold = True

    doc.add_page_break()

    # ================= PAGE 2: à¸„à¸³à¸™à¸³ =================
    add_main_header("à¸„à¸³à¸™à¸³", center=True)
    add_body("à¹‚à¸„à¸£à¸‡à¸‡à¸²à¸™à¸£à¸°à¸šà¸šà¸šà¸£à¸´à¸«à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¹à¸¥à¸°à¸ªà¸±à¹ˆà¸‡à¸­à¸²à¸«à¸²à¸£à¸­à¸­à¸™à¹„à¸¥à¸™à¹Œà¸­à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸°à¸ªà¸³à¸«à¸£à¸±à¸šà¸œà¸¹à¹‰à¸›à¸£à¸°à¸à¸­à¸šà¸à¸²à¸£à¸‚à¸™à¸²à¸”à¸¢à¹ˆà¸­à¸¡ (SME Restaurant OS) à¸ˆà¸±à¸”à¸—à¸³à¸‚à¸¶à¹‰à¸™à¹€à¸žà¸·à¹ˆà¸­à¸žà¸±à¸’à¸™à¸²à¸™à¸§à¸±à¸•à¸à¸£à¸£à¸¡à¸£à¸°à¸šà¸šà¸ªà¸²à¸£à¸ªà¸™à¹€à¸—à¸¨à¹ƒà¸™à¸à¸²à¸£à¸šà¸£à¸´à¸«à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸£à¹‰à¸²à¸™à¸­à¸²à¸«à¸²à¸£à¸¢à¸¸à¸„à¸”à¸´à¸ˆà¸´à¸—à¸±à¸¥ à¹à¸à¹‰à¹„à¸‚à¸›à¸±à¸à¸«à¸²à¸„à¸§à¸²à¸¡à¸¥à¹ˆà¸²à¸Šà¹‰à¸² à¸à¸²à¸£à¸ªà¸¹à¸à¸«à¸²à¸¢à¸‚à¸­à¸‡à¸­à¸­à¹€à¸”à¸­à¸£à¹Œ à¸„à¸§à¸²à¸¡à¸œà¸´à¸”à¸žà¸¥à¸²à¸”à¹ƒà¸™à¸à¸²à¸£à¸£à¸±à¸šà¸£à¸²à¸¢à¸à¸²à¸£à¸­à¸²à¸«à¸²à¸£ à¹à¸¥à¸°à¸à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸„à¸´à¸§à¹ƒà¸™à¸„à¸£à¸±à¸§à¹ƒà¸«à¹‰à¹€à¸à¸´à¸”à¸›à¸£à¸°à¸ªà¸´à¸—à¸˜à¸´à¸ à¸²à¸žà¸ªà¸¹à¸‡à¸ªà¸¸à¸”")
    add_body("à¸£à¸²à¸¢à¸‡à¸²à¸™à¸‰à¸šà¸±à¸šà¸™à¸µà¹‰à¹„à¸”à¹‰à¸£à¸§à¸šà¸£à¸§à¸¡à¸£à¸²à¸¢à¸¥à¸°à¹€à¸­à¸µà¸¢à¸”à¸à¸²à¸£à¸§à¸´à¹€à¸„à¸£à¸²à¸°à¸«à¹Œà¹à¸¥à¸°à¸­à¸­à¸à¹à¸šà¸šà¸£à¸°à¸šà¸šà¸•à¸²à¸¡à¸¡à¸²à¸•à¸£à¸à¸²à¸™à¸ªà¸²à¸à¸¥ Gane & Sarson à¸›à¸£à¸°à¸à¸­à¸šà¸”à¹‰à¸§à¸¢ à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 0 (DFD Level 0 / Context Diagram), à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 1 (DFD Level 1) à¹à¸ªà¸”à¸‡ 7 à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸«à¸¥à¸±à¸ à¹à¸¥à¸°à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2) à¸—à¸µà¹ˆà¹à¸•à¸à¸¢à¹ˆà¸­à¸¢à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¹€à¸›à¹‡à¸™à¸‚à¸±à¹‰à¸™à¸•à¸­à¸™à¸à¸²à¸£à¸—à¸³à¸‡à¸²à¸™à¸£à¸°à¸”à¸±à¸šà¹‚à¸›à¸£à¹à¸à¸£à¸¡à¸­à¸¢à¹ˆà¸²à¸‡à¸ªà¸¡à¸šà¸¹à¸£à¸“à¹Œ à¸žà¸£à¹‰à¸­à¸¡à¸—à¸±à¹‰à¸‡à¸žà¸ˆà¸™à¸²à¸™à¸¸à¸à¸£à¸¡à¸‚à¹‰à¸­à¸¡à¸¹à¸¥ (Data Dictionary)")

    p_sign = doc.add_paragraph()
    p_sign.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    p_sign.paragraph_format.space_before = Pt(50)
    r_s = p_sign.add_run("à¸ªà¸´à¸›à¸›à¸à¸£ à¸§à¸‡à¸„à¹Œà¸žà¸£à¸«à¸¡\nà¸œà¸¹à¹‰à¸ˆà¸±à¸”à¸—à¸³")
    r_s.font.name = 'TH Sarabun PSK'
    r_s.font.size = Pt(16)
    r_s.font.bold = True

    doc.add_page_break()

    # ================= PAGE 3: à¸ªà¸²à¸£à¸šà¸±à¸ =================
    add_main_header("à¸ªà¸²à¸£à¸šà¸±à¸", center=True)
    toc_table = doc.add_table(rows=1, cols=2)
    toc_table.alignment = WD_TABLE_ALIGNMENT.CENTER
    toc_table.autofit = False
    toc_table.columns[0].width = Inches(5.0)
    toc_table.columns[1].width = Inches(0.77)

    hdr = toc_table.rows[0].cells
    r_th1 = hdr[0].paragraphs[0].add_run("à¹€à¸£à¸·à¹ˆà¸­à¸‡")
    r_th1.font.name = 'TH Sarabun PSK'
    r_th1.font.size = Pt(16)
    r_th1.font.bold = True

    r_th2 = hdr[1].paragraphs[0].add_run("à¸«à¸™à¹‰à¸²")
    r_th2.font.name = 'TH Sarabun PSK'
    r_th2.font.size = Pt(16)
    r_th2.font.bold = True
    hdr[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT

    toc_items = [
        ("à¸„à¸³à¸™à¸³", "à¸"),
        ("à¸ªà¸²à¸£à¸šà¸±à¸", "à¸‚"),
        ("à¸šà¸—à¸—à¸µà¹ˆ 1 à¸šà¸—à¸™à¸³à¹à¸¥à¸°à¸ à¸²à¸žà¸£à¸§à¸¡à¸£à¸°à¸šà¸š", "1"),
        ("  1.1 à¸§à¸±à¸•à¸–à¸¸à¸›à¸£à¸°à¸ªà¸‡à¸„à¹Œà¸‚à¸­à¸‡à¹‚à¸„à¸£à¸‡à¸‡à¸²à¸™", "1"),
        ("  1.2 à¸‚à¸­à¸šà¹€à¸‚à¸•à¸£à¸°à¸šà¸šà¹à¸¥à¸°à¸ªà¸–à¸²à¸›à¸±à¸•à¸¢à¸à¸£à¸£à¸¡ (7 à¹‚à¸¡à¸”à¸¹à¸¥à¸«à¸¥à¸±à¸)", "1"),
        ("  1.3 à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“à¹Œà¹à¸¥à¸°à¸¡à¸²à¸•à¸£à¸à¸²à¸™à¸à¸²à¸£à¸­à¸­à¸à¹à¸šà¸š (Gane & Sarson Standard)", "2"),
        ("à¸šà¸—à¸—à¸µà¹ˆ 2 à¸žà¸ˆà¸™à¸²à¸™à¸¸à¸à¸£à¸¡à¸‚à¹‰à¸­à¸¡à¸¹à¸¥ (Data Dictionary D1 - D6)", "3"),
        ("à¸šà¸—à¸—à¸µà¹ˆ 3 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥ (Data Flow Diagrams - DFD)", "4"),
        ("  3.1 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 0 (DFD Level 0 / Context Diagram)", "4"),
        ("  3.2 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 1 (DFD Level 1: Process 1.0 - 7.0)", "5"),
        ("  3.3 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2: à¸£à¸°à¸šà¸šà¸ˆà¸±à¸”à¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”à¸¹à¹à¸¥)", "6"),
        ("  3.4 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2: à¸£à¸°à¸šà¸šà¸¥à¸¹à¸à¸„à¹‰à¸²à¹à¸¥à¸°à¸«à¹‰à¸­à¸‡à¸„à¸£à¸±à¸§)", "7"),
        ("à¸šà¸—à¸—à¸µà¹ˆ 4 à¸ªà¸£à¸¸à¸›à¸œà¸¥à¹à¸¥à¸°à¸à¸²à¸£à¸›à¸£à¸°à¸¢à¸¸à¸à¸•à¹Œà¹ƒà¸Šà¹‰à¸‡à¸²à¸™", "8"),
        ("à¸šà¸£à¸£à¸“à¸²à¸™à¸¸à¸à¸£à¸¡", "9")
    ]

    for title, page in toc_items:
        r_c = toc_table.add_row().cells
        rt = r_c[0].paragraphs[0].add_run(title)
        rt.font.name = 'TH Sarabun PSK'
        rt.font.size = Pt(16)
        
        rp = r_c[1].paragraphs[0].add_run(page)
        rp.font.name = 'TH Sarabun PSK'
        rp.font.size = Pt(16)
        r_c[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT

    doc.add_page_break()

    # ================= PAGE 4: à¸šà¸—à¸—à¸µà¹ˆ 1 à¸šà¸—à¸™à¸³à¹à¸¥à¸°à¸ à¸²à¸žà¸£à¸§à¸¡à¸£à¸°à¸šà¸š =================
    add_main_header("à¸šà¸—à¸—à¸µà¹ˆ 1\nà¸šà¸—à¸™à¸³à¹à¸¥à¸°à¸ à¸²à¸žà¸£à¸§à¸¡à¸£à¸°à¸šà¸š", center=True)

    add_sub_header("1.1 à¸§à¸±à¸•à¸–à¸¸à¸›à¸£à¸°à¸ªà¸‡à¸„à¹Œà¸‚à¸­à¸‡à¹‚à¸„à¸£à¸‡à¸‡à¸²à¸™")
    add_body("1. à¹€à¸žà¸·à¹ˆà¸­à¸­à¸­à¸à¹à¸šà¸šà¹à¸¥à¸°à¸žà¸±à¸’à¸™à¸²à¸£à¸°à¸šà¸šà¸šà¸£à¸´à¸«à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸£à¹‰à¸²à¸™à¸­à¸²à¸«à¸²à¸£à¸­à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸° SME Restaurant OS à¸—à¸µà¹ˆà¸—à¸³à¸‡à¸²à¸™à¸šà¸™à¹€à¸§à¹‡à¸šà¹€à¸šà¸£à¸²à¸§à¹Œà¹€à¸‹à¸­à¸£à¹Œ 100% à¹‚à¸”à¸¢à¹„à¸¡à¹ˆà¸•à¹‰à¸­à¸‡à¸•à¸´à¸”à¸•à¸±à¹‰à¸‡à¹à¸­à¸›à¸žà¸¥à¸´à¹€à¸„à¸Šà¸±à¸™")
    add_body("2. à¹€à¸žà¸·à¹ˆà¸­à¸­à¸­à¸à¹à¸šà¸šà¸­à¸±à¸¥à¸à¸­à¸£à¸´à¸—à¸¶à¸¡à¸„à¸³à¸™à¸§à¸“à¹€à¸§à¸¥à¸²à¸£à¸­à¸„à¸­à¸¢à¸­à¸²à¸«à¸²à¸£à¸ˆà¸£à¸´à¸‡ (Kitchen Lead Time Algorithm) à¹à¸ˆà¹‰à¸‡à¹€à¸•à¸·à¸­à¸™à¸ªà¸–à¸²à¸™à¸°à¹à¸à¹ˆà¸¥à¸¹à¸à¸„à¹‰à¸²à¹à¸šà¸šà¹€à¸£à¸µà¸¢à¸¥à¹„à¸—à¸¡à¹Œ")
    add_body("3. à¹€à¸žà¸·à¹ˆà¸­à¸žà¸±à¸’à¸™à¸²à¸£à¸°à¸šà¸šà¸ˆà¸­à¸£à¸±à¸šà¸­à¸­à¹€à¸”à¸­à¸£à¹Œà¸„à¸£à¸±à¸§ (Kitchen Display System - KDS) à¸Šà¹ˆà¸§à¸¢à¸¥à¸”à¸‚à¹‰à¸­à¸œà¸´à¸”à¸žà¸¥à¸²à¸”à¹ƒà¸™à¸à¸²à¸£à¹€à¸ªà¸´à¸£à¹Œà¸Ÿà¸­à¸²à¸«à¸²à¸£à¹à¸¥à¸°à¹€à¸žà¸´à¹ˆà¸¡à¸£à¸­à¸šà¸«à¸¡à¸¸à¸™à¹€à¸§à¸µà¸¢à¸™à¹‚à¸•à¹Šà¸°à¸­à¸²à¸«à¸²à¸£")

    add_sub_header("1.2 à¸‚à¸­à¸šà¹€à¸‚à¸•à¸à¸²à¸£à¸”à¸³à¹€à¸™à¸´à¸™à¸‡à¸²à¸™ (7 à¹‚à¸¡à¸”à¸¹à¸¥à¸«à¸¥à¸±à¸)")
    modules = [
        "1. à¹‚à¸¡à¸”à¸¹à¸¥à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•à¸±à¸§à¸•à¸™à¹à¸¥à¸°à¸ˆà¸±à¸”à¸à¸²à¸£à¸ªà¸´à¸—à¸˜à¸´à¹Œà¸£à¹‰à¸²à¸™à¸„à¹‰à¸² (Authentication & Super Admin Impersonation)",
        "2. à¹‚à¸¡à¸”à¸¹à¸¥à¸ˆà¸±à¸”à¸à¸²à¸£à¹‚à¸•à¹Šà¸°à¸­à¸²à¸«à¸²à¸£à¹à¸¥à¸°à¸ªà¸£à¹‰à¸²à¸‡ Dynamic QR Code à¸›à¸£à¸°à¸ˆà¸³à¹‚à¸•à¹Šà¸° (Table & Session Token)",
        "3. à¹‚à¸¡à¸”à¸¹à¸¥à¸ˆà¸±à¸”à¸à¸²à¸£à¸«à¸¡à¸§à¸”à¸«à¸¡à¸¹à¹ˆ à¹€à¸¡à¸™à¸¹à¸­à¸²à¸«à¸²à¸£ à¹à¸¥à¸°à¸•à¸±à¸§à¹€à¸¥à¸·à¸­à¸à¸žà¸´à¹€à¸¨à¸© (Menu & Custom Options Management)",
        "4. à¹‚à¸¡à¸”à¸¹à¸¥à¸ªà¸±à¹ˆà¸‡à¸­à¸²à¸«à¸²à¸£à¸­à¸­à¸™à¹„à¸¥à¸™à¹Œà¸œà¹ˆà¸²à¸™ Web Browser à¸ªà¸³à¸«à¸£à¸±à¸šà¸¥à¸¹à¸à¸„à¹‰à¸² (Customer QR Ordering System)",
        "5. à¹‚à¸¡à¸”à¸¹à¸¥à¸ˆà¸­à¸£à¸±à¸šà¸­à¸­à¹€à¸”à¸­à¸£à¹Œà¸«à¹‰à¸­à¸‡à¸„à¸£à¸±à¸§à¹€à¸£à¸µà¸¢à¸¥à¹„à¸—à¸¡à¹Œ (Kitchen Display System - KDS Queue Management)",
        "6. à¹‚à¸¡à¸”à¸¹à¸¥à¸›à¸£à¸°à¹€à¸¡à¸´à¸™à¹€à¸§à¸¥à¸²à¸£à¸­à¸„à¸­à¸¢à¸­à¸²à¸«à¸²à¸£à¹ƒà¸™à¸„à¸£à¸±à¸§à¸­à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸° (Real-time Lead Time Engine)",
        "7. à¹‚à¸¡à¸”à¸¹à¸¥à¸£à¸±à¸šà¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™à¹à¸¥à¸°à¸­à¸­à¸à¹ƒà¸šà¹€à¸ªà¸£à¹‡à¸ˆà¸£à¸±à¸šà¹€à¸‡à¸´à¸™à¸­à¸´à¹€à¸¥à¹‡à¸à¸—à¸£à¸­à¸™à¸´à¸à¸ªà¹Œ (PromptPay QR & Payment Verification)"
    ]
    for mod in modules:
        add_body(mod, indent=False)

    add_sub_header("1.3 à¸¡à¸²à¸•à¸£à¸à¸²à¸™à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“à¹Œ Gane & Sarson à¸—à¸µà¹ˆà¹ƒà¸Šà¹‰à¹ƒà¸™à¹‚à¸„à¸£à¸‡à¸‡à¸²à¸™")
    add_body("à¹ƒà¸™à¸à¸²à¸£à¸§à¸´à¹€à¸„à¸£à¸²à¸°à¸«à¹Œà¹à¸¥à¸°à¸­à¸­à¸à¹à¸šà¸šà¸£à¸°à¸šà¸šà¸‚à¸­à¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸‰à¸šà¸±à¸šà¸™à¸µà¹‰ à¹„à¸”à¹‰à¸¢à¸¶à¸”à¸•à¸²à¸¡à¸¡à¸²à¸•à¸£à¸à¸²à¸™à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“à¹Œ Gane & Sarson (1979) à¸­à¸¢à¹ˆà¸²à¸‡à¹€à¸„à¸£à¹ˆà¸‡à¸„à¸£à¸±à¸” à¸›à¸£à¸°à¸à¸­à¸šà¸”à¹‰à¸§à¸¢ 4 à¸­à¸‡à¸„à¹Œà¸›à¸£à¸°à¸à¸­à¸šà¸«à¸¥à¸±à¸:")

    sym_table = doc.add_table(rows=1, cols=3)
    sym_table.alignment = WD_TABLE_ALIGNMENT.CENTER
    sym_headers = ["à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“à¹Œ (Gane & Sarson)", "à¸Šà¸·à¹ˆà¸­à¸­à¸‡à¸„à¹Œà¸›à¸£à¸°à¸à¸­à¸š", "à¸«à¸™à¹‰à¸²à¸—à¸µà¹ˆà¹à¸¥à¸°à¸„à¸§à¸²à¸¡à¸«à¸¡à¸²à¸¢"]
    for i, h in enumerate(sym_headers):
        cell = sym_table.rows[0].cells[i]
        set_cell_background(cell, "EAEAEA")
        p = cell.paragraphs[0]
        run_h = p.add_run(h)
        run_h.font.name = 'TH Sarabun PSK'
        run_h.font.size = Pt(16)
        run_h.font.bold = True
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER

    sym_data = [
        ("Process\n(à¸ªà¸µà¹ˆà¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¸‚à¸­à¸šà¸¡à¸™ à¸¡à¸µà¸Šà¹ˆà¸­à¸‡ No. à¸”à¹‰à¸²à¸™à¸šà¸™)", "Process\n(à¸‚à¸±à¹‰à¸™à¸•à¸­à¸™à¸à¸²à¸£à¸—à¸³à¸‡à¸²à¸™)", "à¹à¸ªà¸”à¸‡à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™à¸«à¸£à¸·à¸­à¸à¸²à¸£à¸›à¸£à¸°à¸¡à¸§à¸¥à¸œà¸¥à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸ à¸²à¸¢à¹ƒà¸™à¸£à¸°à¸šà¸š"),
        ("Data Store\n(à¸ªà¸µà¹ˆà¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¹€à¸›à¸´à¸”à¸‚à¸§à¸² à¸›à¸´à¸”à¸‹à¹‰à¸²à¸¢à¸Šà¹ˆà¸­à¸‡ ID)", "Data Store\n(à¹à¸«à¸¥à¹ˆà¸‡à¸ˆà¸±à¸”à¹€à¸à¹‡à¸šà¸‚à¹‰à¸­à¸¡à¸¹à¸¥)", "à¹à¸«à¸¥à¹ˆà¸‡à¸šà¸±à¸™à¸—à¸¶à¸à¸‚à¹‰à¸­à¸¡à¸¹à¸¥ Database (MySQL) à¸«à¸£à¸·à¸­à¹„à¸Ÿà¸¥à¹Œà¸‚à¹‰à¸­à¸¡à¸¹à¸¥"),
        ("External Agent\n(à¸ªà¸µà¹ˆà¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¸œà¸·à¸™à¸œà¹‰à¸²à¸‚à¸­à¸šà¸—à¸¶à¸š)", "External Entity\n(à¸›à¸±à¸ˆà¸ˆà¸±à¸¢à¸ à¸²à¸¢à¸™à¸­à¸)", "à¸šà¸¸à¸„à¸„à¸¥à¸«à¸£à¸·à¸­à¸£à¸°à¸šà¸šà¸ à¸²à¸¢à¸™à¸­à¸à¸—à¸µà¹ˆà¸ªà¹ˆà¸‡à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¹€à¸‚à¹‰à¸²à¸«à¸£à¸·à¸­à¸£à¸±à¸šà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸­à¸­à¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸š"),
        ("Data Flow\n(à¹€à¸ªà¹‰à¸™à¸•à¸£à¸‡à¸žà¸£à¹‰à¸­à¸¡à¸«à¸±à¸§à¸¥à¸¹à¸à¸¨à¸£à¸—à¸´à¸¨à¸—à¸²à¸‡)", "Data Flow\n(à¹€à¸ªà¹‰à¸™à¸—à¸²à¸‡à¸à¸²à¸£à¹„à¸«à¸¥à¸‚à¸­à¸‡à¸‚à¹‰à¸­à¸¡à¸¹à¸¥)", "à¹à¸ªà¸”à¸‡à¸—à¸´à¸¨à¸—à¸²à¸‡à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸œà¹ˆà¸²à¸™à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡ Entity, Process à¹à¸¥à¸° Data Store")
    ]
    for row in sym_data:
        r_c = sym_table.add_row().cells
        for i, val in enumerate(row):
            rv = r_c[i].paragraphs[0].add_run(val)
            rv.font.name = 'TH Sarabun PSK'
            rv.font.size = Pt(16)

    doc.add_page_break()

    # ================= PAGE 5: à¸šà¸—à¸—à¸µà¹ˆ 2 à¸žà¸ˆà¸™à¸²à¸™à¸¸à¸à¸£à¸¡à¸‚à¹‰à¸­à¸¡à¸¹à¸¥ (Data Dictionary) =================
    add_main_header("à¸šà¸—à¸—à¸µà¹ˆ 2\nà¸žà¸ˆà¸™à¸²à¸™à¸¸à¸à¸£à¸¡à¸‚à¹‰à¸­à¸¡à¸¹à¸¥ (Data Dictionary)", center=True)
    add_body("à¸•à¸²à¸£à¸²à¸‡à¸à¸³à¸«à¸™à¸”à¹‚à¸„à¸£à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¸à¸²à¸™à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¹à¸¥à¸°à¹à¸«à¸¥à¹ˆà¸‡à¸ˆà¸±à¸”à¹€à¸à¹‡à¸šà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸šà¸š SME Restaurant OS (D1 - D6 à¸•à¸²à¸¡à¸à¸²à¸™à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸ˆà¸£à¸´à¸‡):")

    dd_table = doc.add_table(rows=1, cols=4)
    dd_table.alignment = WD_TABLE_ALIGNMENT.CENTER
    dd_headers = ["à¸£à¸«à¸±à¸ª / à¸•à¸²à¸£à¸²à¸‡", "à¸Ÿà¸´à¸¥à¸”à¹Œà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸«à¸¥à¸±à¸ (Key Fields)", "à¸›à¸£à¸°à¹€à¸ à¸—à¸‚à¹‰à¸­à¸¡à¸¹à¸¥", "à¸„à¸³à¸­à¸˜à¸´à¸šà¸²à¸¢à¸à¸²à¸£à¸ˆà¸±à¸”à¹€à¸à¹‡à¸š"]
    for i, h in enumerate(dd_headers):
        cell = dd_table.rows[0].cells[i]
        set_cell_background(cell, "EAEAEA")
        p = cell.paragraphs[0]
        rh = p.add_run(h)
        rh.font.name = 'TH Sarabun PSK'
        rh.font.size = Pt(16)
        rh.font.bold = True
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER

    dd_data = [
        ("D1: users / tenants", "id, username, password, role, store_name, plan_id, status", "INT, VARCHAR, ENUM", "à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸œà¸¹à¹‰à¸”à¸¹à¹à¸¥à¸£à¸°à¸šà¸š à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¹‰à¸²à¸™à¸„à¹‰à¸²à¸œà¸¹à¹‰à¹€à¸Šà¹ˆà¸²à¸£à¸°à¸šà¸š à¹à¸¥à¸°à¹à¸žà¹‡à¸à¹€à¸à¸ˆ"),
        ("D2: tables_qr", "table_id, store_id, table_number, qr_token, table_status", "INT, VARCHAR, ENUM", "à¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¹‚à¸•à¹Šà¸°à¸­à¸²à¸«à¸²à¸£ à¸£à¸«à¸±à¸ª QR Token à¸›à¸£à¸°à¸ˆà¸³à¹‚à¸•à¹Šà¸° à¹à¸¥à¸°à¸ªà¸–à¸²à¸™à¸°à¹€à¸›à¸´à¸”à¹‚à¸•à¹Šà¸°"),
        ("D3: menus / categories", "menu_id, store_id, name, price, category, is_available, spice_options", "INT, DECIMAL, VARCHAR, TINYINT", "à¸£à¸²à¸¢à¸à¸²à¸£à¸­à¸²à¸«à¸²à¸£ à¸£à¸²à¸„à¸² à¸«à¸¡à¸§à¸”à¸«à¸¡à¸¹à¹ˆ à¹à¸¥à¸°à¸ªà¸–à¸²à¸™à¸°à¸ªà¸•à¹‡à¸­à¸à¸„à¸§à¸²à¸¡à¸žà¸£à¹‰à¸­à¸¡"),
        ("D4: orders / order_items", "order_id, store_id, table_number, status, payment_method, is_paid", "INT, VARCHAR, ENUM, TINYINT", "à¹ƒà¸šà¸ªà¸±à¹ˆà¸‡à¸­à¸²à¸«à¸²à¸£ à¸£à¸²à¸¢à¸à¸²à¸£à¸—à¸µà¹ˆà¸¥à¸¹à¸à¸„à¹‰à¸²à¸ªà¸±à¹ˆà¸‡ à¸ˆà¸³à¸™à¸§à¸™ à¹à¸¥à¸°à¸¢à¸­à¸”à¸£à¸§à¸¡à¹€à¸‡à¸´à¸™"),
        ("D5: kitchen_queues", "queue_id, order_id, menu_id, qty, status, prep_time", "INT, ENUM, TIMESTAMP", "à¸„à¸´à¸§à¸à¸²à¸£à¸›à¸£à¸¸à¸‡à¸­à¸²à¸«à¸²à¸£à¸‚à¸­à¸‡à¸à¹ˆà¸²à¸¢à¸„à¸£à¸±à¸§ à¸ªà¸–à¸²à¸™à¸° à¸£à¸­à¸›à¸£à¸¸à¸‡/à¸à¸³à¸¥à¸±à¸‡à¸—à¸³/à¹€à¸ªà¸£à¹‡à¸ˆ"),
        ("D6: payments", "payment_id, store_id, plan_id, amount, slip_url, status", "INT, DECIMAL, VARCHAR, ENUM", "à¸›à¸£à¸°à¸§à¸±à¸•à¸´à¸à¸²à¸£à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™ à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸šà¸ªà¸¥à¸´à¸›à¹‚à¸­à¸™ à¹à¸¥à¸°à¸ªà¸–à¸²à¸™à¸°à¸­à¸™à¸¸à¸¡à¸±à¸•à¸´")
    ]
    for row in dd_data:
        r_c = dd_table.add_row().cells
        for i, val in enumerate(row):
            rv = r_c[i].paragraphs[0].add_run(val)
            rv.font.name = 'TH Sarabun PSK'
            rv.font.size = Pt(16)

    doc.add_page_break()

    # ================= PAGE 6: à¸šà¸—à¸—à¸µà¹ˆ 3 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥ (Context / Level 0) =================
    add_main_header("à¸šà¸—à¸—à¸µà¹ˆ 3\nà¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥ (Data Flow Diagrams - DFD)", center=True)
    add_sub_header("3.1 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 0 (DFD Level 0 / Context Diagram)")
    add_body("à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 0 (DFD Level 0 à¸«à¸£à¸·à¸­ Context Diagram) à¹à¸ªà¸”à¸‡à¸ à¸²à¸žà¸£à¸§à¸¡à¸£à¸°à¸”à¸±à¸šà¸ªà¸¹à¸‡à¸ªà¸¸à¸”à¸‚à¸­à¸‡à¸£à¸°à¸šà¸š SME Restaurant OS (Process 0) à¸à¸±à¸šà¸à¸¥à¸¸à¹ˆà¸¡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ à¸²à¸¢à¸™à¸­à¸ 4 à¸à¸¥à¸¸à¹ˆà¸¡à¸«à¸¥à¸±à¸ à¹„à¸”à¹‰à¹à¸à¹ˆ à¸¥à¸¹à¸à¸„à¹‰à¸², à¸žà¸™à¸±à¸à¸‡à¸²à¸™à¸„à¸£à¸±à¸§, à¸œà¸¹à¹‰à¸”à¸¹à¹à¸¥à¸£à¹‰à¸²à¸™à¸„à¹‰à¸² à¹à¸¥à¸°à¸œà¸¹à¹‰à¸”à¸¹à¹à¸¥à¸£à¸°à¸šà¸šà¸ªà¹ˆà¸§à¸™à¸à¸¥à¸²à¸‡ à¸•à¸²à¸¡à¸¡à¸²à¸•à¸£à¸à¸²à¸™à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“à¹Œ Gane & Sarson:")

    if os.path.exists("images/dfd_level_0.png"):
        p_img1 = doc.add_paragraph()
        p_img1.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p_img1.add_run().add_picture("images/dfd_level_0.png", width=Inches(5.8))
        p_cap1 = doc.add_paragraph()
        p_cap1.alignment = WD_ALIGN_PARAGRAPH.CENTER
        rcap1 = p_cap1.add_run("à¸£à¸¹à¸›à¸—à¸µà¹ˆ 3.1 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 0 (DFD Level 0 / Context Diagram)")
        rcap1.font.name = 'TH Sarabun PSK'
        rcap1.font.size = Pt(16)
        rcap1.font.bold = True

    doc.add_page_break()

    # ================= PAGE 7: à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 1 (DFD Level 1) =================
    add_sub_header("3.2 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 1 (DFD Level 1: Process 1.0 - 7.0)")
    add_body("à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 1 (DFD Level 1) à¹à¸ªà¸”à¸‡à¸ à¸²à¸žà¸£à¸§à¸¡à¸à¸²à¸£à¸ˆà¸³à¹à¸™à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸—à¸³à¸‡à¸²à¸™à¸«à¸¥à¸±à¸ 7 à¸‚à¸±à¹‰à¸™à¸•à¸­à¸™ (Process 1.0 - 7.0) à¸ªà¸±à¸¡à¸žà¸±à¸™à¸˜à¹Œà¸à¸±à¸šà¹à¸«à¸¥à¹ˆà¸‡à¸ˆà¸±à¸”à¹€à¸à¹‡à¸šà¸‚à¹‰à¸­à¸¡à¸¹à¸¥ D1 - D6 à¸„à¸£à¸­à¸šà¸„à¸¥à¸¸à¸¡à¸à¸²à¸£à¸—à¸³à¸‡à¸²à¸™à¸—à¸±à¹‰à¸‡à¸£à¸°à¸šà¸š:")

    if os.path.exists("images/dfd_level_1_overview.png"):
        p_img2 = doc.add_paragraph()
        p_img2.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p_img2.add_run().add_picture("images/dfd_level_1_overview.png", width=Inches(5.8))
        p_cap2 = doc.add_paragraph()
        p_cap2.alignment = WD_ALIGN_PARAGRAPH.CENTER
        rcap2 = p_cap2.add_run("à¸£à¸¹à¸›à¸—à¸µà¹ˆ 3.2 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 1 (DFD Level 1) à¹à¸ªà¸”à¸‡ 7 à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸«à¸¥à¸±à¸")
        rcap2.font.name = 'TH Sarabun PSK'
        rcap2.font.size = Pt(16)
        rcap2.font.bold = True

    doc.add_page_break()

    # ================= PAGE 8: à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2 - à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”à¸¹à¹à¸¥ 1.0 - 3.0) =================
    add_sub_header("3.3 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2: à¸£à¸°à¸šà¸šà¸ˆà¸±à¸”à¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”à¸¹à¹à¸¥ (Process 1.0, 2.0, 3.0)")
    add_body("à¸à¸²à¸£à¹à¸•à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2 Decomposition) à¸‚à¸­à¸‡à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”à¸¹à¹à¸¥à¸£à¸°à¸šà¸š à¹€à¸žà¸·à¹ˆà¸­à¹à¸ªà¸”à¸‡à¸‚à¸±à¹‰à¸™à¸•à¸­à¸™à¸¢à¹ˆà¸­à¸¢à¹€à¸Šà¸´à¸‡à¸¥à¸¶à¸ à¹„à¸”à¹‰à¹à¸à¹ˆ Process 1.0 (1.1-1.3 à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•à¸±à¸§à¸•à¸™), Process 2.0 (2.1-2.3 à¸ˆà¸±à¸”à¸à¸²à¸£à¹‚à¸•à¹Šà¸°à¸­à¸²à¸«à¸²à¸£à¹à¸¥à¸° QR Token) à¹à¸¥à¸° Process 3.0 (3.1-3.3 à¸ˆà¸±à¸”à¸à¸²à¸£à¸«à¸¡à¸§à¸”à¸«à¸¡à¸¹à¹ˆ à¹€à¸¡à¸™à¸¹ à¹à¸¥à¸°à¸ªà¸•à¹‡à¸­à¸):")

    if os.path.exists("images/dfd_level_2_admin.png"):
        p_img3a = doc.add_paragraph()
        p_img3a.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p_img3a.add_run().add_picture("images/dfd_level_2_admin.png", width=Inches(5.8))
        p_cap3a = doc.add_paragraph()
        p_cap3a.alignment = WD_ALIGN_PARAGRAPH.CENTER
        rcap3a = p_cap3a.add_run("à¸£à¸¹à¸›à¸—à¸µà¹ˆ 3.3 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2: Process 1.0, Process 2.0 à¹à¸¥à¸° Process 3.0)")
        rcap3a.font.name = 'TH Sarabun PSK'
        rcap3a.font.size = Pt(16)
        rcap3a.font.bold = True

    doc.add_page_break()

    # ================= PAGE 9: à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2 - à¸à¸±à¹ˆà¸‡à¸¥à¸¹à¸à¸„à¹‰à¸²à¹à¸¥à¸°à¸„à¸£à¸±à¸§ 4.0 - 7.0) =================
    add_sub_header("3.4 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2: à¸£à¸°à¸šà¸šà¸¥à¸¹à¸à¸„à¹‰à¸²à¹à¸¥à¸°à¸«à¹‰à¸­à¸‡à¸„à¸£à¸±à¸§ (Process 4.0, 5.0, 6.0, 7.0)")
    add_body("à¸à¸²à¸£à¹à¸•à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2 Decomposition) à¸‚à¸­à¸‡à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸¥à¸¹à¸à¸„à¹‰à¸²à¹à¸¥à¸°à¸«à¹‰à¸­à¸‡à¸„à¸£à¸±à¸§ à¸›à¸£à¸°à¸à¸­à¸šà¸”à¹‰à¸§à¸¢ Process 4.0 (4.1-4.3 à¸ªà¸±à¹ˆà¸‡à¸­à¸²à¸«à¸²à¸£), Process 5.0 (5.1-5.3 à¸„à¸´à¸§à¸„à¸£à¸±à¸§ KDS), Process 6.0 (6.1-6.3 à¸„à¸³à¸™à¸§à¸“ Lead Time) à¹à¸¥à¸° Process 7.0 (7.1-7.3 à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™ PromptPay QR):")

    if os.path.exists("images/dfd_level_2_customer.png"):
        p_img3b = doc.add_paragraph()
        p_img3b.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p_img3b.add_run().add_picture("images/dfd_level_2_customer.png", width=Inches(5.8))
        p_cap3b = doc.add_paragraph()
        p_cap3b.alignment = WD_ALIGN_PARAGRAPH.CENTER
        rcap3b = p_cap3b.add_run("à¸£à¸¹à¸›à¸—à¸µà¹ˆ 3.4 à¹à¸œà¸™à¸ à¸²à¸žà¸à¸£à¸°à¹à¸ªà¸‚à¹‰à¸­à¸¡à¸¹à¸¥à¸£à¸°à¸”à¸±à¸šà¸—à¸µà¹ˆ 2 (DFD Level 2: Process 4.0, 5.0, 6.0 à¹à¸¥à¸° 7.0)")
        rcap3b.font.name = 'TH Sarabun PSK'
        rcap3b.font.size = Pt(16)
        rcap3b.font.bold = True

    doc.add_page_break()

    # ================= PAGE 10: à¸šà¸£à¸£à¸“à¸²à¸™à¸¸à¸à¸£à¸¡ =================
    add_main_header("à¸šà¸£à¸£à¸“à¸²à¸™à¸¸à¸à¸£à¸¡", center=True)
    references = [
        "à¸à¸´à¸•à¸•à¸´ à¸ à¸±à¸à¸”à¸µà¸§à¸±à¸’à¸™à¸°à¸à¸¸à¸¥. (2561). à¸à¸²à¸£à¸§à¸´à¹€à¸„à¸£à¸²à¸°à¸«à¹Œà¹à¸¥à¸°à¸­à¸­à¸à¹à¸šà¸šà¸£à¸°à¸šà¸š (System Analysis and Design). à¸à¸£à¸¸à¸‡à¹€à¸—à¸žà¸¯: à¹€à¸„à¸—à¸µà¸žà¸µ à¸žà¸±à¸šà¸¥à¸´à¸Šà¸Šà¸´à¹ˆà¸‡.",
        "à¸˜à¸§à¸±à¸Šà¸Šà¸±à¸¢ à¸‡à¸²à¸¡à¸¨à¸´à¸£à¸´. (2563). à¸à¸²à¸£à¸žà¸±à¸’à¸™à¸²à¸£à¸°à¸šà¸šà¹€à¸§à¹‡à¸šà¹à¸­à¸›à¸žà¸¥à¸´à¹€à¸„à¸Šà¸±à¸™à¸ªà¸³à¸«à¸£à¸±à¸šà¸à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸£à¹‰à¸²à¸™à¸­à¸²à¸«à¸²à¸£à¹à¸šà¸šà¹€à¸£à¸µà¸¢à¸¥à¹„à¸—à¸¡à¹Œ. à¸§à¸²à¸£à¸ªà¸²à¸£à¸§à¸´à¸Šà¸²à¸à¸²à¸£à¸„à¸­à¸¡à¸žà¸´à¸§à¹€à¸•à¸­à¸£à¹Œà¹à¸¥à¸°à¹€à¸—à¸„à¹‚à¸™à¹‚à¸¥à¸¢à¸µ, 12(2), 45-58.",
        "Gane, C., & Sarson, T. (1979). Structured Systems Analysis: Tools and Techniques. Englewood Cliffs, NJ: Prentice-Hall.",
        "à¸ªà¸³à¸™à¸±à¸à¸‡à¸²à¸™à¸„à¸“à¸°à¸à¸£à¸£à¸¡à¸à¸²à¸£à¸à¸²à¸£à¸­à¸²à¸Šà¸µà¸§à¸¨à¸¶à¸à¸©à¸². (2562). à¸£à¸°à¹€à¸šà¸µà¸¢à¸šà¹à¸¥à¸°à¸„à¸¹à¹ˆà¸¡à¸·à¸­à¸à¸²à¸£à¸ˆà¸±à¸”à¸—à¸³à¹‚à¸„à¸£à¸‡à¸‡à¸²à¸™à¸§à¸´à¸Šà¸²à¸Šà¸µà¸ž. à¸à¸£à¸¸à¸‡à¹€à¸—à¸žà¸¯: à¸à¸£à¸°à¸—à¸£à¸§à¸‡à¸¨à¸¶à¸à¸©à¸²à¸˜à¸´à¸à¸²à¸£.",
        "Pressman, R. S. (2014). Software Engineering: A Practitioner's Approach. (8th ed.). New York: McGraw-Hill Education."
    ]
    for ref in references:
        p_ref = doc.add_paragraph()
        p_ref.paragraph_format.left_indent = Inches(0.5)
        p_ref.paragraph_format.first_line_indent = Inches(-0.5)
        p_ref.paragraph_format.space_after = Pt(6)
        rref = p_ref.add_run(ref)
        rref.font.name = 'TH Sarabun PSK'
        rref.font.size = Pt(16)

    # à¸šà¸±à¸™à¸—à¸¶à¸à¹€à¸›à¹‡à¸™à¹„à¸Ÿà¸¥à¹Œà¹€à¸”à¸´à¸¡ SmartDine_OS_Report.docx
    doc.save("SmartDine_OS_Report.docx")
    print("Report saved successfully as SmartDine_OS_Report.docx")

if __name__ == "__main__":
    create_report()

