<?php

/**
 * Classe permettant de gérer le routage des commandes
 *
 */
class Routage
{

    /**
     * Attributs
     */
    protected $routage_result;
 // Routage disponible pour une commande donnée renvoyé par le WSDL
    protected $array_xml;
 // Tableau d'un flux de données XML à afficher
    protected $array_type_routage;
 // Tableau contenant la liste des routages possibles
    protected $array_valeur_routage;
 // Tableau contenant les propriétés du champ valeur de routage
    protected $exemplaire_for_routage;
 // Tableau contenant les exemplaires sont seront envoyés
    protected $nb_exemplaire_for_routage;
 // Nombre d'exmeplaire pour un routage donné
    protected $FAX_BDC;

    /**
     * Constructeur
     */
    public function __construct()
    {
        
        // On définit la liste des routages possibles
        // Coordonnees 0 indique qu'il n'y a pas de saisie de coordonnées pour ce type de routage
        // Modify 0 indique qu'il n'est pas possible de modifier la valeur du champ coordonnées
        $this->array_type_routage['P']['value'] = 'P';
        $this->array_type_routage['P']['option'] = 'PDF';
        $this->array_type_routage['P']['coord'] = false;
        
        $this->array_type_routage['E']['value'] = 'E';
        $this->array_type_routage['E']['option'] = 'Mail';
        $this->array_type_routage['E']['coord'] = true;
        
        $this->FAX_BDC = Param::AllParamsGetValue('FAX_BDC');
        if ($this->FAX_BDC) {
            $this->array_type_routage['F']['value'] = 'F';
            $this->array_type_routage['F']['option'] = 'Fax';
            $this->array_type_routage['F']['coord'] = true;
        }
        
        /**
         * ECA Spéc N°2157 : Ajout du routage EDI
         */
        $this->array_type_routage['D']['value'] = 'D';
        $this->array_type_routage['D']['option'] = 'EDI';
        $this->array_type_routage['D']['coord'] = 0;
        $this->array_type_routage['D']['modify'] = 0;
        $this->array_valeur_routage['D']['modify'] = 0;
        
        /**
         */
        $this->array_type_routage['P']['modify'] = true;
        $this->array_type_routage['E']['modify'] = true;
        $this->array_type_routage['F']['modify'] = $this->FAX_BDC;
        
        $this->array_valeur_routage['P']['modify'] = true;
        $this->array_valeur_routage['E']['modify'] = true;
        $this->array_valeur_routage['F']['modify'] = $this->FAX_BDC;
        
        // Initialisation des tableaux et compteurs
        $this->routage_result = array();
        $this->exemplaire_for_routage = array();
        $this->array_xml = array();
        $this->nb_exemplaire_for_routage = 0;
    }

    /**
     * Méthodes GET and SET
     */
    public function getRoutageResult()
    {
        return $this->routage_result;
    }

    public function &getXMLArray()
    {
        $this->array_xml['popup_title'] = Trad('Routage de la commande N°') . ' ' . $this->array_xml['form']['no_cde']['!value'];
        return $this->array_xml;
    }

    public function getNbExemplaire()
    {
        return $this->nb_exemplaire_for_routage;
    }

    /**
     * Fonction permettant d'appeler le WSDL retournant le routage disponible pour une commande donnée
     */
    public function callWSDLRoutageForCde($no_cde, $mode)
    {
        
        // Flux XML envoyé au WSDL
        $envoi = "<CdeIn LngUtilisation='" . utilisateur::getLangue() . "'>" . '<RefPanier></RefPanier>' . "<Utilisateur>{$_SESSION['Session_Login']}</Utilisateur>" . '<SectImp></SectImp>' . '<CtrLivraison></CtrLivraison>' . '<AdrLivr></AdrLivr>' . '<VilleLivr></VilleLivr>' . '<PaysLivr></PaysLivr>' . '<ContactLivr></ContactLivr>' . '<FonctionContactLivr></FonctionContactLivr>' . '<TelContLivr></TelContLivr>' . '<FaxContLivr></FaxContLivr>' . '<PortContLivr></PortContLivr>' . '<MailContLivr></MailContLivr>' . "<NumeroCde>$no_cde</NumeroCde>" . '<Cde></Cde>' . "<Routage>$mode</Routage>" . '</CdeIn>';
        
        // Envoi au WSDL
        $tempRoutage = Wsdl::wsdlCallGen('Oxaproc_Commande.wsdl', 'OXAPRC_IMPRIMECDE', $envoi);
        
        // Si le paramétrage indique qu'il n'y a pas de fax, on le supprime des routages
        if (! $this->FAX_BDC) {
            $tempListeRoutage = & $tempRoutage['ListeRoutage']['Routage'];
            $resultListeRoutage = array();
            // est-ce qu'on est sur un tableau d'entrées ou un tableau de tableaux d'entrées?
            if (isset($tempListeRoutage['TypeRoutage'])) {
                if ($tempListeRoutage['TypeRoutage'] !== 'F') {
                    $resultListeRoutage[] = $tempListeRoutage;
                }
            } else
                foreach ($tempListeRoutage as & $routage)
                    if ($routage['TypeRoutage'] !== 'F')
                        $resultListeRoutage[] = $routage;
            
            $tempRoutage['ListeRoutage']['Routage'] = & $resultListeRoutage;
        }
        
        $this->routage_result = & $tempRoutage;
        
        // Attention : selon le nombre de résultats retournés le traitement est différent.
        // En effet, si un seul résultat le tableau n'est pas indexé avec $this->routage_result[0] mais avec $this->routage_result
        // On teste donc le nombre de résultat
        // Si au moins un routage est défini et qu'il n'y a qu'un seul routage alors on reindexe le tableau de résultat
        
        if (is_array($this->routage_result['ListeRoutage']) && array_key_exists('TypeExemplaire', $this->routage_result['ListeRoutage']['Routage'])) {
            $routage = $this->routage_result['ListeRoutage']['Routage'];
            $this->routage_result['ListeRoutage']['Routage'] = null;
            $this->routage_result['ListeRoutage']['Routage'][0] = $routage;
        }
    }

    /**
     * Fonction permettant d'appeler le WSDL retournant le routage disponible pour une commande donnée
     * 
     * @param int $no_cde
     *            : numéro de la commade à router
     * @param array $routage
     *            : tableau contenant le routage choisit par l'utilisateur
     */
    public function callWSDLEnvoiCde($no_cde, $routage)
    {
        
        // Flux XML envoyé au WSDL
        $envoi = "<CdeIn LngUtilisation='{$_SESSION['Session_Langue']}'>" . '<RefPanier></RefPanier>' . "<Utilisateur>{$_SESSION['Session_Login']}</Utilisateur>" . '<SectImp></SectImp>' . '<CtrLivraison></CtrLivraison>' . '<AdrLivr></AdrLivr>' . '<VilleLivr></VilleLivr>' . '<PaysLivr></PaysLivr>' . '<ContactLivr></ContactLivr>' . '<FonctionContactLivr></FonctionContactLivr>' . '<TelContLivr></TelContLivr>' . '<FaxContLivr></FaxContLivr>' . '<PortContLivr></PortContLivr>' . '<MailContLivr></MailContLivr>' . "<NumeroCde>{$no_cde}</NumeroCde>" . '<Cde></Cde>' . '<Routage>E</Routage>' . // On définit le mode E pour exécution
"{$routage}";
        $envoi .= '</CdeIn>';
        
        // Envoi au WSDL
        $this->routage_result = Wsdl::wsdlCallGen('Oxaproc_Commande.wsdl', 'OXAPRC_IMPRIMECDE', $envoi);
    }

    /**
     * Fonction construisant le tableau XML pour l'affichage du routage à l'utilisateur
     * 
     * @param int $no_cde
     *            : numéro de commande à envoyer
     *            
     */
    public function buildXMLforRoutage($no_cde)
    {
        $this->array_xml['form']['no_cde'] = array(
            '!value' => $no_cde
        ); // Initialisation du numéro de commande
        $this->array_xml['form']['name'] = array(
            '!value' => 'routage_' . $no_cde
        ); // Initialisation du nom du formulaire
                                                                                    // On récupère les données de routage pour chaque ligne exemplaire du routage, l'ensemble de ces ligne sera intégré dans un formulaire de routage
                                                                                    // $no_cde permet d'identifier le routage d'une commande par rapport aux autres commandes
                                                                                    // $i permet d'identifier une ligne de routage pour une commande donnée par rapport aux autres lignes de routage
        
        $i = 0;
        
        // On enregistre la liste des types de routage possibles afin de les proposer sur chaque ligne exemplaire
        // Initialisaton du tableau javascript qui sera transmis à la fonction 'activeRoutageExemplaire'
        $tab = ' var tab = new Array();';
        
        // Définition de la liste des types de routage possible
        foreach ($this->array_type_routage as & $value) {
            /**
             * ECA Spéc N°2157 : Ajout du routage EDI
             * Le routage EDI ne doit pas faire partie de la liste des routages possibles
             * Il s'agit d'un routage imposé et non sélectionnable
             */
            if (isset($value['value']) && 'D' != $value['value']) { // Si le type de routage n'est pas EDI alors on alimente la liste contenant les types de routage possible
                $this->array_xml['type_routage']['routage'][] = array(
                    '!value' => $value['value'],
                    '!option' => $value['option'],
                    '!coord' => $value['coord'],
                    '!modify' => $value['modify']
                );
                
                // Si le champ permet la saisie de coordonnées
                // alors on le stock dans un le tableau javascript
                if ($value['coord'])
                    $tab .= "tab.push('{$value['option']}');";
            }
        }
        
        if (is_array($this->routage_result['ListeRoutage'])) {
            
            // Permet d'indiquer que la liste de routage n'est pas vide
            $this->array_xml['ListeRoutage']['vide'] = array(
                '!value' => 0
            );
            if (array_key_exists('Erreur', $this->routage_result['ListeRoutage']))
                $this->array_xml['ListeRoutage']['Erreur'] = $this->routage_result['ListeRoutage']['Erreur'];
            
            for ($i = 0; $i < count($this->routage_result['ListeRoutage']['Routage']); $i ++) {
                $this->array_xml['routage']['ligne'][$i]['Obligatoire']['!value'] = convBoolToBin($this->routage_result['ListeRoutage']['Routage'][$i]['Obligatoire']);
                $this->array_xml['routage']['ligne'][$i]['TypeExemplaire'] = array(
                    '!value' => $this->routage_result['ListeRoutage']['Routage'][$i]['TypeExemplaire'], // On enregistre la valeur du champ
                    '!name' => $no_cde . '_' . $i . '_TypeExemplaire', // On enregistre le nom du champ
                    '!id' => $no_cde . '_' . $i . '_TypeExemplaire'
                ); // On enregistre l'id du champ
                                                                  // Remarque : Pour une raison inconnue, l'encodage retournée par le wsdl est mal détecté on est donc obligé de passer en ISO le titre de l'exemplaire avec utf8_decode
                $this->array_xml['routage']['ligne'][$i]['TitreExemplaire'] = array(
                    '!value' => $this->routage_result['ListeRoutage']['Routage'][$i]['TitreExemplaire'],
                    '!name' => $no_cde . '_' . $i . '_TitreExemplaire',
                    '!id' => $no_cde . '_' . $i . '_TitreExemplaire'
                );
                
                $this->array_xml['routage']['ligne'][$i]['TypeRoutage'] = array(
                    '!value' => $this->routage_result['ListeRoutage']['Routage'][$i]['TypeRoutage'],
                    '!name' => $no_cde . '_' . $i . '_TypeRoutage',
                    '!id' => $no_cde . '_' . $i . '_TypeRoutage',
                    '!modify' => $this->array_type_routage[$this->routage_result['ListeRoutage']['Routage'][$i]['TypeRoutage']]['modify'],
                    '!libelle' => $this->array_type_routage[$this->routage_result['ListeRoutage']['Routage'][$i]['TypeRoutage']]['option']
                );
                
                $this->array_xml['routage']['ligne'][$i]['Coordonnee'] = array(
                    '!name' => $no_cde . '_' . $i . '_Coordonnee',
                    '!id' => $no_cde . '_' . $i . '_Coordonnee',
                    '!modify' => $this->array_valeur_routage[$this->routage_result['ListeRoutage']['Routage'][$i]['TypeRoutage']]['modify']
                );
                
                $this->array_xml['routage']['ligne'][$i]['From'] = array(
                    '!value' => $this->routage_result['ListeRoutage']['Routage'][$i]['From'],
                    '!name' => $no_cde . '_' . $i . '_From',
                    '!id' => $no_cde . '_' . $i . '_From',
                    '!modify' => '0'
                );
                
                $this->array_xml['routage']['ligne'][$i]['Id'] = array(
                    '!value' => $this->routage_result['ListeRoutage']['Routage'][$i]['Id'],
                    '!name' => $no_cde . '_' . $i . '_Id',
                    '!id' => $no_cde . '_' . $i . '_Id'
                );
                
                // En effet, selon le routage choisi, le champ coordonnées est soit un input (mail et fax) soit vide (pdf)
                $this->array_xml['routage']['ligne'][$i]['onchange_routage'] = array(
                    '!value' => "$tab selectTypeRoutage('{$this->array_xml['routage']['ligne'][$i]['TypeRoutage']['!id']}','{$this->array_xml['routage']['ligne'][$i]['Coordonnee']['!id']}',tab);"
                );
                
                // On définit ici les value des options de chaque exemplaire de routage
                // On concatène le type de routage et les coordonnées associées par défaut au type de routage
                $this->array_xml['routage']['ligne'][$i]['PDF'] = array(
                    '!value' => $this->array_type_routage['P']['value']
                );
                $this->array_xml['routage']['ligne'][$i]['Mail'] = array(
                    '!value' => $this->array_type_routage['E']['value'] . '_' . $this->routage_result['ListeRoutage']['Routage'][$i]['Mail']
                );
                $this->array_xml['routage']['ligne'][$i]['Fax'] = array(
                    '!value' => $this->array_type_routage['F']['value'] ?? '' . '_' . $this->routage_result['ListeRoutage']['Routage'][$i]['Fax']
                );
                
                // On initialise les valeurs par défaut des champs coordonnées
                $this->array_xml['routage']['ligne'][$i]['init']['Mail'] = array(
                    '!value' => $this->routage_result['ListeRoutage']['Routage'][$i]['Mail']
                );
                $this->array_xml['routage']['ligne'][$i]['init']['Fax'] = array(
                    '!value' => $this->routage_result['ListeRoutage']['Routage'][$i]['Fax']
                );
                
                $this->array_xml['routage']['ligne'][$i]['activation'] = array(
                    '!name' => $no_cde . '_' . $i . '_checkbox',
                    '!id' => $no_cde . '_' . $i . '_checkbox',
                    '!onclick' => "$tab activeRoutageExemplaire('{$no_cde}_{$i}_checkbox','{$this->array_xml['routage']['ligne'][$i]['TypeRoutage']['!id']}','{$this->array_xml['routage']['ligne'][$i]['Coordonnee']['!id']}',tab);"
                );
                
                // On incrémente le nombre d'exemplaire présent qui est utilisé par la suite pour déterminer la hauteur de la popup de routage
                $this->nb_exemplaire_for_routage ++;
                
                /**
                 * Spécifique Agrica
                 */
                if (51 == $_SESSION['Session_NumClient']) {
                    $RoutageAgrica = new RoutageAGRICA($no_cde);
                    
                    if (0 == $RoutageAgrica->getEXEMPLAIRE_GESTION_MODIFABLE()) {
                        if ('GES' == $this->routage_result['ListeRoutage']['Routage'][$i]['TypeExemplaire']) {
                            $this->array_xml['routage']['ligne'][$i]['TypeRoutage']['!modify'] = 0;
                            $this->array_xml['routage']['ligne'][$i]['TypeRoutage']['!value'] = 'E';
                            $this->array_xml['routage']['ligne'][$i]['TypeRoutage']['!libelle'] = $this->array_type_routage['E']['option'];
                            $this->array_xml['routage']['ligne'][$i]['Coordonnee']['!modify'] = 1;
                        }
                    }
                }
            } // fin du for
        } else {
            // Permet d'indiquer que la liste de routage est pas vide
            $this->array_xml['ListeRoutage']['vide'] = array(
                '!value' => 1,
                '!message' => trad('Le routage n\'est pas défini pour le centre de émetteur de la commande, veuillez contacter votre administrateur')
            );
        }
        
        // On enregistre le nombre total de ligne du formulaire correspondant au nombre d'exemplaire du routage
        // le total sera nécessaire lors de l'envoi des commandes afin de récupérer toutes les lignes du formulaire
        
        if(is_array($this->array_xml['routage']['ligne']))
            $total_ligne_count = count($this->array_xml['routage']['ligne']);
        else 
            $total_ligne_count = 0; 
        
        $this->array_xml['total_ligne'] = array(
            '!value' => $total_ligne_count,
            '!name' => 'total_' . $no_cde
        );
        
        // On définit l'action sur le bouton d'exécution du routage
        // RQ : Remise en asyncrone car probleme avec la fonction Traite()
        $this->array_xml['execution'] = array(
            '!value' => "TraiteAsync('routage.php?action=envoyer',document.forms.{$this->array_xml['form']['name']['!value']}.{$this->array_xml['total_ligne']['!name']},'','" . Trad('Traitement du routage en cours...') . '\');'
        );
        
        // on définit l'action quitter le routage de la commande : le contenu de la popup est supprimé et elle devient masquée
        $this->array_xml['quitter'] = array(
            '!value' => 'masquePopup();'
        );
        
        // Preparation de l'ajout de routage
        $this->array_xml['ADD']['select']['!name'] = 'add_select_' . $no_cde;
        $this->array_xml['ADD']['select']['!id'] = 'add_select_' . $no_cde;
        $this->array_xml['ADD']['coord']['!name'] = 'add_coord_' . $no_cde;
        $this->array_xml['ADD']['coord']['!id'] = 'add_coord_' . $no_cde;
        $this->array_xml['ADD']['type']['!name'] = 'add_type_' . $no_cde;
        $this->array_xml['ADD']['type']['!id'] = 'add_type_' . $no_cde;
        $this->array_xml['ADD']['select']['!onchange'] = "$tab selectTypeRoutage('{$this->array_xml['ADD']['select']['!id']}','{$this->array_xml['ADD']['coord']['!id']}',tab);";
        $this->array_xml['ADD']['add']['!onclick'] = "TraiteAsync('routage.php?action=ajouter',this,'');";
        $_SESSION['routage'] = serializeSecure($this->array_xml);
        $_SESSION['type_routage'] = serializeSecure($this->array_type_routage);
    }

    /**
     * Fonction préparant les données pour l'appel du WSDL de routage en mode exécution
     *
     * @param array $array_data
     *            : Tableau des données de routage à traiter
     */
    public function &getDataRoutage(& $array_data)
    {
        global $connecteur;
        
        // Récupération du Numéro de la commande en question $array_data[form] = routage_20060044
        $no_cdeTmp = explode('_', $array_data['form']);
        $no_cde = $no_cdeTmp[1];
        
        // Récupération du nombre total de ligne exemplaire
        $nb_ligne = $array_data['total_' . $no_cde];
        
        $envoi = '<ListeRoutageFinal>';
        
        // Pour toutes les lignes exemplaires
        for ($i = 0; $i < $nb_ligne; $i ++) {
            
            $prefixe = $no_cde . '_' . $i . '_';
            
            /**
             * Pour le moment on le laisse pas le choix aux utilisateur de sélectionner un exemplaire
             * pour activer la prise en compte de la sélection il suffit de décommenter le test sur le statut de la checbox
             */
            // Si l'exemplaire a été sélectionné par l'utilisateur
            if ($array_data[$prefixe . 'checkbox'] == 'on') {
                
                // On extrait le type de routage à partir de la value de l'option de routage sélectionné.
                // car la value contient "tpe de routage"_"coordonnées par défaut" ex : F_0146994845 ou E_xxx@oxalys.fr
                $type_routage = mb_substr($array_data[$prefixe . 'TypeRoutage'], 0, 1);
                
                // Si le type de routage est le mail
                if ($type_routage == 'E') {
                    
                    $array_data[$prefixe . 'Coordonnee'] = str_ireplace(',', ';', $array_data[$prefixe . 'Coordonnee']);
                    
                    if (trim($array_data[$prefixe . 'Coordonnee']) == '') {
                        Affichage::messageJS(trad('Une adresse mail doit etre renseignée'));
                        $connecteur->disconnect();
                        exit();
                    }
                    
                    if (false !== strpos($array_data[$prefixe . 'Coordonnee'], ';')) {
                        
                        $liste_mail = explode(';', $array_data[$prefixe . 'Coordonnee']);
                        
                        if (is_array($liste_mail)) {
                            foreach ($liste_mail as $mail) {
                                // On contrôle la syntaxe du mail
                                if (! ControleSaisie::checkMail(trim($mail))) {
                                    Affichage::messageJS(trad('La syntaxe de l\'adresse mail est incorrecte, veuillez la vérifier'));
                                    $connecteur->disconnect();
                                    exit();
                                }
                            }
                        }
                    }                    // Si l'utilisateur a saisi une seul adresse mail
                    elseif (! ControleSaisie::checkMail(trim($array_data[$prefixe . 'Coordonnee']))) {
                        Affichage::messageJS(trad('La syntaxe de l\'adresse mail est incorrecte, veuillez la vérifier'));
                        $connecteur->disconnect();
                        exit();
                    }
                }                // Si le type de routage est le fax
                elseif ($type_routage == 'F' && $array_data[$prefixe . 'Coordonnee'] == '') {
                    Affichage::messageJS(trad('Veuillez renseigner un numéro de fax pour les routages de type fax'));
                    $connecteur->disconnect();
                    exit();
                }
                
                // Alors on stocke les informations relatives à l'exemplaire
                $envoi .= '<RoutageFinal>';
                $envoi .= "<TypeExemplaire>{$array_data[$prefixe . 'TypeExemplaire']}</TypeExemplaire>";
                $envoi .= "<TitreExemplaire>{$array_data[$prefixe . 'TitreExemplaire']}</TitreExemplaire>";
                $envoi .= "<TypeRoutage>$type_routage</TypeRoutage>";
                $envoi .= "<Coordonnee>{$array_data[$prefixe . 'Coordonnee']}</Coordonnee>";
                $envoi .= "<From>{$array_data[$prefixe . 'From']}</From>";
                $envoi .= "<Id>{$array_data[$prefixe . 'Id']}</Id>";
                $envoi .= "</RoutageFinal>";
            }
        }
        
        $envoi .= '</ListeRoutageFinal>';
        return $envoi;
    }
}
