' 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/>.
Imports System.Xml
Imports System.Xml.Serialization
Imports System.IO

Public Class Commande_réception
    Public Ref_Commande As Integer
    Public reception_groupée As Boolean 'reception de plusieurs commande pharma_ml en m^me temps
    Private pharma_ml As Boolean
    Private commande As officine.PharmaDataSet.CommandesRow
    Public reception_hors_commande As Boolean
    Private validate_data As Boolean 'sert à determiner si le form est fermé en validant ou avec la croix dans le cas des receptions groupées

    Private Reception_Commande_Scan_private As Reception_Commande_Scan



    Private Sub OK_Button_Click(sender As Object, e As EventArgs) Handles OK_Button.Click
        If OK_Button.Text = "Fin scan>>" Then
            Bandeau_info_bas_show("Traitements...")
            Reception_DataGridView.Visible = True
            Scan_DataGridView.Visible = False

            If concat_scan() = False Then
                Reception_DataGridView.Visible = False
                Scan_DataGridView.Visible = True
                Exit Sub
            End If
            Reception_DataGridView.Rows.Clear()
            Reception_DataGridView.Columns.Clear()

            If reception_hors_commande = False Then

                commande = Commandes_PharmaML.CommandesTableAdapter.GetDataBy_ref(Ref_Commande).Item(0)
                Label1.Text = "Ref Commande: " & Ref_Commande.ToString & "  " & commande.Fournisseur & "   " & commande._DATE

                Reception_DataGridView.Columns.Add("num_ligne", "num ligne") '0
                Reception_DataGridView.Columns.Item(0).Visible = False
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 30
                Reception_DataGridView.Columns.Add("Code_Produits", "Code") '1
                Reception_DataGridView.Columns.Item(1).Visible = False
                Reception_DataGridView.Columns.Item(1).DefaultCellStyle.ForeColor = Color.MediumBlue
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 90
                Reception_DataGridView.Columns.Add("Designation", "Designation") '2
                Reception_DataGridView.Columns.Item(2).DefaultCellStyle.ForeColor = Color.MediumBlue
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 260
                Reception_DataGridView.Columns.Add("Quantité", "com.") '3
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 30
                pharma_ml = False
                If commande.REF_MESSAGE_Officine <> "" Then 'pharma-ml
                    pharma_ml = True
                    Reception_DataGridView.Columns.Add("Partielle", "Partielle") '4
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 30
                    Reception_DataGridView.Columns.Item(4).Visible = False
                    Reception_DataGridView.Columns.Add("Reliquat", "Reliquat") '5
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 30
                    Reception_DataGridView.Columns.Item(5).Visible = False
                    Reception_DataGridView.Columns.Add("Equivalent", "Equivalent") '6
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 30
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Visible = False
                    Reception_DataGridView.Columns.Add("livré_Designation", "livré") '7
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 260
                    Reception_DataGridView.Columns.Add("livré_Code_Produit", "Code") '8
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 90
                    Reception_DataGridView.Columns.Item(8).Visible = False
                    Reception_DataGridView.Columns.Add("livré_Quantité", "livr.") '9
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 40
                    Reception_DataGridView.Columns.Add("livré_INDISPONIBILITE_N", "Indisponibilité") '10
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 150
                End If
                Reception_DataGridView.Columns.Add("Reçus", "scan.") ' 4 or 11$
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 40
                Reception_DataGridView.Columns.Add("PAHT_remisé", "PAHT remisé") ' 5 or 12
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 70
                Reception_DataGridView.Columns.Add("PAHT_modif", "ancien PAHT-R") ' 6 or 13
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 60
                Reception_DataGridView.Columns.Add("remise", "remise %") ' 7 or 14
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 70
                Reception_DataGridView.Columns.Add("PAHT", "PAHT") ' 8 or 15
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 70
                Reception_DataGridView.Columns.Add("Du", "Du") ' 9 or 16
                Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 40
                If pharma_ml = False Then
                    Reception_DataGridView.Columns.Add("UG", "UG") ' 10
                    Reception_DataGridView.Columns.Item(Reception_DataGridView.ColumnCount - 1).Width = 40
                End If
                Dim lignes = Commandes_PharmaML.Commandes_LignesTableAdapter.GetDataBy_ref_commande(Ref_Commande)
                For r = 0 To lignes.Rows.Count - 1
                    Reception_DataGridView.Rows.Add()
                Next

                For r = 0 To lignes.Rows.Count - 1
                    Reception_DataGridView.Item(0, r).Value = lignes.Item(r).num_ligne
                    Reception_DataGridView.Item(1, r).Value = lignes.Item(r).Code_Produit
                    Reception_DataGridView.Item(2, r).Value = lignes.Item(r).Designation
                    Reception_DataGridView.Item(3, r).Value = lignes.Item(r).Quantité
                    Dim dus = BDD.DusTableAdapter.GetDataBy_CIP_Soldé(lignes.Item(r).Code_Produit, False)
                    Dim du_qtt = 0
                    For rr = 0 To dus.Rows.Count - 1
                        du_qtt = du_qtt + dus(rr).Quantité_Du
                    Next
                    If pharma_ml = True Then
                        Reception_DataGridView.Item(4, r).Value = lignes.Item(r).Partielle
                        Reception_DataGridView.Item(5, r).Value = lignes.Item(r).Reliquat
                        Reception_DataGridView.Item(6, r).Value = lignes.Item(r).Equivalent
                        Reception_DataGridView.Item(7, r).Value = lignes.Item(r).livré_Designation
                        Reception_DataGridView.Item(8, r).Value = lignes.Item(r).livré_Code_Produit
                        Reception_DataGridView.Item(9, r).Value = lignes.Item(r).livré_Quantité
                        Reception_DataGridView.Item(10, r).Value = lignes.Item(r).livré_INDISPONIBILITE_N
                        If lignes.Item(r).livré_INDISPONIBILITE_N <> "" Then
                            Dim manquant As Reservation_Produit_Reception_Commande.Manquant
                            manquant.commande_ref = Ref_Commande
                            manquant.commande_NumLigne = lignes.Item(r).num_ligne
                            manquant.info = lignes.Item(r).livré_INDISPONIBILITE_N
                            If Reservation_Produit_Reception_Commande.Manquants Is Nothing Then
                                Reservation_Produit_Reception_Commande.Manquants = New List(Of Reservation_Produit_Reception_Commande.Manquant)
                            End If
                            If Not Reservation_Produit_Reception_Commande.Manquants.Contains(manquant) Then
                                Reservation_Produit_Reception_Commande.Manquants.Add(manquant)
                            End If
                        End If


                        Reception_DataGridView.Item(11, r).Value = lignes.Item(r).reçu
                        If BDD.Produits_AchatsTableAdapter.GetDataBy_Ref_Commande_Ligne_Commande(lignes.Item(r).ref_commande, lignes.Item(r).num_ligne).Rows.Count > 0 Then
                            Dim ligne_achat = BDD.Produits_AchatsTableAdapter.GetDataBy_Ref_Commande_Ligne_Commande(lignes.Item(r).ref_commande, lignes.Item(r).num_ligne).Item(0)
                            Reception_DataGridView.Item(12, r).Value = ligne_achat.Prix_achat_remisé
                            Reception_DataGridView.Item(14, r).Value = ligne_achat.Remise
                            Reception_DataGridView.Item(15, r).Value = ligne_achat.Prix_achat
                        End If
                        Reception_DataGridView.Item(16, r).Value = du_qtt
                    Else
                        Reception_DataGridView.Item(4, r).Value = lignes.Item(r).reçu
                        If BDD.Produits_AchatsTableAdapter.GetDataBy_Ref_Commande_Ligne_Commande(lignes.Item(r).ref_commande, lignes.Item(r).num_ligne).Rows.Count > 0 Then
                            Dim ligne_achat = BDD.Produits_AchatsTableAdapter.GetDataBy_Ref_Commande_Ligne_Commande(lignes.Item(r).ref_commande, lignes.Item(r).num_ligne).Item(0)
                            Reception_DataGridView.Item(5, r).Value = ligne_achat.Prix_achat_remisé
                            Reception_DataGridView.Item(7, r).Value = ligne_achat.Remise
                            Reception_DataGridView.Item(8, r).Value = ligne_achat.Prix_achat
                        End If
                        Reception_DataGridView.Item(9, r).Value = du_qtt
                        Reception_DataGridView.Item(10, r).Value = lignes.Item(r).Unités_Gratuite
                    End If
                Next

                For i = 1 To prods_scannés.Length - 1
                    Dim est_dans_la_commande As Boolean = False
                    For r = 0 To Reception_DataGridView.Rows.Count - 1
                        If prods_scannés(i).code = Reception_DataGridView.Item(1, r).Value And prods_scannés(i).designation = Reception_DataGridView.Item(2, r).Value Then
                            est_dans_la_commande = True

                            If pharma_ml = True Then
                                If reception_groupée = True Then
                                    If Val(prods_scannés(i).quantité) > Val(Reception_DataGridView.Item(9, r).Value) Then
                                        Reception_DataGridView.Item(11, r).Value = Reception_DataGridView.Item(9, r).Value
                                        prods_scannés(i).quantité = prods_scannés(i).quantité - CInt(Reception_DataGridView.Item(9, r).Value)
                                        est_dans_la_commande = False
                                    Else
                                        Reception_DataGridView.Item(11, r).Value = prods_scannés(i).quantité
                                    End If
                                Else
                                    Reception_DataGridView.Item(11, r).Value = prods_scannés(i).quantité
                                End If

                                If Val(Reception_DataGridView.Item(11, r).Value) <> Val(Reception_DataGridView.Item(9, r).Value) Then
                                    Reception_DataGridView.Rows(r).Cells(11).Style.BackColor = Color.Red
                                    'Reception_DataGridView.Rows.Item(r).DefaultCellStyle.BackColor = Color.Red
                                Else
                                    Reception_DataGridView.Rows(r).Cells(11).Style.BackColor = Color.LightGreen
                                    'Reception_DataGridView.Rows.Item(r).DefaultCellStyle.BackColor = Color.LightGreen
                                End If


                            Else
                                Reception_DataGridView.Item(4, r).Value = prods_scannés(i).quantité
                                If Val(Reception_DataGridView.Item(3, r).Value) + Val(Reception_DataGridView.Item(10, r).Value) <> Val(Reception_DataGridView.Item(4, r).Value) Then
                                    Reception_DataGridView.Rows(r).Cells(4).Style.BackColor = Color.Red
                                    'Reception_DataGridView.Rows.Item(r).DefaultCellStyle.BackColor = Color.Red
                                Else
                                    Reception_DataGridView.Rows(r).Cells(4).Style.BackColor = Color.LightGreen
                                    'Reception_DataGridView.Rows.Item(r).DefaultCellStyle.BackColor = Color.LightGreen
                                End If
                            End If
                            Exit For
                        End If
                    Next
                    If est_dans_la_commande = False Then
                        scan_abs_comm_DataGridView.Rows.Add()
                        scan_abs_comm_DataGridView.Item(abs_comm_code.Index, scan_abs_comm_DataGridView.Rows.Count - 1).Value = prods_scannés(i).code
                        scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, scan_abs_comm_DataGridView.Rows.Count - 1).Value = prods_scannés(i).designation
                        scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, scan_abs_comm_DataGridView.Rows.Count - 1).Value = prods_scannés(i).quantité
                    End If
                Next
            Else
                pharma_ml = False
                For i = 0 To prods_scannés.Length - 1

                    scan_abs_comm_DataGridView.Rows.Add()
                    scan_abs_comm_DataGridView.Item(abs_comm_code.Index, scan_abs_comm_DataGridView.Rows.Count - 1).Value = prods_scannés(i).code
                    scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, scan_abs_comm_DataGridView.Rows.Count - 1).Value = prods_scannés(i).designation
                    scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, scan_abs_comm_DataGridView.Rows.Count - 1).Value = prods_scannés(i).quantité

                Next
            End If
            For r = 0 To Reception_DataGridView.Rows.Count - 1
                If pharma_ml = True Then
                    If Val(Reception_DataGridView.Item(3, r).Value) <> Val(Reception_DataGridView.Item(9, r).Value) Then
                        Reception_DataGridView.Rows(r).Cells(9).Style.BackColor = Color.Orange
                        Reception_DataGridView.Rows(r).Cells(10).Style.BackColor = Color.Orange
                    End If
                End If

                'prix achat

                Dim prix = BDD.Produits_AchatsTableAdapter.deux_derniers_prix(Reception_DataGridView.Item(1, r).Value)

                For rr = 0 To prix.Rows.Count - 1
                    If pharma_ml = True Then
                        If prix(rr).Prix_achat_remisé <> Reception_DataGridView.Item(12, r).Value Then
                            Reception_DataGridView.Rows(r).Cells(12).Style.BackColor = Color.Yellow
                            Reception_DataGridView.Rows(r).Cells(13).Style.BackColor = Color.Yellow
                            Reception_DataGridView.Item(13, r).Value = prix(rr).Prix_achat_remisé
                        End If
                    Else
                        If prix(rr).Prix_achat_remisé <> Reception_DataGridView.Item(5, r).Value Then
                            Reception_DataGridView.Rows(r).Cells(5).Style.BackColor = Color.Yellow
                            Reception_DataGridView.Rows(r).Cells(6).Style.BackColor = Color.Yellow
                            Reception_DataGridView.Item(6, r).Value = prix(rr).Prix_achat_remisé
                        End If
                    End If

                Next


            Next

            Scan_Panel.Visible = False
            Reception_Panel.Visible = True

            OK_Button.Text = "OK"
            Retour_scan_Button.Visible = True

            If reception_groupée = True And _
               Afficher_commandes.reception_groupée_compteur_commande_à_traiter = Afficher_commandes.reception_groupée_compteur_commandes_traitées And _
               scan_abs_comm_DataGridView.Rows.Count > 0 Then
                Application.DoEvents()
                MyMsg_Box.Presentation("Officine !", "Produits scannés absents des commandes.", False, "", False, "", True, "OK")
                MyMsg_Box.ShowDialog()
            End If
            Prixcontrol1.Visible = True
            Set_PV_TTC_LinkLabel.Visible = True
            Bandeau_info_bas_hide()
        ElseIf OK_Button.Text = "OK" Then
            Bandeau_info_bas_show("Enregistrement...")
            validate_data = True

            Dim reçu_index As Integer
            If pharma_ml = True Then
                reçu_index = 11
            Else
                reçu_index = 4
            End If
            If reception_hors_commande = False Then
                For r = 0 To Reception_DataGridView.RowCount - 1

                    'controle présence produit en bdd
                    If Reception_DataGridView.Item(1, r).Value <> "" Then
                        If ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, r).Value).Rows.Count = 0 Then
                            If BDD.Produits_AliasTableAdapter.GetDataBy_Alias(Reception_DataGridView.Item(1, r).Value).Rows.Count = 0 Then
                                MyMsg_Box.Presentation("Officine !", "Code " & Reception_DataGridView.Item(1, r).Value & " absent de la base produit." & vbCrLf & "Réception commande interrompue.", False, "", False, "", True, "OK")
                                MyMsg_Box.ShowDialog()
                                Bandeau_info_bas_hide()
                                Exit Sub
                            Else
                                Dim code = Reception_DataGridView.Item(1, r).Value
                                Dim alias_ = BDD.Produits_AliasTableAdapter.GetDataBy_Alias(code).Item(0)
                                If alias_.CAB <> "" Then
                                    Reception_DataGridView.Item(1, r).Value = alias_.CAB
                                ElseIf alias_.EAN13 <> "" Then
                                    Reception_DataGridView.Item(1, r).Value = alias_.EAN13
                                ElseIf alias_.CIP <> "" Then
                                    Reception_DataGridView.Item(1, r).Value = alias_.CIP
                                End If
                                If ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, r).Value).Rows.Count = 0 Then
                                    MyMsg_Box.Presentation("Officine !", "Code " & Reception_DataGridView.Item(1, r).Value & " absent de la base produit." & vbCrLf & "Réception commande interrompue.", False, "", False, "", True, "OK")
                                    MyMsg_Box.ShowDialog()
                                    Bandeau_info_bas_hide()
                                    Exit Sub
                                End If
                            End If
                        End If
                    End If

                    'retire du stock les anciennes valeurs saisies si la reception à déja été saisie
                    Dim ligne_commande = Commandes_PharmaML.Commandes_LignesTableAdapter.GetDataBy_RefCommande_NumLigne(commande.ref, Val(Reception_DataGridView.Item(0, r).Value)).Item(0)
                    Dim reçu_old As Integer = ligne_commande.reçu + ligne_commande.Unités_Gratuite

                    If Reception_DataGridView.Item(1, r).Value <> "" Then
                        Dim prod = ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, r).Value).Item(0)
                        If prod.Liste = "Stupéfiant" Then
                            PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(reçu_old * (-1) * Val(prod.Contenance), Reception_DataGridView.Item(1, r).Value, Reception_DataGridView.Item(1, r).Value)
                        Else
                            PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(reçu_old * (-1), Reception_DataGridView.Item(1, r).Value, Reception_DataGridView.Item(1, r).Value)
                        End If
                    Else
                        PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_by_Designation(reçu_old * (-1), Reception_DataGridView.Item(2, r).Value)
                    End If
                    'mise à jour du stock
                    If pharma_ml = True Then
                        If Reception_DataGridView.Item(1, r).Value <> "" Then
                            If ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, r).Value).Rows.Count = 1 Then
                                Dim prod = ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, r).Value).Item(0)
                                If prod.Liste = "Stupéfiant" Then
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(Val(Reception_DataGridView.Item(reçu_index, r).Value) * Val(prod.Contenance), Reception_DataGridView.Item(8, r).Value, Reception_DataGridView.Item(1, r).Value)
                                Else
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(Val(Reception_DataGridView.Item(reçu_index, r).Value), Reception_DataGridView.Item(8, r).Value, Reception_DataGridView.Item(1, r).Value)
                                End If
                            Else
                                MyMsg_Box.Presentation("Officine !", "ANOMALIE" & vbCrLf & "Plusieurs produits avec le code " & Reception_DataGridView.Item(1, r).Value.ToString & vbCrLf & "METTRE STOCK A JOUR MANUELLEMENT", False, "", False, "", True, "OK")
                                MyMsg_Box.ShowDialog()
                            End If
                        Else
                            PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_by_Designation(Val(Reception_DataGridView.Item(reçu_index, r).Value), Reception_DataGridView.Item(7, r).Value)
                        End If
                    Else
                        Dim reçu_new As Integer = Val(Reception_DataGridView.Item(reçu_index, r).Value) + Val(Reception_DataGridView.Item(10, r).Value)
                        If Reception_DataGridView.Item(1, r).Value <> "" Then
                            If ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, r).Value).Rows.Count = 1 Then
                                Dim prod = ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, r).Value).Item(0)

                                If prod.Liste = "Stupéfiant" Then
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(reçu_new * Val(prod.Contenance), Reception_DataGridView.Item(1, r).Value, Reception_DataGridView.Item(1, r).Value)
                                Else
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(reçu_new, Reception_DataGridView.Item(1, r).Value, Reception_DataGridView.Item(1, r).Value)
                                End If
                            Else
                                MyMsg_Box.Presentation("Officine !", "ANOMALIE" & vbCrLf & "Plusieurs produits avec le code " & Reception_DataGridView.Item(1, r).Value.ToString & vbCrLf & "METTRE STOCK A JOUR MANUELLEMENT", False, "", False, "", True, "OK")
                                MyMsg_Box.ShowDialog()
                            End If
                        Else
                            PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_by_Designation(reçu_new, Reception_DataGridView.Item(2, r).Value)
                        End If
                        If pharma_ml = True Then
                            Commandes_PharmaML.Produits_AchatsTableAdapter.Update_Quantité_reçue(Val(Reception_DataGridView.Item(reçu_index, r).Value), 0, commande.ref, Val(Reception_DataGridView.Item(0, r).Value))
                        Else
                            Commandes_PharmaML.Produits_AchatsTableAdapter.Update_Quantité_reçue(Val(Reception_DataGridView.Item(reçu_index, r).Value) - Val(Reception_DataGridView.Item(10, r).Value), Val(Reception_DataGridView.Item(10, r).Value), commande.ref, Val(Reception_DataGridView.Item(0, r).Value))
                        End If
                    End If
                    If pharma_ml = True Then
                        Commandes_PharmaML.Commandes_LignesTableAdapter.Update_reçu(Val(Reception_DataGridView.Item(reçu_index, r).Value), 0, commande.ref, Val(Reception_DataGridView.Item(0, r).Value))
                    Else
                        Commandes_PharmaML.Commandes_LignesTableAdapter.Update_reçu(Val(Reception_DataGridView.Item(reçu_index, r).Value), Val(Reception_DataGridView.Item(10, r).Value), commande.ref, Val(Reception_DataGridView.Item(0, r).Value))
                    End If
                    'mise à jour en_commande
                    If commande.Statut <> "RECEPTIONNÉE" Then
                        If pharma_ml = True Then
                            If Reception_DataGridView.Item(1, r).Value <> "" Then
                                PRODUITS_bdd.ProduitsTableAdapter.Update_en_commande(Val(Reception_DataGridView.Item(9, r).Value) * (-1), Reception_DataGridView.Item(1, r).Value)
                            Else
                                PRODUITS_bdd.ProduitsTableAdapter.Update_en_commande(Val(Reception_DataGridView.Item(9, r).Value) * (-1), Reception_DataGridView.Item(2, r).Value)
                            End If
                        Else
                            If Reception_DataGridView.Item(1, r).Value <> "" Then

                                PRODUITS_bdd.ProduitsTableAdapter.Update_en_commande((Val(Reception_DataGridView.Item(3, r).Value) + Val(Reception_DataGridView.Item(10, r).Value)) * (-1), Reception_DataGridView.Item(1, r).Value)
                            Else
                                PRODUITS_bdd.ProduitsTableAdapter.Update_en_commande((Val(Reception_DataGridView.Item(3, r).Value) + Val(Reception_DataGridView.Item(10, r).Value)) * (-1), Reception_DataGridView.Item(2, r).Value)
                            End If
                        End If
                    End If

                    'mise à jour Prix_achat, Prix_achat_remisé, Remise
                    Try
                        If pharma_ml = True Then
                            CDec(Reception_DataGridView.Item(12, r).Value).ToString()
                            CDec(Reception_DataGridView.Item(14, r).Value).ToString()
                            CDec(Reception_DataGridView.Item(15, r).Value).ToString()
                            CDec(Reception_DataGridView.Item(11, r).Value).ToString()
                            If BDD.Produits_AchatsTableAdapter.GetDataBy_Ref_Commande_Ligne_Commande(commande.ref, CDec(Reception_DataGridView.Item(0, r).Value)).Rows.Count = 0 Then
                                BDD.Produits_AchatsTableAdapter.Insert(Reception_DataGridView.Item(1, r).Value, Reception_DataGridView.Item(2, r).Value, 0, 0, 0, _
                                                                     CDec(Reception_DataGridView.Item(11, r).Value), Now, "", commande.ref, CDec(Reception_DataGridView.Item(0, r).Value), 0)
                            End If
                            BDD.Produits_AchatsTableAdapter.Update_Prix_achat_Remise_Prix_achat_remisé(CDec(Reception_DataGridView.Item(15, r).Value), CDec(Reception_DataGridView.Item(14, r).Value), CDec(Reception_DataGridView.Item(12, r).Value), commande.ref, CDec(Reception_DataGridView.Item(0, r).Value))
                        Else
                            CDec(Reception_DataGridView.Item(5, r).Value).ToString()
                            CDec(Reception_DataGridView.Item(7, r).Value).ToString()
                            CDec(Reception_DataGridView.Item(8, r).Value).ToString()
                            CDec(Reception_DataGridView.Item(4, r).Value).ToString()
                            If BDD.Produits_AchatsTableAdapter.GetDataBy_Ref_Commande_Ligne_Commande(commande.ref, CDec(Reception_DataGridView.Item(0, r).Value)).Rows.Count = 0 Then
                                BDD.Produits_AchatsTableAdapter.Insert(Reception_DataGridView.Item(1, r).Value, Reception_DataGridView.Item(2, r).Value, 0, 0, 0, _
                                                                      CDec(Reception_DataGridView.Item(4, r).Value) - CDec(Reception_DataGridView.Item(10, r).Value), Now, "", commande.ref, CDec(Reception_DataGridView.Item(0, r).Value), Val(Reception_DataGridView.Item(10, r).Value))
                            End If
                            BDD.Produits_AchatsTableAdapter.Update_Prix_achat_Remise_Prix_achat_remisé(CDec(Reception_DataGridView.Item(8, r).Value), CDec(Reception_DataGridView.Item(7, r).Value), CDec(Reception_DataGridView.Item(5, r).Value), commande.ref, CDec(Reception_DataGridView.Item(0, r).Value))
                        End If

                    Catch ex As Exception
                        MyMsg_Box.Presentation("Mise à jour des prix d'achat:", "Les valeurs saisies sont erronées pour" & vbCrLf & Reception_DataGridView.Item(2, r).Value.ToString, False, "", False, "", True, "OK")
                        MyMsg_Box.ShowDialog()
                    End Try

                Next
                'prod scannés pas dans commande
                For r = 0 To scan_abs_comm_DataGridView.RowCount - 1
                    If scan_abs_comm_DataGridView.Item(abs_comm_insert.Index, r).Value = True Then
                        If scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value <> "" Then
                            If ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value).Rows.Count = 1 Then
                                Dim prod = ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value).Item(0)
                                If prod.Liste = "Stupéfiant" Then
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value) * Val(prod.Contenance), scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value, scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value)
                                Else
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value), scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value, scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value)
                                End If
                            Else
                                MyMsg_Box.Presentation("Officine !", "ANOMALIE" & vbCrLf & "Plusieurs produits avec le code " & Reception_DataGridView.Item(1, r).Value.ToString & vbCrLf & "METTRE STOCK A JOUR MANUELLEMENT", False, "", False, "", True, "OK")
                                MyMsg_Box.ShowDialog()
                            End If
                        Else
                            PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_by_Designation(Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value), scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, r).Value)
                        End If

                        Dim PA = CDec(Replace(InputBox(scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, r).Value.ToString & vbCrLf & "prix achat €"), ".", ","))
                        BDD.Produits_AchatsTableAdapter.Insert(scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value, _
                                                                              scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, r).Value, PA, 0, PA, _
                                                                              Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value), Now, "", 0, 0, 0)

                    End If
                Next
                Dim newstatut = "RECEPTIONNÉE"
                If ReceptionPartielleCheckBox.Checked Then
                    newstatut = "PARTIELLE"
                End If
                Commandes_PharmaML.CommandesTableAdapter.Update_by_ref(commande.Fournisseur, commande.Ref_Fournisseur, commande._DATE, commande.Date_livraison, newstatut, commande.REF_MESSAGE_Officine, commande.REF_MESSAGE_Fournisseur, commande.ref)
                Bandeau_info_bas_hide() 'Bandeau_info_bas_show_thread)



                Produits_Reservés()
                Me.Close()
            Else
                For r = 0 To scan_abs_comm_DataGridView.RowCount - 1

                    If scan_abs_comm_DataGridView.Item(abs_comm_insert.Index, r).Value = True Then
                        If scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value <> "" Then
                            If ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value).Rows.Count = 1 Then
                                Dim prod = ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value).Item(0)
                                If prod.Liste = "Stupéfiant" Then
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value) * Val(prod.Contenance), scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value, scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value)
                                Else
                                    PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_By_CIP_CAB(Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value), scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value, scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value)
                                End If
                            Else
                                MyMsg_Box.Presentation("Officine !", "ANOMALIE" & vbCrLf & "Plusieurs produits avec le code " & Reception_DataGridView.Item(1, r).Value.ToString & vbCrLf & "METTRE STOCK A JOUR MANUELLEMENT", False, "", False, "", True, "OK")
                                MyMsg_Box.ShowDialog()
                            End If
                        Else
                            PRODUITS_bdd.ProduitsTableAdapter.UpdateStock_by_Designation(Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value), scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, r).Value)
                        End If

                        Dim PA = CDec(Replace(InputBox(scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, r).Value.ToString & vbCrLf & "prix achat €"), ".", ","))
                        Commandes_PharmaML.Produits_AchatsTableAdapter.Insert(scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value, _
                                                                              scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, r).Value, PA, 0, PA, _
                                                                              Val(scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value), Now, "", 0, 0, 0)

                    End If
                Next
                Bandeau_info_bas_hide() 'Bandeau_info_bas_show_thread)
                Me.Close()
            End If
            Bandeau_info_bas_hide() 'Bandeau_info_bas_show_thread)
        End If
    End Sub

    Public Structure prod_scanné
        Dim code As String
        Dim designation As String
        Dim quantité As Integer

    End Structure
    Public prods_scannés() As prod_scanné

    Private Function concat_scan() As Boolean
        For r = 0 To Scan_DataGridView.Rows.Count - 1
            Try
                CInt(Scan_DataGridView.Item(Column_quantité.Index, r).Value).ToString()
            Catch ex As Exception
                MyMsg_Box.Presentation("Officine !", "Quantité numérique entière", False, "", False, "", True, "OK")
                MyMsg_Box.ShowDialog()
                Return False
            End Try
        Next
        ReDim prods_scannés(0)
        For r = 0 To Scan_DataGridView.Rows.Count - 1
            Dim déja_dans_tab As Boolean = False
            If prods_scannés.Length > 0 Then
                For i = 0 To prods_scannés.Count - 1
                    If prods_scannés(i).code = Scan_DataGridView.Item(Column_code.Index, r).Value And _
                        prods_scannés(i).designation = Scan_DataGridView.Item(Column_produit.Index, r).Value Then
                        déja_dans_tab = True
                        prods_scannés(i).quantité = prods_scannés(i).quantité + CInt(Scan_DataGridView.Item(Column_quantité.Index, r).Value)
                        Exit For
                    End If
                Next
            End If
            If déja_dans_tab = False Then
                ReDim Preserve prods_scannés(prods_scannés.Length)
                prods_scannés(prods_scannés.Length - 1).code = Scan_DataGridView.Item(Column_code.Index, r).Value
                prods_scannés(prods_scannés.Length - 1).designation = Scan_DataGridView.Item(Column_produit.Index, r).Value
                prods_scannés(prods_scannés.Length - 1).quantité = CInt(Scan_DataGridView.Item(Column_quantité.Index, r).Value)
            End If

        Next
        Return True
    End Function





    Private Sub Scan_produit_TextBox_KeyDown(sender As Object, e As KeyEventArgs) Handles Scan_produit_TextBox.KeyDown
        If e.KeyCode = Keys.Enter And Scan_produit_TextBox.Text <> "" Then
            Quantité_produit_TextBox.Focus()

        End If
    End Sub


    Private Sub Scan_produit_TextBox_Validated(sender As Object, e As EventArgs) Handles Scan_produit_TextBox.Validated
        If Scan_produit_TextBox.Text = "" Then Exit Sub
        Try
            If Mid(Scan_produit_TextBox.Text, 1, 1) = "$" Then
                Scan_produit_TextBox.Text = Mid(Scan_produit_TextBox.Text, 2)
            End If
        Catch ex As Exception

        End Try
        Dim my_Search_Product_Input As New Produits.Search_Product_Input
        my_Search_Product_Input.input_String = Scan_produit_TextBox.Text
        my_Search_Product_Input.calcul_valeurs(Val(warning_peremption_TextBox.Text))
        Dim string_searched = my_Search_Product_Input.output_String

        'Dim is_datamatrix As Boolean = False
        'Dim string_searched As String = Scan_produit_TextBox.Text
        'Dim num_lot As String = "*"
        'Dim date_peremption As Date
        'Dim date_string = ""
        'If Mid(string_searched, 1, 2) = "01" And Mid(string_searched, 17, 2) = "17" And Mid(string_searched, 25, 2) = "10" Then
        '    is_datamatrix = True
        '    num_lot = Mid(string_searched, 27)
        '    date_string = (Mid(string_searched, 23, 2) & "/" & Mid(string_searched, 21, 2) & "/" & "20" & Mid(string_searched, 19, 2))
        'ElseIf Mid(string_searched, 1, 2) = "01" And Mid(string_searched, 17, 2) = "11" And Mid(string_searched, 25, 2) = "17" And Mid(string_searched, 33, 2) = "10" Then
        '    is_datamatrix = True
        '    num_lot = Mid(string_searched, 35)
        '    date_string = (Mid(string_searched, 31, 2) & "/" & Mid(string_searched, 29, 2) & "/" & "20" & Mid(string_searched, 27, 2))
        'ElseIf Mid(string_searched, 1, 3) = "010" And string_searched.Length >= 16 Then
        '    string_searched = Mid(string_searched, 4, 13)
        'ElseIf IsNumeric(string_searched) And string_searched.Length > 13 Then
        '    string_searched = Mid(string_searched, 1, 13)
        'End If
        'If is_datamatrix = True Then

        '    While InStr(date_string, "00/") <> 0
        '        date_string = Replace(date_string, "00/", "01/")
        '    End While
        '    date_peremption = Convert.ToDateTime(date_string, Nothing)
        '    string_searched = Mid(string_searched, 4, 13)
        '    If date_peremption.Subtract(Now).Days < Val(warning_peremption_TextBox.Text) Then
        '        MyMsg_Box.Presentation("Officine !", "DATE DE PEREMPTION" + Chr(10) + date_peremption.ToLongDateString, False, "", False, "", True, "OK")
        '        MyMsg_Box.ShowDialog()
        '    End If
        'End If


        Dim x As Decimal = Me.ProduitsTableAdapter.selectcountproduit(string_searched, string_searched, string_searched, string_searched)
        Select Case x
            Case 1 '1 produit correspondant trouvé dans la base
                Me.ProduitsTableAdapter.selectproduit(Me.PharmaDataSet.Produits, string_searched, string_searched, string_searched, string_searched)
                Scan_produit_TextBox.BackColor = Color.LightGreen
                If my_Search_Product_Input.Is_datamatrix Then
                    If ProduitsDataGridView.Item(Peremption_Date_Min.Index, 0).Value Is DBNull.Value Then
                        ProduitsDataGridView.Item(Peremption_Date_Min.Index, 0).Value = New Date(3000, 1, 1)
                    End If
                    my_Search_Product_Input.Calcul_Peremption_Date_Min(ProduitsDataGridView.Item(DataGridViewTextBoxColumn1.Index, 0).Value, ProduitsDataGridView.Item(DataGridViewTextBoxColumn2.Index, 0).Value, _
                                                                       ProduitsDataGridView.Item(DataGridViewTextBoxColumn3.Index, 0).Value, ProduitsDataGridView.Item(DataGridViewTextBoxColumn4.Index, 0).Value, _
                                     CInt(ProduitsDataGridView.Item(DataGridViewTextBoxColumn7.Index, 0).Value), my_Search_Product_Input.Date_peremption, ProduitsDataGridView.Item(Peremption_Date_Min.Index, 0).Value)
                End If
            Case 0 'aucun produit correspondant trouvée dans la base
                Dim aliastable = BDD.Produits_AliasTableAdapter.GetDataBy_Alias(string_searched)
                If aliastable.Rows.Count > 0 Then
                    Me.PharmaDataSet.Produits.Rows.Clear()
                    For r = 0 To aliastable.Rows.Count - 1
                        Me.PharmaDataSet.Produits.Merge(Me.ProduitsTableAdapter.GetDataProduits(aliastable.Item(r).CIP, aliastable.Item(r).CAB, aliastable.Item(r).Désignation, aliastable.Item(r).EAN13))
                    Next
                    If aliastable.Rows.Count = 1 Then
                        Scan_produit_TextBox.BackColor = Color.LightGreen
                    Else
                        Scan_produit_TextBox.BackColor = Color.Orange
                    End If
                Else
                    Scan_produit_TextBox.Focus()
                    Scan_produit_TextBox.SelectAll()
                    Scan_produit_TextBox.BackColor = Color.Red
                End If
            Case Else 'Plusieurs CAB correspondant trouvés dans la base

                Me.ProduitsTableAdapter.selectproduit(Me.PharmaDataSet.Produits, string_searched, string_searched, string_searched, string_searched)
                Scan_produit_TextBox.BackColor = Color.Orange
        End Select

    End Sub

    Private Sub Quantité_produit_TextBox_Enter(sender As Object, e As EventArgs) Handles Quantité_produit_TextBox.Enter
        If Quantité_produit_TextBox.Text = "" Then
            Quantité_produit_TextBox.Text = "1"
        End If
        If plus_one_CheckBox.Checked Then
            If ProduitsDataGridView.Rows.Count = 1 Then
                Quantité_produit_TextBox.Focus()
                SendKeys.SendWait("{Enter}")
            End If
        End If
    End Sub



    Private Sub Quantité_produit_TextBox_KeyDown(sender As Object, e As KeyEventArgs) Handles Quantité_produit_TextBox.KeyDown
        If e.KeyCode = Keys.Enter Then

            Try
                CInt(Quantité_produit_TextBox.Text).ToString()
            Catch ex As Exception
                MyMsg_Box.Presentation("Officine !", "Quantité numérique entière", False, "", False, "", True, "OK")
                MyMsg_Box.ShowDialog()
                Exit Sub
            End Try
            Scan_DataGridView.Rows.Add()
            If ProduitsDataGridView.Item(DataGridViewTextBoxColumn2.Index, ProduitsDataGridView.CurrentRow.Index).Value <> "" Then
                Scan_DataGridView.Item(Column_code.Index, Scan_DataGridView.Rows.Count - 1).Value = ProduitsDataGridView.Item(DataGridViewTextBoxColumn2.Index, ProduitsDataGridView.CurrentRow.Index).Value
            ElseIf ProduitsDataGridView.Item(DataGridViewTextBoxColumn1.Index, 0).Value <> "" Then
                Scan_DataGridView.Item(Column_code.Index, Scan_DataGridView.Rows.Count - 1).Value = ProduitsDataGridView.Item(DataGridViewTextBoxColumn1.Index, ProduitsDataGridView.CurrentRow.Index).Value
            ElseIf ProduitsDataGridView.Item(DataGridViewTextBoxColumn3.Index, 0).Value <> "" Then
                Scan_DataGridView.Item(Column_code.Index, Scan_DataGridView.Rows.Count - 1).Value = ProduitsDataGridView.Item(DataGridViewTextBoxColumn3.Index, ProduitsDataGridView.CurrentRow.Index).Value
            End If
            Scan_DataGridView.Item(Column_produit.Index, Scan_DataGridView.Rows.Count - 1).Value = ProduitsDataGridView.Item(DataGridViewTextBoxColumn4.Index, ProduitsDataGridView.CurrentRow.Index).Value
            Scan_DataGridView.Item(Column_quantité.Index, Scan_DataGridView.Rows.Count - 1).Value = CInt(Quantité_produit_TextBox.Text).ToString


          
            Dim dus = BDD.DusTableAdapter.GetDataBy_CIP_Soldé(Scan_DataGridView.Item(Column_code.Index, Scan_DataGridView.Rows.Count - 1).Value, False)
            Dim du_qtt = 0
            For rr = 0 To dus.Rows.Count - 1
                du_qtt = du_qtt + dus(rr).Quantité_Du
            Next
            Scan_DataGridView.Item(Column_Du.Index, Scan_DataGridView.Rows.Count - 1).Value = du_qtt
            Scan_produit_TextBox.Text = ""
            Quantité_produit_TextBox.Text = ""
            While ProduitsDataGridView.Rows.Count > 0
                ProduitsDataGridView.Rows.RemoveAt(0)
            End While
            Scan_DataGridView.FirstDisplayedScrollingRowIndex = Scan_DataGridView.RowCount - 1
            save_scan(Scan_DataGridView.RowCount - 1)
            Scan_produit_TextBox.Focus()

        End If



    End Sub

    Private Sub ProduitsDataGridView_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles ProduitsDataGridView.CellClick
        Quantité_produit_TextBox.Focus()
        Quantité_produit_TextBox.SelectAll()
    End Sub



    Private Sub ProduitsDataGridView_KeyDown(sender As Object, e As KeyEventArgs) Handles ProduitsDataGridView.KeyDown
        If e.KeyCode = Keys.Enter And Scan_produit_TextBox.Text <> "" Then
            Quantité_produit_TextBox.Focus()
        End If
    End Sub



    Private Sub Retour_scan_Button_Click(sender As Object, e As EventArgs) Handles Retour_scan_Button.Click
        Bandeau_info_bas_show("Retour scan...")
        Label1.Text = "Scan"
        Retour_scan_Button.Visible = False
        OK_Button.Text = "Fin scan>>"
        Scan_DataGridView.Rows.Clear()
        Reception_DataGridView.Visible = False
        Prixcontrol1.Visible = False
        Set_PV_TTC_LinkLabel.Visible = False
        Scan_DataGridView.Visible = True
        Scan_DataGridView.Rows.Clear()
        For i = 1 To prods_scannés.Length - 1
            Scan_DataGridView.Rows.Add()
        Next
        For i = 1 To prods_scannés.Length - 1
            Scan_DataGridView.Item(Column_produit.Index, i - 1).Value = prods_scannés(i).designation
            Scan_DataGridView.Item(Column_code.Index, i - 1).Value = prods_scannés(i).code
            Scan_DataGridView.Item(Column_quantité.Index, i - 1).Value = prods_scannés(i).quantité
            Dim dus = BDD.DusTableAdapter.GetDataBy_CIP_Soldé(prods_scannés(i).code, False)
            Dim du_qtt = 0
            For rr = 0 To dus.Rows.Count - 1
                du_qtt = du_qtt + dus(rr).Quantité_Du
            Next
            Scan_DataGridView.Item(Column_Du.Index, i - 1).Value = du_qtt
        Next
        ReDim prods_scannés(0)
        scan_abs_comm_DataGridView.Rows.Clear()

        Reception_Panel.Visible = False
        Scan_Panel.Visible = True
        Bandeau_info_bas_hide()
    End Sub



    Private Sub Commande_réception_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing

        If reception_groupée = True Then

            ReDim Afficher_commandes.prods_scannés(scan_abs_comm_DataGridView.Rows.Count - 1)
            For r = 0 To scan_abs_comm_DataGridView.Rows.Count - 1
                Afficher_commandes.prods_scannés(r).code = scan_abs_comm_DataGridView.Item(abs_comm_code.Index, r).Value
                Afficher_commandes.prods_scannés(r).designation = scan_abs_comm_DataGridView.Item(abs_comm_prod.Index, r).Value
                Afficher_commandes.prods_scannés(r).quantité = scan_abs_comm_DataGridView.Item(abs_comm_quantité.Index, r).Value
            Next

            If validate_data = False Then 'recupération des quantité si formulaire fermé avec la croix
                For r = 0 To Reception_DataGridView.Rows.Count - 1
                    If Val(Reception_DataGridView.Item(11, r).Value) > 0 Then
                        Dim prod_déja_prods_scannés As Boolean = False
                        For i = 0 To Afficher_commandes.prods_scannés.Length
                            If Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length - 1).code = Reception_DataGridView.Item(8, r).Value And _
                                Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length - 1).designation = Reception_DataGridView.Item(2, r).Value Then
                                prod_déja_prods_scannés = True
                                Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length - 1).quantité = _
                                    Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length - 1).quantité + Val(Reception_DataGridView.Item(11, r).Value)
                                Exit For
                            End If
                        Next
                        If prod_déja_prods_scannés = False Then
                            ReDim Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length)
                            Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length - 1).code = Reception_DataGridView.Item(8, r).Value
                            Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length - 1).designation = Reception_DataGridView.Item(2, r).Value
                            Afficher_commandes.prods_scannés(Afficher_commandes.prods_scannés.Length - 1).quantité = Reception_DataGridView.Item(11, r).Value
                        End If
                    End If
                Next
            End If
        End If
    End Sub

    Private Sub Commande_réception_Load(sender As Object, e As EventArgs) Handles Me.Load

        Me.Icon = Icon.FromHandle(officine.My.Resources.Commandes2.GetHicon)

        validate_data = False

        If reception_hors_commande = False Then
            abs_comm_insert.ReadOnly = True
        End If

        If reception_groupée = True Then
            If Not Afficher_commandes.prods_scannés Is Nothing Then
                If Afficher_commandes.prods_scannés.Length > 0 Then
                    For r = 0 To Afficher_commandes.prods_scannés.Length - 1
                        Scan_DataGridView.Rows.Add()
                    Next
                    For r = 0 To Afficher_commandes.prods_scannés.Length - 1
                        Scan_DataGridView.Item(Column_code.Index, r).Value = Afficher_commandes.prods_scannés(r).code
                        Scan_DataGridView.Item(Column_produit.Index, r).Value = Afficher_commandes.prods_scannés(r).designation
                        Scan_DataGridView.Item(Column_quantité.Index, r).Value = Afficher_commandes.prods_scannés(r).quantité
                    Next
                End If
            End If
            If Scan_DataGridView.Rows.Count > 0 Then
                OK_Button.PerformClick()
            End If

        End If
    End Sub

    Private Sub Reception_DataGridView_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles Reception_DataGridView.CellClick
        If e.RowIndex < 0 Then Exit Sub

        Select Case e.ColumnIndex
            Case 1, 2
                Produits.Visible = True
                Dim code As String
                If Reception_DataGridView.Item(1, e.RowIndex).Value <> "" Then
                    code = Reception_DataGridView.Item(1, e.RowIndex).Value
                Else
                    code = Reception_DataGridView.Item(2, e.RowIndex).Value
                End If
                Produits.Recherche_TextBox.Text = code
                Produits.Recherche_TextBox_Validated(Nothing, Nothing)
                Produits.BringToFront()
                Produits.Select()
        End Select

        Try
            Dim produits = BDD.ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, e.RowIndex).Value).Item(0)
            If commande.REF_MESSAGE_Officine <> "" Then 'pharma-ml
                Prixcontrol1.PA_HT = CDec(Reception_DataGridView.Item(15, e.RowIndex).Value)
                Prixcontrol1.Remise = CDec(Reception_DataGridView.Item(14, e.RowIndex).Value)
                Prixcontrol1.TVA = CDec(produits.TVA)
                Prixcontrol1.PV_TTC = produits.PrixventeTTC
                Prixcontrol1.Unitées_reçues = CDec(Reception_DataGridView.Item(11, e.RowIndex).Value)
                Prixcontrol1.UG = 0
            Else
                Prixcontrol1.PA_HT = CDec(Reception_DataGridView.Item(8, e.RowIndex).Value)
                Prixcontrol1.Remise = CDec(Reception_DataGridView.Item(7, e.RowIndex).Value)
                Prixcontrol1.TVA = CDec(produits.TVA)
                Prixcontrol1.PV_TTC = produits.PrixventeTTC
                Prixcontrol1.Unitées_reçues = CDec(Reception_DataGridView.Item(4, e.RowIndex).Value)
                Prixcontrol1.UG = CDec(Reception_DataGridView.Item(10, e.RowIndex).Value)
            End If
            Prixcontrol1.calcul()
        Catch ex As Exception

        End Try




    End Sub



    Private Sub Reception_DataGridView_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles Reception_DataGridView.CellEndEdit

        If Reception_DataGridView.Columns.Item(e.ColumnIndex).Name = "PAHT" Then
            Reception_DataGridView.Item(e.ColumnIndex, e.RowIndex).Value = Replace(Reception_DataGridView.Item(e.ColumnIndex, e.RowIndex).Value, ".", ",")
        End If
        Try
            CDec(Reception_DataGridView.Item(e.ColumnIndex, e.RowIndex).Value).ToString()
        Catch ex As Exception
            MyMsg_Box.Presentation("Officine !", Reception_DataGridView.Item(2, e.RowIndex).Value.ToString & vbCrLf & vbCrLf & "Montant PAHT saisi incohérent: " & Reception_DataGridView.Item(e.ColumnIndex, e.RowIndex).Value.ToString, False, "", False, "", True, "OK")
            MyMsg_Box.ShowDialog()
            Reception_DataGridView.Item(e.ColumnIndex, e.RowIndex).Value = "0"
        End Try
    End Sub

    Private Sub Reception_DataGridView_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles Reception_DataGridView.CellContentClick

    End Sub

    Private Sub Produits_Reservés()




        Dim Chronique_lignes = BDD.ChroniqueTableAdapter.GetDataBy_Commande_Ref(commande.ref)

        If Chronique_lignes.Rows.Count = 0 Then Exit Sub

        If commande.Statut = "RECEPTIONNÉE" Then
            MyMsg_Box.Presentation("Officine ?", "Cette commande, déja receptionnée contient des produits a reserver pour des patients." & vbCrLf & vbCrLf & "Voulez-vous ouvrir le formulaire des réservations ?", True, "Oui", True, "Non", False, "")
            If MyMsg_Box.ShowDialog = Windows.Forms.DialogResult.No Then
                Exit Sub
            End If
        End If

        Reservation_Produit_Reception_Commande.DataGridView1.Rows.Clear()
        For r = 0 To Chronique_lignes.Rows.Count - 1
            Reservation_Produit_Reception_Commande.DataGridView1.Rows.Add()
        Next
        For r = 0 To Chronique_lignes.Rows.Count - 1
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Patient_Num.Index, r).Value = Chronique_lignes(r).Vitale_Num
            Dim patient = BDD.VitaleTableAdapter.GetDataBy_Num(Chronique_lignes(r).Vitale_Num).Item(0)
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Patient_NIR.Index, r).Value = patient.G101C8
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Patient_DateNaiss.Index, r).Value = DateVitale_To_DateString(patient.G104C12)
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Patient_RangNaiss.Index, r).Value = patient.G104C13
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Patient_Qualité.Index, r).Value = patient.G104C14
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Produit_Désignation.Index, r).Value = Chronique_lignes(r).Produit_Désignation
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Produit_CIP.Index, r).Value = Chronique_lignes(r).Produit_CIP
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Produit_EAN13.Index, r).Value = Chronique_lignes(r).Produit_EAN13
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Produit_CAB.Index, r).Value = Chronique_lignes(r).Produit_CAB
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Date_dernière_delivrance.Index, r).Value = Chronique_lignes(r).Date_dernière_delivrance
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Date_Renouvellement.Index, r).Value = Chronique_lignes(r).Date_Renouvellement
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Commande_Quantité.Index, r).Value = Chronique_lignes(r).Commande_Quantité
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Patient_Nom.Index, r).Value = patient.G104C1 & " " & patient.G104C3
            Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.ALD.Index, r).Value = Chronique_lignes(r).ALD
            If Not patient.IsDelivrance_LieuNull Then
                Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Delivrance_Lieu.Index, r).Value = patient.Delivrance_Lieu
            Else
                Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Delivrance_Lieu.Index, r).Value = ""
            End If

            If Not Reservation_Produit_Reception_Commande.Manquants Is Nothing Then
                For Each manq As Reservation_Produit_Reception_Commande.Manquant In Reservation_Produit_Reception_Commande.Manquants
                    If manq.commande_ref = Chronique_lignes(r).Commande_Ref And manq.commande_NumLigne = Chronique_lignes(r).Commande_NumLigne Then
                        Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Manquant_column.Index, r).Value = manq.info
                        Reservation_Produit_Reception_Commande.DataGridView1.Rows(r).Cells(Reservation_Produit_Reception_Commande.Manquant_column.Index).Style.BackColor = Color.Orange
                        Reservation_Produit_Reception_Commande.DataGridView1.Item(Reservation_Produit_Reception_Commande.Commande_Quantité.Index, r).Value = 0
                    End If
                Next
            End If
        Next
        Reservation_Produit_Reception_Commande.ShowDialog()
    End Sub

    Private Sub Set_PV_TTC_LinkLabel_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles Set_PV_TTC_LinkLabel.LinkClicked

        Try
            Dim produit = BDD.ProduitsTableAdapter.GetDataByCIP_or_EAN13_or_CAB(Reception_DataGridView.Item(1, Reception_DataGridView.CurrentRow.Index).Value).Item(0)
            MyMsg_Box.Presentation("Officine ?", "Modifier prix de vente:" & vbCrLf & vbCrLf & produit.Designation & vbCrLf & vbCrLf & produit.PrixventeTTC & "€ --> " & Prixcontrol1.PV_TTC.ToString & "€", True, "Oui", True, "Non", False, "")
            If MyMsg_Box.ShowDialog = Windows.Forms.DialogResult.Yes Then
                Dim cip = produit.EAN13
                If cip = "" Then
                    cip = produit.CIP
                End If
                BDD.ProduitsTableAdapter.set_PrixventeTTC(Prixcontrol1.PV_TTC.ToString, cip, produit.CAB, produit.Designation)
            End If
        Catch ex As Exception
            MyMsg_Box.Presentation("Officine ?", "Echec modification prix de vente:" & vbCrLf & vbCrLf & ex.Message, False, "", False, "", True, "Ok")
            MyMsg_Box.ShowDialog()
        End Try
    End Sub

  
    Public Sub save_scan(ByVal NumLigne As Integer)
        Try

      
        If Scan_DataGridView.RowCount = 0 Then Exit Sub
        If Reception_Commande_Scan_private Is Nothing Then
            Reception_Commande_Scan_private = New Reception_Commande_Scan
        End If
        ReDim Preserve Reception_Commande_Scan_private.scan(Scan_DataGridView.RowCount - 1)
        Dim ligne As New ligne
        ligne.Code = Scan_DataGridView.Item(Column_code.Index, NumLigne).Value
        ligne.Designation = Scan_DataGridView.Item(Column_produit.Index, NumLigne).Value
        ligne.Quantité = Scan_DataGridView.Item(Column_quantité.Index, NumLigne).Value.ToString
        ligne.Num = NumLigne.ToString
        Reception_Commande_Scan_private.scan(NumLigne) = ligne
        Dim serializer As New XmlSerializer(GetType(Reception_Commande_Scan))
        Dim writer As New StreamWriter(Application.StartupPath & "\Reception_Commande_Scan.xml")
        serializer.Serialize(writer, Reception_Commande_Scan_private)
            writer.Close()
        Catch ex As Exception

        End Try
    End Sub

  

    Private Sub Scan_DataGridView_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles Scan_DataGridView.CellEndEdit
        save_scan(e.RowIndex)
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Try

      
        Dim serializer As New XmlSerializer(GetType(Reception_Commande_Scan))
        Dim reader As New IO.StreamReader(Application.StartupPath & "\Reception_Commande_Scan.xml")
        Reception_Commande_Scan_private = serializer.Deserialize(reader)
        reader.Close()
        reader.Dispose()
        Scan_DataGridView.Rows.Clear()
        For r = 0 To Reception_Commande_Scan_private.scan.Count - 1
            Scan_DataGridView.Rows.Add()
        Next
        For r = 0 To Reception_Commande_Scan_private.scan.Count - 1
            Scan_DataGridView.Item(Column_code.Index, r).Value = Reception_Commande_Scan_private.scan(r).Code
            Scan_DataGridView.Item(Column_produit.Index, r).Value = Reception_Commande_Scan_private.scan(r).Designation
            Scan_DataGridView.Item(Column_quantité.Index, r).Value = CInt(Reception_Commande_Scan_private.scan(r).Quantité)
            Next
        Catch ex As Exception

        End Try
    End Sub
End Class



