<?php

class RequetePaginee_AO_ImportDA extends RequetePaginee
{

    public function initPerimetre(& $data = null)
    {
        $sql_select_champs = 'DA_LIGNE.NO_DA, DA_LIGNE.NO_PO';
        $this->setSqlChamps($sql_select_champs);
        
        //
        // Toutes les jointures nécessaires
        //
        $sql_from = 'DA_LIGNE with (nolock)
					left join DA_ENTET with (nolock)         on DA_ENTET.NO_DA = DA_LIGNE.NO_DA
					left join SOCIETE with(nolock)           on DA_LIGNE.CODE_STE = SOCIETE.CODE_STE
					left join HASTUTIL DEMAND with(nolock)   on DA_ENTET.NO_DEM = DEMAND.CODE
					left join HASTUTIL ACHETEUR with(nolock) on DA_LIGNE.ACHETEUR = ACHETEUR.CODE
					left join SSFAMILL with (nolock)         on DA_LIGNE.SSFAM = SSFAMILL.CODE_SFA
					left join FAMILLE with (nolock)          on SSFAMILL.CODE_FAM = FAMILLE.CODE_FAM
					left join FOURNISS with (nolock)         on DA_LIGNE.CODE_FOU = FOURNISS.CODE
					left join TYPDOC with (nolock)           on DA_ENTET.TYP_DOC = TYPDOC.TYPE';
        $this->setSqlFrom($sql_from);
        
        //
        // Périmètre de base
        //
        $sql_where = 'DA_ENTET.FM_CODE  = \'\'
					and DA_LIGNE.TRAITEE  = 0x46
					and DA_LIGNE.ACHATDIR = 0x46
					and DA_LIGNE.CDEAUTO  = 0x46
					and DA_LIGNE.SITE_STK = \'\'
					and DA_LIGNE.VALIDEE  = 0x54
					and DA_ENTET.REFUSEE  = 0x46
					and DA_LIGNE.QTE_DEM > DA_LIGNE.DEJA_COMM
					and DA_ENTET.DTE_VAL != \'00000000\'';
        
        // Dossier 26715
        $sql_where .= (Param::AllParamsGetValue('NOTCREATCDEDANONSIG')) ? ' and DA_ENTET.SIGNEE = 0x54' : '';
        
        $this->setSqlWhere($sql_where);
    }

    public function &getChampSqlRupture(& $rupture)
    {
        $resultat = '';
        switch ($rupture) {
            case ChampRecherche::Groupe:
                $resultat = 'SOCIETE.GROUPE';
                break;
            case ChampRecherche::Societe:
                $resultat = 'DA_LIGNE.CODE_STE';
                break;
            case ChampRecherche::CentreEmet:
                $resultat = 'DEMAND.CTR_ADR';
                break;
            case ChampRecherche::CentreLivr:
                $resultat = 'DA_LIGNE.CTRLIVR';
                break;
            case ChampRecherche::Demandeur:
                $resultat = 'DEMAND.NOM';
                break;
            case ChampRecherche::Acheteur:
                $resultat = 'ACHETEUR.NOM';
                break;
            case ChampRecherche::SI:
                $resultat = 'DA_LIGNE.SECTIMP';
                break;
            case ChampRecherche::CodeCompl:
                $resultat = 'DA_LIGNE.CODE_COMP';
                break;
            case ChampRecherche::SCA:
                $resultat = 'DA_LIGNE.SSCPTEANA';
                break;
            case ChampRecherche::Famille:
                $resultat = 'FAMILLE.DESIGNAT';
                break;
            case ChampRecherche::SousFamille:
                $resultat = 'SSFAMILL.DESIGNAT';
                break;
            case ChampRecherche::numdoc:
                $resultat = 'DA_LIGNE.NO_DA';
                break;
            case ChampRecherche::chifExec:
                $resultat = 'DA_LIGNE.CHIF_EXEC';
                break;
            case ChampRecherche::TypeDocument:
                $resultat = 'TYPDOC.LIBELLE';
                break;
            case ChampRecherche::Fournisseur:
                $resultat = 'FOURNISS.RS';
                break;
        }
        return $resultat;
    }

    public function traiteFiltres(& $data, & $obj_specif = null)
    {
        //
        // Filtre sur les lignes sélectionnées ou non
        //
        $visualisation = $data[AO_ImportDA::filtre_visualisation];
        
        if (null != $obj_specif && '' != $obj_specif) {
            global $connecteur;
            // On a en effet une liste de lignes sélectionnées
            if (AO_ImportDA::filtre_visu_selection == $visualisation)
                switch ($connecteur->getType(DB_OXASQLDB)) {
                    case DB_MSSQL:
                        $sql_where_filtre .= ' and (convert(varchar, DA_LIGNE.NO_DA) + \'_\' + convert(varchar, DA_LIGNE.NO_PO)) in (' . $obj_specif . ')';
                        break;
                    case DB_ORA:
                        $sql_where_filtre .= ' and CONCAT(DA_LIGNE.NO_DA, \'_\', DA_LIGNE.NO_PO) in (' . $obj_specif . ')';
                        break;
                }
            elseif (AO_ImportDA::filtre_visu_non_selection == $visualisation)
                switch ($connecteur->getType(DB_OXASQLDB)) {
                    case DB_MSSQL:
                        $sql_where_filtre .= ' and (convert(varchar, DA_LIGNE.NO_DA) + \'_\' + convert(varchar, DA_LIGNE.NO_PO)) not in (' . $obj_specif . ')';
                        break;
                    case DB_ORA:
                        $sql_where_filtre .= ' and CONCAT(DA_LIGNE.NO_DA, \'_\', DA_LIGNE.NO_PO) not in (' . $obj_specif . ')';
                        break;
                }
        } else {
            // Aucune ligne sélectionnée
            if (AO_ImportDA::filtre_visu_selection == $visualisation)
                // On ne sélectionne aucune ligne
                $sql_where_filtre .= ' and 1=0';
            elseif (AO_ImportDA::filtre_visu_non_selection == $visualisation)
                // On ne sélectionne toutes les lignes
                $sql_where_filtre .= ' and 1=1';
        }
        
        //
        // Filtres standards
        //
        $listeNomChamp = FormulaireRecherche::getChampsSuiviAOImportDA();
        foreach ($listeNomChamp as $nomChamp) {
            $nom_sql_champ = $this->getChampSqlRupture($nomChamp);
            $valeur = CriteresRecherche::getValue($data, $nomChamp);
            
            switch ($nomChamp) {
                case ChampRecherche::GrpSoc: // On passe sur ce cas
                    break;
                case ChampRecherche::Demandeur:
                    if ('' != $valeur)
                        $sql_where_filtre .= ' and DA_ENTET.NO_DEM = \'' . ReplaceSqlPointeur($valeur) . '\'';
                    break;
                case ChampRecherche::Acheteur:
                    if ('' != $valeur)
                        $sql_where_filtre .= ' and DA_LIGNE.ACHETEUR = \'' . ReplaceSqlPointeur($valeur) . '\'';
                    break;
                case ChampRecherche::numdoc: // C'est un entier
                    if ('' != $nom_sql_champ && '' != $valeur)
                        $sql_where_filtre .= ' and ' . $nom_sql_champ . ' = ' . $valeur;
                    break;
                case ChampRecherche::SousFamille:
                    if ('' != $valeur)
                        $sql_where_filtre .= ' and  (upper(DA_LIGNE.SSFAM) like upper(\'%' . ReplaceSqlPointeur($valeur) . '%\') or upper(FAMILLE.DESIGNAT) like upper(\'%' . ReplaceSqlPointeur($valeur) . '%\'))';
                    break;
                
                default: // Pour tous les champs à valeur alphanumérique simple
                    if ('' != $nom_sql_champ && '' != $valeur)
                        $sql_where_filtre .= ' and ' . $nom_sql_champ . ' = \'' . ReplaceSqlPointeur($valeur) . '\'';
                    break;
            }
        }
        $this->setSqlWhereFiltre($sql_where_filtre);
    }

    public function traiteRupture(& $data)
    {
        $sql_order_by = '';
        $rupture1 = RequetePaginee::getValue($data, ChampRecherche::rupture1);
        $ordre1 = RequetePaginee::getValue($data, ChampRecherche::rupture1_ordre);
        $rupture2 = RequetePaginee::getValue($data, ChampRecherche::rupture2);
        $ordre2 = RequetePaginee::getValue($data, ChampRecherche::rupture2_ordre);
        
        if ('' != $rupture1) {
            $sql_order_by = $this->getChampSqlRupture($rupture1) . ' ';
            $sql_order_by .= ('TRI_ASC' == $ordre1) ? 'ASC' : 'DESC';
            if ('' != $rupture2) {
                $sql_order_by .= ', ' . $this->getChampSqlRupture($rupture2) . ' ';
                $sql_order_by .= ('TRI_ASC' == $ordre2) ? 'ASC' : 'DESC';
            }
        }
        
        // Qu'il y ait présence ou absence de rupture, il y a tri général
        if ('' != $sql_order_by)
            $sql_order_by .= ',';
        $sql_order_by .= 'DA_LIGNE.NO_DA DESC, DA_LIGNE.NO_PO ASC';
        $this->setSqlOrderBy($sql_order_by);
    }

    public function calculeComplement(& $info_rupture, & $array_liste_selection)
    {
        $resultat = 0;
        
        if (is_array($array_liste_selection) && 0 < count($array_liste_selection)) {
            // On construit la requête pour avoir le résultat
            $filtre_rupture = '';
            $type_rupture1 = $info_rupture['type_rupture1'];
            $code_rupture1 = $info_rupture['code_rupture1'];
            $type_rupture2 = $info_rupture['type_rupture2'];
            $code_rupture2 = $info_rupture['code_rupture2'];
            
            //
            // On gère le filtre sur la rupture 1
            //
            if ('' != $type_rupture1) {
                $champ_sql_rupture = $this->getChampSqlRupture($type_rupture1);
                switch ($type_rupture1) {
                    case ChampRecherche::numdoc:
                        $filtre_rupture .= ' and ' . $champ_sql_rupture . ' = ' . ReplaceSqlPointeur($code_rupture1);
                        break;
                    case ChampRecherche::Demandeur:
                        $filtre_rupture .= ' and DA_ENTET.NO_DEM = \'' . ReplaceSqlPointeur($code_rupture1) . '\'';
                        break;
                    case ChampRecherche::Acheteur:
                        $filtre_rupture .= ' and DA_LIGNE.ACHETEUR = \'' . ReplaceSqlPointeur($code_rupture1) . '\'';
                        break;
                    case ChampRecherche::Famille:
                        $filtre_rupture .= ' and SSFAMILL.CODE_FAM = \'' . ReplaceSqlPointeur($code_rupture1) . '\'';
                        break;
                    case ChampRecherche::SousFamille:
                        $filtre_rupture .= ' and DA_LIGNE.SSFAM = \'' . ReplaceSqlPointeur($code_rupture1) . '\'';
                        break;
                    case ChampRecherche::TypeDocument:
                        $filtre_rupture .= ' and DA_ENTET.TYP_DOC = \'' . ReplaceSqlPointeur($code_rupture1) . '\'';
                        break;
                    case ChampRecherche::Fournisseur:
                        $filtre_rupture .= ' and DA_LIGNE.CODE_FOU = \'' . ReplaceSqlPointeur($code_rupture1) . '\'';
                        break;
                    case ChampRecherche::chifExec:
                        $filtre_rupture .= ('Chiffrage' == $code_rupture1) ? ' and DA_LIGNE.CHIF_EXEC = \'C\'' : ' and DA_LIGNE.CHIF_EXEC = \'E\'';
                        break;
                    default:
                        $filtre_rupture .= ' and ' . $champ_sql_rupture . ' = \'' . ReplaceSqlPointeur($code_rupture1) . '\'';
                        break;
                }
            }
            
            //
            // On gère le filtre sur la rupture 2
            //
            if ('' != $type_rupture2) {
                $filtre_rupture .= ' and ' . $this->getChampSqlRupture($type_rupture2) . ' = ';
                switch ($type_rupture2) {
                    case ChampRecherche::numdoc:
                        $filtre_rupture .= ReplaceSqlPointeur($code_rupture2);
                        break;
                    default:
                        $filtre_rupture .= '\'' . ReplaceSqlPointeur($code_rupture2) . '\'';
                        break;
                }
            }
            
            //
            // On restreint à la liste de sélection
            //
            $sql_select = '';
            foreach ($array_liste_selection as $key => & $values) {
                $idx_pos = strrpos($key, '_');
                $no_da = substr($key, 0, $idx_pos);
                $no_po = substr($key, $idx_pos + 1);
                
                if ('' != $sql_select)
                    $sql_select .= ' or ';
                $sql_select .= '(DA_LIGNE.NO_DA=' . ReplaceSql($no_da) . ' and DA_LIGNE.NO_PO=' . ReplaceSql($no_po) . ')';
            }
            $sql_select = 'and (' . $sql_select . ')';
            
            //
            // On calcule la requête
            //
            $requete = 'SELECT count(*) AS nb  FROM ' . $this->sql_from . ' WHERE ' . $this->sql_where . ' ' . $this->sql_where_filtres . ' ' . $filtre_rupture . ' ' . $sql_select;
            $reqSql = new RequeteSQL($requete, $this->database);
            $resSql = $reqSql->Trouve1();
            if (is_array($resSql))
                $resultat = $resSql['nb'];
        }
        return $resultat;
    }
}
