
' ============================================
' Module Import - دوال الاستيراد
' ============================================

Option Explicit

' تنظيف رمز المنتج بشكل شامل - دالة مساعدة عامة
' رمز الصنف هو المعرف الفريد - يجب تنظيفه بشكل موحد تماماً للمقارنة الصحيحة
Public Function CleanProductCode(code As String) As String
    Dim cleaned As String
    Dim i As Long
    Dim char As String
    
    On Error Resume Next
    
    ' تحويل إلى نص
    cleaned = CStr(code)
    If cleaned = "" Then
        CleanProductCode = ""
        Exit Function
    End If
    
    ' إزالة الأحرف الخاصة غير المرئية (Tabs, Carriage Return, Line Feed)
    cleaned = Replace(cleaned, vbTab, "")
    cleaned = Replace(cleaned, vbCr, "")
    cleaned = Replace(cleaned, vbLf, "")
    cleaned = Replace(cleaned, vbCrLf, "")
    
    ' إزالة جميع المسافات (من البداية والنهاية والوسط) لضمان المقارنة الصحيحة
    ' لأن رمز الصنف هو المعرف الفريد ويجب أن يكون متطابقاً تماماً
    cleaned = Replace(cleaned, " ", "")
    
    ' إزالة المسافات من البداية والنهاية (للأمان)
    cleaned = Trim(cleaned)
    
    ' تحويل إلى حروف كبيرة للمقارنة الموحدة
    cleaned = UCase(cleaned)
    
    CleanProductCode = cleaned
End Function

' التحقق من وجود المنتج في جدول المنتجات - حل جذري باستخدام رمز الصنف كمعرف فريد
Public Function ProductExistsInTable(productCode As String) As Boolean
    Dim tbl As ListObject
    Dim i As Long
    Dim dbCode As String
    Dim searchCode As String
    
    On Error GoTo ErrorHandler
    
    ' تنظيف شامل لرمز المنتج المدخل (كمعرف فريد)
    searchCode = CleanProductCode(productCode)
    If searchCode = "" Then
        ProductExistsInTable = False
        Exit Function
    End If
    
    ' الحصول على جدول المنتجات
    Set tbl = GetTableByName("tlbproduct")
    If tbl Is Nothing Then
        ProductExistsInTable = False
        Exit Function
    End If
    
    ' البحث في جميع الصفوف - رمز الصنف هو المعرف الفريد (العمود 1)
    For i = 1 To tbl.ListRows.count
        On Error Resume Next
        ' قراءة رمز المنتج من العمود 1 (المعرف الفريد)
        dbCode = CleanProductCode(CStr(tbl.ListRows(i).Range(1).Value))
        On Error GoTo ErrorHandler
        
        ' مقارنة مباشرة - رمز الصنف هو المعرف الفريد
        If dbCode = searchCode Then
            ProductExistsInTable = True
            Exit Function
        End If
    Next i
    
    ProductExistsInTable = False
    Exit Function
    
ErrorHandler:
    ProductExistsInTable = False
End Function

' الحصول على فهرس المنتج في جدول المنتجات - حل جذري باستخدام رمز الصنف كمعرف فريد
Public Function GetProductRowIndex(productCode As String) As Long
    Dim tbl As ListObject
    Dim i As Long
    Dim dbCode As String
    Dim searchCode As String
    
    On Error GoTo ErrorHandler
    
    ' تنظيف شامل لرمز المنتج المدخل (كمعرف فريد)
    searchCode = CleanProductCode(productCode)
    If searchCode = "" Then
        GetProductRowIndex = 0
        Exit Function
    End If
    
    ' الحصول على جدول المنتجات
    Set tbl = GetTableByName("tlbproduct")
    If tbl Is Nothing Then
        GetProductRowIndex = 0
        Exit Function
    End If
    
    ' البحث في جميع الصفوف - رمز الصنف هو المعرف الفريد (العمود 1)
    For i = 1 To tbl.ListRows.count
        On Error Resume Next
        ' قراءة رمز المنتج من العمود 1 (المعرف الفريد)
        dbCode = CleanProductCode(CStr(tbl.ListRows(i).Range(1).Value))
        On Error GoTo ErrorHandler
        
        ' مقارنة مباشرة - رمز الصنف هو المعرف الفريد
        If dbCode = searchCode Then
            GetProductRowIndex = i
            Exit Function
        End If
    Next i
    
    GetProductRowIndex = 0
    Exit Function
    
ErrorHandler:
    GetProductRowIndex = 0
End Function

' التحقق من وجود المنتج في جدول المخزون - إعادة كتابة محسّنة
Public Function ProductExistsInInventory(productCode As String) As Boolean
    Dim tbl As ListObject
    Dim i As Long
    Dim dbCode As String
    Dim searchCode As String
    
    On Error GoTo ErrorHandler
    
    ' تنظيف رمز المنتج المدخل
    searchCode = UCase(Trim(CStr(productCode)))
    If searchCode = "" Then
        ProductExistsInInventory = False
        Exit Function
    End If
    
    ' الحصول على جدول المخزون
    Set tbl = GetTableByName("tlbInventory")
    If tbl Is Nothing Then
        ProductExistsInInventory = False
        Exit Function
    End If
    
    ' البحث في جميع الصفوف
    For i = 1 To tbl.ListRows.count
        On Error Resume Next
        dbCode = UCase(Trim(CStr(tbl.ListRows(i).Range(1).Value)))
        On Error GoTo ErrorHandler
        
        If dbCode = searchCode Then
            ProductExistsInInventory = True
            Exit Function
        End If
    Next i
    
    ProductExistsInInventory = False
    Exit Function
    
ErrorHandler:
    ProductExistsInInventory = False
End Function

' الحصول على فهرس المنتج في جدول المخزون - إعادة كتابة محسّنة
Public Function GetInventoryRowIndex(productCode As String) As Long
    Dim tbl As ListObject
    Dim i As Long
    Dim dbCode As String
    Dim searchCode As String
    
    On Error GoTo ErrorHandler
    
    ' تنظيف رمز المنتج المدخل
    searchCode = UCase(Trim(CStr(productCode)))
    If searchCode = "" Then
        GetInventoryRowIndex = 0
        Exit Function
    End If
    
    ' الحصول على جدول المخزون
    Set tbl = GetTableByName("tlbInventory")
    If tbl Is Nothing Then
        GetInventoryRowIndex = 0
        Exit Function
    End If
    
    ' البحث في جميع الصفوف
    For i = 1 To tbl.ListRows.count
        On Error Resume Next
        dbCode = UCase(Trim(CStr(tbl.ListRows(i).Range(1).Value)))
        On Error GoTo ErrorHandler
        
        If dbCode = searchCode Then
            GetInventoryRowIndex = i
            Exit Function
        End If
    Next i
    
    GetInventoryRowIndex = 0
    Exit Function
    
ErrorHandler:
    GetInventoryRowIndex = 0
End Function


