' ============================================
' frmWareed - حركة الوارد
' ============================================

Option Explicit
Private cartItems As Collection
Private currentInvoiceNum As String
Private currentSupplierName As String
Private isEditMode As Boolean
Private editInvoiceNum As String

Private Sub cmdfrmSupplier_Click()
    frmsupplier.Show
End Sub

Private Sub UserForm_Initialize()
    Set cartItems = New Collection
    isEditMode = False
    editInvoiceNum = ""
    txtdateIn.Value = Date
    txtInvoiceNum.Value = GetNewInvoiceInNumber
    currentInvoiceNum = txtInvoiceNum.Value
    ' نوع الخط Arial 14 عريض داخل القوائم
    LsvWard.Font.Name = "Arial"
    LsvWard.Font.Size = 14
    LsvWard.Font.Bold = True
    LsvWard.Width = 600
    LsvCar.Font.Name = "Arial"
    LsvCar.Font.Size = 14
    LsvCar.Font.Bold = True
    LoadProductCodes
    LoadProductNames
    LoadSuppliers
    LoadTransactions
    ClearFields
End Sub

' تحميل رموز المنتجات
Private Sub LoadProductCodes()
    Dim tbl As ListObject
    Dim i As Long
    
    comProductCode.Clear
    Set tbl = GetTableByName("tlbproduct")
    If tbl Is Nothing Then Exit Sub
    
    For i = 1 To tbl.ListRows.count
        If UCase(Trim(tbl.ListRows(i).Range(7).Value)) = "نشط" Then
            comProductCode.AddItem tbl.ListRows(i).Range(1).Value
        End If
    Next i
End Sub

' تحميل أسماء المنتجات
Private Sub LoadProductNames()
    Dim tbl As ListObject
    Dim i As Long
    
    comProductName.Clear
    Set tbl = GetTableByName("tlbproduct")
    If tbl Is Nothing Then Exit Sub
    
    For i = 1 To tbl.ListRows.count
        If UCase(Trim(tbl.ListRows(i).Range(7).Value)) = "نشط" Then
            comProductName.AddItem tbl.ListRows(i).Range(2).Value
        End If
    Next i
End Sub

' تحميل الموردين
Private Sub LoadSuppliers()
    Dim tbl As ListObject
    Dim i As Long
    
    cobSupplierName.Clear
    Set tbl = GetTableByName("tlbsupplier")
    If tbl Is Nothing Then Exit Sub
    
    For i = 1 To tbl.ListRows.count
        cobSupplierName.AddItem tbl.ListRows(i).Range(2).Value
    Next i
End Sub

' عند اختيار رمز المنتج
Private Sub comProductCode_Change()
    If comProductCode.ListIndex >= 0 Then
        Dim productData As Variant
        productData = GetProductByCode(comProductCode.Value)
        If Not IsEmpty(productData) Then
            comProductName.Value = productData(2)
            comUnit.Value = productData(3)
            txtPurchasePrice.Value = productData(4)
            txtSalePrice.Value = productData(5)
            lbQtyNow.Caption = Format(GetCurrentStock(comProductCode.Value), "#,##0.00")
            CalculateTotalPrice
        End If
    End If
End Sub

' عند اختيار اسم المنتج
Private Sub comProductName_Change()
    If comProductName.ListIndex >= 0 Then
        Dim productData As Variant
        productData = GetProductByName(comProductName.Value)
        If Not IsEmpty(productData) Then
            comProductCode.Value = productData(1)
            comUnit.Value = productData(3)
            txtPurchasePrice.Value = productData(4)
            txtSalePrice.Value = productData(5)
            lbQtyNow.Caption = Format(GetCurrentStock(CStr(productData(1))), "#,##0.00")
            CalculateTotalPrice
        End If
    End If
End Sub

' حساب إجمالي السعر
Private Sub CalculateTotalPrice()
    Dim q As String, p As String
    q = Trim(txtqtyIN.Value & "")
    p = Trim(txtPurchasePrice.Value & "")
    If q = "" Or p = "" Then
        lblTotalPriceStock.Caption = "0.00"
        Exit Sub
    End If
    q = Replace(q, ",", ".")
    p = Replace(p, ",", ".")
    If IsNumeric(q) And IsNumeric(p) Then
        lblTotalPriceStock.Caption = Format(CDbl(q) * CDbl(p), "#,##0.00")
    Else
        lblTotalPriceStock.Caption = "0.00"
    End If
End Sub

Private Sub txtqtyIN_Change()
    CalculateTotalPrice
End Sub

Private Sub txtPurchasePrice_Change()
    CalculateTotalPrice
End Sub

' إضافة مورد جديد
Private Sub btnfrmsupplier_Click()
    frmsupplier.Show
    LoadSuppliers
End Sub

' إضافة صنف لعربة التسوق
Private Sub cmdAddtoCar_Click()
    Dim qtyVal As Double, priceVal As Double, saleVal As Double
    Dim qStr As String, pStr As String, sStr As String
    
    ' التحقق من العناصر الفارغة ورسالة واحدة بالبيانات المطلوبة
    If Trim(comProductCode.Value & "") = "" Or Trim(comProductName.Value & "") = "" Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• اختيار المنتج (رمز المنتج واسم المنتج)", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    qStr = Trim(txtqtyIN.Value & "")
    pStr = Trim(txtPurchasePrice.Value & "")
    sStr = Trim(txtSalePrice.Value & "")
    
    If qStr = "" Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• إدخال الكمية (رقم أكبر من صفر)", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    qStr = Replace(qStr, ",", ".")
    If Not IsNumeric(qStr) Or CDbl(qStr) <= 0 Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• إدخال كمية صحيحة (رقم أكبر من صفر)", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    If pStr = "" Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• إدخال سعر الشراء (رقم أكبر من صفر)", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    pStr = Replace(pStr, ",", ".")
    If Not IsNumeric(pStr) Or CDbl(pStr) <= 0 Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• إدخال سعر شراء صحيح (رقم أكبر من صفر)", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    qtyVal = CDbl(qStr)
    priceVal = CDbl(pStr)
    If sStr = "" Or Not IsNumeric(Replace(sStr, ",", ".")) Then
        saleVal = 0
    Else
        saleVal = CDbl(Replace(sStr, ",", "."))
    End If
    
    ' إضافة للعربة - قراءة البيانات مباشرة من الجدول
    Dim productData As Variant
    productData = GetProductByCode(comProductCode.Value)
    
    If IsEmpty(productData) Then
        MsgBox "خطأ في قراءة بيانات المنتج. تأكد من اختيار منتج صحيح.", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    Dim itemData(1 To 6) As Variant
    itemData(1) = productData(1)
    itemData(2) = productData(2)
    itemData(3) = qtyVal
    itemData(4) = priceVal
    itemData(5) = saleVal
    itemData(6) = qtyVal * priceVal
    
    cartItems.Add itemData
    
    ' تحديث ListBox2 (عربة التسوق)
    UpdateCartListView
    
    ' الاحتفاظ برقم الفاتورة والمورد
    currentInvoiceNum = txtInvoiceNum.Value
    currentSupplierName = cobSupplierName.Value
    
    ' مسح الحقول
    comProductCode.Value = ""
    comProductName.Value = ""
    comUnit.Value = ""
    txtqtyIN.Value = ""
    txtPurchasePrice.Value = ""
    txtSalePrice.Value = ""
    lbQtyNow.Caption = "0.00"
    lblTotalPriceStock.Caption = "0.00"
End Sub

' تحديث عربة التسوق (ListBox2)
Private Sub UpdateCartListView()
    Dim i As Long
    Dim total As Double
    Dim r As Long
    Dim logFile As Integer
    Dim logPath As String
    
    ' #region agent log
    logPath = ThisWorkbook.Path & "\.cursor\debug.log"
    On Error Resume Next
    logFile = FreeFile
    Open logPath For Append As #logFile
    Print #logFile, "{""sessionId"":""debug-session"",""runId"":""run1"",""hypothesisId"":""F"",""location"":""frmWareed.frm:UpdateCartListView"",""message"":""Function entry"",""data"":{""cartItemsCount"":" & cartItems.count & "},""timestamp"":" & CLng((Now - DateSerial(1970, 1, 1)) * 86400) & "}"
    Close #logFile
    On Error GoTo 0
    ' #endregion
    
    LsvCar.Clear
    LsvCar.ColumnCount = 5
    LsvCar.ColumnWidths = "70;120;50;70;70"
    
    ' صف العناوين
    LsvCar.AddItem "رمز الصنف"
    r = LsvCar.ListCount - 1
    LsvCar.List(r, 1) = "اسم الصنف"
    LsvCar.List(r, 2) = "الكمية"
    LsvCar.List(r, 3) = "السعر"
    LsvCar.List(r, 4) = "الإجمالي"
    
    total = 0
    For i = 1 To cartItems.count
        Dim itemData As Variant
        itemData = cartItems(i)
        
        LsvCar.AddItem itemData(1)
        r = LsvCar.ListCount - 1
        LsvCar.List(r, 1) = itemData(2)
        LsvCar.List(r, 2) = Format(itemData(3), "#,##0.00")
        LsvCar.List(r, 3) = Format(itemData(4), "#,##0.00")
        LsvCar.List(r, 4) = Format(itemData(6), "#,##0.00")
        
        total = total + itemData(6)
    Next i
    
    ' عرض الإجمالي (يمكن إضافة Label للإجمالي)
End Sub

' حفظ الحركة
Private Sub cmdSave_Click()
    If cartItems.count = 0 Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• إضافة أصناف للعربة (زر إضافة للعربة)", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    If Trim(cobSupplierName.Value & "") = "" Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• اختيار المورد", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    If Trim(txtcaerteBy.Value & "") = "" Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• إدخال اسم الموظف (تم بواسطة)", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    Dim transactionNum As String
    Dim i As Long
    Dim tbl As ListObject
    Dim supplierCode As String
    
    ' الحصول على كود المورد
    Dim supplierData As Variant
    Set tbl = GetTableByName("tlbsupplier")
    If Not tbl Is Nothing Then
        For i = 1 To tbl.ListRows.count
            If UCase(Trim(tbl.ListRows(i).Range(2).Value)) = UCase(Trim(cobSupplierName.Value)) Then
                supplierCode = tbl.ListRows(i).Range(1).Value
                Exit For
            End If
        Next i
    End If
    
    If isEditMode Then
        ' حذف الحركات القديمة
        DeleteTransactionsByInvoice (editInvoiceNum)
        transactionNum = GetNewTransactionNumber
    Else
        transactionNum = GetNewTransactionNumber
    End If
    
    ' حفظ كل صنف كحركة منفصلة
    Set tbl = GetTableByName("tlbTransaction")
    If tbl Is Nothing Then Exit Sub
    
    For i = 1 To cartItems.count
        Dim itemData As Variant
        itemData = cartItems(i)
        
        Dim newRow As ListRow
        Set newRow = tbl.ListRows.Add
        newRow.Range(1).Value = transactionNum
        newRow.Range(2).Value = txtdateIn.Value
        newRow.Range(3).Value = "وارد"
        newRow.Range(4).Value = itemData(1)
        newRow.Range(5).Value = itemData(2)
        newRow.Range(6).Value = itemData(3)
        newRow.Range(7).Value = itemData(4)
        newRow.Range(8).Value = itemData(6)
        newRow.Range(9).Value = supplierCode
        newRow.Range(10).Value = cobSupplierName.Value
        newRow.Range(11).Value = txtInvoiceNum.Value
        newRow.Range(12).Value = txtcaerteBy.Value
        newRow.Range(13).Value = txtNotes.Value
        
        ' تحديث المخزون
        UpdateInventory CStr(itemData(1)), CDbl(itemData(3)), 0, CDbl(itemData(4)), CDbl(itemData(5))
    Next i
    
    MsgBox "تم حفظ الحركة بنجاح", vbInformation
    
    ' السؤال عن الطباعة
    Dim response As VbMsgBoxResult
    response = MsgBox("هل تريد طباعة الفاتورة؟", vbYesNo + vbQuestion, "طباعة الفاتورة")
    
    If response = vbYes Then
        GenerateInvoiceIn txtInvoiceNum.Value
    End If
    
    ' إعادة تعيين
    Set cartItems = New Collection
    isEditMode = False
    editInvoiceNum = ""
    txtInvoiceNum.Value = GetNewInvoiceInNumber
    currentInvoiceNum = txtInvoiceNum.Value
    ClearFields
    UpdateCartListView
    LoadTransactions
End Sub

' حذف حركات الفاتورة
Private Sub DeleteTransactionsByInvoice(invoiceNum As String)
    Dim tbl As ListObject
    Dim i As Long
    
    Set tbl = GetTableByName("tlbTransaction")
    If tbl Is Nothing Then Exit Sub
    
    For i = tbl.ListRows.count To 1 Step -1
        If UCase(Trim(CStr(tbl.ListRows(i).Range(11).Value & ""))) = UCase(Trim(invoiceNum)) Then
            ' استرجاع المخزون قبل الحذف
            Dim productCode As String
            Dim qty As Double
            Dim qtyVal As Variant
            productCode = CStr(tbl.ListRows(i).Range(4).Value & "")
            qtyVal = tbl.ListRows(i).Range(6).Value
            If IsNumeric(qtyVal) Then qty = CDbl(Replace(CStr(qtyVal), ",", ".")) Else qty = 0
            UpdateInventory productCode, 0, qty ' استرجاع الكمية
            
            tbl.ListRows(i).Delete
        End If
    Next i
End Sub

' مسح الحقول
Private Sub ClearFields()
    comProductCode.Value = ""
    comProductName.Value = ""
    comUnit.Value = ""
    txtqtyIN.Value = ""
    txtPurchasePrice.Value = ""
    txtSalePrice.Value = ""
    txtcaerteBy.Value = ""
    txtLocationStock.Value = ""
    txtNotes.Value = ""
    lbQtyNow.Caption = "0.00"
    lblTotalPriceStock.Caption = "0.00"
End Sub

' تحميل الحركات
Private Sub LoadTransactions()
    Dim tbl As ListObject
    Dim i As Long
    Dim invoiceNumbers As Object
    Dim invoiceNum As String
    Dim key As Variant
    Dim logFile As Integer
    Dim logPath As String
    
    ' #region agent log
    logPath = ThisWorkbook.Path & "\.cursor\debug.log"
    On Error Resume Next
    logFile = FreeFile
    Open logPath For Append As #logFile
    Print #logFile, "{""sessionId"":""debug-session"",""runId"":""run1"",""hypothesisId"":""A"",""location"":""frmWareed.frm:LoadTransactions"",""message"":""Function entry"",""data"":{""function"":""LoadTransactions""},""timestamp"":" & CLng((Now - DateSerial(1970, 1, 1)) * 86400) & "}"
    Close #logFile
    On Error GoTo 0
    ' #endregion
    
    LsvWard.Clear
    LsvWard.ColumnCount = 6
    LsvWard.ColumnWidths = "100;100;100;100;100;100"
    
    ' #region agent log
    On Error Resume Next
    logFile = FreeFile
    Open logPath For Append As #logFile
    Print #logFile, "{""sessionId"":""debug-session"",""runId"":""run1"",""hypothesisId"":""B"",""location"":""frmWareed.frm:LoadTransactions"",""message"":""Before adding column headers"",""data"":{""listBoxName"":""ListBox1""},""timestamp"":" & CLng((Now - DateSerial(1970, 1, 1)) * 86400) & "}"
    Close #logFile
    On Error GoTo 0
    ' #endregion
    
    ' صف العناوين
    Dim r As Long
    LsvWard.AddItem "رقم الفاتورة"
    r = LsvWard.ListCount - 1
    LsvWard.List(r, 1) = "التاريخ"
    LsvWard.List(r, 2) = "المورد"
    LsvWard.List(r, 3) = "عدد الأصناف"
    LsvWard.List(r, 4) = "الإجمالي"
    LsvWard.List(r, 5) = "تم بواسطة"
    
    Set tbl = GetTableByName("tlbTransaction")
    If tbl Is Nothing Then Exit Sub
    
    Set invoiceNumbers = CreateObject("Scripting.Dictionary")
    
    ' جمع بيانات الفواتير - تخزين الفهرس فقط
    For i = 1 To tbl.ListRows.count
        If UCase(tbl.ListRows(i).Range(3).Value) = "وارد" Then
            invoiceNum = tbl.ListRows(i).Range(11).Value
            If Not invoiceNumbers.exists(invoiceNum) Then
                ' تخزين الفهرس الأول فقط
                invoiceNumbers.Add invoiceNum, i
            End If
        End If
    Next i
    
    ' عرض الفواتير - استخدام نفس منطق frmProduct (قراءة مباشرة من الجدول)
    For Each key In invoiceNumbers.keys
        Dim firstRowIndex As Long
        firstRowIndex = invoiceNumbers(key)
        
        ' حساب عدد الأصناف والإجمالي لهذه الفاتورة
        Dim itemCount As Long
        Dim totalAmount As Double
        itemCount = 0
        totalAmount = 0
        
        For i = 1 To tbl.ListRows.count
            If UCase(tbl.ListRows(i).Range(3).Value) = "وارد" Then
                If UCase(Trim(CStr(tbl.ListRows(i).Range(11).Value & ""))) = UCase(Trim(key)) Then
                    itemCount = itemCount + 1
                    If IsNumeric(tbl.ListRows(i).Range(8).Value) Then totalAmount = totalAmount + CDbl(Replace(CStr(tbl.ListRows(i).Range(8).Value), ",", "."))
                End If
            End If
        Next i
        
        ' قراءة البيانات مباشرة من الجدول - عرض في ListBox1
        LsvWard.AddItem tbl.ListRows(firstRowIndex).Range(11).Value
        r = LsvWard.ListCount - 1
        LsvWard.List(r, 1) = Format(tbl.ListRows(firstRowIndex).Range(2).Value, "yyyy/mm/dd")
        LsvWard.List(r, 2) = tbl.ListRows(firstRowIndex).Range(10).Value
        LsvWard.List(r, 3) = itemCount
        LsvWard.List(r, 4) = Format(totalAmount, "#,##0.00")
        LsvWard.List(r, 5) = tbl.ListRows(firstRowIndex).Range(12).Value
    Next key
    
    ' #region agent log
    On Error Resume Next
    logFile = FreeFile
    Open logPath For Append As #logFile
    Print #logFile, "{""sessionId"":""debug-session"",""runId"":""run1"",""hypothesisId"":""E"",""location"":""frmWareed.frm:LoadTransactions"",""message"":""Function exit"",""data"":{""itemsCount"":" & LsvWard.ListCount & "},""timestamp"":" & CLng((Now - DateSerial(1970, 1, 1)) * 86400) & "}"
    Close #logFile
    On Error GoTo 0
    ' #endregion
End Sub

' البحث عن حركة
Private Sub cmdSearch_Click()
    Dim invoiceNum As String
    invoiceNum = InputBox("أدخل رقم الفاتورة:", "بحث عن حركة وارد")
    
    If invoiceNum = "" Then Exit Sub
    
    LoadTransactionByInvoice invoiceNum
End Sub

' تحميل حركة برقم الفاتورة
Private Sub LoadTransactionByInvoice(invoiceNum As String)
    Dim tbl As ListObject
    Dim i As Long
    Dim firstRow As Boolean
    
    Set tbl = GetTableByName("tlbTransaction")
    If tbl Is Nothing Then Exit Sub
    
    Set cartItems = New Collection
    firstRow = True
    
    For i = 1 To tbl.ListRows.count
        If UCase(Trim(tbl.ListRows(i).Range(11).Value)) = UCase(Trim(invoiceNum)) Then
            If UCase(tbl.ListRows(i).Range(3).Value) = "وارد" Then
                If firstRow Then
                    txtInvoiceNum.Value = invoiceNum
                    txtdateIn.Value = tbl.ListRows(i).Range(2).Value
                    cobSupplierName.Value = tbl.ListRows(i).Range(10).Value
                    txtcaerteBy.Value = tbl.ListRows(i).Range(12).Value
                    txtNotes.Value = tbl.ListRows(i).Range(13).Value
                    firstRow = False
                End If
                
                ' إضافة للعربة (تحويل آمن للأرقام)
                Dim itemData(1 To 6) As Variant
                Dim v6 As Variant, v7 As Variant, v8 As Variant
                itemData(1) = tbl.ListRows(i).Range(4).Value
                itemData(2) = tbl.ListRows(i).Range(5).Value
                v6 = tbl.ListRows(i).Range(6).Value
                v7 = tbl.ListRows(i).Range(7).Value
                v8 = tbl.ListRows(i).Range(8).Value
                itemData(3) = IIf(IsNumeric(v6), CDbl(Replace(CStr(v6), ",", ".")), 0)
                itemData(4) = IIf(IsNumeric(v7), CDbl(Replace(CStr(v7), ",", ".")), 0)
                itemData(5) = 0
                itemData(6) = IIf(IsNumeric(v8), CDbl(Replace(CStr(v8), ",", ".")), 0)
                cartItems.Add itemData
            End If
        End If
    Next i
    
    If cartItems.count > 0 Then
        isEditMode = True
        editInvoiceNum = invoiceNum
        UpdateCartListView
        MsgBox "تم تحميل الحركة", vbInformation
    Else
        MsgBox "لم يتم العثور على الحركة", vbExclamation
    End If
End Sub

' تعديل حركة
Private Sub cmdEdite_Click()
    If Not isEditMode Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• البحث عن حركة (رقم الفاتورة) وتحميلها أولاً ثم التعديل والحفظ", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    ' حفظ كحركة جديدة
    cmdSave_Click
End Sub

' حذف حركة
Private Sub btnDeleteIn_Click()
    If ListBox1.ListIndex < 0 Or ListBox1.ListIndex = 0 Then
        MsgBox "يرجى اختيار حركة للحذف", vbExclamation
        Exit Sub
    End If
    
    Dim response As VbMsgBoxResult
    response = MsgBox("هل أنت متأكد من حذف هذه الحركة؟", vbYesNo + vbQuestion, "تأكيد الحذف")
    
    If response = vbYes Then
        DeleteTransactionsByInvoice ListBox1.List(ListBox1.ListIndex, 0)
        MsgBox "تم حذف الحركة بنجاح", vbInformation
        LoadTransactions
    End If
End Sub

' طباعة فاتورة
Private Sub cmdPrintInvoiceIn_Click()
    If ListBox1.ListCount <= 1 Then
        MsgBox "لا توجد فواتير في القائمة للطباعة.", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    If ListBox1.ListIndex < 0 Or ListBox1.ListIndex = 0 Then
        MsgBox "البيانات المطلوبة:" & vbCrLf & "• اختيار فاتورة من القائمة ثم الضغط على طباعة", vbExclamation, "بيانات ناقصة"
        Exit Sub
    End If
    
    GenerateInvoiceIn ListBox1.List(ListBox1.ListIndex, 0)
End Sub

' إضافة منتج جديد
Private Sub btnaddItimeNew_Click()
    frmItimeData.Show
    LoadProductCodes
    LoadProductNames
End Sub

' تحديث
Private Sub cmdRefresh_Click()
    LoadProductCodes
    LoadProductNames
    LoadSuppliers
    LoadTransactions
End Sub


