' 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 Facture_Auto

    Public Facturation_auto As Boolean
    Public Facturation_auto_IdOrdo As Integer
    Public Facturation_auto_TypeEncaissement As String
    Public list_Produits_Reservés As List(Of PharmaDataSet.Produits_ReservésRow)
    Public Ordo_Type As String


    Public Sub Facturation_VD(ByVal Produits_Reservés As List(Of PharmaDataSet.Produits_ReservésRow))
        Bandeau_info_bas_show("Facturation")
        Dim total_global As Decimal = 0
        While Produits_Reservés.Count > 0
            Dim my_Produits_Reservés = Produits_Reservés.Item(0)
            Try
                Dim vitale = BDD.VitaleTableAdapter.GetDataBy_Num(my_Produits_Reservés.Vitale_Num).Item(0)
                CurrentBenéficiaire.clear()

                Dim num_facture = COMPTOIR_MAIN.Facture_VenteDirecteTableAdapter1.SelectMaxNum + 1

                Dim total As Decimal = 0
                RichTextBox1.AppendText(vbCrLf & num_facture.ToString & " " & vitale.G104C1 & " " & vitale.G104C3 & vbCrLf)
                Dim num_encaissement As Integer = BDD.EncaissementsTableAdapter.Select_Max_Num + 1
                For r = 0 To Produits_Reservés.Count - 1
                    If Produits_Reservés(r).Vitale_Num = my_Produits_Reservés.Vitale_Num Then
                        Dim prod = BDD.ProduitsTableAdapter.GetDataBy_CIPandEAN13andCABandDesignation(Produits_Reservés(r).Produit_CIP, Produits_Reservés(r).Produit_EAN13, _
                                                                                                      Produits_Reservés(r).Produit_CAB, Produits_Reservés(r).Produit_Désignation).Item(0)
                        Dim prix As Decimal = 0
                        If Not COMPTOIR_MAIN.BdM_PrixTableAdapter1.Select_Prix_Public_TTC(Produits_Reservés(r).Produit_EAN13, Produits_Reservés(r).Produit_CIP, Format(Now, "yyyyMMdd")) Is Nothing Then
                            prix = COMPTOIR_MAIN.BdM_PrixTableAdapter1.Select_Prix_Public_TTC(Produits_Reservés(r).Produit_EAN13, Produits_Reservés(r).Produit_CIP, Format(Now, "yyyyMMdd")) / 100
                        Else
                            prix = CDec(prod.PrixventeTTC)
                        End If
                        If prod.Prestation = "PH1" Or prod.Prestation = "PH2" Or prod.Prestation = "PH4" Or prod.Prestation = "PH7" Then

                            If prod.conditionnement_trimestriel = True Then
                                prix = prix + (2.76)
                            Else
                                prix = prix + (1.02)
                            End If
                        End If
                        total = total + Produits_Reservés(r).Quantité_Reservée * prix
                        total_global = total_global + Produits_Reservés(r).Quantité_Reservée * prix
                        BDD.ActesTableAdapter.Insert(BDD.ActesTableAdapter.SelectMaxNumActe + 1, vitale.G104C1, vitale.G104C3, Format(Now, "yyyyMMddHHmmss"), "Vente Directe", _
                                                     Produits_Reservés(r).Produit_CIP, Produits_Reservés(r).Produit_EAN13, prod.Prestation, Produits_Reservés(r).Quantité_Reservée, _
                                                     Produits_Reservés(r).Quantité_Reservée * prix, "0", "0", vitale.G101C8, num_facture.ToString, prix, Produits_Reservés(r).Produit_Désignation, _
                                                     0, 0, 0, "", "", 0, num_encaissement, prod.TVA, "", "", "Facture auto", prix, False, Produits_Reservés(r).Produit_CAB)
                        RichTextBox1.AppendText(Produits_Reservés(r).Produit_Désignation & " *" & Produits_Reservés(r).Quantité_Reservée.ToString & " pu:" & prix.ToString & _
                                                " tot:" & (Produits_Reservés(r).Quantité_Reservée * prix).ToString & vbCrLf)

                    End If
                Next
                COMPTOIR_MAIN.Facture_VenteDirecteTableAdapter1.Insert(num_facture, vitale.G101C8, Format(Now, "yyyyMMddHHmmss"), total, vitale.G104C1 & " " & vitale.G104C3, False)
                BDD.EncaissementsTableAdapter.Insert(num_encaissement, MyCombobox1.Text, total, 0, num_facture, Now, Now, "", vitale.G104C1 & " " & vitale.G104C3, _
                                                     0, False, num_encaissement, "Facture auto", False, 0)
                RichTextBox1.AppendText("total:" & total.ToString & vbCrLf)
                Application.DoEvents()
                RichTextBox1.Select(RichTextBox1.Text.Length - 1, 0)
                RichTextBox1.ScrollToCaret()
                Try

                Catch ex As Exception

                End Try


                Dim again = True
                While again And Produits_Reservés.Count > 0
                    For r = 0 To Produits_Reservés.Count - 1
                        again = False
                        If Produits_Reservés.Item(r).Vitale_Num = my_Produits_Reservés.Vitale_Num Then
                            Dim my_Chronique = BDD.ChroniqueTableAdapter.GetDataBy_Datas(my_Produits_Reservés.Vitale_Num, Produits_Reservés.Item(r).Produit_Désignation, Produits_Reservés.Item(r).Produit_CIP, _
                                                                                        Produits_Reservés.Item(r).Produit_EAN13, Produits_Reservés.Item(r).Produit_CAB)
                            If my_Chronique.Rows.Count > 0 Then
                                Chronique_MAJ_Fact_Auto(my_Chronique.Item(0))

                            End If
                            delivrer_produit_réservé_Fact_Auto(Produits_Reservés(r))
                            Produits_Reservés.RemoveAt(r)
                            again = True
                            Exit For
                        End If
                    Next
                End While

            Catch ex As Exception
                trace_log(vbCrLf & "Facturation automatique (Facture_Auto.Facturation)" & vbCrLf & my_Produits_Reservés.Vitale_Num & vbCrLf & my_Produits_Reservés.Produit_Désignation & vbCrLf & ex.Message & vbCrLf)
                MyMsg_Box.Presentation("Facturation Automatique", "Erreur en cours de facturation", False, "", False, "", True, "Ok")
                MyMsg_Box.ShowDialog()
                Bandeau_info_bas_hide()
                Exit Sub
            End Try
        End While
        RichTextBox1.AppendText(vbCrLf & "total global:" & total_global.ToString)
        Bandeau_info_bas_hide()
    End Sub



    Private Sub goFactureSV(ByVal Vitale_num As Integer)

        Facturation_SV(Vitale_num)
        ''MsgBox(SuiviTraitementList.Tri_Produit & vbCrLf & SuiviTraitementList.Tri_Patient & vbCrLf & SuiviTraitementList.Organisme & vbCrLf & SuiviTraitementList.Tri_Patient_période)
        '        Dim data = BDD.Produits_ReservésTableAdapter.GetData_Facturation_Auto(SuiviTraitementList.Tri_Produit, SuiviTraitementList.Tri_Patient, SuiviTraitementList.Organisme, SuiviTraitementList.Tri_Patient_période)
        '        list_Produits_Reservés = New List(Of PharmaDataSet.Produits_ReservésRow)
        '        For r = 0 To data.Rows.Count - 1
        '            list_Produits_Reservés.Add(data(r))
        'Next

        '        affichage()

        For r = 0 To DataGridView1.RowCount - 1
            Try
                If CInt(DataGridView1.Item(Num_Patient.Index, r).Value) = Vitale_num Then
                    DataGridView1.Item(Facturer.Index, r).Value = ""
                    DataGridView1.Rows.Item(r).DefaultCellStyle.BackColor = Color.Gray
                End If
            Catch ex As Exception

            End Try
        Next
    End Sub

    Private Sub goFactureVD(ByVal Vitale_num As Integer)

        RichTextBox1.Clear()
        RichTextBox1.Visible = True
        DataGridView1.Visible = False
        Application.DoEvents()
        If Vitale_num = 0 Then
            Facturation_VD(list_Produits_Reservés)
        Else
            Dim newlist As New List(Of PharmaDataSet.Produits_ReservésRow)
            For r = 0 To list_Produits_Reservés.Count - 1
                If list_Produits_Reservés(r).Vitale_Num = Vitale_num Then
                    newlist.Add(list_Produits_Reservés(r))
                End If
            Next
            Facturation_VD(newlist)
        End If



    End Sub
    Private Sub Facture_Auto_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
        Me.Dispose()
    End Sub



    Private Sub Facture_Auto_Load(sender As Object, e As EventArgs) Handles Me.Load
        MyCombobox1.Items.Clear()
        Dim data = BDD.Type_PaiementTableAdapter.GetData
        For r = 0 To data.Rows.Count - 1
            MyCombobox1.Items.Add(data(r).Type)
        Next
        Dim data2 = BDD.OrganismesTableAdapter.GetData_OrderByNom
        For r = 0 To data2.Rows.Count - 1
            If data2(r).Type_Encaissement = True Then
                MyCombobox1.Items.Add(data2(r).Nom)
            End If
        Next
    End Sub

    Public Sub Chronique_MAJ_Fact_Auto(ByVal data As PharmaDataSet.ChroniqueRow)
        'CHRONIQUE
        Dim Date_Renouvellement = DateAdd(DateInterval.DayOfYear, data.Intervalle_renouvellement, Now)
        Dim Date_Commande_Produit As Date
        If data.Période_ID = 0 Then
            Date_Commande_Produit = DateAdd(DateInterval.DayOfYear, data.Intervalle_Commande_Produit * (-1), Date_Renouvellement)
        Else
            If data.Date_Commande_Produit < Now Then
                Dim période_data = BDD.Chronique_PériodeTableAdapter.GetDataBy_Id(data.Période_ID).Item(0)
                Dim interval As Integer = CInt(période_data.interval_command_jours * CInt(Mid(data.Période_récurence, InStr(data.Période_récurence, "/") + 1)) / CInt(Mid(data.Période_récurence, 1, InStr(data.Période_récurence, "/") - 1)))
                Date_Commande_Produit = DateAdd(DateInterval.Day, interval, BDD.Chronique_PériodeTableAdapter.GetDataBy_Id(data.Période_ID).Item(0).Date_dernière_commande)
                Dim vitale = BDD.VitaleTableAdapter.GetDataBy_Num(data.Vitale_Num).Item(0)
                If vitale.Chronique_Periode_decalage_jour <> 0 Then
                    Date_Commande_Produit = DateAdd(DateInterval.Day, vitale.Chronique_Periode_decalage_jour, Date_Commande_Produit)
                End If
            Else
                Date_Commande_Produit = data.Date_Commande_Produit
            End If
        End If
        BDD.ChroniqueTableAdapter.Update_Dates(Now, Date_Renouvellement, Date_Commande_Produit, data.Vitale_Num, data.Produit_Désignation, data.Produit_CIP, _
                                                            data.Produit_EAN13, data.Produit_CAB)
        BDD.ChroniqueTableAdapter.Update_Commande_Ref("", 0, data.Vitale_Num, data.Produit_Désignation, data.Produit_CIP, data.Produit_EAN13, data.Produit_CAB)
    End Sub

    Public Sub delivrer_produit_réservé_Fact_Auto(ByVal data As PharmaDataSet.Produits_ReservésRow)
        BDD.Produits_ReservésTableAdapter.Delete_ligne(data.Vitale_Num, data.Produit_Désignation, data.Produit_CIP, data.Produit_EAN13, data.Produit_CAB)
    End Sub

    Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
        If e.RowIndex < 0 Then Exit Sub
        If e.ColumnIndex = Ordo.Index Then
        ElseIf e.ColumnIndex = Facturer.Index Then
            If MyCombobox1.Text = "" Then
                MyCombobox1.BackColor = Color.Red
                Exit Sub
            Else
                Facturation_auto_TypeEncaissement = MyCombobox1.Text
            End If
            Dim Vitale_num As Integer = 0
            MyMsg_Box.Presentation("Facturation Automatique", "Choix du type de facture" & vbCrLf & vbCrLf & "Sesam Vitale" & vbCrLf & vbCrLf & "ou" & vbCrLf & vbCrLf & "Vente Directe", True, "Sesam Vitale", True, "Vente Directe", True, "Annuler")
            Dim rep = MyMsg_Box.ShowDialog
            If rep = Windows.Forms.DialogResult.Yes Then 'SV
                Try
                    Facturation_auto_IdOrdo = CInt(DataGridView1.Item(Ordo.Index, e.RowIndex).Value)
                Catch ex As Exception
                    Facturation_auto_IdOrdo = 0
                End Try
                goFactureSV(CInt(DataGridView1.Item(Num_Patient.Index, e.RowIndex).Value))
            ElseIf rep = Windows.Forms.DialogResult.No Then 'VD
                MyMsg_Box.Presentation("Facturation Automatique", "Souhaitez-vous facturer pour " & vbCrLf & vbCrLf & DataGridView1.Item(Patient.Index, e.RowIndex).Value & vbCrLf & _
                                      "ou" & vbCrLf & "facturer toute la liste ?", True, "Ce patient", True, "La liste", True, "Annuler")
                rep = MyMsg_Box.ShowDialog
                If rep = Windows.Forms.DialogResult.Yes Then
                    goFactureVD(CInt(DataGridView1.Item(Num_Patient.Index, e.RowIndex).Value))
                ElseIf rep = Windows.Forms.DialogResult.No Then
                    goFactureVD(0)
                Else
                    Exit Sub
                End If
            Else
                Exit Sub
            End If
        ElseIf e.RowIndex = Scanner.Index Then

        End If
    End Sub

    Private Sub Facture_Auto_Resize(sender As Object, e As EventArgs) Handles Me.Resize
        DataGridView1.Size = New Size(Me.Width - 40, Me.Height - 126)
        Label2.Location = New Point(12, Me.Height - 69)
    End Sub

    Private Sub Facture_Auto_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        affichage(Ordo_Type)
        If SuiviTraitementList.Visible = True Then
            SuiviTraitementList.Close()
        End If
    End Sub
    Private Sub affichage(ByVal Ordo_type As String)
        DataGridView1.Rows.Clear()
        For r = 0 To list_Produits_Reservés.Count - 1
            DataGridView1.Rows.Add()
        Next
        For r = 0 To list_Produits_Reservés.Count - 1
            DataGridView1.Item(Num_Patient.Index, r).Value = list_Produits_Reservés(r).Vitale_Num
            DataGridView1.Item(Produit.Index, r).Value = list_Produits_Reservés(r).Produit_Désignation
            DataGridView1.Item(Quantité.Index, r).Value = list_Produits_Reservés(r).Quantité_Reservée
            Application.DoEvents()
        Next
        For r = 0 To list_Produits_Reservés.Count - 1
            If DataGridView1.Item(Patient.Index, r).Value = "" Then
                Dim patient_ = BDD.VitaleTableAdapter.GetDataBy_Num(list_Produits_Reservés(r).Vitale_Num).Item(0)
                DataGridView1.Item(Patient.Index, r).Value = patient_.G104C1 & " " & patient_.G104C3
                DataGridView1.Item(Patient.Index, r).Style.BackColor = Color.LightGreen
                Dim ordo_ As officine.PharmaDataSet.OrdoDataTable = BDD.OrdoTableAdapter.Get_Last_Ordo_ByVitaleNum(list_Produits_Reservés(r).Vitale_Num, Ordo_type)

                If ordo_.Rows.Count > 0 Then
                    DataGridView1.Item(Ordo.Index, r).Value = ordo_.Item(0).Id_Ordo
                    DataGridView1.Item(Ordo_restant.Index, r).Value = ordo_.Item(0).Renouvellement_restant
                    If ordo_.Item(0).Renouvellement_restant = 1 Then
                        DataGridView1.Item(Ordo_restant.Index, r).Style.BackColor = Color.Orange
                    ElseIf ordo_.Item(0).Renouvellement_restant <= 0 Then
                        DataGridView1.Item(Ordo_restant.Index, r).Style.BackColor = Color.Red
                    End If
                End If
                For rr = r + 1 To list_Produits_Reservés.Count - 1
                    If list_Produits_Reservés(rr).Vitale_Num = list_Produits_Reservés(r).Vitale_Num Then
                        DataGridView1.Item(Patient.Index, rr).Value = " " ' DataGridView1.Item(Patient.Index, r).Value
                        DataGridView1.Item(Ordo.Index, rr).Value = DataGridView1.Item(Ordo.Index, r).Value
                        DataGridView1.Item(Ordo_restant.Index, rr).Value = DataGridView1.Item(Ordo_restant.Index, r).Value
                        DataGridView1.Item(Ordo_restant.Index, rr).Style.BackColor = DataGridView1.Item(Ordo_restant.Index, r).Style.BackColor
                    End If
                Next
            End If
        Next


        For r = 0 To DataGridView1.RowCount - 1
            DataGridView1.Item(Facturer.Index, r).Value = "facturer"
        Next
        Label2.Text = DataGridView1.RowCount.ToString

    End Sub
    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        If Not PictureBox1.BackgroundImage Is Nothing Then
            Dim i = PictureBox1.BackgroundImage

            'i.HorizontalResolution = pixels per inch of the image 
            'i.VerticalResoulutin = ppi of image again 
            'e.MarginBounds.Width = printable width in 100 ppi 
            'e.MarginBounds.Height = printable height in 100 ppi 

            Dim newWidth As Decimal = i.Width * 100 / i.HorizontalResolution 'Convert to same units (100 ppi) as e.MarginBounds.Width 
            Dim newHeight As Decimal = i.Height * 100 / i.VerticalResolution 'Convert to same units (100 ppi) as e.MarginBounds.Height 
            Dim widthFactor As Decimal = newWidth / e.MarginBounds.Width
            Dim heightFactor As Decimal = newHeight / e.MarginBounds.Height


            If (widthFactor > 1 Or heightFactor > 1) Then ' if the image is wider or taller than the printable area then adjust... 
                If (widthFactor > heightFactor) Then
                    newWidth = newWidth / widthFactor
                    newHeight = newHeight / widthFactor
                Else
                    newWidth = newWidth / heightFactor
                    newHeight = newHeight / heightFactor

                End If
                e.Graphics.DrawImage(i, 0, 0, Int(newWidth), Int(newHeight))
            Else
                e.Graphics.DrawImage(PictureBox1.BackgroundImage, 0, 0)
            End If





        End If
    End Sub

    Public Sub Facturation_SV(ByVal Vitale_Num As Integer)
        Facturation_auto = True
        Bandeau_info_bas_show("Facturation")
        COMPTOIR_MAIN.Visible = True
        Dim vitale = BDD.VitaleTableAdapter.GetDataBy_Num(Vitale_Num).Item(0)
        COMPTOIR_MAIN.ResetForm()
        COMPTOIR_MAIN.Facturation_automatique = True
        Dim id_prescripteur As String = ""
        Try
            Dim ordo = BDD.OrdoTableAdapter.GetDataBy_Id_Ordo(Facturation_auto_IdOrdo).Item(0)
            COMPTOIR_MAIN.DatePrecription.Value = ordo.Ordo_Date_Prescr
            id_prescripteur = ordo.Prescr_NumID
        Catch ex As Exception
            MsgBox("rescanner ordo (joie de l'innovation)")
            Bandeau_info_bas_hide()
            COMPTOIR_MAIN.Close()
            Exit Sub
        End Try
        CurrentBenéficiaire.clear()
        CurrentBenéficiaire.G101C8 = vitale.G101C8
        CurrentBenéficiaire.G104C12 = vitale.G104C12
        CurrentBenéficiaire.G104C13 = vitale.G104C13
        CurrentBenéficiaire.G104C14 = vitale.G104C14
        COMPTOIR_MAIN.GetDataBénéficiaire()
        COMPTOIR_MAIN.ModeSecur = "5"
        COMPTOIR_MAIN.CheckBoxModeDegradé.Enabled = True
        COMPTOIR_MAIN.CheckBoxModeDegradé.Checked = True
        COMPTOIR_MAIN.ventetype_defaut = "assurance"
        COMPTOIR_MAIN.afficheDonnéesAssuré()
        COMPTOIR_MAIN.Dossier_Patient_Load()
        COMPTOIR_MAIN.AMC_Piècejustificative_ComboBox.SelectedIndex = 0
        'COMPTOIR_MAIN.Assuré_détail_Button.Visible = True
        COMPTOIR_MAIN.DP_form = New DP
        COMPTOIR_MAIN.DP_form.Affichage_histo_local()
        COMPTOIR_MAIN.affiche_histo_facture()
        If id_prescripteur <> "" Then
            COMPTOIR_MAIN.PrescripteurMyCombobox.Text = id_prescripteur
            COMPTOIR_MAIN.recherche_prescripteur()
        ElseIf COMPTOIR_MAIN.PrescripteurMyCombobox.Items.Count > 0 Then
            COMPTOIR_MAIN.PrescripteurMyCombobox.Text = COMPTOIR_MAIN.PrescripteurMyCombobox.Items.Item(0)
            COMPTOIR_MAIN.recherche_prescripteur()
        End If

        COMPTOIR_MAIN.Chronique_Affichage()
        COMPTOIR_MAIN.NatureAssurance_Button.Text = "MALADIE"
        COMPTOIR_MAIN.Produits_Reservés_affichage()
        Select Case Ordo_Type
            Case "", "MEDICAMENT"
                COMPTOIR_MAIN.Produits_résevés_tout_delivrer_Click(Nothing, Nothing)
            Case "LOCATION"

                Dim data = BDD.ChroniqueTableAdapter.GetDataBy_DateRenouv_TypeOrdo_VitaleNum(Now, CurrentBenéficiaire.Num, "LOCATION")
                If data.Rows.Count > 0 Then
                    COMPTOIR_MAIN.DateExecution.Value = data(0).Date_Renouvellement
                End If
                For r = 0 To data.Rows.Count - 1
                    COMPTOIR_MAIN.Vente_Ajout_Produit(data(r).Produit_CIP, data(r).Produit_EAN13, data(r).Produit_CAB, data(r).Produit_Désignation, data(r).Commande_Quantité)
                Next

        End Select



        COMPTOIR_MAIN.CheckBox_Facturation_AMC.Enabled = True
        COMPTOIR_MAIN.Dossier_Patient_Load()
        COMPTOIR_MAIN.Button_Facturation_Click(Nothing, Nothing)
        Bandeau_info_bas_hide()
    End Sub



End Class