<?php

namespace Modules\Panier\Service;

use Entity\Model\OxaUserPanierLigne;
use Modules\RechercheArticles\Repository\Recherche;
use Entity\Model\Articles;
use Entity\Model\CataEnt;
use Entity\Model\Fabricant;
use Entity\Model\Fourniss;
use Entity\Model\Gamme;
use Helpers\Outil\Sql;
use Entity\Model\SousFamille;
use Modules\Panier\Service\RequeteArticle;
use Modules\Panier\Repository\PanierEntete;
use Helpers\Parametres\Constante;
use Helpers\Outil\Roles;

class ControlePanierService
{
    /**
     * @var array<mixed> $entete
     */
    private $entete;
    private CalculTauxTvaService $calculTauxTvaService;
    private ReceptionAutoService $receptionAuto;
    
    public function __construct(private \PDO $pdo, private \PDO $pdoOxaFT)
    {
        $this->calculTauxTvaService = new CalculTauxTvaService($this->pdo);
        $this->entete = (new PanierEntete($this->pdo))->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);
        $this->receptionAuto = (new ReceptionAutoService($this->pdo, $this->pdoOxaFT));
    }


    public function controlePanier(bool $updateFrs = false, bool $updateImportLigne = false) : void
    {
        $listeLigne = (new OxaUserPanierLigne($this->pdo))->findAll([
            'id_user' => $_SESSION['id_user'],
            'id_panier' => $_SESSION['id_panier'],
            'CTRL_FAIT' => 'F',
        ]);

        if ($listeLigne) {
            $rechercheRepo = new Recherche($this->pdo);
            $rechercheRepo->generateProfilPub($this->pdoOxaFT, $_SESSION["Session_Login"], $this->entete['LIV_CTR'], $this->entete['CENTRE_EMETTEUR']);
            $rechercheRepo->generateProfilCtr($this->pdoOxaFT, $this->entete['LIV_CTR']);
    
            foreach ($listeLigne as $ligne) {
                $ligne = $this->valideLignePanier($ligne, $ligne['qte'], true, $updateFrs, $updateImportLigne);
                $this->receptionAuto->receptionAutomatique($ligne);
            }
        }
    }

    /**
     * V1 valideLignePanier
     * @param mixed $qte
     * @param array<mixed> $ligne_panier
     * @return array<mixed>
     */
    public function valideLignePanier($ligne_panier, $qte, bool $majDb = true, bool $update_frs = false, bool $updateImportLigne = false)
    {
        $ligne_panier['CodeCtrLivraison']   = $ligne_panier['CodeCtrLivraison']??$this->entete['LIV_CTR'];
        $ligne_panier['id_lig']             = $ligne_panier['id_lig']??0;
        $ligne_panier['NO_LIGNE_CA']        = $ligne_panier['NO_LIGNE_CA']??0;
        $ligne_panier['type_de_ligne']      = intval($ligne_panier['type_de_ligne']??0);
        
        $requeteArticle = new RequeteArticle(
            $this->pdo,
            $this->pdoOxaFT,
            $_SESSION["Session_Login"],
            $this->entete['LIV_CTR'],
            $this->entete['CENTRE_EMETTEUR']
        );
        $oxaUserPanierLigne = new OxaUserPanierLigne($this->pdo);

        $articleCataproc = false;
        if ($_SESSION['id_panier'] == 0 || $majDb == false) {
            if ($ligne_panier['PROVENANCE'] == 'PO' || $ligne_panier['PROVENANCE'] == 'AO') {
                $ligne_panier['type_de_ligne'] = 1;
            } elseif ($ligne_panier['type_de_ligne'] == 1 && $ligne_panier['ID_CAT'] != '') {
                if ($ligne_panier['COD_ART'] != '') {
                    $articlesRepo = new Articles($this->pdo);
                    $result = $articlesRepo->find($ligne_panier['COD_ART']);
                    if (!$result || !Sql::boolSql($result['GENRERIQUE'])) {
                        $ligne_panier['type_de_ligne'] = 0;
                    }
                } else {
                    $ligne_panier['type_de_ligne'] = 0;
                }
            }
        }

        /*
            dossier 306024 :
            Si la ligne viens d'un avenant de commande, on ne recalcul pas la ligne
        */
        if ($ligne_panier['NO_LIGNE_CA'] > 0 && stripos($this->entete['ORIGINE'], 'CreationAvenant') === 0) {
            $ligne_ok = true;
            $ligne_panier['type_de_ligne'] = 1;
            $ligne_panier['flg_ligne_ok'] = '0x54';
            if ($majDb) {
                $this->updateLigne($ligne_panier['id_lig'], $ligne_panier, $ligne_ok);
            }

            return $ligne_panier;
        }
        
        //On vérifié si l'article existe dans CATAPROC
        $resultCataproc = [];
        $articleCataproc = true;
        if ($ligne_panier['type_de_ligne'] == 0 || $ligne_panier['type_de_ligne'] == 3) {
            if ($this->isOkSearchCatalogue($ligne_panier)) {
                $resultCataproc = $requeteArticle->rechercheArt($ligne_panier, false);

                if (!$resultCataproc && ($_SESSION['id_panier'] == 0 || $majDb == false)) {
                    $ligne_panier_recherche['ID_CAT']       = $ligne_panier['ID_CAT'];
                    $ligne_panier_recherche['COD_ART']      = $ligne_panier['COD_ART'];
                    $ligne_panier_recherche['COD_FOURN']    = $ligne_panier['COD_FOURN'];
                    $ligne_panier_recherche['REF_FOURN']    = $ligne_panier['REF_FOURN'];
                    $ligne_panier_recherche['COD_FAB']      = $ligne_panier['COD_FAB'];
                    $ligne_panier_recherche['REF_FAB']      = $ligne_panier['REF_FAB'];
                    $ligne_panier_recherche['COD_ACD']      = $ligne_panier['COD_ACD'];
    
                    $resultCataproc = $requeteArticle->rechercheArtFrs(false, $ligne_panier_recherche);
                    
                    if (!$resultCataproc) {
                        $ligne_panier_recherche['ID_CAT'] = '';
                        $resultCataproc = $requeteArticle->rechercheArtFrs(false, $ligne_panier_recherche);
                    }
                    
                    $resultCataproc = $resultCataproc[0]??[];
                }
            }

            
            if ($resultCataproc) {
                if (sql::boolSql($resultCataproc['ARTFRAISPORT'])) {
                    $ligne_panier['type_de_ligne'] = 3;
                }
                
                if ($ligne_panier['COD_DEV'] == '') {
                    $ligne_panier['COD_DEV'] = $resultCataproc['COD_DEV'];
                }

                if ($ligne_panier['CATPRLST'] == '') {
                    $ligne_panier['CATPRLST'] = $resultCataproc['CATPRLST'];
                }

                if (!$majDb) {
                    foreach ($resultCataproc as $key => $val) {
                        if ($key != 'COD_DEV') {
                            $ligne_panier[$key] = $val;
                        }
                    }
                }
            } else {
                $articleCataproc = false;
            }
        } elseif ($ligne_panier['type_de_ligne'] == 1) {
            $articleCataproc = false;
        }

        //si on ne le trouve pas et que ce ne soit pas un article frais annexes, on va vérifié dans dalibre
        $articleGenerique = false;
        if (!$articleCataproc) {
            if ($ligne_panier['type_de_ligne'] != 1) {
                $infoArtGen['CODE_ART'] = $ligne_panier['COD_ART'];
                $infoArtGen['SSFAM']    = $ligne_panier['COD_SFAM'];
            } elseif ($ligne_panier['COD_ART'] != '') {
                $infoArtGen['CODE_ART'] = $ligne_panier['COD_ART'];
            } else {
                $infoArtGen['SSFAM']    = $ligne_panier['COD_SFAM'];
            }

            $artGen = $requeteArticle->rechercherArtGen($infoArtGen);

            if ($artGen) {
                $ligne_panier['type_de_ligne'] = 1;
                $articleGenerique = true;
            } elseif (($_SESSION['GLOB_AuthLigneLibre'] || $_SESSION['GLOB_AuthLigneManuelle']) && $ligne_panier['type_de_ligne'] != 3) {
                $ligne_panier['type_de_ligne'] = 1;
            }
        }
        
        if ($_SESSION['id_panier'] != 0 && $majDb) {
            if ($ligne_panier['type_de_ligne'] == 0 || $ligne_panier['type_de_ligne'] == 3) {
                if ($articleCataproc) {
                    $ligne_panier['flg_ligne_ok'] = '0x54';
                } elseif ($articleGenerique) {
                    $ligne_panier['flg_ligne_ok'] = '0x54';
                } else {
                    $ligne_panier['flg_ligne_ok'] = '0x46';
                }
            } elseif ($ligne_panier['type_de_ligne'] == 1) {
                if ($articleCataproc || $articleGenerique) {
                    $ligne_panier['flg_ligne_ok'] = '0x54';
                } else {
                    $ligne_panier['flg_ligne_ok'] = '0x46';
                }
            }
            
            $oxaUserPanierLigne->update([
                'numerique_flg_ligne_ok' => $ligne_panier['flg_ligne_ok'],
                'numerique_CTRL_FAIT' => Sql::setBoolSql(true),
            ], [
                'id_lig' => $ligne_panier['id_lig'],
                'id_panier' => $_SESSION['id_panier'],
                'id_user' => $_SESSION['id_user'],
            ]);
        } else {
            if (($ligne_panier['COD_DEV']??'') == '' && $ligne_panier['COD_FOURN'] != '') {
                $fourniss = new Fourniss($this->pdo);
                $infoFrs = $fourniss->find($ligne_panier['COD_FOURN']);

                $ligne_panier['COD_DEV'] = $infoFrs['DEVISE']??'';
            }

            if ($ligne_panier['COD_DEV'] == '') {
                $ligne_panier['COD_DEV'] = $this->entete['DEVISE'];
            }

            $result = [];
            if ($ligne_panier['NO_LIGNE_CA'] != 0) {
                $result = $ligne_panier;
            }
            
            // Si la ligne est du type : Ligne catalogue
            if ($ligne_panier['type_de_ligne'] == 0 || $ligne_panier['type_de_ligne'] == 3) {
                // La ligne est par défaut considérée comme en erreur
                $pu_art = $ligne_panier['PX_ART']!=0?:0;

                $ligne_ok = false;
                $result = $ligne_panier;

                $is_autorise_cde_chantier = 0;
                $is_multi_frs = 0;

                // TODO : why $ligne_panier['type_de_ligne'] == 1 ?
                // S'il s'agit d'une ligne libre ou bien d'une ligne provenant d'une opération de PO, elle est déclarée valide
                if (/*$ligne_panier['type_de_ligne'] == 1 ||*/ in_array($ligne_panier['PROVENANCE'], ['PO', 'AO'])) {
                    $result = $ligne_panier;
                    if ($result['PX_ART'] == 0) {
                        $result['PX_ART'] = $pu_art;
                    }
                    $ligne_ok = true;
                }

                if (($ligne_panier['COD_ART'] == '' &&
                    $ligne_panier['REF_FOURN'] == '' &&
                    $ligne_panier['COD_FAB'] == '' &&
                    $ligne_panier['REF_FAB'] == '')
                ) {
                    $ligne_panier['type_de_ligne'] = 1;
                    $result = $ligne_panier;
                    
                    if ($result['PX_ART'] == 0) {
                        $result['PX_ART'] = $pu_art;
                    }
                    $ligne_ok = true;
                }

                $savePrix = $result['PX_ART'];

                if (!$ligne_ok) {
                    $ligne_panier_recherche['ID_CAT']       = $ligne_panier['ID_CAT'];
                    $ligne_panier_recherche['COD_ART']      = $ligne_panier['COD_ART'];
                    $ligne_panier_recherche['COD_FOURN']    = $ligne_panier['COD_FOURN'];
                    $ligne_panier_recherche['REF_FOURN']    = $ligne_panier['REF_FOURN'];
                    $ligne_panier_recherche['COD_FAB']      = $ligne_panier['COD_FAB'];
                    $ligne_panier_recherche['REF_FAB']      = $ligne_panier['REF_FAB'];
                    $ligne_panier_recherche['COD_ACD']      = $ligne_panier['COD_ACD'];

                    $resultat_premiere_recherche = $requeteArticle->rechercheArt($ligne_panier_recherche, false);

                    if ($resultat_premiere_recherche && $resultat_premiere_recherche['TYPECATA'] != 'M') {
                        if (!(stripos($this->entete['ORIGINE'], 'CreationAvenant') === 0 &&
                            $resultat_premiere_recherche['COD_DEV'] != $ligne_panier['COD_DEV'])
                        ) {
                            $result = $resultat_premiere_recherche;
                            $ligne_ok = true;
                            $result['PX_ART_INIT'] = $result['PX_ART'];
                        }
                    } else {
                        $ligne_panier_recherche['ID_CAT'] = '';
                        $resultat_premiere_recherche = $requeteArticle->rechercheArt($ligne_panier_recherche, false);

                        if ($resultat_premiere_recherche && $resultat_premiere_recherche['TYPECATA'] != 'M') {
                            if (!(stripos($this->entete['ORIGINE'], 'CreationAvenant') === 0 &&
                                $resultat_premiere_recherche['COD_DEV'] != $ligne_panier['COD_DEV'])
                            ) {
                                $result = $resultat_premiere_recherche;
                                $ligne_ok = true;
                                $result['PX_ART_INIT'] = $result['PX_ART'];
                            }
                        } else {
                            // mise a jour des informations obtenu par synequa exemple COD_GRP
                            // On effectue une recherche dans Synequa des fournisseurs proposant cet article

                            $continue = true;
                            if ($resultat_premiere_recherche && $resultat_premiere_recherche['TYPECATA'] == 'M') {
                                if ((stripos($this->entete['ORIGINE'], 'CreationAvenant') === 0 &&
                                    $resultat_premiere_recherche['COD_DEV'] != $ligne_panier['COD_DEV'])
                                ) {
                                    $continue = false;
                                } else {
                                    $result['IDLIGNE'] = $resultat_premiere_recherche['IDLIGNE'];

                                    $ret = $requeteArticle->getFrsControle(
                                        $ligne_panier_recherche['COD_FOURN'],
                                        $resultat_premiere_recherche['COD_FAB'],
                                        $resultat_premiere_recherche['COD_GAM']
                                    );
                                
                                    if ($ret) {
                                        foreach ($resultat_premiere_recherche as $indexElement => $value) {
                                            $result[$indexElement] = $value;
                                        }

                                        $result['COD_FOURN'] = $ret['CODEFOUR']; // On met le code fournisseur à jour
                                        $result['RS_FOURN'] = (is_null($ret['ENSCOMM']) || $ret['ENSCOMM'] == '') ? $ret['RS'] : $ret['ENSCOMM']; // On met la raison sociale à jour
                                        $result['CPOSTAL'] = $ret['CPOSTAL']; // On met le code postal à jour
                                        $result['VILLE1'] = $ret['VILLE1']; // On met la ville à jour
                                        $result['REMGAM'] = $ret['REMGAM']; // On met le taux de Remise à jour
                                        $is_multi_frs = 1;
                                        $ligne_ok = true;
                                        $continue = false;
                                        
                                        $result['PX_ART'] = number_format($resultat_premiere_recherche['PX_ART_INIT'] * (1 - ($result['REMGAM'] / 100)), Constante::PUDECIMAL, '.', '');
                                        $result['PX_ART_INIT'] = $result['PX_ART'];
                                    } else {
                                        $result['PX_ART'] = number_format($resultat_premiere_recherche['PX_ART_INIT'], Constante::PUDECIMAL, '.', '');
                                        $result['PX_ART_INIT'] = $result['PX_ART'];
                                        
                                        $is_multi_frs = 1;
                                        $ligne_ok = true;
                                        $continue = false;
                                    }
                                }
                            }

                            if ($continue) {
                                $liste_ligne_trouve_intuition = $requeteArticle->rechercheArtFrs(true, $ligne_panier);
                                $is_multi_frs = 0;
                                $is_autorise_cde_chantier = 0;

                                if ($liste_ligne_trouve_intuition) {
                                    if (count($liste_ligne_trouve_intuition) > 1) {
                                        $is_multi_frs = 1;
                                    }

                                    foreach ($liste_ligne_trouve_intuition as $element) {
                                        if (($ligne_panier['COD_ART'] == '' || $element['COD_ART'] == $ligne_panier['COD_ART'])
                                            && ($ligne_panier['COD_FOURN'] == '' || $element['COD_FOURN'] == $ligne_panier['COD_FOURN'])
                                            && ($ligne_panier['REF_FOURN'] == '' || $element['REF_FOURN'] == $ligne_panier['REF_FOURN'])
                                            && ($ligne_panier['COD_FAB'] == '' || $element['COD_FAB'] == $ligne_panier['COD_FAB'])
                                            && ($ligne_panier['REF_FAB'] == '' || $element['REF_FAB'] == $ligne_panier['REF_FAB'])
                                            && ($ligne_panier['COD_ACD'] == '' || $element['COD_ACD'] == $ligne_panier['COD_ACD'])
                                        ) {
                                            $result = $element;
                                            $ligne_ok = true;
                                            break;
                                        }
                                    }

                                    // Flag indiquant si le fournisseur présent sur la ligne du panier fait partie de l'extension de panel
                                    $isFrsExtPanel = false;

                                    // specifique client 28
                                    $specifique = new \Helpers\Additional\Specifique\Specifique();
                                    $namespaceSpecifique = $specifique->specifiqueFunction('\\Modules\\Panier\\Service\\SpecPanierLigneService');
                            
                                    if (class_exists($namespaceSpecifique)) {
                                        $isFrsExtPanel = \Helpers\Additional\Specifique\Specifique::specifique('\\Modules\\Panier\\Service\\SpecPanierLigneService', 'articlesFormulaireMetier', $ligne_panier, $this->pdo);
                                    }

                                    if (($update_frs || $isFrsExtPanel) && $ligne_panier['NO_LIGNE_CA'] == 0) {
                                        foreach ($liste_ligne_trouve_intuition as $fournisseur_trouve_sinequa) {
                                            if ($ligne_panier_recherche['COD_FOURN'] == $fournisseur_trouve_sinequa['COD_FOURN'] || $isFrsExtPanel) {
                                                if (! $isFrsExtPanel) {
                                                    $result = $fournisseur_trouve_sinequa;
                                                    if ($result['flg_cde']) {
                                                        $is_autorise_cde_chantier = 1;
                                                    }
                                                    $ligne_ok = true;
                                                } elseif ($ligne_panier_recherche['COD_FOURN'] == $fournisseur_trouve_sinequa['COD_FOURN']) {
                                                    $result = $fournisseur_trouve_sinequa;
                                                    if ($result['flg_cde']) {
                                                        $is_autorise_cde_chantier = 1;
                                                    }
                                                    $ligne_ok = true;
                                                }
                                            }
                                        }

                                        if (!$ligne_ok && $isFrsExtPanel) {
                                            $ligne_panier['type_de_ligne'] = 1;
                                            $result = $ligne_panier;
                                            $ligne_ok = true;
                                        }
                                        
                                        if (! $ligne_ok) {
                                            $result = $liste_ligne_trouve_intuition[0];
                                            if ($result['flg_cde']) {
                                                $is_autorise_cde_chantier = 1;
                                            }
                                            $ligne_ok = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                if ($updateImportLigne) {
                    $cataEnt = new CataEnt($this->pdo);
                    $catalogue = $cataEnt->find($result['ID_CAT']);

                    if ($result['ID_CAT']!='' && $catalogue) {
                        if (sql::boolSql($catalogue['PRIXMODIFIABLE'])) {
                            if ($result['PX_ART']>$savePrix && $savePrix>0) {
                                $result['PX_ART_INIT'] = $result['PX_ART'] = $savePrix;
                            } elseif ($result['PX_ART']<$savePrix && $savePrix>0 && sql::boolSql($catalogue['PRIXMODIFHAUSSE'])) {
                                $result['PX_ART_INIT'] = $result['PX_ART'] = $savePrix;
                            }
                        }
                    } else {
                        $result['PX_ART_INIT'] = $result['PX_ART'] = $savePrix;
                    }
                }

                if ($ligne_panier['type_de_ligne'] == 3) {
                    $result = $ligne_panier;
                    $ligne_ok = true;
                }
                
                if (!$ligne_ok && (stripos($this->entete['ORIGINE'], 'CreationAvenant') === 0 || stripos($this->entete['ORIGINE'], 'modification') === 0)) {
                    $ligne_ok = true;
                }
                $outilPanierService = new OutilPanierService($this->pdo, $this->pdoOxaFT);

                if ($ligne_ok && ($ligne_panier['type_de_ligne'] == 0 || $ligne_panier['type_de_ligne'] == 3)) {
                    // On conserve la désignation complémentaire telle qu'elle était présente dans la ligne du panier
                    $result['DES_COMP'] = $ligne_panier['DES_COMP'];

                    // Le type de ligne manuelle ou catalogue est inchangé
                    $result['type_de_ligne'] = intval($ligne_panier['type_de_ligne']);
                    $result['CodeCtrLivraison'] = $ligne_panier['CodeCtrLivraison'];
                    $result['PX_ART_INIT'] = $result['PX_ART'];

                    $result['ID_LIGNE_ASSOC'] = $ligne_panier['ID_LIGNE_ASSOC']??'';
                    
                    $result['CARACT_ART_HAP'] = $outilPanierService->initAllCaractArt($result, $is_autorise_cde_chantier, $is_multi_frs, 0);

                    $result['PU']       =  $result['PX_ART'];
                    $result['PU_INIT']  =  $result['PX_ART_INIT'];
                    $result['TAUX_TVA'] =  $ligne_panier['TAUX_TVA'];
                    
                    $result['PX_ART'] = $requeteArticle->getPrixDegressifByQte($result, $qte);

                    if (!$result['PX_ART']) {
                        $parmaPrix = sql::paravrac($this->pdo, 'OXAPROC', 'SAISIE_PRIX_SI_NUL');

                        if ($parmaPrix != 'O') {
                            $result['PX_ART'] = $pu_art;
                        }
                    }

                    if ($majDb) {
                        $this->updateLigne($ligne_panier['id_lig'], $result, true);
                    }
                } elseif (stripos($this->entete['ORIGINE'], 'modification') != false) {
                    $result = $ligne_panier;
                    $result['type_de_ligne'] = 1; // La ligne sera considérée comme une ligne manuelle

                    $result['CARACT_ART_HAP'] = $outilPanierService->initAllCaractArt($result, 0, $is_multi_frs, 0);

                    $result['PX_ART_INIT'] = $result['PX_ART'];
                    
                    $result['PU']       =  $result['PX_ART'];
                    $result['PU_INIT']  =  $result['PX_ART_INIT'];
                    $result['TAUX_TVA'] =  $ligne_panier['TAUX_TVA'];

                    $result['PX_ART'] = $requeteArticle->getPrixDegressifByQte($result, $qte);

                    if (!$result['PX_ART']) {
                        $parmaPrix = sql::paravrac($this->pdo, 'OXAPROC', 'SAISIE_PRIX_SI_NUL');

                        if ($parmaPrix != 'O') {
                            $result['PX_ART'] = $pu_art;
                        }
                    }

                    if ($majDb) {
                        $this->updateLigne($ligne_panier['id_lig'], $result, true);
                    }
                } else {
                    $CARACT_ART_HAP = $outilPanierService->initAllCaractArt($result, 0, $is_multi_frs, 0);
                    $oxaUserPanierLigne->update([
                        'CARACT_ART_HAP' => $CARACT_ART_HAP,
                    ], [
                        'id_panier' => $_SESSION['id_panier'],
                        'id_user' => $_SESSION['id_user'],
                        'id_lig' => $ligne_panier['id_lig'],
                    ]);

                    if ($ligne_panier['type_de_ligne'] == 1) {
                        $ligne_ok = ($_SESSION['GLOB_AuthLigneLibre'] || $_SESSION['GLOB_AuthLigneManuelle'] || Roles::droitsUtilisateur($this->pdo, 'OX_RA_SFZG'));
                    } elseif ($ligne_panier['type_de_ligne'] == 0) {
                        $ligne_panier['type_de_ligne'] = 1;
                    }
                }

                if ($majDb) {
                    $this->updateLigne($ligne_panier['id_lig'], $result, $ligne_ok);
                } else {
                    $ligne_panier['flg_ligne_ok'] = ($ligne_ok ? '0x54' : '0x46');
                }
            }
            
            // Si la ligne est du type : Ligne libre
            if ($ligne_panier['type_de_ligne'] == 1) {
                $ligne_ok = ($ligne_panier['PROVENANCE'] == 'PO' || $ligne_panier['PROVENANCE']  == 'AO' || $ligne_panier['NO_LIGNE_CA'] != 0);
                if (!$ligne_ok || $this->entete['NO_DA'] != 0) {
                    $info_recherche_art_gen['CODE_ART'] = $ligne_panier['COD_ART'];
                    $info_recherche_art_gen['SSFAM'] = $ligne_panier['COD_SFAM'];

                    $article = $requeteArticle->rechercherArtGen($info_recherche_art_gen);
                    
                    if ($article) {
                        if (Sql::rqPublicationGenerique($this->pdo) || $_SESSION['GLOB_AuthLigneGenerique']) {
                            // Cas d'un article generique
                            if ($article['IDSTRUC'] == 'ART') {
                                $ligne_panier['CATPRLST'] = $article['CATPRLST'];
                            
                                // Dossier 17518 - Si une ligne de commande est renseignée (dans le cas d'un avenant), on ne remet pas l'ID_CAT à blanc.
                                if (! is_numeric($ligne_panier['NO_LIGNE_CA']) || ! ($ligne_panier['NO_LIGNE_CA'] > 0)) {
                                    $ligne_panier['ID_CAT'] = '';
                                }
                                
                                $ligne_panier['COD_SFAM'] = $article['SSFAM'];
                                $ligne_panier['DES_ART'] = $article['DESIGN'];
                                $ligne_ok = true;
                            }
                        }

                        if (Sql::rqPublicationGenerique($this->pdo) || $_SESSION['GLOB_AuthLigneSFamille']) {
                            if ($article['IDSTRUC'] == 'SSF') { // Cas d'un article sous famille
                                $ligne_panier['CATPRLST'] = $article['CATPRLST'];
                                
                                // Dossier 17518 - Si une ligne de commande est renseignée (dans le cas d'un avenant), on ne remet pas l'ID_CAT à blanc.
                                if (! is_numeric($ligne_panier['NO_LIGNE_CA']) || ! ($ligne_panier['NO_LIGNE_CA'] > 0)) {
                                    $ligne_panier['ID_CAT'] = '';
                                }
                                
                                $ligne_ok = true;
                            }
                        }
                        if ($ligne_ok && ! $majDb) {
                            $ligne_panier['PROVENANCE'] = $article['PROVENANCE'];
                            if ($article['UNITE']) {
                                $ligne_panier['COD_UNIT'] = $article['UNITE'];
                            }
                        }
                    }
                }

                // Si non trouvé dans dlibproc, et que l'utilisateur ne dispose du droit de créer une ligne libre, croix rouge
                if (!$ligne_ok) {
                    if ($_SESSION['GLOB_AuthLigneLibre'] || $_SESSION['GLOB_AuthLigneManuelle'] || roles::droitsUtilisateur($this->pdo, 'OX_RA_SFZG')) {
                        if (! $majDb) {
                            $ligne_panier['PROVENANCE'] = '';
                        }
                        $ligne_ok = true;
                    }
                }

                // sauf en mode modification de DA ou avenant de cde.
                if (! $ligne_ok) {
                    if (stripos($this->entete['ORIGINE'], 'CreationAvenant') != false || stripos($this->entete['ORIGINE'], 'modification') !=false) {
                        $ligne_ok = true;
                    }
                }

                if ($ligne_ok) {
                    $fabricantEntity = new Fabricant($this->pdo);
                    $ssFamilleEntity = new SousFamille($this->pdo);
                    $gammeEntity = new Gamme($this->pdo);

                    if ($ligne_panier['COD_FAB'] != '') {
                        $ligne_panier['RS_FAB'] = $fabricantEntity->find($ligne_panier['COD_FAB'])['RS']??'';
                    }

                    if ($ligne_panier['COD_GAM'] != '') {
                        $ligne_panier['LIB_GAM'] = $gammeEntity->find($ligne_panier['COD_GAM'])['DESIGN']??'';
                    }

                    if ($ligne_panier['COD_SFAM'] != '') {
                        $ligne_panier['LIB_SFAM'] = $ssFamilleEntity->find($ligne_panier['COD_SFAM'])['DESIGNAT']??'';
                    }
                }

                if ($majDb) {
                    $this->updateLigne($ligne_panier['id_lig'], $ligne_panier, $ligne_ok);
                } else {
                    $ligne_panier['flg_ligne_ok'] = ($ligne_ok ? '0x54' : '0x46');
                }
            }
            
            if ($majDb) {
                CritereRegroupService::recalculCritereRegroup($this->pdo, $_SESSION['id_panier'], $ligne_panier['id_lig']);
            }
        }

        $ligne_panier['DEVISE'] = $ligne_panier['COD_DEV'];
        return $ligne_panier;
    }

    /**
     * @param array<mixed> $ligne_panier
     */
    private function isOkSearchCatalogue($ligne_panier) : bool
    {
        return (
            ($ligne_panier['COD_ART'] != '')
            || ($ligne_panier['COD_FOURN'] != '' && $ligne_panier['REF_FOURN'] != '')
            || ($ligne_panier['COD_FAB'] != '' && $ligne_panier['REF_FAB'] != '')
        );
    }

    /**
     * @param array<mixed> $ligne_panier
     */
    private function updateLigne(string $idLigne, $ligne_panier, bool $ligne_ok) : void
    {
        $oxaUserPanierLigne = new OxaUserPanierLigne($this->pdo);

        if (trim($ligne_panier['CONDITNT']) == '') {
            $ligne_panier['CONDITNT'] = 0;
        }
        
        if (!array_key_exists('PX_ART', $ligne_panier)) {
            $ligne_panier['PX_ART'] = 0;
        }
        
        if (!array_key_exists('TAUX_TVA', $ligne_panier)) {
            $ligne_panier['TAUX_TVA'] = 0;
        }
        
        if (!array_key_exists('PX_ART_INIT', $ligne_panier)) {
            $ligne_panier['PX_ART_INIT'] = $ligne_panier['PX_ART'];
        }
        
        if (strlen($ligne_panier['IMGART'])>=200) {
            $ligne_panier['IMGART'] = '';
        }
        
        $tauxTva = $this->calculTauxTvaService->getTauxTva(
            $ligne_panier['COD_ART'],
            $ligne_panier['COD_SFAM'],
            $ligne_panier['COD_FOURN'],
            $ligne_panier['CodeCtrLivraison'],
            $ligne_panier['TAUX_TVA']
        );

        $oxaUserPanierLigne->update([
            'type_de_ligne'     => intval($ligne_panier['type_de_ligne']),
            'PROVENANCE'        => $ligne_panier['PROVENANCE'],
            'ID_CAT'            => $ligne_panier['ID_CAT'],
            'COD_ART'           => $ligne_panier['COD_ART'],
            'COD_FOURN'         => $ligne_panier['COD_FOURN'],
            'RS_FOURN'          => $ligne_panier['RS_FOURN'],
            'REF_FOURN'         => $ligne_panier['REF_FOURN'],
            'COD_FAB'           => $ligne_panier['COD_FAB'],
            'RS_FAB'            => $ligne_panier['RS_FAB'],
            'COD_GAM'           => $ligne_panier['COD_GAM'],
            'LIB_GAM'           => $ligne_panier['LIB_GAM'],
            'REF_FAB'           => $ligne_panier['REF_FAB'],
            'COD_SFAM'          => $ligne_panier['COD_SFAM'],
            'LIB_SFAM'          => $ligne_panier['LIB_SFAM'],
            'DES_ART'           => $ligne_panier['DES_ART'],
            'DES_COMP'          => $ligne_panier['DES_COMP'],
            'COD_UNIT'          => $ligne_panier['COD_UNIT'],
            'PX_ART'            => $ligne_panier['PX_ART'],
            'TAUX_TVA'          => $tauxTva,
            'DELAI'             => $ligne_panier['DELAI'],
            'CARACT'            => $ligne_panier['CARACT'],
            'IMGART'            => $ligne_panier['IMGART'],
            'TYPIMAGE'          => $ligne_panier['TYPIMAGE'],
            'CONDITNT'          => $ligne_panier['CONDITNT'],
            'TXTCOND'           => $ligne_panier['TXTCOND'],
            'COD_ACD'           => $ligne_panier['COD_ACD'],
            'COD_GRP'           => $ligne_panier['COD_GRP'],
            'CARACT_ART_HAP'    => $ligne_panier['CARACT_ART_HAP'],
            'numerique_flg_ligne_ok' => Sql::setBoolSql($ligne_ok),
            'FICHTECH'          => Sql::boolSql($ligne_panier['FICHTECH']),
            'ARTASSOCIE'        => Sql::boolSql($ligne_panier['ARTASSOCIE']),
            'PRIXDEGRESSIF'     => Sql::boolSql($ligne_panier['PRIXDEGRESSIF']),
            'IDLIGNECAT'        => $ligne_panier['IDLIGNE']??$ligne_panier['IDLIGNECAT'],
            'PX_ART_INIT'       => $ligne_panier['PX_ART_INIT'],
            'ID_LIGNE_ASSOC'    => $ligne_panier['ID_LIGNE_ASSOC']??0,
            'CATPRLST'          => $ligne_panier['CATPRLST'],
            'COD_DEV'           => $ligne_panier['COD_DEV'],
            'CRITERE_REGROUP'   => $ligne_panier['CRITERE_REGROUP']??'',
            'numerique_CTRL_FAIT' => Sql::setBoolSql(true),
        ], [
            'id_panier' => $_SESSION['id_panier'],
            'id_user' => $_SESSION['id_user'],
            'id_lig' => $idLigne
        ]);
    }
}
