
    *Di*                     8    d Z ddlZddlZddlmZ  G d d      Zy)u   
Checkpoint Manager Module
إدارة نقاط الحفظ (Checkpoints) لكل سكريبت
يقرأ من log.csv لمعرفة آخر سجل تم معالجته
    N)datetimec                   R    e Zd ZdZddZd Zd ZddZd Zd Z	d	 Z
d
 ZddZd Zy)CheckpointManageru   
    كلاس لإدارة نقاط الحفظ (Checkpoints)
    يقرأ من log.csv بدلاً من ملفات منفصلة
    c                     |j                         | _        || _        t               | _        d| _        | j                          y)u   
        تهيئة الكلاس

        Args:
            script_name (str): اسم السكريبت (مثل: "SAM", "OFAC", "Exclusions")
            log_file (str): مسار ملف السجلات
        r   N)upperscript_namelog_filesetprocessed_nameslast_processed_count_load_processed_records)selfr   r	   s      0/var/www/zoho/zoho_quality/checkpoint_manager.py__init__zCheckpointManager.__init__   s<     ',,. "u$%! 	$$&    c                 T   t         j                  j                  | j                        sy	 t	        | j                  dd      5 }t        j                  |      }|D ]  }|j                  dd      j                         | j                  k(  s1|j                  dd      }|j                  dd      }|sX|s[| d	| }| j                  j                  |       | xj                  d
z  c_         	 ddd       y# 1 sw Y   yxY w# t        $ r}t        d|        Y d}~yd}~ww xY w)uI   
        قراءة السجلات المعالجة من log.csv
        Nrutf-8encodingWebsite NameDatabase|   [!] Error reading log file: )ospathexistsr	   opencsv
DictReadergetr   r   r   addr   	Exceptionprint)r   freaderrownamedatabasekeyes           r   r   z)CheckpointManager._load_processed_records"   s    ww~~dmm,	6dmmS7; ;q*! 
;Cwwy"-3359I9II"wwvr2#&77:r#:H%)F!H:"6C 0044S9 55:5
;; ; ;  	60455	6sH   D AC:&C:4C:79C:1D :D?D D 	D'D""D'c                 ,    | d| }|| j                   v S )u  
        التحقق من أن السجل تم معالجته مسبقاً

        Args:
            name (str): اسم الشخص
            database (str): اسم قاعدة البيانات

        Returns:
            bool: True إذا تم معالجته مسبقاً
        r   )r   )r   r+   r,   r-   s       r   is_processedzCheckpointManager.is_processed;   s%     az"d****r   Nc                      y)u   
        حفظ نقطة الحفظ (لا يفعل شيء - للتوافق مع الكود القديم)
        البيانات يتم حفظها في log.csv مباشرة
        N )r   indextotal	item_datas       r   save_checkpointz!CheckpointManager.save_checkpointI       
 	r   c                     | j                   S )u   
        الحصول على عدد السجلات المعالجة

        Returns:
            int: عدد السجلات المعالجة
        r   r   s    r   get_processed_countz%CheckpointManager.get_processed_countP   s     (((r   c                      y)uq   
        حذف نقطة الحفظ (لا يفعل شيء - للتوافق مع الكود القديم)
        Nr2   r:   s    r   clear_checkpointz"CheckpointManager.clear_checkpointY   s     	r   c                      | j                   dkD  S )u   
        التحقق من وجود سجلات معالجة مسبقاً

        Returns:
            bool: True إذا كان هناك سجلات معالجة
        r   r9   r:   s    r   has_checkpointz CheckpointManager.has_checkpoint_   s     ((1,,r   c                 |    | j                   dk(  ryd| j                    d| j                   d}|j                         S )u   
        الحصول على معلومات السجلات المعالجة

        Returns:
            str: نص يحتوي على معلومات السجلات المعالجة
        r   z3No previous records found - Starting from beginningz9
Previous Records Found in log.csv:
  Already processed: z records for z6
  Will skip these records and continue with new ones
)r   r   strip)r   infos     r   get_checkpoint_infoz%CheckpointManager.get_checkpoint_infoh   sN     $$)H//0d>N>N=O P
 zz|r   c                      y)u   
        تحديث التقدم (لا يفعل شيء - للتوافق مع الكود القديم)
        البيانات يتم حفظها في log.csv مباشرة
        Nr2   )r   r3   r4   r5   
save_everys        r   update_progressz!CheckpointManager.update_progressy   r7   r   c                    t         j                  j                  | j                        syd}	 t	        | j                  dd      5 }t        j                  |      }|D ]  }|j                  dd      j                         |j                         k(  s5|j                  dd      }|j                  dd      }t        |      D ]<  \  }	}
|
j                  d	      |k(  s|
j                  d
      |k(  s0t        ||	      }   	 ddd       |S # 1 sw Y   |S xY w# t        $ r}t        d|        Y d}~|S d}~ww xY w)uo  
        الحصول على آخر index تم معالجته من log.csv

        Args:
            script_type (str): نوع السكريبت (SAM, OFAC, Exclusions)
            data_list (list): قائمة البيانات الكاملة

        Returns:
            int: آخر index تم معالجته (-1 إذا لم يتم معالجة أي شيء)
        r   r   r   r   r   r   r   r+   r,   Nr   )r   r   r    r	   r!   r"   r#   r$   r   	enumeratemaxr&   r'   )r   script_type	data_list
last_indexr(   r)   r*   r+   r,   iitemr.   s               r   get_last_processed_indexz*CheckpointManager.get_last_processed_index   s.    ww~~dmm,
	6dmmS7; &q*! 
&Cwwy"-3359J9J9LL"wwvr2#&77:r#: (1'; &GAt#xx/47DHHZ<PT\<\-0Q-?
 %&
&&" #&"   	60455	6sI   D ADA	DD2DD DD D 	D=$D88D=)zlog.csv)N)Nr   )__name__
__module____qualname____doc__r   r   r0   r6   r;   r=   r?   rC   rF   rP   r2   r   r   r   r      s9    
' 62+)-""r   r   )rT   r   r"   r   r   r2   r   r   <module>rU      s!    
 
 V Vr   