' ============================================
' frmItemCard - كشف حركة صنف
' ============================================

Option Explicit

Private Sub UserForm_Initialize()
    LoadProductCodes
    ClearForm
End Sub

' تحميل رموز المنتجات
Private Sub LoadProductCodes()
    Dim tbl As ListObject
    Dim i As Long
    
    cmbItem.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
            cmbItem.AddItem tbl.ListRows(i).Range(1).Value
        End If
    Next i
End Sub

' البحث
Private Sub cmdSearch_Click()
    If cmbItem.Value = "" Then
        MsgBox "يرجى اختيار صنف", vbExclamation
        Exit Sub
    End If
    
    Dim productData As Variant
    productData = GetProductByCode(cmbItem.Value)
    If IsEmpty(productData) Then
        MsgBox "لم يتم العثور على الصنف", vbExclamation
        Exit Sub
    End If
    
    lblItemName.Caption = productData(2)
    CalculateItemCard
End Sub

' حساب كارت الصنف
Private Sub CalculateItemCard()
    Dim productCode As String
    Dim fromDate As Date
    Dim toDate As Date
    Dim tbl As ListObject
    Dim i As Long
    Dim openingQty As Double
    Dim inQty As Double
    Dim outQty As Double
    Dim balanceQty As Double
    Dim avgCost As Double
    Dim stockValue As Double
    Dim runningBalance As Double
    
    productCode = cmbItem.Value
    
    ' تحديد التواريخ
    If IsDate(txtFromDate.Value) Then
        fromDate = CDate(txtFromDate.Value)
    Else
        fromDate = DateSerial(1900, 1, 1) ' تاريخ قديم جداً
    End If
    
    If IsDate(txtToDate.Value) Then
        toDate = CDate(txtToDate.Value)
    Else
        toDate = Date ' حتى اليوم
    End If
    
    Set tbl = GetTableByName("tlbTransaction")
    If tbl Is Nothing Then Exit Sub
    
    ' مسح ListboxItemTrans وإعداد 7 أعمدة
    ListboxItemTrans.Clear
    ListboxItemTrans.ColumnCount = 7
    ListboxItemTrans.ColumnWidths = "100;100;100;100;100;100;100"
    
    ' صف العناوين
    ListboxItemTrans.AddItem "التاريخ"
    Dim r As Long
    r = ListboxItemTrans.ListCount - 1
    ListboxItemTrans.List(r, 1) = "رقم المستند"
    ListboxItemTrans.List(r, 2) = "نوع الحركة"
    ListboxItemTrans.List(r, 3) = "وارد"
    ListboxItemTrans.List(r, 4) = "صادر"
    ListboxItemTrans.List(r, 5) = "الرصيد"
    ListboxItemTrans.List(r, 6) = "متوسط التكلفة"
    
    ' حساب رصيد أول المدة (قبل fromDate)
    openingQty = 0
    For i = 1 To tbl.ListRows.count
        If UCase(Trim(tbl.ListRows(i).Range(4).Value)) = UCase(Trim(productCode)) Then
            Dim transDate As Date
            transDate = tbl.ListRows(i).Range(2).Value
            If transDate < fromDate Then
                If UCase(tbl.ListRows(i).Range(3).Value) = "وارد" Then
                    openingQty = openingQty + CDbl(tbl.ListRows(i).Range(6).Value)
                ElseIf UCase(tbl.ListRows(i).Range(3).Value) = "صادر" Then
                    openingQty = openingQty - CDbl(tbl.ListRows(i).Range(6).Value)
                End If
            End If
        End If
    Next i
    
    ' حساب الوارد والصادر داخل الفترة
    inQty = 0
    outQty = 0
    runningBalance = openingQty
    avgCost = GetAverageCost(productCode)
    
    ' ترتيب الحركات حسب التاريخ
    Dim transactions As Collection
    Set transactions = New Collection
    Dim transData As Variant
    
    For i = 1 To tbl.ListRows.count
        If UCase(Trim(tbl.ListRows(i).Range(4).Value)) = UCase(Trim(productCode)) Then
            transDate = tbl.ListRows(i).Range(2).Value
            If transDate >= fromDate And transDate <= toDate Then
                Dim itemData(1 To 6) As Variant
                itemData(1) = transDate
                itemData(2) = tbl.ListRows(i).Range(11).Value ' رقم المستند
                itemData(3) = tbl.ListRows(i).Range(3).Value ' نوع الحركة
                itemData(4) = IIf(UCase(tbl.ListRows(i).Range(3).Value) = "وارد", CDbl(tbl.ListRows(i).Range(6).Value), 0)
                itemData(5) = IIf(UCase(tbl.ListRows(i).Range(3).Value) = "صادر", CDbl(tbl.ListRows(i).Range(6).Value), 0)
                itemData(6) = tbl.ListRows(i).Range(1).Value ' رقم الحركة للترتيب
                transactions.Add itemData
            End If
        End If
    Next i
    
    ' ترتيب الحركات حسب التاريخ (بسيط - يمكن تحسينه)
    Dim sortedTrans As Collection
    Set sortedTrans = New Collection
    Dim j As Long
    Dim k As Long
    Dim inserted As Boolean
    
    For i = 1 To transactions.count
        transData = transactions(i)
        inserted = False
        For j = 1 To sortedTrans.count
            If transData(1) < sortedTrans(j)(1) Then
                sortedTrans.Add transData, , j
                inserted = True
                Exit For
            End If
        Next j
        If Not inserted Then
            sortedTrans.Add transData
        End If
    Next i
    
    ' عرض الحركات في ListboxItemTrans (أعمدة مثل ListView)
    For i = 1 To sortedTrans.count
        transData = sortedTrans(i)
        
        If UCase(transData(3)) = "وارد" Then
            runningBalance = runningBalance + transData(4)
            inQty = inQty + transData(4)
        ElseIf UCase(transData(3)) = "صادر" Then
            runningBalance = runningBalance - transData(5)
            outQty = outQty + transData(5)
        End If
        
        ListboxItemTrans.AddItem Format(transData(1), "yyyy/mm/dd")
        r = ListboxItemTrans.ListCount - 1
        ListboxItemTrans.List(r, 1) = CStr(transData(2))
        ListboxItemTrans.List(r, 2) = CStr(transData(3))
        ListboxItemTrans.List(r, 3) = Format(transData(4), "#,##0.00")
        ListboxItemTrans.List(r, 4) = Format(transData(5), "#,##0.00")
        ListboxItemTrans.List(r, 5) = Format(runningBalance, "#,##0.00")
        ListboxItemTrans.List(r, 6) = Format(avgCost, "#,##0.00")
    Next i
    
    ' حساب الرصيد النهائي
    balanceQty = openingQty + inQty - outQty
    
    ' عرض الملخص
    txtOpeningQty.Value = Format(openingQty, "#,##0.00")
    txtInQty.Value = Format(inQty, "#,##0.00")
    txtOutQty.Value = Format(outQty, "#,##0.00")
    txtBalanceQty.Value = Format(balanceQty, "#,##0.00")
    txtAvgCost.Value = Format(avgCost, "#,##0.00")
    
    ' حساب قيمة المخزون
    stockValue = balanceQty * avgCost
    txtStockValue.Value = Format(stockValue, "#,##0.00")
End Sub

' طباعة
Private Sub cmdPrint_Click()
    If cmbItem.Value = "" Then
        MsgBox "يرجى اختيار صنف أولاً", vbExclamation
        Exit Sub
    End If
    
    GenerateItemCardReport cmbItem.Value, txtFromDate.Value, txtToDate.Value
End Sub

' تصدير
Private Sub cmdExport_Click()
    If cmbItem.Value = "" Then
        MsgBox "يرجى اختيار صنف أولاً", vbExclamation
        Exit Sub
    End If
    
    If ListboxItemTrans.ListCount <= 1 Then
        MsgBox "لا توجد بيانات للتصدير", vbExclamation
        Exit Sub
    End If
    
    ExportItemCardToExcel
End Sub

' تصدير إلى Excel
Private Sub ExportItemCardToExcel()
    Dim xlApp As Object
    Dim xlWB As Object
    Dim xlWS As Object
    Dim i As Long
    Dim filePath As String
    Dim excelWasOpen As Boolean
    Dim workbooksCount As Long
    
    ' التحقق من وجود Excel مفتوح مسبقاً
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    excelWasOpen = Not (xlApp Is Nothing)
    
    If Not excelWasOpen Then
        ' إذا لم يكن Excel مفتوحاً، إنشاء مثيل جديد
        Set xlApp = CreateObject("Excel.Application")
        xlApp.Visible = True
    Else
        ' إذا كان Excel مفتوحاً، حفظ عدد الملفات المفتوحة
        workbooksCount = xlApp.Workbooks.count
    End If
    On Error GoTo 0
    
    If xlApp Is Nothing Then
        MsgBox "لا يمكن فتح Excel", vbExclamation
        Exit Sub
    End If
    
    Set xlWB = xlApp.Workbooks.Add
    Set xlWS = xlWB.Worksheets(1)
    
    ' العنوان
    xlWS.Cells(1, 1).Value = "كشف حركة صنف"
    xlWS.Cells(2, 1).Value = "الصنف: " & cmbItem.Value & " - " & lblItemName.Caption
    
    ' رؤوس الأعمدة (الصف الأول في ListboxItemTrans)
    xlWS.Cells(4, 1).Value = ListboxItemTrans.List(0, 0)
    xlWS.Cells(4, 2).Value = ListboxItemTrans.List(0, 1)
    xlWS.Cells(4, 3).Value = ListboxItemTrans.List(0, 2)
    xlWS.Cells(4, 4).Value = ListboxItemTrans.List(0, 3)
    xlWS.Cells(4, 5).Value = ListboxItemTrans.List(0, 4)
    xlWS.Cells(4, 6).Value = ListboxItemTrans.List(0, 5)
    xlWS.Cells(4, 7).Value = ListboxItemTrans.List(0, 6)
    
    ' البيانات (من الصف 1 إلى ListCount - 1، الصف 0 للعناوين)
    For i = 1 To ListboxItemTrans.ListCount - 1
        xlWS.Cells(4 + i, 1).Value = ListboxItemTrans.List(i, 0)
        xlWS.Cells(4 + i, 2).Value = ListboxItemTrans.List(i, 1)
        xlWS.Cells(4 + i, 3).Value = ListboxItemTrans.List(i, 2)
        xlWS.Cells(4 + i, 4).Value = ListboxItemTrans.List(i, 3)
        xlWS.Cells(4 + i, 5).Value = ListboxItemTrans.List(i, 4)
        xlWS.Cells(4 + i, 6).Value = ListboxItemTrans.List(i, 5)
        xlWS.Cells(4 + i, 7).Value = ListboxItemTrans.List(i, 6)
    Next i
    
    ' حفظ الملف
    filePath = ThisWorkbook.Path & "\ItemCard_" & cmbItem.Value & "_" & Format(Now, "yyyymmdd_hhmmss") & ".xlsx"
    xlWB.SaveAs filePath
    
    ' إذا كان Excel مفتوحاً مسبقاً، لا نغلق Excel، فقط نفتح الملف المحفوظ
    If excelWasOpen Then
        ' فتح الملف المحفوظ في Excel المفتوح
        xlWB.Close SaveChanges:=False
        xlApp.Workbooks.Open filePath
    Else
        ' إذا أنشأناه نحن، نغلق فقط الملف الجديد ونترك Excel مفتوحاً
        xlWB.Close SaveChanges:=False
        xlApp.Workbooks.Open filePath
        ' لا نغلق Excel - نتركه مفتوحاً للمستخدم
    End If
    
    MsgBox "تم التصدير بنجاح إلى: " & filePath, vbInformation
End Sub

' تفريغ
Private Sub cmdReset_Click()
    ClearForm
End Sub

' مسح النموذج
Private Sub ClearForm()
    cmbItem.Value = ""
    lblItemName.Caption = ""
    txtFromDate.Value = ""
    txtToDate.Value = ""
    txtOpeningQty.Value = "0.00"
    txtInQty.Value = "0.00"
    txtOutQty.Value = "0.00"
    txtBalanceQty.Value = "0.00"
    txtAvgCost.Value = "0.00"
    txtStockValue.Value = "0.00"
    ListboxItemTrans.Clear
End Sub

' إغلاق
Private Sub cmdClose_Click()
    Me.Hide
End Sub



