<?php

class AO_ImportDA
{

    const fichierXsl = 'application/xsl/ao_panier/import_DA.xsl';

    const fichierPhp = 'ao_panier_import_da.php';

    const id_main = 'div_main';

    const id_form_criteres = 'form_ao_criteres_da';

    const id_div_criteres = 'id_ao_criteres_da';

    const id_form_ligne_selection = 'form_selection_da';

    const id_div_ligne_selection = 'ligne_selection_da';

    const id_nb_ligne_selection = 'nb_ligne_selection_da';

    const id_div_total_selection = 'total_selection_da';

    const id_total_ligne_selection = 'nb_ligne_selection_total_da';

    const libelle_visualisation = 'libelle_filtre_visu';

    const filtre_visualisation = 'selection_filtre_visu';

    const filtre_visu_toutes = 'ALL';

    const filtre_visu_selection = 'SEL';

    const filtre_visu_non_selection = 'NON_SEL';

    const action_enregistrer = 'enregistrer';

    const action_annuler = 'annuler';

    const action_selectionner = 'selectionner';

    const tableau_sel_tout = 'select_all';

    const tableau_sel_rupture1 = 'select_rupture1';

    const tableau_sel_rupture2 = 'select_rupture2';

    const id_div_resultat_rech = 'id_ao_resultat_rech';

    const id_session = TypeSuivi::AO_IMPORTDA;

    private $no_ao;

    private $infos_ao;

    private $count_total;

    private $count_total_ok;

    private $requete_paginee;

    private $selection_en_cours;

    private $id_affiches;

    function __construct($no_ao = '')
    {
        $no_ao_tmp = trim($no_ao);
        if ('' != $no_ao_tmp) {
            $this->no_ao = $no_ao_tmp;
            // recherche les informations de l'AO
            $this->infos_ao = SqlAo::rqGetAOPanier($no_ao_tmp)->Trouve1();
            $this->count_total = 0;
            $this->count_total_ok = false;
            $this->selection_en_cours = array();
            
            $this->requete_paginee = new RequetePaginee_AO_ImportDA(TypeSuivi::AO_IMPORTDA);
            $this->requete_paginee->initPerimetre();
            $this->requete_paginee->setNavigationCallbacks(AO_ImportDA::fichierPhp, CriteresRecherche::btnRechercher, AO_ImportDA::id_form_criteres);
        }
    }

    function setToSession()
    {
        $tableau_valeurs = array(
            'no_ao' => serializeSecure($this->no_ao),
            'infos_ao' => serializeSecure($this->infos_ao),
            'count_total' => serializeSecure($this->count_total),
            'count_total_ok' => serializeSecure($this->count_total_ok),
            'requete_paginee' => $this->requete_paginee->saveToString(),
            'selection_en_cours' => serializeSecure($this->selection_en_cours),
            'id_affiches' => serializeSecure($this->id_affiches)
        );
        $_SESSION[AO_ImportDA::id_session] = serializeSecure($tableau_valeurs);
    }

    public static function &getFromSession()
    {
        $obj_import = null;
        if (array_key_exists(AO_ImportDA::id_session, $_SESSION)) {
            $array_tmp = unserializeSecure($_SESSION[AO_ImportDA::id_session]);
            $obj_import = new AO_ImportDA();
            $obj_import->no_ao = unserializeSecure($array_tmp['no_ao']);
            $obj_import->count_total = unserializeSecure($array_tmp['count_total']);
            $obj_import->count_total_ok = unserializeSecure($array_tmp['count_total_ok']);
            $obj_import->infos_ao = unserializeSecure($array_tmp['infos_ao']);
            $obj_import->requete_paginee = new RequetePaginee_AO_ImportDA(TypeSuivi::AO_IMPORTDA);
            $obj_import->requete_paginee->loadFromString($array_tmp['requete_paginee']);
            $obj_import->selection_en_cours = unserializeSecure($array_tmp['selection_en_cours']);
            $obj_import->id_affiches = unserializeSecure($array_tmp['id_affiches']);
        }
        return $obj_import;
    }

    public static function clearSession()
    {
        if (array_key_exists(AO_ImportDA::id_session, $_SESSION))
            unset($_SESSION[AO_ImportDA::id_session]);
    }

    function isCountTotalOk()
    {
        return $this->count_total_ok;
    }

    function &buildXmlLigneSelection()
    {
        $array = array();
        
        //
        // Affichage du nombre de lignes sélectionnées
        //
        $array['!id_form_ligne_selection'] = AO_ImportDA::id_form_ligne_selection;
        $array['!id_nb_ligne_selection'] = AO_ImportDA::id_nb_ligne_selection;
        $array['!valeur_ligne_selection'] = trad('Aucune sélection');
        $array['!id_total_selection'] = AO_ImportDA::id_div_total_selection;
        $array['!valeur_total_selection'] = 0;
        
        //
        // Sélection du mode d'affichage (tout / sélectionné / non sélectionné)
        //
        $id_filtre_select = AO_ImportDA::filtre_visualisation;
        // $action = 'TraiteUrlAsync("'.AO_ImportDA::fichierPhp.'?action='.$id_filtre_select.'&value=" + document.getElementById("'.$id_filtre_select.'").value, document.forms["'.AO_ImportDA::id_form_criteres.'"].elements[0]);';
        $action = 'TraiteUrlAsync("' . AO_ImportDA::fichierPhp . '?action=' . $id_filtre_select . '&value=" + document.forms["' . AO_ImportDA::id_form_ligne_selection . '"].elements["' . $id_filtre_select . '"].value, document.forms["' . AO_ImportDA::id_form_criteres . '"].elements[0]);';
        $liste_visualisation = array(
            array(
                '!value' => AO_ImportDA::filtre_visu_toutes,
                '!texte' => Trad('Toutes')
            ),
            array(
                '!value' => AO_ImportDA::filtre_visu_selection,
                '!texte' => Trad('Sélection')
            ),
            array(
                '!value' => AO_ImportDA::filtre_visu_non_selection,
                '!texte' => Trad('Non sélectionnées')
            )
        );
        $compXslSelection = new ComposantXslSelection($id_filtre_select);
        $compXslSelection->setAction($action);
        $compXslSelection->setListeOptions($liste_visualisation);
        $array[AO_ImportDA::filtre_visualisation] = $compXslSelection->buildXml();
        
        //
        // Sélection du mode d'affichage (tout / sélectionné / non sélectionné)
        //
        $id_libelle_visu = AO_ImportDA::libelle_visualisation;
        $libelle = Trad('Nombre de lignes sélectionnées') . ' : ';
        $compXsl = new ComposantXslLienAction($id_libelle_visu);
        $compXsl->setAction($action); // La même que précédemment
        $compXsl->setLibelle($libelle);
        $array[AO_ImportDA::libelle_visualisation] = $compXsl->buildXml();
        
        //
        // Bouton Enregistrer
        //
        $id = AO_ImportDA::action_enregistrer;
        $libelle = Trad('Enregistrer');
        $action = 'TraiteUrlAsync("' . AO_ImportDA::fichierPhp . '?action=' . $id . '", document.forms["' . AO_ImportDA::id_form_criteres . '"].elements[0]);';
        $compXsl = new ComposantXslAction($id);
        $compXsl->setAction($action);
        $compXsl->setLibelle($libelle);
        $compXsl->setEstPrimaire(true);
        $array[AO_ImportDA::action_enregistrer] = $compXsl->buildXml();
        
        //
        // Bouton annuler
        //
        $id = AO_ImportDA::action_annuler;
        $libelle = Trad('Annuler');
        $action = 'TraiteUrlAsync("' . AO_ImportDA::fichierPhp . '?action=' . $id . '", document.forms["' . AO_ImportDA::id_form_criteres . '"].elements[0]);';
        $compXsl = new ComposantXslAction($id);
        $compXsl->setAction($action);
        $compXsl->setLibelle($libelle);
        $array[AO_ImportDA::action_annuler] = $compXsl->buildXml();
        
        return $array;
    }

    function &buildXml()
    {
        $array = array();
        $critereRecherche = new CriteresRecherche(TypeSuivi::AO_IMPORTDA, CriteresRecherche::reinitLesChp, AO_ImportDA::id_form_criteres);
        $callback = AO_ImportDA::fichierPhp;
        $critereRecherche->setCallBackRecherche($callback);
        
        // valeur idem buildXmlLigneSelection
        $nom = AO_ImportDA::filtre_visualisation;
        $valeur = AO_ImportDA::filtre_visu_toutes;
        $critereRecherche->ajouteChampCache($nom, $valeur);
        
        $nom = 'no_ao';
        $valeur = $this->no_ao;
        $critereRecherche->ajouteChampCache($nom, $valeur);
        
        $array['form'] = array(
            '!id' => AO_ImportDA::id_form_criteres,
            '!div_id' => AO_ImportDA::id_div_criteres,
            '!id_result_rech' => AO_ImportDA::id_div_resultat_rech,
            'criteres' => $critereRecherche->buildXml()
        );
        
        $array['ligneSelection'] = $this->buildXmlLigneSelection();
        $array['action'] = 'AffichePopup';
        $array['popup_title'] = strBuild(Trad('Appel d\'offre N° @1@ créé le @2@ par @3@'), $this->no_ao, convertDateSqlToFr($this->infos_ao['DTE_AO']), $this->infos_ao['NOM_ACH']);
        
        return $array;
    }

    function getCountTotal()
    {
        // D'abord, on calcul es lignes de résultat
        $this->count_total = $this->requete_paginee->getCountTotal();
        
        // On met à jour l'information de count total
        $this->count_total_ok = true;
        
        // On sauvegarde l'information de count total
        $this->setToSession();
        
        return $this->count_total;
    }

    function &getValeurRuptureSurLibelle(& $type_rupture, & $reqSql)
    {
        switch ($type_rupture) {
            case ChampRecherche::Acheteur:
                $code = $reqSql['ACHETEUR'];
                $lib = $reqSql['Acheteur_lib'];
                break;
            
            case ChampRecherche::Demandeur:
                $code = $reqSql['NO_DEM'];
                $lib = $reqSql['Demandeur_lib'];
                break;
            
            case ChampRecherche::SousFamille:
                $code = $reqSql['SSFAM'];
                $lib = $reqSql['LIB_SSFAM'];
                break;
            
            case ChampRecherche::Famille:
                $code = $reqSql['CODE_FAM'];
                $lib = $reqSql['Famille_lib'];
                break;
            
            case ChampRecherche::chifExec:
                switch ($reqSql['CHIF_EXEC']) {
                    case 'C':
                        $code = Trad('Chiffrage');
                        break;
                    case 'E':
                        $code = Trad('Exécution');
                        break;
                }
                break;
            
            case ChampRecherche::TypeDocument:
                $code = $reqSql['TYP_DOC'];
                break;
            
            case ChampRecherche::Fournisseur:
                $code = $reqSql['CODE_FOU'];
                break;
            
            case ChampRecherche::Groupe:
                $code = $reqSql['GROUPE'];
                break;
            
            default:
                $code_rupture = $this->requete_paginee->getChampSqlRupture($type_rupture);
                $rupture = RequetePaginee::getChampPhpRupture($code_rupture);
                $code = $reqSql[$rupture];
                break;
        }
        
        if ('' != $code && '' != $lib)
            $libelle = $lib . ' (' . $code . ')';
        elseif ('' != $code)
            $libelle = $code;
        else
            $libelle = RequetePaginee::getLibelleRuptureVide();
        
        return array(
            'code' => $code,
            'lib' => $libelle
        );
    }

    function &buildXmlLigneResultat(& $no_da, & $no_po, & $info_rupture)
    {
        $array = array(
            '!type_ligne' => 'donnees'
        );
        
        // On récupère les infos de rupture
        $type_rupture1 = $info_rupture['type_rupture1'];
        $type_rupture2 = $info_rupture['type_rupture2'];
        
        // On récupère les infos de la DA
        $reqSql = SqlDa::getInfoOnLigneDA($no_da, $no_po)->Trouve1();
        if (is_array($reqSql)) {
            //
            // Gestion de la rupture
            //
            $info_rupture[ChampRecherche::Societe] = $reqSql['CODE_STE']; // Pour la recherche des axes d'imputation notamment
            $info_tmp1 = array(
                'code' => ''
            );
            if ('' != $type_rupture1) { // Il y a une rupture de niveau 1 à gérer
                $info_tmp1 = $this->getValeurRuptureSurLibelle($type_rupture1, $reqSql);
                $info_rupture['code_rupture1'] = $info_tmp1['code'];
                $info_rupture['val_rupture1'] = $info_tmp1['lib'];
            }
            $info_tmp2 = array(
                'code' => ''
            );
            if ('' != $type_rupture2) { // Il y a une rupture de niveau 2 à gérer
                $info_tmp2 = $this->getValeurRuptureSurLibelle($type_rupture2, $reqSql);
                $info_rupture['code_rupture2'] = $info_tmp2['code'];
                $info_rupture['val_rupture2'] = $info_tmp2['lib'];
            }
            
            // Gestion de l'affichage des infos
            
            $id_ligne = $reqSql['NO_DA'] . '_' . $reqSql['NO_PO'];
            
            $this->id_affiches[$id_ligne] = array(
                'rupture1' => $info_tmp1['code'],
                'rupture2' => $info_tmp2['code']
            );
            //
            // Case sélection
            //
            // On doit renvoyer tout le formulaire pour prendre en compte les infos de rupture ;
            // S'il y a des ruptures, on doit recalculer le nombre de lignes par rupture
            $action = 'TraiteUrlAsync("' . AO_ImportDA::fichierPhp . '?action=' . AO_ImportDA::action_selectionner . '&id_ligne=' . $id_ligne . '&value=" + this.checked, document.forms["' . AO_ImportDA::id_form_criteres . '"].elements[0]);';
            $valeur = array_key_exists($id_ligne, $this->selection_en_cours);
            $compXsl = new ComposantXslSelection($id_ligne);
            $compXsl->setAction($action);
            $compXsl->setValeur($valeur);
            $array['selection'] = $compXsl->buildXml();
            
            //
            // Zoom sur ficher de la DA
            //
            $id_loupe = 'zoom_da_' . $id_ligne;
            $contexte = 'ContexteSuivi'; // Pour essayer
            $action = 'OpenPopup("suivi_doc.php?action=AfficherDocUnitaire&type_doc=' . TypeSuivi::DA . '&no_doc=' . $no_da . '&contexte=' . $contexte . '", "win_popup_DA", 1000, 480);';
            $title = Trad('Afficher le détail de la DA');
            $image = ComposantXslAction::img_loupe;
            $compXsl = new ComposantXslAction($id_loupe);
            $compXsl->setImage($image);
            $compXsl->setTitle($title);
            $compXsl->setAction($action);
            $array['zoom_da'] = $compXsl->buildXml();
            
            //
            // Infos de la lignes
            //
            $array['!libelle_da_po'] = $reqSql['NO_DA'] . ' / ' . $reqSql['NO_PO'];
            $array['!demandeur'] = $reqSql['Demandeur_lib'];
            $array['!des_somm'] = $reqSql['DES_SOMM'];
            $array['!des_comp'] = $reqSql['CONTMEMO'];
            $array['!lib_ssfam'] = $reqSql['LIB_SSFAM'];
            
            $format = 'NC9.3';
            $value = $reqSql['QTE_DEM'];
            $tmp = ControleSaisie::checkValueFormat($format, $value);
            $array['!qte'] = $tmp['valeurModifiee'];
            
            $array['!unite'] = $reqSql['UNITE'];
            
            $value = (0 != $reqSql['BUDGET']) ? $reqSql['BUDGET'] : $reqSql['PU'];
            $format = 'NC9.' . Param::AllParamsGetValue('NB_DECIMAL_PU');
            $tmp = ControleSaisie::checkValueFormat($format, $value);
            $array['!pu_bud'] = $tmp['valeurModifiee'];
            
            // Montant HT ou TTC
            $format = 'NC9.2';
            $is_ttc = Param::AllParamsGetValue('IS_AFFICHE_TTC');
            $value = ($is_ttc) ? $reqSql['MNT_LIG'] * 0.01 * (100 + $reqSql['TVA']) : $reqSql['MNT_LIG'];
            $tmp = ControleSaisie::checkValueFormat($format, $value);
            $array['!montant'] = $tmp['valeurModifiee'];
            
            $array['!devise'] = $reqSql['DEVISE'];
            
            //
            // Informations supplémentaires
            //
            
            // Info sur un autre AO existant
            $reqSqlCnt = SqlAo::rqGetNbAoPrepaEnCoursSSFam($this->no_ao, $reqSql['SSFAM'])->TrouveTous();
            $str_autre_AO = '';
            if (is_array($reqSqlCnt))
                foreach ($reqSqlCnt as & $values) {
                    if ('' != $str_autre_AO)
                        $str_autre_AO .= ', ';
                    $str_autre_AO .= $values['NO_AO'] . ' (' . $values['NOM'] . ')';
                }
            
            if ('' != $str_autre_AO) {
                $id = 'info_autre_AO_' . $id_ligne;
                $title = Trad('AO concernés par la sous famille') . ' : ' . $str_autre_AO;
                $image = ComposantXslAction::img_avertissement_r_sur_gf;
                $compXsl = new ComposantXslAction($id);
                $compXsl->setImage($image);
                $compXsl->setTitle($title);
                $array['info_autre_AO'] = $compXsl->buildXml();
            }
            
            // Info sur un titre de DA
            $TITRE = Memos::get($reqSql['NM_TITRE']);
            if ('' != $TITRE) {
                $id = 'titre_DA_' . $id_ligne;
                $image = ComposantXslAction::img_select_info;
                
                $compXsl = new ComposantXslAction($id);
                $compXsl->setImage($image);
                $compXsl->setTitle($TITRE);
                $array['info_titre_DA'] = $compXsl->buildXml();
            }
            
            // Info sur un commentaire de DA
            $COMMEN = Memos::get($reqSql['NM_COMMEN']);
            if ('' != $COMMEN) {
                $id = 'commen_DA_' . $id_ligne;
                $image = ComposantXslAction::img_picto_pdf;
                
                $compXsl = new ComposantXslAction($id);
                $compXsl->setImage($image);
                $compXsl->setTitle($COMMEN);
                $array['info_commen_DA'] = $compXsl->buildXml();
            }
            
            // Info sur la présence de doc rattachés
            $info_doc_att = SqlInfo::rqGetDocRattByItem('DA_ENTET', $no_da)->TrouveTous();
            $type_doc = TypeSuivi::DA;
            if (is_array($info_doc_att) && - 1 != count($info_doc_att)) {
                $id = 'docatt_DA_' . $id_ligne;
                $image = ComposantXslAction::img_picto_doc_att;
                $title = Trad('Présence de documents rattachés');
                $action = 'OpenPopup(\'suivi_doc.php?action=visuDocRatt&typeItem=' . $type_doc . '&codeItem=' . $no_da . '&modif=0\',\'popup_visu_doc_ratt\',800, 500);';
                
                $compXsl = new ComposantXslAction($id);
                $compXsl->setImage($image);
                $compXsl->setTitle($title);
                $compXsl->setAction($action);
                $array['info_docatt_DA'] = $compXsl->buildXml();
            }
            
            // Info sur la présence de pièces jointes
            $info_pj = SqlStatutDocument::rqGetNumPJ($no_da, $type_doc)->Trouve1();
            if (is_array($info_pj) && $info_pj['NbPJ'] > 0) {
                $id = 'pj_DA_' . $id_ligne;
                $image = ComposantXslAction::img_picto_trombone;
                $title = Trad('Présence de pièces jointes');
                $action = 'CallUrl(\'suivi_doc.php\',\'action=afficherPJ&typ_doc=' . $type_doc . '&no_doc=' . $no_da . '\');';
                
                $compXsl = new ComposantXslAction($id);
                $compXsl->setImage($image);
                $compXsl->setTitle($title);
                $compXsl->setAction($action);
                $array['info_pj_DA'] = $compXsl->buildXml();
            }
        }
        return $array;
    }

    function buildXmlResultat(& $data)
    {
        $array_resultat = array();
        $sql_where_filtre = '';
        unset($this->id_affiches);
        $this->id_affiches = array();
        
        // Note : vu avaec VAN/YA, dans un premier temps, on va faire sans la limitation à 500 lignes
        
        //
        // On traite les filtres
        //
        $visualisation = $data[AO_ImportDA::filtre_visualisation];
        
        $sql_liste_selection = '';
        if (AO_ImportDA::filtre_visu_toutes != $visualisation) {
            // Il y a un filtre spécifique sur la visualisation : on prépare la liste de sélection
            $sql_liste_selection = '';
            foreach ($this->selection_en_cours as $key => & $value) {
                if ('' != $sql_liste_selection)
                    $sql_liste_selection .= ',';
                $sql_liste_selection .= '\'' . $key . '\'';
            }
        }
        $this->requete_paginee->traiteFiltres($data, $sql_liste_selection);
        
        //
        // On tient compte des ruptures pour la requête SQL
        //
        $this->requete_paginee->traiteRupture($data);
        
        //
        // On prépare l'affichage du count
        //
        $count_total = $this->requete_paginee->getCountResultatFiltre();
        
        //
        // On prépare l'affichage du résultat
        //
        $num_page = CriteresRecherche::getValue($data, BarreNavigation::id_num_page);
        $resultat = $this->requete_paginee->getResultat($num_page);
        
        if (is_array($resultat)) {
            $type_rupture1 = RequetePaginee::getValue($data, ChampRecherche::rupture1);
            $type_rupture2 = RequetePaginee::getValue($data, ChampRecherche::rupture2);
            $rupture2_existe = ($type_rupture2 != '');
            $val_rupture1_courant = '';
            $val_rupture1_courant = '';
            
            $infos_rupture = array(
                'type_rupture1' => $type_rupture1,
                'type_rupture2' => $type_rupture2,
                'code_rupture1' => '',
                'code_rupture2' => '',
                'val_rupture1' => '',
                'val_rupture2' => ''
            );
            
            if ('' == $type_rupture1 && '' == $type_rupture2) {
                // Il n'y a aucune rupture, on affiche l'entête du tableau
                $id = AO_ImportDA::tableau_sel_tout;
                $action = ' var collec = document.getElementById("' . AO_ImportDA::id_div_resultat_rech . '").getElementsByTagName("input");
							var str_result = "";
							for (var i=0 ; i < collec.length ; i++) {
								if (collec[i].id != "' . AO_ImportDA::tableau_sel_tout . '") {
									if (str_result != "")
										str_result += ",";
									str_result += collec[i].id;
								}
							}
							TraiteUrlAsync("' . AO_ImportDA::fichierPhp . '?action=' . $id . '&liste_ids=" + encodeURIComponent(str_result) + "&value=" + this.checked);
						';
                
                // Est-ce que tous les éléments de la page ont été sélectionnés ?
                $nb_elt = $this->requete_paginee->getCountEltResultat();
                $nb_ref = ($count_total < $nb_elt) ? $count_total : $nb_elt;
                $valeur = (count($this->selection_en_cours) == $nb_ref);
                // Composant à afficher
                $compXsl = new ComposantXslSelection($id);
                $compXsl->setAction($action);
                $compXsl->setValeur($valeur);
                $array_resultat[] = array(
                    '!type_ligne' => 'entete_tableau',
                    'action' => $compXsl->buildXml()
                );
            }
            
            $nb_selection = 0;
            
            foreach ($resultat as & $values) {
                $no_da = $values['NO_DA'];
                $no_po = $values['NO_PO'];
                $id_ligne = $no_da . '_' . $no_po;
                
                $this->id_affiches[$id_ligne] = array(
                    'rupture1' => '',
                    'rupture2' => ''
                );
                
                // Note : les valeur de rupture sur libellé (par exemple pour le demandeur, etc...) sont traités au niveau de la ligne résultat
                $xml_ligne = $this->buildXmlLigneResultat($no_da, $no_po, $infos_rupture);
                if (array_key_exists($id_ligne, $this->selection_en_cours))
                    $nb_selection ++;
                
                // On gère l'affichage HTML des ruptures
                if ('' != $type_rupture1) {
                    // Rupture de niveau 1 à gérer
                    if ($infos_rupture['val_rupture1'] != $val_rupture1_courant) {
                        // On recherche éventuellement le libellé
                        $libelle_rupture1 = RequetePaginee::getLibelleChampRupture($type_rupture1, $infos_rupture['val_rupture1'], $infos_rupture);
                        
                        // On calcule le nombre de ligne sélectionnées pour afficher dans la rupture
                        $nb_complement = $this->requete_paginee->calculeComplement($infos_rupture, $this->selection_en_cours);
                        
                        // On prépare une case à cocher
                        $id = AO_ImportDA::tableau_sel_rupture1;
                        $action = 'TraiteUrlAsync("' . AO_ImportDA::fichierPhp . '?action=' . $id . '&code_rupture1=' . urlencode($infos_rupture['code_rupture1']) . '&value=" + this.checked, document.forms["' . AO_ImportDA::id_form_criteres . '"].elements[0]);';
                        $compXsl = new ComposantXslSelection($id);
                        $compXsl->setAction($action);
                        $valeurSelect = true;
                        $compXsl->setValeur($valeurSelect);
                        
                        // On ajoute les infos de rupture
                        $info_rupture1 = array(
                            '!type_ligne' => 'rupture1',
                            '!code' => $infos_rupture['val_rupture1'],
                            '!lib' => $libelle_rupture1,
                            '!lib_complement' => Trad('Nombre de lignes') . ' : ' . $nb_complement,
                            '!rupture2_existe' => $rupture2_existe,
                            'action' => $compXsl->buildXml()
                        );
                        // $this->id_affiches[$id_ligne]['rupture1'] = $infos_rupture['code_rupture1'];
                        
                        // On ajoute la ligne d'affichage correspondante
                        $array_resultat[] = $info_rupture1;
                        
                        // On met à jour l'info de rupture courante
                        $val_rupture1_courant = $infos_rupture['val_rupture1'];
                        
                        // On force l'affichage de la rupture niveau 2
                        $val_rupture2_courant = '';
                    }
                    if ($infos_rupture['val_rupture2'] != $val_rupture2_courant) {
                        // On recherche éventuellement le libellé
                        $libelle_rupture2 = RequetePaginee::getLibelleChampRupture($type_rupture2, $infos_rupture['val_rupture2'], $infos_rupture);
                        
                        // On prépare une case à cocher
                        $id = AO_ImportDA::tableau_sel_rupture2;
                        // Dossier 26661
                        $action = 'TraiteUrlAsync("' . AO_ImportDA::fichierPhp . '?action=' . $id . '&code_rupture1=' . urlencode($infos_rupture['code_rupture1']) . '&code_rupture2=' . urlencode($infos_rupture['code_rupture2']) . '&value=" + this.checked, document.forms["' . AO_ImportDA::id_form_criteres . '"].elements[0]);';
                        $compXsl = new ComposantXslSelection($id);
                        $compXsl->setAction($action);
                        $valeurSelect = true;
                        $compXsl->setValeur($valeurSelect);
                        
                        // On ajoute les infos de rupture
                        $info_rupture2 = array(
                            '!type_ligne' => 'rupture2',
                            '!code' => $infos_rupture['val_rupture2'],
                            '!lib' => $libelle_rupture2,
                            'action' => $compXsl->buildXml()
                        );
                        // $this->id_affiches[$id_ligne]['rupture2'] = $infos_rupture['code_rupture2'];
                        
                        // On ajoute la ligne d'affichage correspondante
                        $array_resultat[] = $info_rupture2;
                        
                        // On met à jour l'info de rupture courante
                        $val_rupture2_courant = $infos_rupture['val_rupture2'];
                    }
                }
                $array_resultat[] = $xml_ligne;
            }
            // On va repasser le tableau en revue afin de gérer correctement les infos de rupture
            if ('' != $type_rupture2) {
                foreach ($array_resultat as & $ligne) {
                    if ('rupture2' == $ligne['!type_ligne']) {
                        $info_rupture = & $ligne;
                    } elseif ('donnees' == $ligne['!type_ligne']) {
                        if (! $ligne['selection']['!value'])
                            $info_rupture['action']['!value'] = false;
                    }
                }
            } elseif ('' != $type_rupture1) {
                foreach ($array_resultat as & $ligne) {
                    if ('rupture1' == $ligne['!type_ligne']) {
                        $info_rupture = & $ligne;
                    } elseif ('donnees' == $ligne['!type_ligne']) {
                        if (! $ligne['selection']['!value'])
                            $info_rupture['action']['!value'] = false;
                    }
                }
            }
        }
        
        $this->setToSession(); // On doit conserver plusieurs informations calculées ici
        
        $array['action'] = 'AfficheResultats';
        $array['resultats'] = & $array_resultat;
        $array['navigation'] = $this->requete_paginee->buildXmlBarreNavigation($num_page);
        
        return $array;
    }

    function gereSelection(& $id_ligne, & $value)
    {
        if (BoolSql($value)) {
            // On va ajouter à la sélection
            $this->selection_en_cours[$id_ligne] = 1;
        } else {
            // On va retirer à la sélection
            if (array_key_exists($id_ligne, $this->selection_en_cours)) {
                unset($this->selection_en_cours[$id_ligne]);
            }
        }
        $this->setToSession();
    }

    function gereSelectionRupture1(& $code_rupture1, $value)
    {
        foreach ($this->id_affiches as $key => & $info_rupture) {
            if ($info_rupture['rupture1'] == $code_rupture1) {
                if (BoolSql($value))
                    // On doit sélectionner l'élément
                    $this->selection_en_cours[$key] = 1;
                else 
                // On doit désélectionner l'élément
                if (array_key_exists($key, $this->selection_en_cours))
                    unset($this->selection_en_cours[$key]);
            }
        }
        $this->setToSession();
    }

    function gereSelectionRupture2(& $code_rupture1, & $code_rupture2, $value)
    {
        foreach ($this->id_affiches as $key => & $info_rupture) {
            // Dossier 26661
            if ($info_rupture['rupture1'] == $code_rupture1 && $info_rupture['rupture2'] == $code_rupture2) {
                if (BoolSql($value))
                    // On doit sélectionner l'élément
                    $this->selection_en_cours[$key] = 1;
                else 
                // On doit désélectionner l'élément
                if (array_key_exists($key, $this->selection_en_cours))
                    unset($this->selection_en_cours[$key]);
            }
        }
        $this->setToSession();
    }

    function getCountSelection()
    {
        return count($this->selection_en_cours);
    }

    function WsdlImporter()
    {
        // TODO SPEC 4241 Caractéristiques complémentaires : ajouter les CC des lignes de la DA
        $messageErreur = '';
        if ($this->getCountSelection() > 0) {
            //
            // On récupère les infos
            //
            $ao_orig = AO::CallWsdlGetAO(utilisateur::getCode(), $this->no_ao);
            $ajout_ligne_ok = false;
            if (array_key_exists('AO', $ao_orig))
                if (array_key_exists('ListLignes', $ao_orig['AO']))
                    if (array_key_exists('!Modifiable', $ao_orig['AO']['ListLignes']))
                        if (BoolSql($ao_orig['AO']['ListLignes']['!Modifiable']))
                            $ajout_ligne_ok = true;
            
            if ($ajout_ligne_ok) {
                //
                // On ajoute les lignes d'import
                //
                foreach ($this->selection_en_cours as $key => & $value) {
                    $idx_sep = strrpos($key, '_');
                    $no_da = substr($key, 0, $idx_sep);
                    $no_po = substr($key, $idx_sep + 1);
                    //
                    // On va rechercher les infos de la ligne de DA
                    //
                    $reqSql = SqlDa::getInfoOnLigneDA($no_da, $no_po)->Trouve1();
                    if (is_array($reqSql)) {
                        $array_ligne = array(
                            '!Etat' => 'A'
                        ); // C'est un ajout
                        $array_ligne['NO_PO'] = '';
                        $array_ligne['NO_DA'] = $no_da;
                        $array_ligne['NO_PO_DA'] = $no_po;
                        $array_ligne['CODE_ART'] = $reqSql['CODE_ART'];
                        $array_ligne['DES'] = $reqSql['DES_SOMM'];
                        $array_ligne['DCOMP'] = $reqSql['CONTMEMO'];
                        $array_ligne['QTE'] = $reqSql['QTE_DEM'] - $reqSql['DEJA_COMM'];
                        $array_ligne['UNITE'] = $reqSql['UNITE'];
                        $DTELIVSOU = $reqSql['DTELIVSOU'];
                        switch ($this->infos_ao['TYPEDEL']) {
                            case 'D':
                                $array_ligne['DELAI'] = $reqSql['DLIVSOU'];
                                $array_ligne['DELAIJ'] = 0;
                                $array_ligne['DELAIT'] = '';
                                break;
                            case 'J':
                                $array_ligne['DELAI'] = '00000000';
                                if ($DTELIVSOU > $today) {
                                    $obj_DTELIVSOU = new DateTime(substr($DTELIVSOU, 0, 4) . '-' . substr($DTELIVSOU, 4, 2) . '-' . substr($DTELIVSOU, 6, 2));
                                    $aujoudhui = date("Ymd");
                                    $obj_aujourdhui = new DateTime(substr($aujoudhui, 0, 4) . '-' . substr($aujoudhui, 4, 2) . '-' . substr($aujoudhui, 6, 2));
                                    $array_ligne['DELAIJ'] = $obj_DTELIVSOU->diff($obj_aujourdhui)->days;
                                } else
                                    $array_ligne['DELAIJ'] = 0;
                                $array_ligne['DELAIT'] = '';
                                break;
                            case 'T':
                                $array_ligne['DELAI'] = '00000000';
                                $array_ligne['DELAIJ'] = 0;
                                $array_ligne['DELAIT'] = convertDateSqlToFr($DTELIVSOU);
                                break;
                        }
                        $array_ligne['BUDGET'] = $reqSql['BUDGET'];
                        $array_ligne['PRIX_REF'] = $reqSql['PU'];
                        $array_ligne['ORI_PRIX_REF'] = '';
                        $array_ligne['SSFAMILLE'] = $reqSql['SSFAM'];
                        $array_ligne['COD_FAB'] = $reqSql['COD_FAB'];
                        $array_ligne['COD_GAM'] = $reqSql['COD_GAM'];
                        $array_ligne['REF_FAB'] = $reqSql['REF_FAB'];
                        $array_ligne['TITRE_AV'] = '';
                        $array_ligne['SSTOTAL'] = '';
                        $array_ligne['TITRE_ST'] = '';
                        
                        // Planning
                        $reqSqlPlann = SqlDa::getDALineCalendar($no_da, $no_po);
                        $array_ligne['ListPlanning'] = array();
                        foreach ($reqSqlPlann as $key => & $values)
                            $array_ligne['ListPlanning'][] = array(
                                'Planning' => array(
                                    '!Etat' => 'A',
                                    'DTE' => $values['expected_date'],
                                    'QTE' => $values['quantity']
                                )
                            );
                        // On peut ajouter cette ligne au tableau
                        echo '';
                        $liste_lignes = & $ao_orig['AO']['ListLignes'];
                        // Est-ce qu'il y a au moins une ligne?
                        if (! array_key_exists('Ligne', $liste_lignes)) {
                            // On peut ajouter directement la ligne directement
                            $liste_lignes['Ligne'][] = $array_ligne;
                        } elseif (array_key_exists('NO_PO', $liste_lignes['Ligne'])) { // Est-ce qu'il y a un seul enregistrement ?
                            $sauve_ligne = $liste_lignes['Ligne'];
                            unset($liste_lignes['Ligne']);
                            $liste_lignes['Ligne'][] = $sauve_ligne;
                            unset($sauve_ligne);
                            $liste_lignes['Ligne'][] = $array_ligne;
                        } else {
                            // Il y a déjà plusieurs lignes
                            $liste_lignes['Ligne'][] = $array_ligne;
                        }
                    }
                }
                // On appelle le Wsdl
                $resultWsdl = AO::CallWsdlCreeAOPanier(utilisateur::getCode(), false, $ao_orig['AO']);
                if ('E' == $resultWsdl['Statut'])
                    $messageErreur = $resultWsdl['MsgErreur'];
            } else
                $messageErreur = Trad('On ne peut pas ajouter de ligne à cet AO.');
        } else
            $messageErreur = Trad('Aucune ligne sélectionnée');
        
        // On ajoute les lignes d'import
        return $messageErreur;
    }
}