' Copyright (C) 2025  P4pillon.org
'
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU Affero General Public License as
' published by the Free Software Foundation, either version 3 of the
' License, or (at your option) any later version.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
' GNU Affero General Public License for more details.
'
' You should have received a copy of the GNU Affero General Public License
' along with this program.  If not, see <https://www.gnu.org/licenses/>.
Public Class Bande_de_caisse
    Private bmp_toprint As Bitmap

    Private Sub DEBUT_DateTimePicker_Validated(sender As Object, e As EventArgs) Handles DEBUT_DateTimePicker.ValueChanged
        DEBUT_DateTimePicker.Value = New DateTime(DEBUT_DateTimePicker.Value.Year, DEBUT_DateTimePicker.Value.Month, DEBUT_DateTimePicker.Value.Day, 0, 0, 1)
        Synthese_comptable()

    End Sub

    Private Sub FIN_DateTimePicker_ValueChanged(sender As Object, e As EventArgs) Handles FIN_DateTimePicker.ValueChanged
        FIN_DateTimePicker.Value = New DateTime(FIN_DateTimePicker.Value.Year, FIN_DateTimePicker.Value.Month, FIN_DateTimePicker.Value.Day, 23, 59, 59)
        Synthese_comptable()
    End Sub

    Private Sub Edition_Button_Click(sender As Object, e As EventArgs) Handles Edition_Button.Click
        Vente_DataGridView.ClearSelection()
        TVA_DataGridView.ClearSelection()
        Caisse_DataGridView.ClearSelection()

        Header_Label.Text = "Synthèse comptable" + Chr(10) _
            + "du " + Format(DEBUT_DateTimePicker.Value, "dd/MM/yyyy") + " au " + Format(FIN_DateTimePicker.Value, "dd/MM/yyyy") + Chr(10) _
            + "Edition le " + Format(Now, "dd/MM/yyyy")

       

        PrintPreviewDialog1.Document = PrintDocument1
        PrintDialog1.Document = PrintDocument1
        If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            PrintPreviewDialog1.ShowDialog()
            If PrintPreviewDialog1.DialogResult = DialogResult.OK Then
                PrintDocument1.Print()
            End If
        End If
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, _
         ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
         Handles PrintDocument1.PrintPage
        Dim bmp_toprint As New Bitmap(Panel1.Width, Panel1.Height)
        Panel1.DrawToBitmap(bmp_toprint, Panel1.ClientRectangle)
        Dim g As Graphics
        g = e.Graphics
        g.DrawImage(bmp_toprint, 0, 0)
        g.Dispose()
        e.HasMorePages = False
    End Sub

    Private Sub Synthese_comptable()
        Dim Encaissements = Me.EncaissementsTableAdapter.GetDataByDate(DEBUT_DateTimePicker.Value, FIN_DateTimePicker.Value)

        Dim total_TP_AMO, total_TP_AMC, Encaissement, Crédit, Encaissement_CréditClient, total_Espèces, total_Carte, total_Chèque, total_Autres, _
            totalTVA_0v0, totalTVA_2v1, totalTVA_5v5, totalTVA_10v0, totalTVA_20v0, totalTVA_Autre As Single
        Dim nbre_carte, nbre_chèques As Integer
        For r = 0 To Encaissements.Rows.Count - 1
            Dim reprise As Boolean = False
            If Val(Encaissements(r).NumFactureSV) > 0 Then
                If Me.FacturesTableAdapter1.GetFactureDataByNum1(Val(Encaissements(r).NumFactureSV)).Item(0).Reprise_Facture_Num > 0 Then
                    reprise = True
                End If
            End If
            If reprise = False Then
                Select Case Encaissements(r).Type
                    Case "Espèces"
                        Encaissement = Encaissement + Encaissements(r).Valeur
                        total_Espèces = total_Espèces + Encaissements(r).Valeur
                    Case "Carte"
                        Encaissement = Encaissement + Encaissements(r).Valeur
                        If Encaissements(r).Num = Encaissements(r).Vente_Enchainée_Num_Encaissement Then nbre_carte = nbre_carte + 1
                        total_Carte = total_Carte + Encaissements(r).Valeur
                    Case "Chèque"
                        Encaissement = Encaissement + Encaissements(r).Valeur
                        If Encaissements(r).Num = Encaissements(r).Vente_Enchainée_Num_Encaissement Then nbre_chèques = nbre_chèques + 1
                        total_Chèque = total_Chèque + Encaissements(r).Valeur
                    Case "Crédit"
                        Crédit = Crédit + Encaissements(r).Valeur
                    Case "Vente enchainée"
                        Dim encaissement_parent = Me.EncaissementsTableAdapter.GetDataBy_Num(Encaissements(r).Vente_Enchainée_Num_Encaissement).Item(0)
                        Select Case encaissement_parent.Type
                            Case "Espèces"
                                Encaissement = Encaissement + Encaissements(r).Valeur
                                total_Espèces = total_Espèces + Encaissements(r).Valeur
                            Case "Carte"
                                Encaissement = Encaissement + Encaissements(r).Valeur
                                total_Carte = total_Carte + Encaissements(r).Valeur
                            Case "Chèque"
                                Encaissement = Encaissement + Encaissements(r).Valeur
                                total_Chèque = total_Chèque + Encaissements(r).Valeur
                            Case "Crédit"
                                Crédit = Crédit + Encaissements(r).Valeur
                            Case Else
                                Encaissement = Encaissement + Encaissements(r).Valeur
                                total_Autres = total_Autres + Encaissements(r).Valeur
                        End Select
                    Case Else
                        Encaissement = Encaissement + Encaissements(r).Valeur
                        total_Autres = total_Autres + Encaissements(r).Valeur
                End Select

                If Val(Encaissements(r).NumFactureSV) <> 0 Then
                    If Me.FacturesTableAdapter1.GetFactureDataByNum1(Val(Encaissements(r).NumFactureSV)).Item(0).TP_AMO = True Then
                        total_TP_AMO = total_TP_AMO + (Me.FacturesTableAdapter1.GetFactureDataByNum1(Val(Encaissements(r).NumFactureSV)).Item(0).G1910C3 / 100)
                    End If
                    If Me.FacturesTableAdapter1.GetFactureDataByNum1(Val(Encaissements(r).NumFactureSV)).Item(0).TP_AMC = True Then
                        total_TP_AMC = total_TP_AMC + (Me.FacturesTableAdapter1.GetFactureDataByNum1(Val(Encaissements(r).NumFactureSV)).Item(0).G1910C6 / 100)
                    End If
                End If

                Dim Actes = Me.ActesTableAdapter1.GetDataBy_Encaissement_Num(Encaissements(r).Num)
                Dim Actes_TVA_index, Actes_Total_Index As Integer

                For c = 0 To Actes.Columns.Count - 1
                    Select Case Actes.Columns.Item(c).ColumnName
                        Case "TVA"
                            Actes_TVA_index = c
                        Case "Total"
                            Actes_Total_Index = c
                    End Select
                Next

                For rr = 0 To Actes.Rows.Count - 1
                    Dim est_une_reprise As Boolean = False
                    If Val(Actes(rr).NumFacturesSV) > 0 Then
                        If Me.FacturesTableAdapter1.GetFactureDataByNum1(CDec(Actes(rr).NumFacturesSV)).Item(0).Reprise_Facture_Num > 0 Then
                            est_une_reprise = True
                        End If
                    End If
                    If est_une_reprise = False Then
                        Select Case Actes(rr).Item(Actes_TVA_index).ToString
                            Case "0", "0,0", "0,00"
                                totalTVA_0v0 = totalTVA_0v0 + Actes(rr).Item(Actes_Total_Index)
                            Case "2,1", "2,10"
                                totalTVA_2v1 = totalTVA_2v1 + Actes(rr).Item(Actes_Total_Index)
                            Case "5,5", "5,50"
                                totalTVA_5v5 = totalTVA_5v5 + Actes(rr).Item(Actes_Total_Index)
                            Case "10", "10,0", "10,00"
                                totalTVA_10v0 = totalTVA_10v0 + Actes(rr).Item(Actes_Total_Index)
                            Case "20", "20,0", "20,00"
                                totalTVA_20v0 = totalTVA_20v0 + Actes(rr).Item(Actes_Total_Index)
                            Case Else
                                totalTVA_Autre = totalTVA_Autre + Actes(rr).Item(Actes_Total_Index)
                        End Select
                    End If
                Next
            End If
        Next

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'VENTES
        Vente_DataGridView.Rows.Clear()
        For i = 0 To 4
            Vente_DataGridView.Rows.Add()
        Next

        Vente_DataGridView.Item(0, 0).Value = "TP AMO"
        Vente_DataGridView.Item(1, 0).Value = total_TP_AMO.ToString

        Vente_DataGridView.Item(0, 1).Value = "TP AMC"
        Vente_DataGridView.Item(1, 1).Value = total_TP_AMC.ToString

        Vente_DataGridView.Item(0, 2).Value = "TP Total"
        Vente_DataGridView.Item(1, 2).Value = (total_TP_AMO + total_TP_AMC).ToString

        Vente_DataGridView.Item(0, 3).Value = "Encaissements"
        Vente_DataGridView.Item(1, 3).Value = Encaissement.ToString

        Vente_DataGridView.Item(0, 4).Value = "Crédit"
        Vente_DataGridView.Item(1, 4).Value = Crédit.ToString


        Vente_DataGridView.Item(0, 5).Value = "CA"
        Vente_DataGridView.Item(1, 5).Value = (total_TP_AMO + total_TP_AMC + Crédit + Encaissement).ToString

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'Encaissement crédit
        Dim Encaissements_Sur_CreditClient = Me.EncaissementsTableAdapter.GetDataBy_Encaissement_sur_Crédit_Date(DEBUT_DateTimePicker.Value, FIN_DateTimePicker.Value)

        Dim Encaissement_sur_Crédit_Date_index, Encaissement_sur_Crédit_Valeur_index As Integer
        For c = 0 To Encaissements_Sur_CreditClient.Columns.Count - 1
            Select Case Encaissements_Sur_CreditClient.Columns.Item(c).ColumnName
               
                Case "Encaissement_sur_Crédit_Date"
                    Encaissement_sur_Crédit_Date_index = c
                Case "Encaissement_sur_Crédit_Valeur"
                    Encaissement_sur_Crédit_Valeur_index = c
            End Select
        Next

        For r = 0 To Encaissements_Sur_CreditClient.Rows.Count - 1

            Select Case Encaissements_Sur_CreditClient(r).Encaissement_sur_Crédit_Type
                Case "Espèces"
                    Encaissement = Encaissement + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    Encaissement_CréditClient = Encaissement_CréditClient + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    total_Espèces = total_Espèces + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                Case "Carte"
                    Encaissement = Encaissement + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    Encaissement_CréditClient = Encaissement_CréditClient + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    If Encaissements_Sur_CreditClient(r).Encaissement_sur_Crédit_Encaissement_seul = True Then nbre_carte = nbre_carte + 1
                    total_Carte = total_Carte + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                Case "Chèque"
                    Encaissement = Encaissement + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    Encaissement_CréditClient = Encaissement_CréditClient + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    If Encaissements_Sur_CreditClient(r).Encaissement_sur_Crédit_Encaissement_seul = True Then nbre_chèques = nbre_chèques + 1
                    total_Chèque = total_Chèque + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                Case Else
                    Encaissement = Encaissement + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    Encaissement_CréditClient = Encaissement_CréditClient + Encaissements_Sur_CreditClient(r).Item(Encaissement_sur_Crédit_Valeur_index)
                    total_Autres = total_Autres + Encaissements(r).Encaissement_sur_Crédit_Valeur
            End Select

        Next

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'CAISSE
        Caisse_DataGridView.Rows.Clear()
        For i = 0 To 7
            Caisse_DataGridView.Rows.Add()
        Next

        Caisse_DataGridView.Item(0, 0).Value = "Espèce"
        Caisse_DataGridView.Item(1, 0).Value = total_Espèces.ToString

        Caisse_DataGridView.Item(0, 1).Value = "CB"
        Caisse_DataGridView.Item(1, 1).Value = total_Carte.ToString

        Caisse_DataGridView.Item(0, 2).Value = "Chèques"
        Caisse_DataGridView.Item(1, 2).Value = total_Chèque.ToString

        Caisse_DataGridView.Item(0, 3).Value = "Autres"
        Caisse_DataGridView.Item(1, 3).Value = total_Autres.ToString

        Caisse_DataGridView.Item(0, 4).Value = "Total"
        Caisse_DataGridView.Item(1, 4).Value = (total_Espèces + total_Carte + total_Autres + total_Chèque).ToString

        If Encaissement_CréditClient <> 0 Then
            Caisse_DataGridView.Item(0, 5).Value = "dont crédits réglés"
            Caisse_DataGridView.Item(1, 5).Value = Encaissement_CréditClient.ToString
        End If

        Caisse_DataGridView.Item(0, 7).Value = "Nbre CB"
        Caisse_DataGridView.Item(1, 7).Value = nbre_carte.ToString

        Caisse_DataGridView.Item(0, 8).Value = "Nbre chèques"
        Caisse_DataGridView.Item(1, 8).Value = nbre_chèques.ToString

        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'TVA
        TVA_DataGridView.Rows.Clear()
        For i = 0 To 4
            TVA_DataGridView.Rows.Add()
        Next
   
        TVA_DataGridView.Item(0, 0).Value = "0%"
        TVA_DataGridView.Item(1, 0).Value = totalTVA_0v0.ToString
        TVA_DataGridView.Item(2, 0).Value = totalTVA_0v0.ToString
        TVA_DataGridView.Item(0, 1).Value = "2,1%"
        TVA_DataGridView.Item(1, 1).Value = totalTVA_2v1.ToString
        TVA_DataGridView.Item(2, 1).Value = (totalTVA_2v1 * 1000 / 1021).ToString
        TVA_DataGridView.Item(0, 2).Value = "5,5%"
        TVA_DataGridView.Item(1, 2).Value = totalTVA_5v5.ToString
        TVA_DataGridView.Item(2, 2).Value = (totalTVA_5v5 * 1000 / 1055).ToString
        TVA_DataGridView.Item(0, 3).Value = "10%"
        TVA_DataGridView.Item(1, 3).Value = totalTVA_10v0.ToString
        TVA_DataGridView.Item(2, 3).Value = (totalTVA_10v0 * 1000 / 1100).ToString
        TVA_DataGridView.Item(0, 4).Value = "20%"
        TVA_DataGridView.Item(1, 4).Value = totalTVA_20v0.ToString
        TVA_DataGridView.Item(2, 4).Value = (totalTVA_20v0 * 1000 / 1200).ToString
        'TVA_DataGridView.Item(0, 6).Value = "autre%"
        'TVA_DataGridView.Item(1, 6).Value = totalTVA_Autre.ToString
        TVA_DataGridView.Item(0, 5).Value = "Total"
        TVA_DataGridView.Item(1, 5).Value = (totalTVA_0v0 + totalTVA_2v1 + totalTVA_5v5 + totalTVA_10v0 + totalTVA_20v0).ToString
        TVA_DataGridView.Item(2, 5).Value = (totalTVA_0v0 + (totalTVA_2v1 * 1000 / 1021) + (totalTVA_5v5 * 1000 / 1055) + (totalTVA_10v0 * 1000 / 1100) + (totalTVA_20v0 * 1000 / 1200)).ToString

        For i = 0 To 5
            If InStr(TVA_DataGridView.Item(2, i).Value, ",") <> 0 Then
                TVA_DataGridView.Item(2, i).Value = Mid(TVA_DataGridView.Item(2, i).Value, 1, Math.Min(TVA_DataGridView.Item(2, i).ToString.Length, InStr(TVA_DataGridView.Item(2, i).Value, ",") + 2))
            End If
        Next
    End Sub
End Class