<?php

class Signataire
{

    var $base_reference = null;

    var $array = null;

    var $flux_result = null;

    var $connecteur = null;

    function __construct($contexte = 'panier', $typeDoc = null, $numDoc = null)
    {
        if ('panier' == $contexte) {
            
            $client = new SopaClientOxa('//localhost', false);
            $this->flux_result = FluxXml::GetFlux($client, 'soumission');
            
            $key = getValue('tag');
            
            // Recherche du pointeur correspondant a ce tag dans le flux
            
            list ($champs, $type, $id_xml) = explode('_', $key);
            
            $this->base_reference = null;
            switch (strtolower($type)) {
                case 'da':
                    $index_da = 0;
                    if (array_key_exists('DA', $this->flux_result)) {
                        $pointeur = & $this->flux_result['DA'];
                        
                        // Traitement de la liste des signataires
                        if (array_key_exists('ListSignataire', $pointeur)) {
                            if ($id_xml == $index_da) {
                                // Mise a jour signataire
                                $this->base_reference = & $pointeur['ListSignataire'];
                                break;
                            }
                            
                            $index_da ++;
                        }
                    }
                    break;
                case 'stock':
                    $index_stock = 0;
                    if (array_key_exists('Stock', $this->flux_result)) {
                        $pointeur = & $this->flux_result['Stock'];
                        
                        if (array_key_exists('ListSignataire', $pointeur)) {
                            if ($id_xml == $index_stock) {
                                // Mise a jour signataire
                                $this->base_reference = & $pointeur['ListSignataire'];
                                break;
                            }
                            
                            $index_stock ++;
                        }
                    }
                    break;
                case 'cdes':
                    $index_cdes = 0;
                    if (array_key_exists('ListCdes', $this->flux_result)) {
                        if (array_key_exists('Cde', $this->flux_result['ListCdes'])) {
                            if (array_key_exists('0', $this->flux_result['ListCdes']['Cde']))
                                $pointeur = & $this->flux_result['ListCdes']['Cde'];
                            else
                                $pointeur = & $this->flux_result['ListCdes'];
                            
                            $this->flux_result['ListCdes']['!TotCde'] = 0;
                            
                            $index = 0;
                            foreach ($pointeur as &$element)
                                if (is_array($element)) {
                                    if (array_key_exists('ListSignataire', $element)) {
                                        if ($id_xml == $index_cdes) {
                                            // Mise a jour signataire
                                            $this->base_reference = & $element['ListSignataire'];
                                            
                                            break;
                                        }
                                    }
                                    $index_cdes ++;
                                    $index ++;
                                }
                        }
                    }
                    break;
                default:
                    echo 'alert(\'', strtolower($type), '\');';
                    break;
            }
        }        // Si la liste des signataires est appelée depuis le module des documents en signature
        elseif ('documentEnSignature' == $contexte) {
            switch ($typeDoc) {
                case TypeSuivi::DA:
                    $liste_signataires_attendus = SqlSign::rqGetAllSignatAttendusByDA($numDoc, 'signature')->TrouveTous();
                    break;
                
                case TypeSuivi::CDE:
                    $liste_signataires_attendus = SqlSign::rqGetAllSignatAttendusByCDE($numDoc, 'signature')->TrouveTous();
                    break;
                
                case TypeSuivi::BAP:
                    $liste_signataires_attendus = SqlSign::rqGetAllSignatAttendusByBAP($numDoc, 'signature')->TrouveTous();
                    break;
                default:
                    $liste_signataires_attendus = null;
                    break;
            }
            
            $chaineSignat = '';
            
            // Initialisation des signataires attendus
            if (! is_null($liste_signataires_attendus) && is_array($liste_signataires_attendus) && count($liste_signataires_attendus) > 0) {
                foreach ($liste_signataires_attendus as & $signatAttendus) {
                    if (BoolSql($signatAttendus['INFORME']))
                        $type_signat = 'O';
                    else
                        $type_signat = 'N';
                    
                    $chaineSignat .= $signatAttendus['ORDRE'] . ';' . $signatAttendus['CODE'] . ';' . $signatAttendus['ROLE'] . ';;' . $signatAttendus['NOM'] . ';' . $type_signat . '|';
                    'O';
                }
                
                // On supprime le dernier séparateur ;
                $chaineSignat = mb_substr($chaineSignat, 0, mb_strlen($chaineSignat) - 1);
                
                $_SESSION['AlgoSpecif'] = $chaineSignat;
                $_SESSION['CSV_' . getValue('tag')] = $chaineSignat;
            }
            
            $listeSignatairesPossibles = SqlSign::getListUserForDelegation('', '', $typeDoc,false,$numDoc)->TrouveTous();

            if($listeSignatairesPossibles)
            {
                foreach ($listeSignatairesPossibles as & $signatPossible)
                    $this->base_reference['Signataire'][] = array(
                        'NomUtilisateur' => $signatPossible['NOM'],
                        'Utilisateur' => $signatPossible['CODE']
                    );
            }
        }
    }

    function CalcListe($liste_signataire_initiale = '', $context = '')
    {
        $this->AlgoSpecif = null;
        $this->add_liste = null;
        $this->signa_exite = null;
        $this->array = null;
        
        $rang_sys = 0;
        
        if ($_SESSION['AlgoSpecif'] != '') {
            $array_signataire_defaut = array();
            
            if ('' != $liste_signataire_initiale) {
                $array_signataire_initiaux = explode('|', $liste_signataire_initiale);
                
                // On définit la liste des signataire attendus présent initialement. Ces signataires ne peuvent être supprimer de la liste de signatires attendus
                foreach ($array_signataire_initiaux as $signataire_defaut) {
                    $signataire_defaut = explode(';', $signataire_defaut);
                    
                    if (is_array($signataire_defaut))
                        $array_signataire_defaut[] = $signataire_defaut[3];
                }
            }
            
            foreach (explode('|', $_SESSION['AlgoSpecif']) as $ligne) {
                $info = explode(';', $ligne);
                
                // Dans le cas de l'ajout de signataire sur un document en signature alors on bloque la possibilité de placer un signataire au dessus du signataire ajouté
                $this->signa_exite[$info[3]] = 1;
                $rang_sys ++;
                
                // Recherche du numero de telephone
                $record_user = SqlUsers::rqGetInfoUser($info[3])->Trouve1();
                
                $info[0] = sprintf('%02.1f', $info[0]);
                $this->AlgoSpecif[$rang_sys] = array(
                    'rang' => $info[0],
                    'code' => $info[1],
                    'role' => $info[2],
                    'codes' => $info[3],
                    'nom' => $info[4],
                    'sys' => $rang_sys,
                    'tel' => ($record_user['TEL'] != '' ? Trad('Tel : ') . $record_user['TEL'] : ''),
                    '!move' => ((int) $info[0] != $info[0] ? 1 : 0), // Autorisation a deplacement
                    '!supp' => ((count($info) > 6 && ($info[6] == 'O' || $info[6] == 'o')) || ($context == 'documentEnSignature' && $info[1]==$_SESSION["Session_Login"]) ? 0 : 1) // Autorisation a supprimer
                );
                
                // On donne la possibilité à l'utilisateur de sélectionner le type de signataire ajouté manuellement : Signataire ou Informé
                $this->AlgoSpecif[$rang_sys]['typeSigna'] = $info[5];
                if ($this->AlgoSpecif[$rang_sys]['!move']) {
                    $this->AlgoSpecif[$rang_sys]['nameSelectSigna'] = 'typeSigna_' . $info[3];
                    $this->AlgoSpecif[$rang_sys]['onChangeTypeSigna'] = 'TraiteUrl("select_signa_DA_specif.php?action=changeTypeSigna",this);';
                }
                
                if ($this->AlgoSpecif[$rang_sys]['!move']) {
                    $this->AlgoSpecif[$rang_sys]['!down'] = "Traite('select_signa_DA_specif.php',document.frm_popup.information,'down_{$rang_sys}');";
                    $this->AlgoSpecif[$rang_sys]['!up'] = "Traite('select_signa_DA_specif.php',document.frm_popup.information,'up_{$rang_sys}');";
                    if ($this->AlgoSpecif[$rang_sys]['!supp'] == 1)
                        $this->AlgoSpecif[$rang_sys]['!del'] = "Traite('select_signa_DA_specif.php',document.frm_popup.information,'del_{$rang_sys}');";
                } else {
                    // Spec 2690 La suppression d'un signtaire est autorise meme pour les signataires qui ne peuvent pas bouger
                    if ($_SESSION['AuthSupSigWF'])
                        if ($this->AlgoSpecif[$rang_sys]['!supp'] == 1)
                            $this->AlgoSpecif[$rang_sys]['!del'] = "Traite('select_signa_DA_specif.php',document.frm_popup.information,'del_{$rang_sys}');";
                    
                }
                if (is_null($this->array)) {
                    $this->array['!mini'] = $info[0];
                    $this->array['!maxi'] = $info[0];
                } else {
                    if ($this->array['!mini'] > $info[0])
                        $this->array['!mini'] = $info[0];
                    if ($this->array['!maxi'] < $info[0])
                        $this->array['!maxi'] = $info[0];
                }
            }
        }
    }

    function GenereListe($base_reference, $liste_signataire_initiale = '', $context = null)
    {
        $this->AlgoSpecif = null;
        $this->add_liste = null;
        $this->signa_exite = null;
        
        $this->CalcListe($liste_signataire_initiale, $context);
        
        $add_liste = [];
        
        if($_SESSION['AuthAjoutSignataire'])
        {
            // Liste des signataires pouvant etre rajoutés
            if (array_key_exists('Signataire', $base_reference)) {
                if (is_array($base_reference['Signataire'])) {
                    if (array_key_exists('0', $base_reference['Signataire'])) {
                        foreach ($base_reference['Signataire'] as & $signataire)
                            if (is_null($this->signa_exite))
                                $add_liste[] = $signataire;
                            else if (! array_key_exists($signataire['Utilisateur'], $this->signa_exite))
                                $add_liste[] = $signataire;
                    } else if (is_null($this->signa_exite))
                        $add_liste[] = $base_reference['Signataire'];
                    else if (! array_key_exists($base_reference['Signataire']['Utilisateur'], $this->signa_exite))
                        $add_liste[] = $base_reference['Signataire'];
                }
            }
        }
   
        /**
         * Donc maintenant on a deux choses la liste des signataires specifiques
         * et la liste des signataires pouvant etre rajoutés
         */
        //print_r($this->AlgoSpecif); exit; 
        if (! is_null($this->AlgoSpecif))
        {
            $i = 0;
            $k = 1; 
            $concatAliasSqlDeleg= '';
            $concatArray = []; 

            //print_r(SqlInfo::delegByCDE('YA')->TrouveTous()); exit; 
    
            foreach($this->AlgoSpecif as $v)
            {      
                //print_r($v);        
                foreach(SqlInfo::delegByCDE($v['codes'])->TrouveTous() as $z)
                {
                    $arr = SqlVisibilite::rqGetLibelleUser($z['DELEG'])->Trouve1(); 
                    $title=  count(SqlInfo::delegByCDE($v['codes'])->TrouveTous()) > 1 ? trad('Délégations du signataire') : trad('Délégation du signataire'); 
                  
                    if($v['codes'] ==  $z['SIGNAT'])
                    {
                        if($z['DTE_FIN'] == '00000000')
                        {
                            if($i==0 || $concatAliasSqlDeleg == '')
                            {
                                $concatAliasSqlDeleg = $title.' : ' . $z['DELEG'] . ' ('. $arr['NOM']. ' '. trad('à partir du'). ' '. convertDateSqlToFr($z['DTE_DEB']). ') '; 
                                $i++;                                
                            }
                            else
                            {
                                $concatAliasSqlDeleg .= ', '. $z['DELEG']. ' ('. $arr['NOM']. ' '. trad('à partir du'). ' '. convertDateSqlToFr($z['DTE_DEB']). ') ';
                            }
                            
                        }
                        if($z['DTE_FIN'] != '00000000')
                        {
                            if($i==0 || $concatAliasSqlDeleg == '')
                            {
                                $concatAliasSqlDeleg = $title.' : ' . $z['DELEG'] . ' ('. $arr['NOM']. ' '. trad('du'). ' '. convertDateSqlToFr($z['DTE_DEB']). ' '. trad('au'). ' '. convertDateSqlToFr($z['DTE_FIN']). ') '; 
                                $i++; 
                            }
                            else
                            {
                                $concatAliasSqlDeleg .= ', '. $z['DELEG']. ' ('. $arr['NOM']. ' '. trad('du'). ' '. convertDateSqlToFr($z['DTE_DEB']). ' '. trad('au'). ' '. convertDateSqlToFr($z['DTE_FIN']). ') ';
                            }
                        }
                    }
                }
 
             
                array_push($concatArray, $concatAliasSqlDeleg); 
                $concatAliasSqlDeleg = '';              
            } 
           
            //print_r($concatArray); exit; 
            for($c = 0; $c<count($concatArray) ; $c++)
            {
                $this->AlgoSpecif[$k]['concat'] = $concatArray[$c]; 
                $k++; 
            } 
            $this->array['base'] = $this->AlgoSpecif;
        }

        if (! is_null($add_liste))
        {
            $this->array['add']['!onchange'] = "Traite('select_signa_DA_specif.php',this);";
            $this->array['add']['option'] = $add_liste;
        }
        
        return $this->array;
    }
}