<?php

/**
 * Classe permettant de gérer les AO
 *
 */
class AO
{

    const ID_ONGLET_PANEL_AOPANIER = 'onglet_creeAOPanierPanel';

    const ID_ONGLET_CORPS_AOPANIER = 'onglet_creeAOPanierCorps';

    const ONGLET_AO_PANIER_BASE = 'onglet_ligne_panier';

    const ONGLET_AO_PANIER_VIRTUEL = 'onglet_virt_ao';

    const SESSION_AO_TEMP = 'SESS_AO_TEMP';

    const TAG_SUP_LIGNE = 'SUP_LIGNE_';

    const TAG_SUP_FOUR = 'SUP_FOUR_';

    const FORM_POPUP_AO_PANIER = 'form_popup_textarea';

    const NAME_TITRE_AO = 'titreOnglet';

    const NAME_OBJET_AO = 'objetOnglet';

    const NAME_COMMENT_AO = 'commentOnglet';

    const NAME_DTE_REP = 'DTE_REP';

    const NAME_DTELIMIT = 'DTELIMIT';

    const NAME_POP_IMP_AO = 'popupImpAction';

    const xslPopupAOPanier = 'application/xsl/popup_panierversao.xsl';

    const xslPopupAOnewProp = 'application/xsl/popup_aonew_prop.xsl';

    protected $AODemandeur;
 // Tableau des AO non clos des DA du user
    protected $tableau_xml;
 // Tableau XML qui sera transmis à la XSL
    protected $data;

    /**
     * Enter description here...
     *
     * @param unknown_type $demandeur
     */
    public function __construct($demandeur)
    {
        $this->AODemandeur = array();
        $this->tableau_xml = array();
        $this->initListAODemandeur($demandeur);
    }

    // Méthodes GET
    public function &getAODemandeur()
    {
        return $this->AODemandeur;
    }

    public function getNbAODemandeur()
    {
        return count($this->AODemandeur);
    }

    public function &getTableauXML()
    {
        return $this->tableau_xml;
    }

    public function &getData()
    {
        return $this->data;
    }

    // retourne le nombre de ligne sur un AO.
    public function &getNbligneAO($numAO)
    {
        return SqlAo::rqGetNbLigneAO($numAO)->TrouveTous();
    }

    // Fonction listant les AO pour un demandeur donné
    public function initListAODemandeur(& $demandeur)
    {
        $this->AODemandeur = SqlAo::rqGetListAODAUser($demandeur)->TrouveTous();
    }

    /**
     * Fonction qui permet de construire le tableau avec les infos nécessaire à la construction de notre fichier XML
     */
    public function selectAllAODem()
    {
        $this->data = array();
        if ($element = $this->getAODemandeur())
            foreach ($element as $i => & $demandeur) {
                $this->data['ListeAO']['AO'][$i]['entete'] = array(
                    'NO_AO' => & $demandeur['NO_AO'],
                    'CODE_ACH' => & $demandeur['CODE_ACH'],
                    'NOM_ACH' => & $demandeur['NOM_ACH'],
                    'DATECHXFOU' => & $demandeur['VALCHXFOU'],
                    'DELAI_REP' => convertDateSqlToFr($demandeur['DEL_REP']),
                    'FRS_AO' => "var win_pop = OpenPopup('liste_AO.php?action=Aff_Lst_FRS_AO&NO_AO={$demandeur['NO_AO']}','win_pop','600','350');",
                    'DEVELOPPEAO' => "collapseExpandMenuOuvrir('AO_ZoneLigne_{$demandeur['NO_AO']}','Btn_{$demandeur['NO_AO']}','',\"" . HttpReplacePointeur(trad("Masquer les lignes de l'AO N°")) . $demandeur['NO_AO'] . "\",'',\"" . HttpReplacePointeur(trad("Afficher les lignes de l'AO N°")) . $demandeur['NO_AO'] . '");'
                );
                $element = & $this->data['ListeAO']['AO'][$i];
                if ($listeLigne = SqlAo::getInfoOnLigneAO($demandeur['NO_AO'])->TrouveTous())
                    foreach ($listeLigne as $j => & $ligne) {
                        $element['ListeLigne'][$j]['Ligne'] = & $ligne;
                        $element['ListeLigne'][$j]['Ligne']['NO_LIGNE'] = $j;
                    }
            }
    }

    /**
     * Fonction appellant le wsdl permettant de valider le choix des fournisseur sur un AO
     *
     * @param string $num_AO
     * @param tableau $Chx_FRS
     * @return appel au wsdl
     */
    static public function &CallWsdlForFRSAO($login, $num_AO)
    {
        $envoi = '<Utilisateur>' . $login . '</Utilisateur>' . '<NumAO>' . $num_AO . '</NumAO>';
        
        $envoi = '<AOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</AOIn>';
        
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'OXAPRC_AO_VALCHXFOURN', $envoi);
    }

    static public function &CallWsdlAORechercheLigne($login, $num_AO, $motARechercher)
    {
        $envoi = '<CodeUtilisateur>' . $login . '</CodeUtilisateur>' . '<NO_AO>' . $num_AO . '</NO_AO>' . '<ChaineRecherche>' . htmlspecialchars($motARechercher) . '</ChaineRecherche>' . '';
        
        $envoi = '<RechercheLigneAO_In LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</RechercheLigneAO_In>';
        
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'OXAPRC_AO_RECHLIG', $envoi, false);
    }

    static public function &CallWsdlGetAO($login, $num_AO, $sousElement = '', $noPage = '')
    {
        $envoi = '<CodeUtilisateur>' . $login . '</CodeUtilisateur>' . '<NO_AO>' . $num_AO . '</NO_AO>' . '<SousElement>' . $sousElement . '</SousElement>' . ($noPage != '' ? '<Ligne_NoPage>' . $noPage . '</Ligne_NoPage>' : '');
        
        $envoi = '<LectureAO_In LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</LectureAO_In>';
        
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'SRM_AO_LECTURE', $envoi, false);
    }

    public static function creePanier($numAO, $passerelleV1V2 = false)
    {
        // Selection du premier fournisseur AO retenu
        $arrayInfoRuptureCde = null;

        $codeFrs = null;
        $_SESSION['initConnexion'] = true;
        // print_r(SqlAo::rqAO_FourRetenu($numAO, null, $codeFrs, true)->TrouveTous()); exit; 
        if ($elementAo = & SqlAo::rqGetAoEntente($numAO)->Trouve1())
            if ($req =  SqlAo::rqAO_FourRetenu($numAO, null, $codeFrs, true)->TrouveTous()) {
                $panierCree = false;
                
                $frsRet = AO_ecran::getFournisseurRet();
                
                if ($elementAo['TYPE_SG'] == 'G')
                    $codeSte = $frsRet['entete']['!value'];
                else
                    $codeSte = $elementAo['CODE_STE'];

                foreach ($req as & $arrayFrs) {
                    $elementContinue = null;
                    foreach ($frsRet['FRS'] as & $cmp) {
                        if ($arrayFrs['TYPE_FG'] == $cmp['!TYPE_FG'] && $arrayFrs['CODE_FOU'] == $cmp['!CODE']) {
                            if ($cmp['_chk']['!value'] != '') {
                                $elementContinue = $cmp;
                            }
                            
                            break;
                        }
                    }
                    if (is_array($elementContinue)) {
                        
                        if ($elementContinue['!TYPE_FG'] == 'G')
                            $codeFour = $elementContinue['_select']['!value'];
                        else
                            $codeFour = $cmp['!CODE'];
                        
              
                        $sql = 'select TOP 1 * from AO_DAREP with(nolock) ' . 
                                'WHERE  AO_DAREP.NO_AO 	  =   ' . ReplaceSqlPointeur($arrayFrs['NO_AO']) . ' ' . 'AND 	AO_DAREP.CODE_FOU = \'' . ReplaceSqlPointeur($arrayFrs['CODE_FOU']) . '\' ' . 'AND 	AO_DAREP.TYPE_FG  = \'' . ReplaceSqlPointeur($arrayFrs['TYPE_FG']) . '\' ' . 'AND 	AO_DAREP.C_V      = \'' . ReplaceSqlPointeur($arrayFrs['RET_CV']) . '\' ' . 'ORDER BY AO_DAREP.DTE_REP DESC ';
                               
                        if ($requeteAODAREP = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) { 

                            
                            // print_r(SqlAo::rqAO_getLigneReponse($numAO, $requeteAODAREP['TYPE_FG'], $requeteAODAREP['CODE_FOU'], $requeteAODAREP['DTE_REP'], $requeteAODAREP['C_V'])->TrouveTous()); exit; 

                            if ($listeLigne = SqlAo::rqAO_getLigneReponse($numAO, $requeteAODAREP['TYPE_FG'], $requeteAODAREP['CODE_FOU'], $requeteAODAREP['DTE_REP'], $requeteAODAREP['C_V'])->TrouveTous()) {
                                
                                $panierEncours = 0;
                                $panierEntete = new PanierEntete();
                                $panierEntete->getEntetePanier($panierEncours, $_SESSION['id_user']);
                                
                                $codeSte = $listeLigne[0]['CODE_STE'];
                                if (! $panierCree) {
                                    $nbLignesPanier = Panier::getNbLignePanier($_SESSION['id_user'], $panierEncours);
                                    
                                    if ($nbLignesPanier !== '0') {

                                        if ($codeSte != $panierEntete->getCODE_STE()) {
                                            $message = Affichage::messageJS(trad('Votre panier en cours doit être vide, car il ne correspond pas à la société de votre AO.'), false, $passerelleV1V2);
                                            return $message;
                                        }
                                    }
                                    
                                    
                                    if($codeSte)
                                        $new_variables_session = utilisateur::getAllValueInitSessionByUserAndSociete($_SESSION['Session_Login'], $codeSte);
                                    else
                                        $new_variables_session = utilisateur::getAllValueInitSessionByUserAndSociete($_SESSION['Session_Login'], $_SESSION['Session_SocUsr']);

                                    if (! array_key_exists('CTR_EMET', $new_variables_session) || trim($new_variables_session['CTR_EMET']) == '' || ! array_key_exists('CTR_LIV', $new_variables_session) || trim($new_variables_session['CTR_LIV']) == '') {
                                        $message = Affichage::messageJS(strBuild(trad('Veuillez renseigner les informations centre de livraison et / ou centre émetteur de la société'), $codeSte), false, $passerelleV1V2);
                                        return $message;
                                    }
                                    
                                    utilisateur::setAllFieldsSessionUser($new_variables_session);
                                    /**
                                     * mise à niveau des paramètres de session utilisateurs
                                     */
                                    
                                    $_SESSION['id_panier'] = $panierEncours;
                                    PanierEntete::InitPanierEncours($_SESSION['id_user'], $_SESSION['id_panier']);
                                    $panierCree = true;

                                    
                                }
                                
                                $arrayInfoRuptureCde[$codeFour] = array(
                                    'REFRPFOU' => $requeteAODAREP['REFRPFOU']
                                );
                                // La premiere va donner la date de réponse à prendre en compte
                                
                                $dateRep = $requeteAODAREP['DTE_REP'];
                                
                                $panierEntete = new PanierEntete();
                                
                                if(!$codeSte)
                                {
                                    $codeSte = $_SESSION['Session_SocUsr'];
                                }

                                if ($_SESSION['Session_SocUsr'] != $codeSte) {

                                    $tableauRetour = utilisateur::enregistreChangementSociete($codeSte, $null);
                                    $messageErreur = $tableauRetour['message'];
                                    if ($messageErreur === '') {
                                        $panierEntete->setCODE_STE($codeSte);
                                        
                                        $_SESSION['Init_SectionImputation'] = $_SESSION['Session_SectionImputation'];
                                        $_SESSION['Init_CG'] = $_SESSION['Session_CG'];
                                        $_SESSION['Init_CDC'] = $_SESSION['Session_CDC'];
                                        $_SESSION['Init_SCA'] = $_SESSION['Session_SCA'];
                                        
                                        $panierEntete->initEntetePanier($panierEncours, true);
                                    } else
                                    {
                                        $message = Affichage::messageJS($messageErreur, false, $passerelleV1V2);
                                        return $message;
                                    }
                                } else
                                    $panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);
                                
                                $arrayEntete['COD_DEV'] = $elementAo['DEVISE'];
                                
                                $arrayEntete['CENTRE_EMETTEUR'] = $elementAo['EMETTEUR'];
                                
                                if ($elementAo['CTR_LIV']) {
                                    $arrayEntete['LIV_CTR'] = $elementAo['CTR_LIV'];                                    
                                }
                                PanierEntete::updateEntetePanier($_SESSION['id_panier'], $arrayEntete);
                                
                                $_SESSION['PANIER_TYPE_SPEC'] = 'CREEAO'; // Important pour la prise en compte de la date de livraison fourni par l'AO
                                
                                foreach ($listeLigne as & $ligneAO)
                                    if ($ligneAO['DTE_REP'] == $dateRep) {
                                        
                                        // Recuperation de la ligne d'AO associé
                                        
                                        $sql = 'select * from AO_LIGNE with(nolock) ' . 'WHERE NO_AO   = ' . ReplaceSqlPointeur($numAO) . ' ' . 'AND  NO_PO = ' . ReplaceSqlPointeur($ligneAO['NO_PO_AO']);
                                        
                                        if ($ligne = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
       
                                            // Si l'on a des sous lignes concerrnant la ligne de réponse
                                            $sql = 'select * from AO_REPSL with(nolock) ' . 'WHERE NO_AO    = ' . ReplaceSqlPointeur($numAO) . ' ' . 'AND  NO_PO_AO  = ' . ReplaceSqlPointeur($ligneAO['NO_PO_AO']) . ' ' . 'AND  DTE_REP   = \'' . ReplaceSqlPointeur($ligneAO['DTE_REP']) . '\' ' . 'AND  TYPE_FG   = \'' . ReplaceSqlPointeur($ligneAO['TYPE_FG']) . '\' ' . 'AND  CODE_FOU  = \'' . ReplaceSqlPointeur($ligneAO['CODE_FOU']) . '\' ' . 'AND  C_V       = \'' . ReplaceSqlPointeur($ligneAO['C_V']) . '\' ' . 'ORDER BY NO_SSLIG';
                                            if ($listeSousligne = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous()) {
    
                                                foreach ($listeSousligne as & $Sousligne) {
                                                    $itemPanier['PROVENANCE'] = Article::AO;
                                                    $itemPanier['COD_ART'] = $Sousligne['CODE_ART'];
                                                    $itemPanier['DES_ART'] = $Sousligne['DES_ART'];
                                                    $itemPanier['REF_FAB'] = $Sousligne['REF_FAB'];
                                                    $itemPanier['REF_FOURN'] = $Sousligne['REF_FOUR'];
                                                    if ($ligneAO['QTE'] == 0) // Si quantité de l'article de base = 0 alors simplement la quantité proposé
                                                        $itemPanier['qte'] = $Sousligne['QTE_PROP'];
                                                    else
                                                        $itemPanier['qte'] = $ligneAO['QTE'] * $Sousligne['QTE_PROP'];
                                                    
                                                    $itemPanier['COD_GAM'] = $Sousligne['COD_GAM'];
                                                    $itemPanier['COD_FAB'] = $Sousligne['COD_FAB'];
                                                    
                                                    $itemPanier['COD_SFAM'] = $ligne['SSFAMILLE']; // EDP INCOHERENT dans la partie ligne on recupere le code sous famille mais pour les sous lignes on fait quoi
                                                    
                                                    $itemPanier['PX_ART'] = $Sousligne['PU'];
                                                    $itemPanier['PX_ART_INIT'] = $Sousligne['PU'];
                                                    $itemPanier['COD_FOURN'] = $codeFour;
                                                    $itemPanier['ARTASSOCIE'] = false;
                                                    $itemPanier['COEFCONV'] = 0;
                                                    $itemPanier['ID_CAT'] = '';
                                                    $itemPanier['CATPRLST'] = '';
                                                    $itemPanier['COD_UNIT'] = $ligneAO['UNITE'];
                                                    
                                                    $itemPanier['type_de_ligne'] = 1;
                                                    
                                                    $DATELIVR = '';
                                                    if ($elementAo['TYPEDEL'] == 'D') {
                                                        if ($ligneAO['DELAI'] != '' || $ligneAO['DELAI'] != '00000000')
                                                            $DATELIVR = convertDateSqlToFr($ligneAO['DELAI']); // Imperatif mettre au format user final car c'est la fonction insert qui traduit dans l'autre sens
                                                    } else if ($elementAo['TYPEDEL'] == 'T')
                                                        $DATELIVR = null; // Le calcul est la règle de base faite par les routines d'insertion standard
                                                    else if ($elementAo['TYPEDEL'] == 'J') {
                                                        $DATELIVR = PanierLigne::getDateLivraisonMin($ligneAO['DELAIJ'], $_SESSION['Session_DureeTraitementDA']);
                                                    }
                                                    
                                                    $itemPanier['DES_COMP'] = $ligneAO['DCOMP'];
                                                    
                                                    if ((! array_key_exists('COD_UNIT', $itemPanier) || '' == $itemPanier['COD_UNIT']))
                                                        $itemPanier['COD_UNIT'] = Param::getUniteDefautHaplus();
                                                    
                                                    // Pour les lignes libres importées, on initialise la sous-famille.
                                                    if ((! array_key_exists('COD_SFAM', $itemPanier) || '' == $itemPanier['COD_SFAM'])) {
                                                        if (Article::isArticleHAPLUS($itemPanier['COD_ART'])) {
                                                            $info_art = Article::getInfoOnArticle($itemPanier['COD_ART']);
                                                            $itemPanier['COD_SFAM'] = $info_art['SSFAM'];
                                                        } else {
                                                            $sous_famille_defaut = Param::getSousFamilleArtLibre();
                                                            $itemPanier['COD_SFAM'] = $sous_famille_defaut['CODE_SFAM'];
                                                        }
                                                    }
                                                    
                                                    if (! array_key_exists('COD_DEV', $itemPanier))
                                                        $itemPanier['COD_DEV'] = '';
                                                    
                                                    if ($itemPanier['COD_DEV'] == '' && $itemPanier['COD_FOURN'] != '') {
                                                        $frs = new Fournisseur($itemPanier['COD_FOURN'], true);
                                                        $itemPanier['COD_DEV'] = $frs->getDEVISE();
                                                    }
                                                    
                                                    if ($itemPanier['COD_DEV'] == '')
                                                        $itemPanier['COD_DEV'] = $panierEntete->getCOD_DEV();
                                                    
                                                    $itemPanier['SI_CODE'] = $panierEntete->getSI_CODE();
                                                    if (! array_key_exists('SI_CODE', $itemPanier))
                                                        if (! array_key_exists('CG_CODE', $itemPanier))
                                                            $itemPanier['CG_CODE'] = $panierEntete->getCG_CODE();
                                                    if (! array_key_exists('CDC_CODE', $itemPanier))
                                                        $itemPanier['CDC_CODE'] = $panierEntete->getCDC_CODE();
                                                    if (! array_key_exists('SCA_CODE', $itemPanier))
                                                        $itemPanier['SCA_CODE'] = $panierEntete->getSCA_CODE();
                                                    if (! array_key_exists('CTR_LIVR', $itemPanier))
                                                        $itemPanier['CTR_LIVR'] = $panierEntete->getLIV_CTR();
                                                    elseif ($itemPanier['CTR_LIVR'] == '')
                                                        $itemPanier['CTR_LIVR'] = $panierEntete->getLIV_CTR();
                                                    if (! array_key_exists('MODE_TRS', $itemPanier))
                                                        $itemPanier['MODE_TRS'] = $panierEntete->getMOD_TRS();
                                                    if (! array_key_exists('DATELIVR', $itemPanier))
                                                        $itemPanier['DATELIVR'] = $itemPanier['DATELIVR'] = '00/00/0000';
                                                    
                                                    if (array_key_exists('TAUX_TVA', $itemPanier))
                                                        $itemPanier['TAUX_TVA'] = Article::getTauxTva($itemPanier['type_de_ligne'], $itemPanier['COD_ART'], $itemPanier['COD_SFAM'], $itemPanier['COD_FOURN'], $itemPanier['TAUX_TVA']);
                                                    else
                                                        $itemPanier['TAUX_TVA'] = Article::getTauxTva($itemPanier['type_de_ligne'], $itemPanier['COD_ART'], $itemPanier['COD_SFAM'], $itemPanier['COD_FOURN']);
                                                    
                                                    $idLigPere = InsertQteArticlePanier($_SESSION['id_panier'], 1, $itemPanier, $itemPanier['qte'], '', '', '', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', $panierEntete->getLIV_CTR(), $panierEntete->getMOD_TRS(), '', 0, $DATELIVR, false, true, NULL);
                                                    // Imperatif il faut obtenir le critère de regoupement qui a été fabriqué 200810296
                                                    
                                                    /*** SPEC 4241 Caractéristiques complémentaires : initialisation des CC pour la ligne ***/
                                                    // TODO SPEC 4241 : à modifier lorsque les CC sur les lignes d'AO seront opérationnelles
                                                    $liste_cc_nouvelle_ligne = CaracteristiquesCompl::getListeCCInit($itemPanier['COD_SFAM'], '', $itemPanier['COD_ART']);
                                                    $SqlListe = new PileSql(DB_OXAPROCDB);
                                                    CaracteristiquesCompl::InsertListeCC($SqlListe, $liste_cc_nouvelle_ligne, 'PAN', $_SESSION['id_panier'], $idLigPere, $_SESSION['id_user']);
                                                    $SqlListe->Commit();
                                                    // MAJ des CC calculé
                                                    CaracteristiquesCompl::majCcCalc(['PU', 'MNT_LIG_HT', 'MNT_LIG_TTC'], 'PAN', $_SESSION['id_panier'], $idLigPere, $_SESSION['id_user']);
                                                }
                                            } else {
                                                $itemPanier['PROVENANCE'] = Article::AO;
                                                $itemPanier['COD_ART'] = $ligneAO['CODE_ART'];
                                                $itemPanier['DES_ART'] = $ligneAO['DES_ART'];
                                                $itemPanier['REF_FAB'] = $ligneAO['REF_FAB'];
                                                $itemPanier['REF_FOURN'] = $ligneAO['REF_FOUR'];
                                                $itemPanier['qte'] = $ligneAO['QTE'];
                                                
                                                $itemPanier['COD_GAM'] = $ligneAO['COD_GAM'];
                                                $itemPanier['COD_FAB'] = $ligneAO['COD_FAB'];
                                                
                                                $itemPanier['COD_SFAM'] = $ligne['SSFAMILLE'];
                                                
                                                $itemPanier['PX_ART'] = $ligneAO['PU'];
                                                $itemPanier['PX_ART_INIT'] = $ligneAO['PU'];
                                                $itemPanier['COD_FOURN'] = $codeFour;
                                                $itemPanier['ARTASSOCIE'] = false;
                                                $itemPanier['COEFCONV'] = 0;
                                                $itemPanier['ID_CAT'] = '';
                                                $itemPanier['CATPRLST'] = '';
                                                $itemPanier['COD_UNIT'] = $ligneAO['UNITE'];
                                                
                                                $itemPanier['type_de_ligne'] = 1;
                                                
                                                $DATELIVR = '';
                                                if ($elementAo['TYPEDEL'] == 'D') {
                                                    if ($ligneAO['DELAI'] != '' || $ligneAO['DELAI'] != '00000000')
                                                        $DATELIVR = convertDateSqlToFr($ligneAO['DELAI']); // Imperatif mettre au format user final car c'est la fonction insert qui traduit dans l'autre sens
                                                } else if ($elementAo['TYPEDEL'] == 'T')
                                                    $DATELIVR = null; // Le calcul est la règle de base faite par les routines d'insertion standard
                                                else if ($elementAo['TYPEDEL'] == 'J') {
                                                    $DATELIVR = PanierLigne::getDateLivraisonMin($ligneAO['DELAIJ'], $_SESSION['Session_DureeTraitementDA']);
                                                }
                                                
                                                // RS_FAB LIB_GAM LIB_SFAM
                                                
                                                // SSFAMILLE provient de AO_LIGNE sauf que l'on part de AO_REP donc ???
                                                
                                                $nmDesCompl = $ligneAO['DESCOMPL'];
                                                if ($nmDesCompl == 0)
                                                    $itemPanier['DES_COMP'] = '';
                                                else if ($reqMemo = & SqlInfo::rqGetMemo($nmDesCompl)->Trouve1())
                                                    $itemPanier['DES_COMP'] = $reqMemo['CONTMEMO'];
                                                else
                                                    $itemPanier['DES_COMP'] = '';
                                                
                                                if ((! array_key_exists('COD_UNIT', $itemPanier) || '' == $itemPanier['COD_UNIT']))
                                                    $itemPanier['COD_UNIT'] = Param::getUniteDefautHaplus();
                                                
                                                // Pour les lignes libres importées, on initialise la sous-famille.
                                                if ((! array_key_exists('COD_SFAM', $itemPanier) || '' == $itemPanier['COD_SFAM'])) {
                                                    if (Article::isArticleHAPLUS($itemPanier['COD_ART'])) {
                                                        $info_art = Article::getInfoOnArticle($itemPanier['COD_ART']);
                                                        $itemPanier['COD_SFAM'] = $info_art['SSFAM'];
                                                    } else {
                                                        $sous_famille_defaut = Param::getSousFamilleArtLibre();
                                                        $itemPanier['COD_SFAM'] = $sous_famille_defaut['CODE_SFAM'];
                                                    }
                                                }
                                                
                                                if (! array_key_exists('COD_DEV', $itemPanier))
                                                    $itemPanier['COD_DEV'] = '';
                                                
                                                if ($itemPanier['COD_DEV'] == '' && $itemPanier['COD_FOURN'] != '') {
                                                    $frs = new Fournisseur($itemPanier['COD_FOURN'], true);
                                                    $itemPanier['COD_DEV'] = $frs->getDEVISE();
                                                }
                                                
                                                if ($itemPanier['COD_DEV'] == '')
                                                    $itemPanier['COD_DEV'] = $panierEntete->getCOD_DEV();
                                                $itemPanier['SI_CODE'] = $panierEntete->getSI_CODE();
                                                if (! array_key_exists('SI_CODE', $itemPanier))
                                                    if (! array_key_exists('CG_CODE', $itemPanier))
                                                        $itemPanier['CG_CODE'] = $panierEntete->getCG_CODE();
                                                if (! array_key_exists('CDC_CODE', $itemPanier))
                                                    $itemPanier['CDC_CODE'] = $panierEntete->getCDC_CODE();
                                                if (! array_key_exists('SCA_CODE', $itemPanier))
                                                    $itemPanier['SCA_CODE'] = $panierEntete->getSCA_CODE();
                                                if (! array_key_exists('CTR_LIVR', $itemPanier))
                                                    $itemPanier['CTR_LIVR'] = $panierEntete->getLIV_CTR();
                                                elseif ($itemPanier['CTR_LIVR'] == '')
                                                    $itemPanier['CTR_LIVR'] = $panierEntete->getLIV_CTR();
                                                if (! array_key_exists('MODE_TRS', $itemPanier))
                                                    $itemPanier['MODE_TRS'] = $panierEntete->getMOD_TRS();
                                                if (! array_key_exists('DATELIVR', $itemPanier))
                                                    $itemPanier['DATELIVR'] = $itemPanier['DATELIVR'] = '00/00/0000';
                                                
                                                if (array_key_exists('TAUX_TVA', $itemPanier))
                                                    $itemPanier['TAUX_TVA'] = Article::getTauxTva($itemPanier['type_de_ligne'], $itemPanier['COD_ART'], $itemPanier['COD_SFAM'], $itemPanier['COD_FOURN'], $itemPanier['TAUX_TVA']);
                                                else
                                                    $itemPanier['TAUX_TVA'] = Article::getTauxTva($itemPanier['type_de_ligne'], $itemPanier['COD_ART'], $itemPanier['COD_SFAM'], $itemPanier['COD_FOURN']);

                                                $idLigPere = InsertQteArticlePanier($_SESSION['id_panier'], 1, $itemPanier, $itemPanier['qte'], '', '', '', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', // L'axe d'imputation est mis à blanc car c'est le process d'insertion qui va declenché les init
'', $panierEntete->getLIV_CTR(), $panierEntete->getMOD_TRS(), '', 0, $DATELIVR, false, true, NULL);
                                                // Imperatif il faut obtenir le critère de regoupement qui a été fabriqué 200810296
                                                
                                                /*** SPEC 4241 Caractéristiques complémentaires : initialisation des CC pour la ligne ***/
                                                // TODO SPEC 4241 : à modifier lorsque les CC sur les lignes d'AO seront opérationnelles 
                                                //dossier 33323 : l'action est déjà faite dans InsertQteArticlePanier()
                                                /*$liste_cc_nouvelle_ligne = CaracteristiquesCompl::getListeCCInit($itemPanier['COD_SFAM'], '', $itemPanier['COD_ART']);
                                                $SqlListe = new PileSql(DB_OXAPROCDB);
                                                CaracteristiquesCompl::InsertListeCC($SqlListe, $liste_cc_nouvelle_ligne, 'PAN', $_SESSION['id_panier'], $idLigPere, $_SESSION['id_user']);
                                                $SqlListe->Commit();
                                                // MAJ des CC calculé
                                                CaracteristiquesCompl::majCcCalc(['PU', 'MNT_LIG_HT', 'MNT_LIG_TTC'], 'PAN', $_SESSION['id_panier'], $idLigPere, $_SESSION['id_user']);
                                               */
                                            }
                                        } else {
                                            $message = Affichage::messageJS(trad('Anomalie système ligne d\'AO non trouvée'), false, $passerelleV1V2);
                                            return $message;
                                        }
                                    }
                            }
                        }
                    }
                }

                if ($panierCree) {
                    
                    if($codeSte!='')
                    {
                        $_SESSION['Session_SocUsr'] = $codeSte;
                    }
                    
                    $clTraitement = ValideIntPanier('panier_ong_2_ao', true);
                    $clTraitement->addVariable('requeteAO', $elementAo);
                    $clTraitement->addVariable('arrayInfoRuptureCde', $arrayInfoRuptureCde);
                    $clTraitement->saveSession();
                    
                    $_SESSION['PANIER_TYPE_SPEC'] = '';
                    return true;
                } else{
                    $message = Affichage::messageJS(trad('Impossible de crée le panier, aucune ligne de selectionnée pour les fournisseurs retenus'), false, $passerelleV1V2);                    
                }
            } else {
                $message = Affichage::messageJS(trad('Impossible de crée le panier, aucune ligne de réponse pour le fournisseur retenu'), false, $passerelleV1V2);
            }
                
        return $message??false;
    }

    /**
     *
     * @param unknown $login
     * @param unknown $num_AO
     * @param unknown $formatEdition
     *            TRUE Ponctuel FALSE marché (>Format edition de l'AO. P pour Type Ponctuel , M pour Type Marché)
     */
    static public function &CallWsdlImprimeAO($login, $num_AO, $formatEdition, $tousFournisseur, $typeFournisseur, $codeFournisseur, $par_mail, $format_excel)
    {
        // pour la valeur false, il faudrat mettre une popup devant pour permettre la selection du fournisseur
        $envoi = '<Utilisateur>' . $login . '</Utilisateur>' . '<NumAO>' . $num_AO . '</NumAO>' . '<ParMail>' . BoolWsdl($par_mail) . '</ParMail>' . '<FormatEdition>' . ($formatEdition ? 'P' : 'M') . '</FormatEdition>' . 
        '<TousOuUnFournisseur>' . ($tousFournisseur ? 'T' : 'U') . '</TousOuUnFournisseur>' . ($tousFournisseur ? '' : '<TypeFournisseur>' . $typeFournisseur . '</TypeFournisseur>' . '<CodeFournisseur>' . $codeFournisseur . '</CodeFournisseur>') . '';
        if (BoolSql($format_excel)) {
            $envoi .= '<Excel>' . 'true' . '</Excel>';
        } else {
            $envoi .= '<Excel>' . 'false' . '</Excel>';
        }
        
        if (BoolSql($par_mail)) {
            $properties = Properties::getObjectSession(AO::NAME_POP_IMP_AO);
            if ($properties instanceof Properties) {
                $refListeFour = $properties->getProperties('mailFour');
                
                $complement = '';
                XmlEntities($refListeFour);
                foreach ($refListeFour as & $listeFour) {
                    $tmp = explode('|', $listeFour['four']['!index']);
                    $complement .= '<Fournisseur>' . '<TypeFournisseur>' . $tmp[0] . '</TypeFournisseur>' . '<CodeFournisseur>' . $tmp[1] . '</CodeFournisseur>' . '<Mail>' . $listeFour['mail']['!value'] . '</Mail>' . '</Fournisseur>';
                }
            }
            if ($complement != '')
                $envoi .= '<ListeMailsFournisseurs>' . $complement . '</ListeMailsFournisseurs>';
        }
        
        $envoi = '<ImprAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</ImprAOIn>';
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'OXAPRC_IMPRIMEAO', $envoi);
    }

    static public function &CallWsdlImprimeTableauAO($login, $num_AO)
    {
        $envoi = '<Utilisateur>' . $login . '</Utilisateur>' . '<NumAO>' . $num_AO . '</NumAO>' . '';
        
        $envoi = '<ImpCompAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</ImpCompAOIn>';
        
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', ' OXAPRC_AO_COMPMOINSDISANT', $envoi);
    }

    static public function &CallWsdlExportComparatifExcel($login, $num_AO, $devise)
    {
        $envoi = '<Utilisateur>' . $login . '</Utilisateur>' . '<NumAO>' . $num_AO . '</NumAO>' . '<DeviseEdition>' . $devise . '</DeviseEdition>';
        $envoi = '<ExportCompExcelAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</ExportCompExcelAOIn>';
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'OXAPRC_AO_EXPORT_COMP_EXCEL', $envoi);
    }

    static public function &CallWsdlImprimeReponseAO($login, $num_AO, $typeTarif, $tousFournisseur, $typeFournisseur, $codeFournisseur)
    {
        // pour la valeur false, il faudrat mettre une popup devant pour permettre la selection du fournisseur
        $envoi = '<Utilisateur>' . $login . '</Utilisateur>' . '<NumAO>' . $num_AO . '</NumAO>' . '<TypeTarif>' . ($typeTarif ? 'M' : 'D') . '</TypeTarif>' . // M Meilleur Réponse D Dernière réponse

        '<TousOuUnFournisseur>' . ($tousFournisseur ? 'T' : 'U') . '</TousOuUnFournisseur>' . ($tousFournisseur ? '' : '<TypeFournisseur>' . ($typeFournisseur ? 'F' : 'G') . '</TypeFournisseur>' . '<CodeFournisseur>' . $codeFournisseur . '</CodeFournisseur>') . '';
        
        $envoi = '<ImprReponseAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</ImprReponseAOIn>';
        
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'OXAPRC_AO_IMP_REPONSE', $envoi);
    }

    /**
     * Validation d'un AO passage du statut preparation vers autre
     * 
     * @param unknown $login
     * @param unknown $NO_AO
     * @param unknown $validation
     */
    static public function CallWsdlValDeval($login, $NO_AO, $validation, $confirmation = false)
    {
        $envoi = '<Utilisateur>' . $login . '</Utilisateur>' . '<NumAO>' . $NO_AO . '</NumAO>' . '<Mode>' . ($validation ? 'V' : 'D') . '</Mode>' . '<Confirm>' . (BoolWsdl($confirmation)) . '</Confirm>';
        $envoi = '<ValDevalAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</ValDevalAOIn>';
        
        if ($res = Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'OXAPRC_AO_VAL_DEVAL_PREP', $envoi)) {
            // Ticket 27524 => Probleme lors de l'affichage des erreurs
            if ($res['Statut'] == 'O') {
                return true;
            } else if ($res['Statut'] == 'E') {
                Affichage::messageJS($res['Erreur']);
            } else if ($res['Statut'] == 'B') {
                if (count($res['ListAnomalie']['Anomalie']) != 0 && isset($res['ListAnomalie']['Anomalie'][0])) {
                    $errorMessage = '';
                    foreach ($res['ListAnomalie']['Anomalie'] as $errorList) {
                        Affichage::messageJS($errorList['MsgAnomalie']);
                    }
                } else
                    Affichage::messageJS($res['ListAnomalie']['Anomalie']['MsgAnomalie']);
            } else if ($res['Statut'] == 'A' && isset($res['ListAnomalie']['Anomalie']['MsgAnomalie'])) {
                Affichage::messageJS($res['ListAnomalie']['Anomalie']['MsgAnomalie']);
                echo '
                    var r = confirm("'.$res['ListAnomalie']['Anomalie']['MsgAnomalie'].' \nVoulez-vous valider l\'appel d\'offres ?");
                    if (r == true) {
                       CallUrlAsync("gest_AO.php", "action=AO_Valider&no_ao='.$NO_AO.'&confirm=TRUE");
                    }
                ';
            }
        }
        return false;
    }

    static public function CallWsdlSupprime($login, $NO_AO)
    {
        $envoi = '<Utilisateur>' . $login . '</Utilisateur>' . '<NumAO>' . $NO_AO . '</NumAO>';
        
        $envoi = '<SupprAOIn LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</SupprAOIn>';
        
        if ($res = Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'OXAPRC_AO_SUPPRIM', $envoi)) {
            if ($res['Statut'] == 'O') {
                return true;
            } else if ($res['Statut'] == 'E') {
                Affichage::messageJS($res['Erreur']);
            } else if ($res['Statut'] == 'B') {
                Affichage::messageJS($res['ListAnomalie']['Anomalie']['MsgAnomalie']);
            }
        }
        return false;
    }

    /**
     * Cree un AO à partir d'un array depuis le panier
     * 
     * @param unknown $login
     * @param unknown $array
     */
    static public function &CallWsdlCreeAOPanier($login, $modeCreation, & $array, $ListeCs=null, $contexte='')
    {
        if(isset($array['ListLignes']['Ligne']))
        {
            // TODO SPEC 4241 Caractéristiques complémentaires : ajouter les CC
            if(isset($array['ListLignes']['Ligne']['NO_PO'])){
                unset($array['ListLignes']['Ligne']['existCC']);
            }else{
                foreach($array['ListLignes']['Ligne'] as &$ligne){
                    unset($ligne['existCC']);
                }
            }
        }
        
        // SPEC 4557 : ajout des CS AO_ENTET
        $cs = '';
        if(is_array($ListeCs) && count($ListeCs)>0){
            foreach($ListeCs as $key => $value){
                $cs .=
                '<ChpSup>
                    <NOCS>'.$key.'</NOCS>
                    <VALEUR Sectorisation="'.$value['TBLSECTO'].'">'.htmlspecialchars($value['VALEUR']).'</VALEUR>
                </ChpSup>';
            }
        }

        $envoi = '<CodeUtilisateur>' . $login . '</CodeUtilisateur>' . ' <ModeCreation>' . ($modeCreation ? 'true' : 'false') . '</ModeCreation>' . '<Confirmation>true</Confirmation>' . '<AO>' . FluxXml::tradArrayInFluxXml($array, '', $contexte) . '<ListChampsSup>'.$cs.'</ListChampsSup></AO>';
        $envoi = '<MajAOIn  LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</MajAOIn>';
        
        return Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'SRM_AO_ENREG', $envoi);
    }

    // 3621 Initialisation de l'environnement temporaire relatif à la constuction viturel des AO du paniers en cours
    static public function initCreeAOPanier($mode, $no_ao = 0)
    {
        $arrayTemp['AO'] = array(
            '!initPopup' => ($no_ao == 0),
            '!indiceFour' => 0, // Important ce sont des compteurs car si l'on crée puis supprime il ne faut reutiliser les trous en aucun cas
            '!indiceAO' => 1,
            '!mode' => $mode,
            '!no_ao' => $no_ao
        ); // Important ce sont des compteurs car si l'on crée puis supprime il ne faut reutiliser les trous en aucun cas
        
        if ($no_ao == 0)
            $arrayTemp['AO']['!ongletCourant'] = AO::ONGLET_AO_PANIER_BASE;
        else {
            $arrayTemp['AO']['!ongletCourant'] = AO::ONGLET_AO_PANIER_VIRTUEL;
            
            $envoi = '<CodeUtilisateur>' . $login . '</CodeUtilisateur>' . '<NO_AO>' . $no_ao . '</NO_AO>' . '';
            
            $envoi = '<LectureAO_In LngUtilisation="' . $_SESSION['Session_Langue'] . '">' . $envoi . '</LectureAO_In>';
            
            if ($result = Wsdl::wsdlCallGen('Oxaproc_AO.wsdl', 'SRM_AO_LECTURE', $envoi, false)) {
                if ($result['Statut']['#text'] == 'E') {
                    Affichage::messageJS($result['MsgErreur']['#text']);
                    return false;
                }
                // Encore une inovation ce webservice ne renvoi pas de statut si la demande est correcte
                $arrayTemp['AO']['WSDL'] = $result;
            }
        }
        AO::setSessionAoTemp($arrayTemp);
        return true;
    }

    static public function getSessionAoTemp()
    {
        return unserializeSecure($_SESSION[AO::SESSION_AO_TEMP]);
    }

    static public function setSessionAoTemp($arrayTemp)
    {
        $_SESSION[AO::SESSION_AO_TEMP] = serializeSecure($arrayTemp);
    }

    /**
     * Stocke le nouvel onglet actif
     * 
     * @param unknown $ongletDemande
     * @return boolean
     */
    static public function changeOnglet($ongletDemande)
    {
        $arrayTemp = AO::getSessionAoTemp();
        
        $arrayTemp['AO']['!ongletCourant'] = & $ongletDemande;
        
        AO::setSessionAoTemp($arrayTemp);
        return true;
    }

    /**
     * Permet de mettre a jour dans le systeme de session la valeur du post pour un entete d'AO dans le noeud qui du name envoyé par l'input ATTENTION arrete au premier underscor
     * 
     * @param unknown $indexAO
     *            numéro de l'index du systeme de session des differents AO
     * @param unknown $object
     */
    static public function majEnteteAO($indexAO, $object, $reponse = null)
    {
        $arrayTemp = AO::getSessionAoTemp();
        
        $tmp = explode('_', $object);
        
        if (is_null($reponse))
            $reponse = getValue($object);
        
        if (stripos($object, AO::NAME_DTE_REP) === 0)
            $arrayTemp['AO']['entete'][$indexAO]['!DTE_REP'] = $reponse;
        else if (stripos($object, AO::NAME_DTELIMIT) === 0)
            $arrayTemp['AO']['entete'][$indexAO]['!DTELIMIT'] = $reponse;
        else
            $arrayTemp['AO']['entete'][$indexAO][$tmp[0]] = $reponse;
        
        AO::setSessionAoTemp($arrayTemp);
    }

    /*
     * Fonction pour Edition des réponse ou Impression AO
     */
    static function &buildXmlBoiteImpression(& $NO_AO, $ReponseOuAO, $init = true)
    {
        $array['fenetre'] = array(
            'information' => array(
                '!value' => ''
            ),
            'form_parent' => array(
                '!value' => getValue('form_parent')
            ),
            'champ' => array(
                '!value' => getValue('champ')
            ),
            'prg_appel' => array(
                '!value' => getValue('prg_appel')
            ),
            'typeEcran' => array(
                '!value' => $ReponseOuAO
            )
        );
        if ($ReponseOuAO == 'T') {
            $nameObjet = 'popupEditTableauAo';
            $array['fenetre']['action'] = array(
                '!value' => 'Traite("gest_AO.php?action=' . $nameObjet . '",this);'
            );
            $array['popup_title'] = Trad('Editer tableau AO');
        } else if ($ReponseOuAO == 'R') {
            $nameObjet = 'popupImpReponseAo';
            $array['fenetre']['action'] = array(
                '!value' => 'Traite("gest_AO.php?action=' . $nameObjet . '",this);'
            );
            $array['popup_title'] = Trad('Réponse AO par Fournisseurs');
        } else {
            $nameObjet = AO::NAME_POP_IMP_AO;
            $array['fenetre']['action'] = array(
                '!value' => 'Traite("gest_AO.php?action=' . $nameObjet . '",this);'
            );
            $array['popup_title'] = Trad('Impression AO');
        }
        
        if ($init)
            $properties = new Properties();
        else
            $properties = Properties::getObjectSession(AO::NAME_POP_IMP_AO);
        
        $sql = 'select * from AO_FOUR with (nolock) ' . 'WHERE NO_AO = ' . ReplaceSqlPointeur($NO_AO);
        $refListeFour = null;
        $icptFour = 0;
        if ($requeteFourAo = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous()) {
            $array['champs']['CODE_FOU_GRP'] = array(
                '!value' => '',
                '!action' => 'Traite("gest_AO.php?action=popupImpAction",this);'
            );
            foreach ($requeteFourAo as & $fourAo) {
                $element['!value'] = $fourAo['TYPE_FG'] . '|' . $fourAo['CODE_FOU'];
                
                $options = null;
                switch ($fourAo['TYPE_FG']) {
                    case 'F':
                        if ($result = & SqlFrs::rqGetRecordFournis($fourAo['CODE_FOU'])->Trouve1())
                            $element['!libelle'] = $result['RS'];
                        
                        $sql = 'select NOM,EMAIL from CONTFOUR with (nolock) where VIBOXAP = 0x54 and CODE_FOU = \'' . ReplaceSqlPointeur($fourAo['CODE_FOU']) . '\'';
                        break;
                    case 'G':
                        if ($result = & SqlGestFourniss::rqGetInfoGroupeFournisseur($fourAo['CODE_FOU'])->Trouve1())
                            $element['!libelle'] = $result['RS'];
                        
                        $sql = 'select NOM,EMAIL from CONTGF where CODE_GF=\'' . ReplaceSqlPointeur($fourAo['CODE_FOU']) . '\'';
                        break;
                    default:
                        $result = null;
                        $sql = '';
                        break;
                }
                
                if ($sql != '') {
                    if ($resultContact = (new RequeteSQL($sql, DB_OXASQLDB))->TrouveTous()) {
                        foreach ($resultContact as & $ligne)
                            $options[] = array(
                                '!value' => $ligne['EMAIL'],
                                '!texte' => $ligne['NOM']
                            );
                    }
                }
                if (is_array($result)) {
                    $nameCont = 'emailcont_' . $icptFour;
                    
                    if ($init) {
                        $value = $fourAo['EMAILCONT'];
                    } else if ($properties instanceof Properties) {
                        $refListeFour = $properties->getProperties('mailFour');
                        if (! is_null($refListeFour))
                            $value = $refListeFour[$icptFour]['mail']['!value'];
                        else
                            $value = '';
                    } else
                        $value = '';
                    
                    if ($init && $icptFour == 0) {
                        $array['champs']['CODE_FOU_GRP']['!value'] = $element['!value'];
                    }
                    
                    $array['champs']['CODE_FOU_GRP']['option'][] = $element;
                    $refListeFour[$icptFour] = array(
                        'four' => array(
                            '!index' => $element['!value'],
                            '!texte' => $result['RS']
                        ),
                        'mail' => array(
                            '!name' => $nameCont,
                            '!value' => $value,
                            'option' => $options
                        )
                    );
                    $icptFour ++;
                }
            }
        }
        
        if ($init) {
            $properties->setProperties('mailFour', $refListeFour);
            $properties->saveObjectSession($nameObjet);
        }
        
        if (! is_null($refListeFour))
            $array['listeFour'] = & $refListeFour;
        
        $array['hidden'] = array(
            '!name' => 'NO_AO',
            '!value' => $NO_AO
        );
        
        if ($req = & SqlAo::rqGetAO_ParamExcel()->Trouve1())
            $array['ExcelActif'] = '1';
        
        return $array;
    }

    static public function buildXmlInitProprieteNewAO()
    {
        /**
         * Test s'il est possible de creer des AO donc s'il existe des lignes
         */
        $ok = false;
        foreach (getValueAll() as $index => & $value)
            if (stripos($index, 'sel_') === 0 && $value == 'on') {
                $ok = true;
                break;
            }
        if ($ok)
            echo 'OpenPopup("popup_panierversao.php?action=initPopupProp","popup_ao_prop",400,300);';
        else {
            Affichage::messageJS(cnv_to_javascript(trad('Veuillez selectionner au moins une ligne')));
        }
    }

    /**
     * Fonction d'acquisition des propriétés générale pour la fabrication des AO
     * 
     * @return NULL
     */
    static public function buildXmlSaisieProprieteNewAO()
    {
        $array = null;
        
        $arrayTemp = AO::getSessionAoTemp();
        
        $initPopup = $arrayTemp['AO']['!initPopup'];
        
        $array['fenetre'] = array(
            'information' => array(
                '!value' => ''
            ),
            'form_parent' => array(
                '!value' => getValue('form_parent')
            ),
            'champ' => array(
                '!value' => getValue('champ')
            ),
            'prg_appel' => array(
                '!value' => getValue('prg_appel')
            )
        );
        $array['popup_title'] = Trad('Initialisation des AO');
        
        $zone['DTE_REP'] = array(
            '!name' => "DTE_REP",
            '!value' => '',
            '!onclick' => "CL.show(null,document.form_popup_textarea.DTE_REP,null,-80);",
            '!onfocus' => 'SelObj(this);'
        );
        
        $zone['DTELIMIT'] = array(
            '!name' => "DTELIMIT",
            '!value' => '',
            '!onclick' => "CL.show(null,document.form_popup_textarea.DTE_REP,null,-80);",
            '!onfocus' => 'SelObj(this);'
        );
        
        $array['form'] = array(
            '!name' => 'form_popup_textarea',
            '!actionBase' => 'Traite("popup_panierversao.php?action=creeAO",this);',
            'champ' => $zone
        );
        
        // Imperatif, il faut sauvegarder la saisie de l'utilisation car elle sera utilisé après
        // lors de la validation de l'écran intermédiaire
        
        $genXsl = new GenXslt(true);
        echo $genXsl->XslHtml(AO::xslPopupAOnewProp, $array);
    }

    static public function &buildXmlCreeAODepuisPanier()
    {
        $array = null;
        
        $arrayTemp = AO::getSessionAoTemp();
        
        $initPopup = $arrayTemp['AO']['!initPopup'];
        
        $num_AO = $arrayTemp['AO']['!no_ao'];
        $ongletCourant = $arrayTemp['AO']['!ongletCourant'];
        $pageRetour = 'popup_panierversao.php';
        
        if ($num_AO == 0) {
            $array['onglet'] = array(
                '!idPanel' => AO::ID_ONGLET_PANEL_AOPANIER,
                '!idCorps' => AO::ID_ONGLET_CORPS_AOPANIER,
                '!current' => $ongletCourant,
                '!actionBase' => 'Traite("' . $pageRetour . '",this)',
                '!no_ao' => $arrayTemp['AO']['!no_ao']
            );
            
            $array['onglet']['liste'][] = array(
                '!id' => AO::ONGLET_AO_PANIER_BASE,
                '!texte' =>  trad('Ligne de panier'),
                '!action' => 'CallUrl("' . $pageRetour . '?action=changeOnglet&onglet=' . AO::ONGLET_AO_PANIER_BASE . '")',
                '!base' => 1
            );
            
            if (array_key_exists('entete', $arrayTemp['AO']))
                foreach ($arrayTemp['AO']['entete'] as $index => & $ao) {
                    $array['onglet']['liste'][] = array(
                        '!id' => AO::ONGLET_AO_PANIER_VIRTUEL . $index,
                        '!texte' => trad('AO') . $index,
                        '!indice' => $index,
                        '!action' => 'CallUrl("' . $pageRetour . '?action=changeOnglet&onglet=' . AO::ONGLET_AO_PANIER_VIRTUEL . $index . '")',
                        '!base' => 0,
                        'comment' => array(
                            '!name' => AO::NAME_COMMENT_AO . '_' . $index,
                            '!value' => (array_key_exists(AO::NAME_COMMENT_AO, $ao) ? $ao[AO::NAME_COMMENT_AO] : ''),
                            '!tooltip' => trad('Saisie du commentaire de l\'AO')
                        ),
                        'titre' => array(
                            '!name' => AO::NAME_TITRE_AO . '_' . $index,
                            '!value' => (array_key_exists(AO::NAME_TITRE_AO, $ao) ? $ao[AO::NAME_TITRE_AO] : ''),
                            '!tooltip' => trad('Saisie du titre de l\'AO')
                        ),
                        'objet' => array(
                            '!name' => AO::NAME_OBJET_AO . '_' . $index,
                            '!value' => (array_key_exists(AO::NAME_OBJET_AO, $ao) ? $ao[AO::NAME_OBJET_AO] : ''),
                            '!tooltip' => trad('Saisie de l\'object de l\'AO')
                        )
                    );
                }
            
            $nbDec = Param::getNombreDeciamlePU();
            // Traitement pour affichage des lignes de panier non déjà incluse dans un des AO virtuel
            if ($ongletCourant == AO::ONGLET_AO_PANIER_BASE) {
                $array['onglet']['ligne_panier']['!texte'] = trad('Lignes de panier non affecté');
                
                if ($LignesPanier = & SqlPanier::rqSqlLignePanier_1($_SESSION['id_panier'], NULL, 'ALL')->TrouveTous()) {
                    foreach ($LignesPanier as & $element) {
                        if ($element['COD_FOURN'] == Fournisseur::CODE_RESERVE_STOCK)
                            $ligne = array(
                                '!DES_ART' => & $element['DES_ART'],
                                '!TAUX_TVA' => & $element['TAUX_TVA'],
                                '!QTE' => FormatageData::formatQte($element['qte']),
                                '!COD_FOURN' => '',
                                '!COD_DEV' => & $element['COD_DEV']
                            );
                        else
                            $ligne = array(
                                '!DES_ART' => & $element['DES_ART'],
                                '!TAUX_TVA' => & $element['TAUX_TVA'],
                                '!QTE' => FormatageData::formatQte($element['qte']),
                                '!COD_FOURN' => & $element['COD_FOURN'],
                                '!COD_DEV' => & $element['COD_DEV']
                            );
                        
                        // Affichage du prix unitaire
                        $prixBase = $element['PX_ART'];
                        if (0 == $element['PX_ART'] && Param::getParamActiverLibellePrixZero())
                            $txtArt = Param::getParamGetLibellePrixZero();
                        else {
                            // SPEC 3502
                            if (Param::isAfficheTtc())
                            {
                                $prixBase = Article::getPrixTtc($prixBase, $element['TAUX_TVA']);
                            }
                            else
                            {
                                $prixBase =  Article::getInfoPuLigneLibre($element['COD_ART'], $element['COD_ACD'], $element['COD_FOURN'], $element['qte']);
                            }
                            
                            $txtArt = FormatageData::formatMontant($prixBase, $nbDec, ' ');
                            
                            $ligne['!MNT_LIGNE'] = FormatageData::formatMontant($prixBase * $element['qte'], 2, ' ');
                        }
                        
                        $ligne['!PX_ART'] = $txtArt;
                        
                        $idLigne = $element['id_lig'];
                        if ($initPopup)
                            $arrayTemp['AO']['ligne'][$idLigne] = array(
                                '!NO_AO' => - 1,
                                '!value' => true
                            );
                        
                        // Affichage coté panier de uniquement les lignes qui ne sont pas affectés sur un AO
                        if ($arrayTemp['AO']['ligne'][$idLigne]['!NO_AO'] == - 1) {
                            $ligne['!value'] = $arrayTemp['AO']['ligne'][$idLigne]['!value'];
                            $ligne['!name'] = 'sel_' . $idLigne;
                            
                            $array['onglet']['ligne_panier']['ligne'][] = $ligne;
                        }
                    }
                }
            } else {
                // Affichage des lignes de panier include dans l'AO + possibilité d'avoir les informations fournisseurs de l'AO + Modification du commentaire de l'AO
                $indiceAO = substr($ongletCourant, mb_strlen(AO::ONGLET_AO_PANIER_VIRTUEL));
                
                if ($LignesPanier = & SqlPanier::rqSqlLignePanier_1($_SESSION['id_panier'], NULL, 'ALL')->TrouveTous()) {
                    foreach ($LignesPanier as & $element) {
                        $idLigne = $element['id_lig'];
                        
                        if ($element['COD_FOURN'] == Fournisseur::CODE_RESERVE_STOCK)
                            $ligne = array(
                                '!DES_ART' => & $element['DES_ART'],
                                '!TAUX_TVA' => & $element['TAUX_TVA'],
                                '!QTE' => FormatageData::formatQte($element['qte']),
                                '!COD_FOURN' => '',
                                '!COD_DEV' => & $element['COD_DEV']
                            );
                        else
                            $ligne = array(
                                '!DES_ART' => & $element['DES_ART'],
                                '!TAUX_TVA' => & $element['TAUX_TVA'],
                                '!QTE' => FormatageData::formatQte($element['qte']),
                                '!COD_FOURN' => & $element['COD_FOURN'],
                                '!COD_DEV' => & $element['COD_DEV']
                            );
                        
                        // Affichage du prix unitaire
                        $prixBase = $element['PX_ART'];
                        if (0 == $element['PX_ART'] && Param::getParamActiverLibellePrixZero())
                            $txtArt = Param::getParamGetLibellePrixZero();
                        else {
                            if (Param::isAfficheTtc()) // SPEC 3502
                                $prixBase = Article::getPrixTtc($prixBase, $element['TAUX_TVA']);
                            
                            $txtArt = FormatageData::formatMontant($prixBase, $nbDec, ' ');
                            
                            $ligne['!MNT_LIGNE'] = FormatageData::formatMontant($prixBase * $element['qte'], 2, ' ');
                        }
                        
                        $ligne['!PX_ART'] = $txtArt;
                        
                        if ($initPopup) {
                            $arrayTemp['AO']['ligne'][$idLigne] = array(
                                '!NO_AO' => - 1,
                                '!value' => true
                            );
                        }
                        
                        // Affichage coté panier de uniquement les lignes qui ne sont pas affectés sur un AO
                        if ($arrayTemp['AO']['ligne'][$idLigne]['!NO_AO'] == $indiceAO) {
                            $ligne['!value'] = $arrayTemp['AO']['ligne'][$idLigne]['!value'];
                            $ligne['!actionSuppression'] = "CallUrl('" . $pageRetour . "','OBJECT=" . AO::TAG_SUP_LIGNE . '' . $idLigne . "');";
                            
                            $array['onglet']['AO']['ligne'][] = $ligne;
                        }
                    }
                }
                
                if (array_key_exists('entete', $arrayTemp['AO']))
                    if (array_key_exists($indiceAO, $arrayTemp['AO']['entete'])) {
                        $array['onglet']['AO']['FOUR'] = array(
                            '!actionAjouter' => "OpenPopup('ctrl_liste_frs.php?action=initPopup&popup_id=FOURNISS&formName=" . AO::FORM_POPUP_AO_PANIER . "&inputField=code_autre_frs','win_pop',800,650);",
                            '!titleAjouter' => 'Ajouter un fournisseur'
                        );
                        
                        $noeudAo = $arrayTemp['AO']['entete'][$indiceAO];
                        $listeFour = &  $noeudAo['FOUR'];
                        if (is_array($listeFour))
                            foreach ($listeFour as $indexF => & $value) {
                                $indiceFour = $value['!indice'];
                                $element = array(
                                    '!COD_FOURN' => $indexF,
                                    '!LIBELLE' => $value['!libelle'],
                                    '!actionSuppression' => "CallUrl('" . $pageRetour . "','OBJECT=" . AO::TAG_SUP_FOUR . '' . $indiceFour . "');"
                                );
                                
                                $array['onglet']['AO']['FOUR']['ligne'][] = $element;
                            }
                        
                        if ($noeudAo['!DTE_REP'] == '' || $noeudAo['!DTE_REP'] == '00000000')
                            $dateRep = '';
                        else
                            $dateRep = convertDateSqlToFr($noeudAo['!DTE_REP']);
                        
                        $name = 'DTE_REP' . '_' . $indiceAO;
                        $array['onglet']['AO']['champ'][]['DTE_REP'] = array(
                            '!name' => $name,
                            '!value' => $dateRep,
                            '!action' => 'Traite("popup_panierversao.php",this)',
                            '!onclick' => "CL.show(null,document.form_popup_textarea." . $name . ",null,-80);"
                        );
                        
                        if ($noeudAo['!DTELIMIT'] == '' || $noeudAo['!DTELIMIT'] == '00000000')
                            $dateRep = '';
                        else
                            $dateRep = convertDateSqlToFr($noeudAo['!DTELIMIT']);
                        
                        $name = 'DTELIMIT' . '_' . $indiceAO;
                        $array['onglet']['AO']['champ'][]['DTELIMIT'] = array(
                            '!name' => $name,
                            '!value' => $dateRep,
                            '!onclick' => "CL.show(null,document.form_popup_textarea." . $name . ",null,-80);",
                            '!action' => 'Traite("popup_panierversao.php",this)',
                            '!onfocus' => 'SelObj(this);'
                        );
                    }
                $array['onglet']['AO']['!texte'] = trad('Contenu de l\'AO') . ' ' . $ongletCourant;
            }
            
            $arrayTemp['AO']['!initPopup'] = false;
        } else { // Mode Edition d'un AO ou consultation
            $num_AO = $arrayTemp['AO']['!no_ao'];
            
            $wsdlAO = & $arrayTemp['AO']['WSDL'];
            
            $index = 0;
            
            $array['onglet'] = array(
                '!idPanel' => AO::ID_ONGLET_PANEL_AOPANIER,
                '!idCorps' => AO::ID_ONGLET_CORPS_AOPANIER,
                '!current' => $ongletCourant,
                '!actionBase' => 'Traite("' . $pageRetour . '",this)',
                '!no_ao' => $arrayTemp['AO']['!no_ao']
            );
            
            $array['onglet']['liste'][] = array(
                '!id' => AO::ONGLET_AO_PANIER_VIRTUEL,
                '!texte' => trad('Ligne de l\'AO'),
                '!action' => 'CallUrl("' . $pageRetour . '?action=changeOnglet&onglet=' . AO::ONGLET_AO_PANIER_BASE . '")',
                '!base' => 1,
                'comment' => array(
                    '!name' => AO::NAME_COMMENT_AO . '_' . $index,
                    '!value' => StdXmlWsdl::getValueZone($wsdlAO['AO']['COMMENT_AO']),
                    '!tooltip' => trad('Saisie du commentaire de l\'AO'),
                    '!disabled' => 1
                ),
                'titre' => array(
                    '!name' => AO::NAME_TITRE_AO . '_' . $index,
                    '!value' => StdXmlWsdl::getValueZone($wsdlAO['AO']['TITRE_AO']),
                    '!tooltip' => trad('Saisie du titre de l\'AO'),
                    '!disabled' => 1
                ),
                'objet' => array(
                    '!name' => AO::NAME_OBJET_AO . '_' . $index,
                    '!value' => StdXmlWsdl::getValueZone($wsdlAO['AO']['OBJET_AO']),
                    '!tooltip' => trad('Saisie de l\'object de l\'AO'),
                    '!disabled' => 1
                )
            );
            
            if ($arrayAo = & $wsdlAO['AO']) {
                // Analyse au niveau de l'entete de l'AO (Pas de saisie de reponse ici)
                $array['onglet']['AO']['champ'][]['DTE_REP'] = array(
                    // '!name' => $name,
                    '!value' => StdXmlWsdl::getValueZone($arrayAo['DTE_REP'])
                    // '!onclick' => "CL.show(null,document.form_popup_textarea.".$name.",null,-80);",
                    // '!action' => 'Traite("popup_panierversao.php",this)',
                    // '!onfocus' => 'SelObj(this);'
                );
                
                // Section concernant les lignes d'AO
                if (array_key_exists('ListLignes', $arrayAo)) {
                    $nodeLigne = & $arrayAo['ListLignes'];
                    
                    if (array_key_exists(1, $nodeLigne['Ligne']))
                        $arrayList = & $nodeLigne['Ligne'];
                    else
                        $arrayList[0] = $nodeLigne['Ligne'];
                    
                    foreach ($arrayList as $index => & $element) {
                        $ligne = array(
                            '!DES_ART' => StdXmlWsdl::getValueZone($element['DES']),
                            '!TAUX_TVA' => StdXmlWsdl::getValueZone($element['TAUX_TVA']),
                            '!QTE' => StdXmlWsdl::getValueZone($element['QTE']),
                            '!BUDGET' => StdXmlWsdl::getValueZone($element['BUDGET'])
                        );
                        
                        $array['onglet']['AO']['ligne'][] = $ligne;
                    }
                }
                
                $array['onglet']['AO']['FOUR'] = array(
                    '!actionAjouter' => "OpenPopup('ctrl_liste_frs.php?action=initPopup&popup_id=FOURNISS&formName=" . AO::FORM_POPUP_AO_PANIER . "&inputField=code_autre_frs','win_pop',800,650);",
                    '!titleAjouter' => 'Ajouter un fournisseur'
                );
                // Section fournisseur
                if (array_key_exists('ListFournisseurs', $arrayAo)) {
                    $nodeLigne = & $arrayAo['ListFournisseurs'];
                    
                    if (array_key_exists(0, $nodeLigne['Fournisseur']))
                        $arrayList = & $nodeLigne['Fournisseur'];
                    else
                        $arrayList[0] = $nodeLigne['Fournisseur'];
                    
                    foreach ($arrayList as $index => $element) {
                        $valeurCodFour = StdXmlWsdl::getValueZone($element['CODE_FOU']);
                        $typeFour = StdXmlWsdl::getValueZone($element['TYPE_FG']);
                        
                        $rs = '';
                        switch ($typeFour) {
                            case 'F':
                                if ($result = & SqlFrs::rqGetRecordFournis($valeurCodFour)->Trouve1())
                                    $rs = $result['RS'];
                                break;
                            case 'G':
                                if ($result = & SqlGestFourniss::rqGetInfoGroupeFournisseur($valeurCodFour)->Trouve1())
                                    $rs = $result['RS'];
                                break;
                            default:
                                break;
                        }
                        
                        if (array_key_exists('!Etat', $element))
                            $etat = $element['!Etat'];
                        else
                            $etat = '';
                        
                        $element = array(
                            '!COD_FOURN' => $valeurCodFour,
                            '!LIBELLE' => $rs,
                            '!actionSuppression' => ($etat == '' ? '' : "CallUrl('" . $pageRetour . "','OBJECT=" . AO::TAG_SUP_FOUR . '' . $index . "');")
                        );
                        
                        $array['onglet']['AO']['FOUR']['ligne'][] = $element;
                    }
                }
            } else
                return false;
        }
        
        AO::setSessionAoTemp($arrayTemp);
        
        AO::addInfoPopup($array, $num_AO);
        return $array;
    }

    static public function supprimeFourPanierAO($indiceAo)
    {
        $arrayTemp = AO::getSessionAoTemp();
        
        $num_AO = $arrayTemp['AO']['!no_ao'];
        if ($num_AO != 0) {
            $result = & $arrayTemp['AO']['WSDL'];
            
            if (array_key_exists(0, $result['AO']['ListFournisseurs']['Fournisseur']))
                $liste = $result['AO']['ListFournisseurs']['Fournisseur'];
            else
                $liste[] = $result['AO']['ListFournisseurs']['Fournisseur'];
            
            unset($liste[$indiceAo]);
            
            $result['AO']['ListFournisseurs']['Fournisseur'] = (count($liste) == 1 ? $liste[0] : $liste);
        } else if (array_key_exists('entete', $arrayTemp['AO']))
            foreach ($arrayTemp['AO']['entete'] as & $elementAO)
                if (array_key_exists('FOUR', $elementAO))
                    foreach ($elementAO['FOUR'] as $index => & $element)
                        if ($element['!indice'] == $indiceAo) {
                            unset($elementAO['FOUR'][$index]);
                            break;
                        }
        
        AO::setSessionAoTemp($arrayTemp);
        
        return true;
    }

    static public function supprimeLignePanierAO($idLigne)
    {
        $arrayTemp = AO::getSessionAoTemp();
        
        $indiceAo = $arrayTemp['AO']['ligne'][$idLigne]['!NO_AO'];
        
        $arrayTemp['AO']['ligne'][$idLigne]['!NO_AO'] = - 1;
        
        // En fonction du cas de figure il peut ausi ne plus y avoir de ligne pour cet AO donc suppression de l'AO en question et si cela est le cas, on repositionne l'onglet sur la liste generale
        
        AO::verifieAOTemp($indiceAo, $arrayTemp);
        return true;
    }

    static public function verifieAOTemp($indiceAO, & $arrayTemp)
    {
        // Si plus de ligne d'article dans cet AO alors suppression de l'item AO Complet
        $existeLigneAO = false;
        if (array_key_exists('ligne', $arrayTemp['AO']))
            foreach ($arrayTemp['AO']['ligne'] as & $element)
                if ($element['!NO_AO'] == $indiceAO) {
                    $existeLigneAO = true;
                    break;
                }
        
        if (! $existeLigneAO) {
            unset($arrayTemp['AO']['entete'][$indiceAO]);
            $arrayTemp['AO']['!ongletCourant'] = AO::ONGLET_AO_PANIER_BASE;
        }
        
        AO::setSessionAoTemp($arrayTemp);
        return true;
    }

    /**
     * Function d'enregistrement du mode de creation AO
     * servant au retour de la saisie de la popup d'initialisation des AO possible de creation
     *
     * @param unknown $mode
     * @return boolean
     */
    static function setModeCreation($mode)
    {
        $arrayTemp = AO::getSessionAoTemp();
        if (array_key_exists('!modeCreation', $arrayTemp) && array_key_exists('!validePopupDef', $arrayTemp)) {
            $arrayTemp = AO::getSessionAoTemp();
            $oldPost = unserializeSecure($arrayTemp['save']);
            
            AO::creeAOetAffiche($oldPost);
            
            // Important relire,
            $arrayTemp = AO::getSessionAoTemp();
            unset($arrayTemp['save']);
            AO::setSessionAoTemp($arrayTemp);
            
            return false;
        } else {
            $arrayTemp['!modeCreation'] = $mode;
            $arrayTemp['save'] = serializeSecure(getValueAll());
            
            AO::setSessionAoTemp($arrayTemp);
            return true;
        }
    }

    static function creeAOetAffiche(& $arraySaisie, $nomEcran = null)
    {
        $arrayTemp = AO::getSessionAoTemp();
        $mode = $arrayTemp['!modeCreation'];
        if ($mode == 'creeAOsimple') {
            $okCreate = AO::creeAOsimplePanier($arraySaisie);
        } else if ($mode == 'creeAOfrs') {
            $okCreate = AO::creeAOMultiplePanier($arraySaisie);
        } else
            $okCreate = false;
        
        if ($okCreate)
            //return $okCreate;
            AO::reafficheElement(AO::buildXmlCreeAODepuisPanier(), $nomEcran);
    }

    /**
     * Creation d'un AO Vituel avec tous les articles et tous les founisseurs
     * 
     * @return boolean
     */
    static public function creeAOsimplePanier(& $arraySaisie)
    {
        $genere = false;
        $tblAO = null;
        $indice = null;
        $indiceFour = 0;
        
        $arrayTemp = AO::getSessionAoTemp();
        
        if (is_array($arraySaisie)) {
            foreach ($arraySaisie as $index => & $value)
                if (stripos($index, 'sel_') === 0 && $value == 'on') {
                    if (! $genere) {
                        $indice = $arrayTemp['AO']['!indiceAO'];
                        $arrayTemp['AO']['!indiceAO'] ++;
                        
                        $arrayTemp['AO']['entete'][$indice] = array(
                            '!texte' => trad('AO ') . $indice,
                            '!DTE_REP' => $arrayTemp['init']['!DTE_REP'] // PAS DE REFERENCE
                        );
                        
                        $tblAO = & $arrayTemp['AO']['entete'][$indice];
                        
                        $genere = true;
                    }
                    $tmp = explode('_', $index);
                    $idLigne = $tmp[1];
                    
                    if ($reqSql = & SqlPanier::rqTrouveLignePanier($_SESSION['id_panier'], $idLigne)->Trouve1()) {
                        $arrayTemp['AO']['ligne'][$idLigne]['!NO_AO'] = $indice;
                        $codFourn = $reqSql['COD_FOURN'];
                        if ($codFourn == Fournisseur::CODE_RESERVE_STOCK)
                            $codFourn = '';
                        
                        if ($codFourn != '') {
                            if (! array_key_exists('FOUR', $tblAO) || ! array_key_exists($codFourn, $tblAO['FOUR'])) {
                                
                                $indiceFour = $arrayTemp['AO']['!indiceFour'];
                                $arrayTemp['AO']['!indiceFour'] ++;
                                
                                $clFourn = new Fournisseur($codFourn);
                                $tblAO['FOUR'][$codFourn] = array(
                                    '!libelle' => ((is_null($clFourn->getEC()) || $clFourn->getEC() == '') ? $clFourn->getRS() : $clFourn->getEC()),
                                    '!indice' => $indiceFour
                                );
                            }
                        }
                    }
                }
            
            // Suppression des informations de type fournisseurs n'ayant pas de fournisseur reel
            if (array_key_exists('AO', $arrayTemp) && array_key_exists('entete', $arrayTemp['AO']))
                foreach ($arrayTemp['AO']['entete'] as & $AO)
                    if (is_array($AO))
                        if (array_key_exists('FOUR', $AO))
                            foreach ($AO['FOUR'] as $index => & $aoFour)
                                if ($index == '')
                                    unset($AO['FOUR']['']);
        }
        
        AO::setSessionAoTemp($arrayTemp);
        return $genere;
    }

    static public function ajouteFournisseur($codFourn)
    {
        $genere = false;
        $arrayTemp = AO::getSessionAoTemp();
        
        $ongletCourant = $arrayTemp['AO']['!ongletCourant'];
        $indexAO = substr($ongletCourant, mb_strlen(AO::ONGLET_AO_PANIER_VIRTUEL));
        
        $tblAO = & $arrayTemp['AO']['entete'][$indexAO];
        
        $no_ao = $arrayTemp['AO']['!no_ao'];
        if ($no_ao != 0) {
            $result = & $arrayTemp['AO']['WSDL'];
            $liste = null;
            if (array_key_exists(0, $result['AO']['ListFournisseurs']['Fournisseur']))
                $liste = $result['AO']['ListFournisseurs']['Fournisseur'];
            else
                $liste[] = $result['AO']['ListFournisseurs']['Fournisseur'];
            
            foreach ($liste as & $elementFrs)
                if ($codFourn == StdXmlWsdl::getValueZoneInterne($elementFrs['CODE_FOU'])) {
                    Affichage::messageJS('Ce fournisseur existe déjà au sein de cet appel d\'offre');
                    return false;
                }
            
            $clFourn = new Fournisseur($codFourn);
            
            $sql = 'select * from CONTFOUR with(nolock) where CODE_FOU= \'' . ReplaceSqlPointeur($codFourn) . '\' and IND_FOU=0';
            if ($req = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                // Rien car tous dans le buffer $req
            } else { // Init du buffer $req
                $req = array(
                    'NOM' => '',
                    'TEL' => '',
                    'FAX' => '',
                    'TELPORT' => '',
                    'EMAIL' => ''
                );
            }
            
            $liste[] = array(
                '!Etat' => 'A',
                'TYPE_FG' => array(
                    '!Format' => 'AU',
                    '#text' => 'F'
                ),
                'CODE_FOU' => array(
                    '!Format' => 'A12',
                    '#text' => $codFourn,
                    '!Objet' => 'FOURNISS'
                ),
                'ADR' => array(
                    '!Format' => 'A90',
                    '#text' => $clFourn->getADR()
                ),
                'CPOSTAL' => array(
                    '!Format' => 'A10',
                    '#text' => $clFourn->getCPOSTAL()
                ),
                'VILLE' => array(
                    '!Format' => 'A35',
                    '#text' => $clFourn->getVILLE()
                ),
                'PAYS' => array(
                    '!Format' => 'A2',
                    '#text' => $clFourn->getCODE_PAYS()
                ),
                'NOM_CTCT' => array(
                    '#text' => $req['NOM']
                ),
                'TEL_CTCT' => array(
                    '#text' => $req['TEL']
                ),
                'POR_CTCT' => array(
                    '#text' => $req['FAX']
                ),
                'FAX_CTCT' => array(
                    '#text' => $req['TELPORT']
                ),
                'EMAILCONT' => array(
                    '#text' => $req['EMAIL']
                )
            );
            
            $result['AO']['ListFournisseurs']['Fournisseur'] = $liste;
        } else if (! array_key_exists('FOUR', $tblAO) || ! array_key_exists($codFourn, $tblAO['FOUR'])) {
            
            $indiceFour = $arrayTemp['AO']['!indiceFour'];
            $arrayTemp['AO']['!indiceFour'] ++;
            
            $clFourn = new Fournisseur($codFourn);
            $tblAO['FOUR'][$codFourn] = array(
                '!libelle' => ((is_null($clFourn->getEC()) || $clFourn->getEC() == '') ? $clFourn->getRS() : $clFourn->getEC()),
                '!indice' => $indiceFour
            );
        }
        
        $genere = true;
        AO::setSessionAoTemp($arrayTemp);
        return $genere;
    }

    static public function creeAOMultiplePanier(& $arraySaisie)
    {
        $genere = false;
        $tblAO = null;
        $indice = null;
        $indiceFour = 0;
        $indiceAO = nulL;
        
        $arrayTemp = AO::getSessionAoTemp();
        
        /**
         * principe d'affectation des articles du panier / generation d'AO sur des fournisseurs non deja présent dans les AO temporaires sinon repartition dans les AO
         */
        if (is_array($arraySaisie)) {
            foreach ($arraySaisie as $index => & $value)
                if (stripos($index, 'sel_') === 0 && $value == 'on') {
                    // Controle si dans les AO existants, ce fournisseur est déjà dedans et si oui on affecte l'article dans cet AO
                    $tmp = explode('_', $index);
                    $idLigne = $tmp[1];
                    
                    $ao = null;
                    if ($reqSql = & SqlPanier::rqTrouveLignePanier($_SESSION['id_panier'], $idLigne)->Trouve1()) {
                        $indexAO = null;
                        $codFourn = $reqSql['COD_FOURN'];
                        if ($codFourn == Fournisseur::CODE_RESERVE_STOCK)
                            $codFourn = '';
                        
                        if (array_key_exists('entete', $arrayTemp['AO']))
                            foreach ($arrayTemp['AO']['entete'] as $indexAOTmp => & $elementAO)
                                if (array_key_exists('FOUR', $elementAO))
                                    foreach ($elementAO['FOUR'] as $codeFour => & $elementFour)
                                        if ($codeFour == $codFourn) {
                                            if (is_null($indexAO))
                                                $indexAO = $indexAOTmp;
                                            break;
                                        }
                        
                        if (! is_null($indexAO)) {
                            $arrayTemp['AO']['ligne'][$idLigne]['!NO_AO'] = $indexAO;
                        } else {
                            // Creation d'un nouvel AO avec l'article et le fournisseur
                            $indexAO = $arrayTemp['AO']['!indiceAO'];
                            $arrayTemp['AO']['!indiceAO'] ++;
                            
                            $arrayTemp['AO']['entete'][$indexAO] = array(
                                '!texte' => trad('AO ') . ($indexAO),
                                '!DTE_REP' => $arrayTemp['init']['!DTE_REP'], // PAS DE REFERENCE
                                '!DTELIMIT' => (array_key_exists('!DTELIMIT', $arrayTemp) ? $arrayTemp['init']['!DTELIMIT'] : '') // PAS DE REFERENCE
                            );
                            
                            $arrayTemp['AO']['ligne'][$idLigne]['!NO_AO'] = $indexAO;
                            
                            $tblAO = & $arrayTemp['AO']['entete'][$indexAO];
                            if (! array_key_exists('FOUR', $tblAO) || ! array_key_exists($codFourn, $tblAO['FOUR'])) {
                                
                                $indiceFour = $arrayTemp['AO']['!indiceFour'];
                                $arrayTemp['AO']['!indiceFour'] ++;
                                
                                if ($codFourn != '') {
                                    $clFourn = new Fournisseur($codFourn);
                                    $tblAO['FOUR'][$codFourn] = array(
                                        '!libelle' => ((is_null($clFourn->getEC()) || $clFourn->getEC() == '') ? $clFourn->getRS() : $clFourn->getEC()),
                                        '!indice' => $indiceFour
                                    );
                                } else {
                                    $tblAO['FOUR'][$codFourn] = array(
                                        '!libelle' => '',
                                        '!indice' => $indiceFour
                                    );
                                }
                            }
                        }
                        $genere = true;
                    }
                }
            
            // Suppression des informations de type fournisseurs n'ayant pas de fournisseur reel
            if (array_key_exists('AO', $arrayTemp) && array_key_exists('entete', $arrayTemp['AO']))
                foreach ($arrayTemp['AO']['entete'] as & $AO)
                    if (is_array($AO))
                        if (array_key_exists('FOUR', $AO))
                            foreach ($AO['FOUR'] as $index => & $aoFour)
                                if ($index == '')
                                    unset($AO['FOUR']['']);
            
            AO::setSessionAoTemp($arrayTemp);
        }
        return $genere;
    }

    static public function afficheElement(& $array)
    {
        AO::addInfoPopup($array);
        
        $genXsl = new GenXslt(true);
        echo $genXsl->XslHtml(AO::xslPopupAOPanier, $array);
    }

    static public function reafficheElement(& $array, $nomEcran = null)
    {
        AO::addInfoPopup($array);
        
        $genXsl = new GenXslt(true);
        $genXsl->XslHtml(AO::xslPopupAOPanier, $array);
        
        if ($nomEcran == null) {
            $genXsl->echoHtml(AO::ID_ONGLET_PANEL_AOPANIER);
            $genXsl->echoHtml(AO::ID_ONGLET_CORPS_AOPANIER);
        } else {
            $prefix = 'Oxa_getDevice().popList["' . $nomEcran . '"].';
            $genXsl->echoHtml(AO::ID_ONGLET_PANEL_AOPANIER, $prefix);
            $genXsl->echoHtml(AO::ID_ONGLET_CORPS_AOPANIER, $prefix);
        }
    }

    static public function addInfoPopup(& $array, $num_AO = 0)
    {
        $array['fenetre'] = array(
            'information' => array(
                '!value' => ''
            ),
            'form_parent' => array(
                '!value' => getValue('form_parent')
            ),
            'champ' => array(
                '!value' => getValue('champ')
            ),
            'prg_appel' => array(
                '!value' => getValue('prg_appel')
            )
        );
        if (! array_key_exists('popup_title', $array))
            if ($num_AO == 0)
                $array['popup_title'] = Trad('Ligne de panier pour AO ');
            else
                $array['popup_title'] = Trad('AO') . ' ' . $num_AO;
    }

    /**
     * Module servant à construire un XML en direction de MAGIC pour la création des AO vis à vis du panier
     * 
     * @return boolean
     */
    static public function enregistreAOPanier()
    {
        $listeAoRet = null;
        $objectDocSuivi = null;
        $arrayTemp = AO::getSessionAoTemp();
        
        $no_ao = $arrayTemp['AO']['!no_ao'];
        
        if ($no_ao != 0) {
            if ($res = AO::CallWsdlCreeAOPanier($_SESSION['Session_Login'], false, $arrayTemp['AO']['WSDL']['AO'])) {
                if ($res['Statut'] == 'E') {
                    Affichage::messageJS($res['MsgErreur']);
                    return false;
                } else if ($res['Statut'] == 'O') {
                    echo 'closePopup();';
                    // Mise à jour du cadre du suivi
                    echo "parent.CallUrl('suivi_doc.php?action=update_ligne&no_doc={$no_ao}&id=" . TypeSuivi::AO_PANIER . "_" . $no_ao . "_globale&type_doc=" . TypeSuivi::AO_PANIER . "', '');";
                }
            }
        } else {
            if (array_key_exists('AO', $arrayTemp) && array_key_exists('entete', $arrayTemp['AO'])) {
                $listeAO = $arrayTemp['AO']['entete'];
                if (count($listeAO) > 0) {
                    // Decision YA le 22/02/2016 Obligation qu'il y a au moins un fournisseur par AO demandé
                    $okToContinue = null;
                    $listeAoErreur = '';
                    foreach ($listeAO as $indiceAO => & $AO) {
                        if (! (array_key_exists('FOUR', $AO) && count($AO['FOUR']) != 0)) {
                            $objetAo = (array_key_exists(AO::NAME_OBJET_AO, $AO) ? $AO[AO::NAME_OBJET_AO] : '');
                            $listeAoErreur .= ($listeAoErreur == '' ? '' : ',') . ' ' . trad('AO') . $indiceAO;
                            $okToContinue = false;
                        }
                        if (is_null($okToContinue))
                            $okToContinue = true;
                    }
                    if ($okToContinue) {
                        foreach ($listeAO as $indiceAO => & $AO) {
                            $titreAo = (array_key_exists(AO::NAME_TITRE_AO, $AO) ? $AO[AO::NAME_TITRE_AO] : '');
                            $objetAo = (array_key_exists(AO::NAME_OBJET_AO, $AO) ? $AO[AO::NAME_OBJET_AO] : '');
                            $commentAo = (array_key_exists(AO::NAME_COMMENT_AO, $AO) ? $AO[AO::NAME_COMMENT_AO] : '');
                            
                            $PanierEntete = new PanierEntete();
                            $PanierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);
                            
                            $array = null;
                            
                            $array['DTE_AO']['#text'] = OxaDate::getToday();
                            $array['ACH']['#text'] = $_SESSION['Session_Login']; // code utilisateur du panier
                            $array['EMETTEUR']['#text'] = $_SESSION['Session_CodeCtrEmetteur']; // centre emetteur de la session
                            $array['DTE_REP']['#text'] = $AO['!DTE_REP']; // Délai de réponse saisie
                            $array['TITRE_AO']['#text'] = $titreAo;
                            $array['COMMENT_AO']['#text'] = $commentAo;
                            $array['OBJET_AO']['#text'] = $objetAo; // valeur saisie au travers au libellé de l'onglet
                            $array['COD_LNG']['#text'] = $_SESSION['Session_Langue'];
                            $array['CODE_STE']['#text'] = $PanierEntete->getCODE_STE(); // Code société de la session
                            $array['BUDG_ENT']['#text'] = $PanierEntete->getBUDGET_DA();
                            $array['DEVISE']['#text'] = $PanierEntete->getCOD_DEV();
                            $array['REPDEV']['#text'] = '';
                            $array['TYPEDEL']['#text'] = '';
                            $array['VARIANTE']['#text'] = 'C'; // Notion de conforme
                            
                            $icpt = 0;
                            if (array_key_exists('FOUR', $AO) && count($AO['FOUR']) != 0)
                                foreach ($AO['FOUR'] as $codeFour => & $four) {
                                    $icpt ++;
                                    $clFour = new Fournisseur($codeFour);
                                    
                                    $sql = 'select * from CONTFOUR with(nolock) where CODE_FOU= \' ' . ReplaceSqlPointeur($codeFour) . ' \' and IND_FOU=0';
                                    if ($req = (new RequeteSQL($sql, DB_OXASQLDB))->Trouve1()) {
                                        // Rien car tous dans le buffer $req
                                    } else { // Init du buffer $req
                                        $req = array(
                                            'NOM' => '',
                                            'TEL' => '',
                                            'FAX' => '',
                                            'TELPORT' => '',
                                            'EMAIL' => ''
                                        );
                                    }
                                    
                                    $ligneFrs['CODE_FOU']['#text'] = $clFour->getCODE();
                                    $ligneFrs['TYPE_FG']['#text'] = 'F'; // Information obligatoire indiquant c'est un code fournisseur et pas un groupement
                                    
                                    $ligneFrs['ADR']['#text'] = $clFour->getADR();
                                    $ligneFrs['CPOSTAL']['#text'] = $clFour->getCPOSTAL();
                                    $ligneFrs['VILLE ']['#text'] = $clFour->getVILLE();
                                    $ligneFrs['PAYS']['#text'] = $clFour->getCODE_PAYS();
                                    
                                    $ligneFrs['NOM_CTCT'] = array(
                                        '#text' => $req['NOM']
                                    );
                                    $ligneFrs['TEL_CTCT'] = array(
                                        '#text' => $req['TEL']
                                    );
                                    $ligneFrs['POR_CTCT'] = array(
                                        '#text' => $req['FAX']
                                    );
                                    $ligneFrs['FAX_CTCT'] = array(
                                        '#text' => $req['TELPORT']
                                    );
                                    $ligneFrs['EMAILCONT'] = array(
                                        '#text' => $req['EMAIL']
                                    );
                                    
                                    $array['ListFournisseurs']['Fournisseur'][$icpt] = $ligneFrs;
                                    $array['ListFournisseurs']['Fournisseur'][$icpt]['!Etat'] = 'A';
                                }
                            
                            $icpt = 0;
                            $tblLigne = null;
                            foreach ($arrayTemp['AO']['ligne'] as $idLigne => & $detail)
                                if ($detail['!NO_AO'] == $indiceAO) {
                                    if ($reqSql = & SqlPanier::rqTrouveLignePanier($_SESSION['id_panier'], $idLigne)->Trouve1()) {
                                        $icpt ++;
                                        $ligneAo['NO_PO']['#text'] = $icpt;
                                        $ligneAo['NO_DA']['#text'] = 0;
                                        $ligneAo['NO_PO_DA']['#text'] = 0;
                                        $ligneAo['CODE_ART']['#text'] = $reqSql['COD_ART'];
                                        $ligneAo['DES']['#text'] = $reqSql['DES_ART'];
                                        $ligneAo['DCOMP']['#text'] = $reqSql['DES_COMP'];
                                        $ligneAo['QTE']['#text'] = $reqSql['qte'];
                                        $ligneAo['UNITE']['#text'] = $reqSql['COD_UNIT'];
                                        
                                        // DELAI DELAIJ DELAIT
                                        // Dossier 25662 : $ligneAo['BUDGET']['#text'] = ($reqSql['budget_tot']!=0 ? $reqSql['budget_tot'] : $reqSql['PX_ART'] * $reqSql['qte']);
                                        $ligneAo['BUDGET']['#text'] = sprintf('%01.2f', $reqSql['budget_tot'] / $reqSql['qte']); // Dossier 25662
                                        $ligneAo['PRIX_REF']['#text'] = $reqSql['PX_ART']; // Dossier 25662
                                        
                                        $ligneAo['SSFAMILLE']['#text'] = $reqSql['COD_SFAM'];
                                        $ligneAo['COD_FAB']['#text'] = $reqSql['COD_FAB'];
                                        $ligneAo['COD_GAM']['#text'] = $reqSql['COD_GAM'];
                                        $ligneAo['REF_FAB']['#text'] = $reqSql['REF_FAB'];
                                        // TITRE_AV
                                        // SSTOTAL TITRE_ST
                                        $array['ListLignes']['Ligne'][$icpt] = $ligneAo;
                                        $array['ListLignes']['Ligne'][$icpt]['!Etat'] = 'A';
                                        
                                        $tblLigne[] = $idLigne;
                                    }
                                }
                            if ($icpt == 0) {
                                Affichage::messageJS(trad('Absence de ligne d\'article pour l\'AO') . ' ' . $titreAo);
                                return false;
                            }
                            
                            if ($res = AO::CallWsdlCreeAOPanier($_SESSION['Session_Login'], true, $array)) {
                                if ($res['Statut'] == 'E') {
                                    Affichage::messageJS($res['MsgErreur']);
                                    return false;
                                } else if ($res['Statut'] == 'O' && array_key_exists('NO_AO', $res)) {
                                    if (is_null($objectDocSuivi))
                                        $objectDocSuivi = new ObjetcDocSuvi();
                                    
                                    if ($objectDocSuivi->ajouteDocument(TypeSuivi::AO, $res['NO_AO'])) {
                                        // Suppression des lignes de panier associé
                                        foreach ($tblLigne as & $idLigne)
                                            PanierLigne::deleteLignePanier($_SESSION['id_panier'], $idLigne);
                                    }
                                }
                            }
                        }
                        if ($objectDocSuivi instanceof ObjetcDocSuvi) {
                            $objectDocSuivi->saveObjectSession('listeWsdlDoc');
                            echo "parent.CallUrlAsync('suivi_doc.php','action=listeCreatedAoDocs','", cnv_to_javascript(Trad('Chargement du suivi des AO ...')), '\');';
                        }
                    } else {
                        Affichage::messageJS(trad('Fournisseur manquant :') . ' (' . $listeAoErreur . ')');
                        return false;
                    }
                } else {
                    Affichage::messageJS(trad('Veuillez créer au moins un AO'));
                    return false;
                }
            } else {
                Affichage::messageJS(trad('Veuillez créer au moins un AO'));
                return false;
            }
        }
    }
}

// fin de la classe AO