File size: 4,218 Bytes
08b3daf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import re
from typing import Any, Optional

from .text_utils import get_pages_by_type, normalize_text


FORM_TITLE_PATTERNS = [
    r"^ĐƠN\s+(XIN|ĐỀ NGHỊ)",
    r"^PHIẾU\s+",
    r"^BIÊN BẢN\s+",
    r"^BẢNG\s+KẾT QUẢ",
    r"^BẢN\s+CAM KẾT",
    r"^GIẤY\s+XÁC NHẬN",
    r"^CÁC MẪU ĐƠN",
]


def is_new_form_title(line: str) -> bool:
    line = line.strip()
    upper = line.upper()

    if len(upper) > 180:
        return False

    # Tránh bắt nhầm dòng ghi chú có chữ "đơn xin"
    banned_phrases = [
        "SINH VIÊN CÓ ĐƠN XIN",
        "CÓ ĐƠN XIN KHÔNG",
        "ĐƠN XIN KHÔNG ĐÁNH",
    ]

    if any(phrase in upper for phrase in banned_phrases):
        return False

    return any(re.search(pattern, upper) for pattern in FORM_TITLE_PATTERNS)


def extract_form_title(text: str) -> Optional[str]:
    lines = [line.strip() for line in text.splitlines() if line.strip()]

    for line in lines:
        if is_new_form_title(line):
            return line

    return None


def extract_required_fields(text: str) -> list[str]:
    fields = [
        "Họ tên",
        "Họ và tên",
        "MSSV",
        "Mã số sinh viên",
        "Lớp",
        "Lớp SV",
        "Khóa",
        "Khoá",
        "Khoa",
        "Ngành",
        "Ngày sinh",
        "Ngày tháng năm sinh",
        "Số điện thoại",
        "Điện thoại",
        "Email",
        "Địa chỉ email",
        "Lý do",
        "Lí do",
        "Nội dung",
        "Thời gian",
        "Kính gửi",
        "Địa chỉ",
        "Hộ khẩu thường trú",
        "CMND",
        "CCCD",
    ]

    found = []
    lower_text = text.lower()

    for field in fields:
        if field.lower() in lower_text:
            found.append(field)

    # Chuẩn hóa field trùng nghĩa
    normalize_map = {
        "Họ và tên": "Họ tên",
        "Mã số sinh viên": "MSSV",
        "Lớp SV": "Lớp",
        "Khoá": "Khóa",
        "Ngày tháng năm sinh": "Ngày sinh",
        "Điện thoại": "Số điện thoại",
        "Địa chỉ email": "Email",
        "Lí do": "Lý do",
    }

    normalized = []
    for item in found:
        normalized.append(normalize_map.get(item, item))

    return sorted(set(normalized))


def should_skip_form_page(text: str, page_number: int) -> bool:
    """
    Bỏ trang rỗng hoặc trang không có nội dung thật.
    """
    if not text.strip():
        return True

    if len(text.strip()) < 30:
        return True

    return False


def extract_form_templates(pages: list[dict[str, Any]]) -> list[dict[str, Any]]:
    form_pages = get_pages_by_type(pages, "form_template")

    forms = []
    current_form = None

    for page in form_pages:
        page_number = page["page_number"]
        text = normalize_text(page.get("text", ""))

        if should_skip_form_page(text, page_number):
            continue

        title = extract_form_title(text)

        if title:
            if current_form:
                forms.append(current_form)

            current_form = {
                "form_id": f"form_p{page_number}",
                "form_name": title,
                "content_type": "form_template",
                "source_pages": [page_number],
                "raw_text": text,
                "review_status": "auto_grouped",
            }

        else:
            if current_form:
                current_form["source_pages"].append(page_number)
                current_form["raw_text"] += "\n\n" + text
            else:
                current_form = {
                    "form_id": f"form_p{page_number}",
                    "form_name": f"Biểu mẫu trang {page_number}",
                    "content_type": "form_template",
                    "source_pages": [page_number],
                    "raw_text": text,
                    "review_status": "needs_manual_review",
                }

    if current_form:
        forms.append(current_form)

    for form in forms:
        form["raw_text"] = normalize_text(form["raw_text"])
        form["required_fields_detected"] = extract_required_fields(form["raw_text"])

    return forms