<?php

/**
 * Classe permettant de gérer la notation des commandes
 *
 */
class NotationCde
{

    protected $array_xml = array();
 // Tableau contenant les données à transmettre à la feuille de style xsl
    protected $formName = 'formulaire_notation';
 // Nom du formulaire de notation des commandes
    protected $fieldNoCde = 'no_cde';
 // Code du champ contenant le numéro de la commande sur laquelle porte la notation
    protected $no_cde = 0;
 // le numéro de la commande sur laquelle porte la notation
    
    /**
     * Constructeur
     *
     * @param int $no_cde
     *            : numéro de la commande sur laquelle porte la notation
     */
    public function __construct($no_cde)
    {
        $this->no_cde = $no_cde;
    }

    public function &getNoCde()
    {
        return $this->no_cde;
    }

    /**
     * Fonction retournant le nombre de commande à noter pour un utilisateur donné
     *
     * @param string $login
     *            : Login de l'utilisateur dont on calcule le nombre de commande à noter
     */
    public static function getNbCdeToRate(& $login)
    {
        $result = & SqlNotation::rqGetNbCdeToRate($login)->Trouve1();
        return $_SESSION['getNbCdeToRate'] = $result['NB_CDE_TO_RATE'];
    }

    /**
     * Fonction retournant un boolean indiquant si la validation de la notation peut être effectuée
     *
     * @param boolean $no_cde
     *            : Numéro de la commande
     */
    public static function isValidationNotation($no_cde)
    {
        // Un utilisateur peut valider une notation de la commande s'il dispose du droit requis et
        // si toutes les notations obligatoires ont été saisies
        $notation_cde = SqlNotation::rqIsNotationCdeValidated($no_cde)->Trouve1();
        $liste_critere = SqlNotation::rqCanNotationCdeBeValidate($no_cde)->Trouve1();
        return BoolSql($_SESSION['AuthValideNotation'] && '00000000' == $notation_cde['DTEVALID'] && 0 == $liste_critere['NB_CRITRE_OBL_VIDE']);
    }

    /**
     * Fonction retournant un boolean indiquant si des saisies de notation restent à faire (obligatoire et non obligatoire)
     *
     * @param boolean $no_cde
     *            : Numéro de la commande
     * @param string $login
     *            : Login de l'utilisateur dont on calcule le nombre de commande à noter
     */
    public static function isNotationToMake($no_cde, $login)
    {
        // Un utilisateur peut saisir/modifier les notations de la commande seulement s'il possède le droit requis et s'il existe au moins un thème
        // pour lequel il est autorisé
        $result = SqlNotation::rqGetNbNotationCdeToRate($no_cde, $login, 'all')->Trouve1();
        return BoolSql($_SESSION['AuthNotation'] && is_array($result) && $result['NB_CRITERES'] > 0);
    }

    /**
     * Fonction construisant le tableau de données xml qui sera transmis à la feuille de style xsl
     *
     * @param int $mode_acces
     *            : Indique si la notation est consulter en lecture : 0, en saisie : 1 ou en validation : 2
     * @param string $zone_globale
     *            : Identifiant de la zone d'affichage de la commande
     * @param string $zone_actions
     *            : Identifiant de la zone contenant les actions possibles sur la commande
     * @return array
     */
    public function &buildXmlNotationCde($mode_acces = 0, $zone_globale = '', $zone_actions = '')
    {
        $this->array_xml['mode_acces']['value'] = $mode_acces;
        
        // On définit les actions possibles sur la notation de la commande
        // Action de saisie nécessite une action enregistrer
        if (1 == $mode_acces) {
            $message = cnv_to_javascript(trad('Enregistrement de la notation en cours...'));
            $this->array_xml['action']['enregistrer'] = "TraiteUrlAsync('gestion_notation_commande.php?action=enregistrer&no_cde={$this->no_cde}&zone_globale={$zone_globale}&zone_actions={$zone_actions}' ,document.forms.{$this->formName}.elements[0],'" . $message . '\');';
        }        // Action de validation nécessite une action validation
        elseif (2 == $mode_acces) {
            $message = cnv_to_javascript(trad('Validation de la notation en cours...'));
            $this->array_xml['action']['valider'] = "TraiteUrlAsync('gestion_notation_commande.php?action=valider&no_cde={$this->no_cde}&zone_globale={$zone_globale}&zone_actions={$zone_actions}'    ,document.forms.{$this->formName}.elements[0],'" . $message . '\');';
        }
        
        // On enregistre le nom du formulaire
        $this->array_xml['formulaire_notation']['name'] = $this->formName;
        
        // On récupère les informations d'entête de la commande
        $enteteCde = SqlCde::getInfoOnEnteteCDE($this->no_cde)->Trouve1();
        
        // On enregistre un libellé titre (N°Commande) et un sous-titre (Code du Frs. + Raison sociale) ;
        $this->array_xml['popup_title'] = trad('Notation de la commande N°') . $this->no_cde;
        $this->array_xml['sousTitre']['value'] = $enteteCde['RS'] . ' (' . $enteteCde['CODE'] . ')';
        
        // On récupère la liste des thèmes à noter sur la commande
        $liste_themes = SqlNotation::rqGetListThemesNotationByCde($this->no_cde)->TrouveTous();
        
        if (is_array($liste_themes)) {
            $ind_theme = 0;
            
            // Pour chacun des thèmes à noter
            foreach ($liste_themes as & $theme) {
                $this->array_xml['theme'][$ind_theme]['code'] = $theme['COD_THEM']; // On enregistre le code du thème
                $this->array_xml['theme'][$ind_theme]['libelle'] = $theme['LIBELLE']; // son libellé
                $this->array_xml['theme'][$ind_theme]['id'] = "TH_$ind_theme"; // On définit un idenfiant pour le champ associé au thème
                $this->array_xml['theme'][$ind_theme]['value'] = $theme['COD_THEM']; // On initialise la valeur de ce champ
                $this->array_xml['theme'][$ind_theme]['note'] = FormatageData::formatMontant($theme['NOTMOYTH']) . ' / 10'; // la note moyenne actuelle
                
                $this->array_xml['theme'][$ind_theme]['img_id'] = "TH_IMG_{$ind_theme}"; // Identifiant de l'image permettant d'afficher/masquer le contenu du thème
                $this->array_xml['theme'][$ind_theme]['zone_id'] = "TH_ZONE_{$ind_theme}"; // Identifiant de la zone du contenu du thème qui sera affichée ou masquée
                                                                                              
                // On définit l'action d'affichage/masquage de la zone du thème
                $this->array_xml['theme'][$ind_theme]['img_onclick'] = "collapseExpandMenu('TH_ZONE_{$ind_theme}','TH_IMG_{$ind_theme}','img_reduire_16x16',\"" . HttpReplacePointeur(trad('Masquer les critères')) . "\",'img_develop_16x16',\"" . HttpReplacePointeur(trad('Afficher les critères')) . '");';
                
                // On détermine si sur le thème en cours l'utilisateur à le droit de saisir une notation sur les critères associés au thème
                $info_theme_cde = SqlNotation::rqGetNbNotationCdeToRate($this->no_cde, $_SESSION['Session_Login'], 'all', $theme['COD_THEM'])->Trouve1();
                $this->array_xml['theme'][$ind_theme]['is_modify'] = BoolSql($info_theme_cde['NB_CRITERES'] > 0);
                
                // On liste les critères associés au thème
                $liste_criteres = SqlNotation::rqGetListCriteresByThemeNotation($theme['COD_THEM'])->TrouveTous();
                
                if (is_array($liste_criteres)) {
                    $ind_critere = 0;
                    
                    // Pour chacun des critères
                    foreach ($liste_criteres as & $critere) {
                        $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['code'] = $critere['COD_CRIT']; // On enregistre le code du critère
                        $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['libelle'] = $critere['LIBELLE']; // son libellé
                        $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['id'] = "TH_{$ind_theme}|CRIT_$ind_critere"; // On définit un idenfiant pour le champ associé au critère du thème
                        $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['value'] = $critere['COD_CRIT']; // Valeur du champ critère
                        $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['obligatoire'] = BoolSql($critere['OBLIGAT']); // Caractère obligatoire du thème
                                                                                                                                          
                        // Pour le thème en cours on liste les notations possibles
                        $liste_notations = SqlNotation::rqGetListNotationByThemeNotationAndCritere($theme['COD_THEM'], $critere['COD_CRIT'])->TrouveTous();
                        
                        if (is_array($liste_notations)) {
                            // On récupère la notation déjà sélectionnée pour le critère
                            $infos_notation = SqlNotation::rqGetValueSelectedNotationForCdeByThemeAndCritere($this->no_cde, $theme['COD_THEM'], $critere['COD_CRIT'])->Trouve1();
                            
                            // On initialise la zone commeentaire de notation si celle-ci est déjà renseignée
                            if (is_array($infos_notation) && array_key_exists('NOTLIB', $infos_notation)) {
                                $valeur_notation = $infos_notation['NOTLIB'];
                                $comment_notation = $infos_notation['CONTMEMO'];
                            } else {
                                $valeur_notation = '';
                                $comment_notation = '';
                            }
                            
                            $id_comment = "TH_{$ind_theme}|CRIT_{$ind_critere}|COM"; // Identifiant de la zone commentaire de la notation
                            $id_zone_comment = "TH_{$ind_theme}|CRIT_{$ind_critere}|COM_ZONE"; // Zone contenant le champ de saisi du commentaire
                                                                                               
                            // Action effectué sur le changement de valeur de la notation. Si l'utilisateur sélectionne la mention "Votre choix" alors la zone commentaire ne sera pas visible
                            $js_onchange = "if('' == this.value){changeVisibility('$id_zone_comment',false); SetInnerHTML('$id_comment','');}else{changeVisibility('$id_zone_comment',true);}";
                            
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['id'] = "TH_{$ind_theme}|CRIT_{$ind_critere}|NOT"; // Identifiant du champ de notation
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['onchange'] = $js_onchange; // Action posé sur le déclancheur onchange du select
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['commentaire']['id'] = $id_comment; // Identifiant du champ de saisi du commentaire
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['commentaire']['value'] = $comment_notation; // Valeur par défaut du commentaire
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['commentaire']['id_zone'] = $id_zone_comment; // Identifiant de la zone contenant le champ de saisie du commentaire
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['value'] = $valeur_notation; // Valeur par défaut de la notation
                            
                            $ind_notation = 0;
                            
                            // On ajoute aux notations prédéfinie, l'option correspondant à la non sélection
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['liste'][$ind_notation]['code'] = '';
                            $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['liste'][$ind_notation]['libelle'] = Trad('Votre choix...');
                            
                            $ind_notation ++;
                            
                            // On enregistre tous les options pré-définies de notation
                            foreach ($liste_notations as & $notation) {
                                $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['liste'][$ind_notation]['code'] = $notation['LIBNOT'];
                                $this->array_xml['theme'][$ind_theme]['critere'][$ind_critere]['notation']['liste'][$ind_notation]['libelle'] = $notation['LIBNOT'];
                                $ind_notation ++;
                            }
                        }
                        
                        $ind_critere ++;
                    }
                }
                
                $ind_theme ++;
            }
        }
        
        return $this->array_xml;
    }

    /**
     * Fonction appelant le wsdl d'enregistrement de la notation d'une commande
     *
     * @param array $array_notation
     * @return
     */
    public static function &callWsdlEnregistrerNotationCde($array_notation)
    {
        $flux_xml = FluxXml::tradArrayInFluxXml($array_notation);
        $envoi_xml = "<NotationIn LngUtilisation='{$_SESSION['Session_Langue']}'>" . $flux_xml . '</NotationIn>';
        
        return Wsdl::wsdlCallGen('Oxaproc_NotationCde.wsdl', 'OXAPRC_ENREGNOTATION', $envoi_xml);
    }

    /**
     * Fonction appelant le wsdl d'enregistrement de la notation d'une commande
     *
     * @param array $array_notation
     * @return
     */
    public static function &callWsdlValiderNotationCde($no_cde, $user)
    {
        $envoi_xml = "<NotationValideIn LngUtilisation='{$_SESSION['Session_Langue']}'><User>$user</User><NumCde>$no_cde</NumCde></NotationValideIn>";
        return Wsdl::wsdlCallGen('Oxaproc_NotationCde.wsdl', 'OXAPRC_VALIDNOTATION', $envoi_xml);
    }
}