File size: 8,630 Bytes
fb20480
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# -*- coding: utf-8 -*-
"""

خدمة تحليل المستندات



هذا الملف يحتوي على الفئة المسؤولة عن تحليل المستندات واستخراج المعلومات الهيكلية منها.

"""

import os
import logging
import datetime

class DocumentParser:
    """فئة تحليل المستندات واستخراج المعلومات منها"""
    
    def __init__(self, config=None):
        """

        تهيئة محلل المستندات

        

        المعلمات:

            config (dict): إعدادات محلل المستندات

        """
        self.config = config or {}
        self.logger = logging.getLogger(__name__)
    
    def parse(self, file_path):
        """

        تحليل المستند واستخراج المعلومات منه

        

        المعلمات:

            file_path (str): مسار الملف

            

        العوائد:

            dict: معلومات المستند المستخرجة

        """
        self.logger.info(f"جاري تحليل المستند: {file_path}")
        
        try:
            # في البيئة الحقيقية، استخدم تحليل متقدم للمستند
            # محاكاة التحليل للعرض
            file_name = os.path.basename(file_path)
            file_size = os.path.getsize(file_path) if os.path.exists(file_path) else 0
            
            # تحديد نوع الملف
            _, ext = os.path.splitext(file_path)
            ext = ext.lower()
            
            # تحديد نوع المستند
            document_type = self._get_document_type(ext)
            
            # محاكاة معلومات المستند
            current_date = datetime.datetime.now().strftime("%Y-%m-%d")
            
            result = {
                "اسم الملف": file_name,
                "حجم الملف": f"{file_size / 1024:.2f} كيلوبايت",
                "نوع الملف": document_type,
                "تاريخ التحليل": current_date,
                "تقدير عدد الصفحات": self._estimate_pages(file_size),
                "نتائج التحليل": {
                    "نوع المستند": self._classify_document(file_name),
                    "درجة الثقة": "85%",
                    "الأقسام الرئيسية": self._get_main_sections(),
                    "الكلمات الرئيسية": self._get_main_keywords(),
                    "الشروط الهامة": self._get_important_terms()
                }
            }
            
            return result
        except Exception as e:
            self.logger.error(f"خطأ في تحليل المستند: {str(e)}")
            return {"خطأ": f"حدث خطأ أثناء تحليل المستند: {str(e)}"}
    
    def parse_document(self, file_path):
        """

        تحليل المستند واستخراج المعلومات الأساسية منه

        

        المعلمات:

            file_path (str): مسار الملف

            

        العوائد:

            dict: معلومات المستند الأساسية

        """
        self.logger.info(f"جاري تحليل المستند الأساسي: {file_path}")
        
        # في البيئة الحقيقية، استخدم تحليل متقدم للمستند
        # محاكاة التحليل للعرض
        file_name = os.path.basename(file_path)
        
        return {
            "نوع": self._classify_document(file_name),
            "محتوى": "محتوى المستند...",
            "هيكل": {
                "عنوان": "عنوان المستند",
                "أقسام": ["قسم 1", "قسم 2", "قسم 3"]
            }
        }
    
    def _get_document_type(self, ext):
        """

        تحديد نوع المستند من امتداد الملف

        

        المعلمات:

            ext (str): امتداد الملف

            

        العوائد:

            str: نوع المستند

        """
        document_types = {
            '.pdf': 'مستند PDF',
            '.doc': 'مستند Word',
            '.docx': 'مستند Word',
            '.jpg': 'صورة JPEG',
            '.jpeg': 'صورة JPEG',
            '.png': 'صورة PNG',
            '.xlsx': 'جدول Excel',
            '.xls': 'جدول Excel',
            '.txt': 'ملف نصي'
        }
        
        return document_types.get(ext, 'نوع ملف غير معروف')
    
    def _estimate_pages(self, file_size):
        """

        تقدير عدد صفحات المستند بناءً على حجمه

        

        المعلمات:

            file_size (int): حجم الملف بالبايت

            

        العوائد:

            int: تقدير عدد الصفحات

        """
        # تقدير بسيط: كل 50 كيلوبايت تقريباً صفحة واحدة
        # هذا تقدير بسيط جداً ويختلف حسب نوع المستند ومحتواه
        return max(1, int(file_size / (50 * 1024)))
    
    def _classify_document(self, file_name):
        """

        تصنيف نوع المستند بناءً على اسمه

        

        المعلمات:

            file_name (str): اسم الملف

            

        العوائد:

            str: تصنيف المستند

        """
        file_name_lower = file_name.lower()
        
        if 'عقد' in file_name_lower or 'contract' in file_name_lower:
            return "عقد"
        elif 'مناقصة' in file_name_lower or 'tender' in file_name_lower:
            return "مستند مناقصة"
        elif 'تقرير' in file_name_lower or 'report' in file_name_lower:
            return "تقرير"
        elif 'فاتورة' in file_name_lower or 'invoice' in file_name_lower:
            return "فاتورة"
        elif 'عرض' in file_name_lower or 'proposal' in file_name_lower:
            return "عرض سعر"
        elif 'مواصفات' in file_name_lower or 'spec' in file_name_lower:
            return "مواصفات فنية"
        elif 'كراسة' in file_name_lower or 'شروط' in file_name_lower:
            return "كراسة شروط"
        else:
            return "مستند عام"
    
    def _get_main_sections(self):
        """

        الحصول على قائمة الأقسام الرئيسية التقديرية للمستند

        

        العوائد:

            list: قائمة الأقسام الرئيسية

        """
        # محاكاة قائمة الأقسام
        return [
            "مقدمة",
            "نطاق العمل",
            "المواصفات الفنية",
            "جدول الكميات",
            "الشروط والأحكام",
            "الجدول الزمني",
            "المتطلبات الخاصة"
        ]
    
    def _get_main_keywords(self):
        """

        الحصول على قائمة الكلمات الرئيسية التقديرية للمستند

        

        العوائد:

            list: قائمة الكلمات الرئيسية

        """
        # محاكاة قائمة الكلمات الرئيسية
        return [
            "مناقصة",
            "بناء",
            "تشييد",
            "تسليم مفتاح",
            "مواصفات فنية",
            "جدول كميات",
            "ضمان",
            "غرامة تأخير",
            "دفعة مقدمة",
            "محتوى محلي"
        ]
    
    def _get_important_terms(self):
        """

        الحصول على قائمة الشروط الهامة التقديرية للمستند

        

        العوائد:

            list: قائمة الشروط الهامة

        """
        # محاكاة قائمة الشروط الهامة
        return [
            "مدة تنفيذ المشروع: 18 شهر",
            "غرامة التأخير: 0.5% أسبوعياً بحد أقصى 10%",
            "الدفعة المقدمة: 10%",
            "الضمان النهائي: 5% لمدة سنة",
            "شروط الدفع: دفعات شهرية حسب نسبة الإنجاز",
            "المحتوى المحلي: 70% كحد أدنى"
        ]