<?php

/**
 * Classe permettant la gestion des délégations lorsque le worflow standard est activé
 *
 * Un utilisateur dispose une liste de délégataires, chaque délégation est composée d'une entête, d'une liste de déclencheurs
 * et d'une liste de rôles.
 */
class DelegationSignature
{

    private $listeDelegataires;
 // Liste des délégataire de l'utilisateur
    private $enteteDelegation;
 // Informations liées à l'entête d'une délégation
    private $declencheurs;
 // Liste des déclencheurs d'une délégation
    private $listeRoles;
 // Rôles associés à une délégation
    private $listeRolesFOURNISS;
 // Rôles associés à une délégation pour la gestion des fournisseurs
    private $signataire;
 // Login de l'utilisateur signataire gérant ses délégations
    private $listeTableRef;
 // Liste des tables de référence des déclencheurs
    private $listeTableRefFOURNISS;
 // Liste des tables de référence des déclencheurs pour la gestion des fournisseurs
    private $script_cible;
 // On définit le script de traitement de la sélection d'un délégataire par l'utilisateur
    public function __construct($signataire)
    {
        $this->script_cible = 'ctrl_signature_manage.php'; // On définit le script de traitement de la sélection d'un délégataire par l'utilisateur
        $this->signataire = $signataire;
        $this->getListeDeclencheurs();
    }

    public function getListeDelegataires()
    {
        return $this->listeDelegataires;
    }

    public function getEnteteDelegation()
    {
        return $this->enteteDelegation;
    }

    public function getDeclencheurs()
    {
        return $this->declencheurs;
    }

    public function getRoles()
    {
        return $this->roles;
    }

    /**
     * Fonction retournant le libellé correspondant à un code table donné
     *
     * @param string $code_table
     *            : Code de la table dont on souhaite le libellé
     * @return string libelle associé au code de la table
     */
    public function getLibelleTable($code_table)
    {
        if (array_key_exists($code_table, $this->listeTableRef))
            return $this->listeTableRef[$code_table];
        else
            return $code_table;
    }

    public function getLibelleTableFourniss($code_table)
    {
        if (array_key_exists($code_table, $this->listeTableRefFOURNISS))
            return $this->listeTableRefFOURNISS[$code_table];
        else
            return $code_table;
    }

    /**
     * Fonction initialisant la liste des délégataire du signataire
     * 
     * @param string $delegataire
     *            : Login du délégataire
     */
    public function initListeDelegataires($delegataire = '')
    {
        $this->listeDelegataires = SqlDelegation::rqGetListeDelegataireBySignat($this->signataire, $delegataire)->TrouveTous();
        return $this->listeDelegataires;
    }

    /**
     * Fonction initialisant la liste des déclancheurs pour un signataire et un délégataire donnés
     * 
     * @param string $delegataire
     *            : Login du délégataire
     */
    public function initListeDeclencheurs($delegataire, $declencheur = '')
    {
        $this->declencheurs = SqlDelegation::rqGetListeDeclencheursBySignatAndDelegataire($this->signataire, $delegataire, $declencheur)->TrouveTous();
    }

    /**
     * Fonction initialisant la liste des déclancheurs pour un signataire et un délégataire donnés
     * 
     * @param string $delegataire
     *            : Login du délégataire
     */
    public function initListeRoles($delegataire)
    {
        $this->listeRoles = SqlDelegation::rqGetListeRolesBySignatAndDelegataire($this->signataire, $delegataire)->TrouveTous();
        /**
         * Dossier N° 27428 (OXAR&D) du 13/07/2017 : Vos Réf.
         * : TEST / Erreur SQL en gestion des délagations
         * A REMETTRE POUR LA VERSION ah SSI le WorkFlow fournisseur est mis en place EDP
         *
         * @var Ambiguous $listeRolesFOURNISS $this->listeRolesFOURNISS = SqlDelegation::rqGetListeRolesFOURNISSBySignatAndDelegataire($this->signataire, $delegataire)->TrouveTous();
         *     
         *      et donc supprimer la ligne ci-dessous
         */
        $this->listeRolesFOURNISS = null;
    }

    public function buildXmlDelegationsRecues()
    {
        // Affichage de browse de la liste des delegations d'absence reçues
        $r['liste'] = SqlSign::rqSignInDelegationsRecues()->TrouveTous();  
        $r['count'] = count($r['liste']);      
        return $r;
    }

    public function buildXmlListeSignatures()
    {
        
        // Affichage de browse de la liste des delelgation d'absence
        if ($r['liste'] = SqlSign::rqSignInDelegationV10()->TrouveTous()) {
            foreach ($r['liste'] as &$info) {
                $unique = 'loginDelegataire=' . $info['DELEG'] . '&' . 'DTE_DEB=' . $info['DTE_DEB'];
                
                $info['modif']['!onclick'] = "OpenPopup('ctrl_info_signatures.php?action=initPopup&popup_id=SIGN_SIGNATURE&mod=M&{$unique}','pop_signa','600','450');";
                $info['suppr']['!onclick'] = "OpenPopup('ctrl_info_signatures.php?action=initPopup&popup_id=SIGN_SIGNATURE&mod=S&{$unique}','pop_signa','600','450');";
                
                $info['DTE_DEB'] = convertDateSqlToFr($info['DTE_DEB']);
                if ($info['DTE_FIN'] == '00000000')
                    $info['DTE_FIN'] = '';
                else
                    $info['DTE_FIN'] = convertDateSqlToFr($info['DTE_FIN']);
            }
        }
        $r['CREER'] = "OpenPopup('ctrl_info_signatures.php?action=initPopup&popup_id=SIGN_SIGNATURE&mod=A','pop_signa','600','450');";
        
        return $r;
    }

    /**
     * Fonction construisant le tableau de donnée xml qui sera transmis à la xsl permettant d'afficher la liste des délégatires du signataire
     */
    public function buildXmlListeDelegataires()
    {
        $this->initListeDelegataires();
        
        if (is_array($this->listeDelegataires))
            foreach ($this->listeDelegataires as & $delegataire)
                $listeDelegatairesXML['delegataires'][] = array(
                    'CODE_DEL' => $delegataire['CODE_DEL'], // Login du delegataire
                    'NOM_DEL' => $delegataire['NOM_DEL'], // Nom du delegataire
                    'CODE_STE' => $delegataire['CODE_STE'], // Code de la société
                    'RAIS_SOC' => $delegataire['RAIS_SOC'], // Raison sociale de la société
                    'MONTANT' => FormatageData::formatMontant($delegataire['MONTANT'], 2, ' '), // Montant plafond de la délégation
                    'TYPE_DEL' => $delegataire['TYPE_DEL'], // Type de délégation : P => Permanente, E => En cas d'absence
                    'LIB_DEL' => $delegataire['TYPE_DEL'] == 'P' ? trad('Permanente') : Trad("En cas d'absence"), // Libellé de la délégation
                    'SELECT_DEL' => "CallUrl('{$this->script_cible}?action=selectDelegation&CODE_DEL={$delegataire['CODE_DEL']}&CODE_STE={$delegataire['CODE_STE']}');" // Action exécutée lorsque le signataire sélectionne un délégataire
                );
        
        $listeDelegatairesXML['CREER'] = "CallUrl('{$this->script_cible}?action=creationDelegation');";
        $listeDelegatairesXML['ENREGISTRER'] = "TraiteUrl('{$this->script_cible}?action=enregistrerDelegation',document.getElementById('code_del'));";
        $listeDelegatairesXML['MODIFIER'] = "TraiteUrl('{$this->script_cible}?action=modifierDelegation'	,document.getElementById('code_del'));";
        $listeDelegatairesXML['SUPPRIMER'] = "TraiteUrl('{$this->script_cible}?action=supprimerDelegation'	,document.getElementById('code_del'));";
        
        return $listeDelegatairesXML;
    }

    /**
     * Fonction construisant le tableau de donnée xml qui sera transmis à la xsl permettant d'afficher l'entête d'une délégation donnée
     * 
     * @param string $delegataire
     *            : Login du délégataire
     * @param string $mode_acces
     *            : Mode d'accès à la délégation Création => 'C' ou Modification 'M'
     */
    public function &buildXmlEnteteDelegation($delegataire, $mode_acces)
    {
        $listeDelegatairesXML = null;
        if ('M' == $mode_acces)
            $this->initListeDelegataires($delegataire);
        else {
            $this->listeDelegataires[0]['CODE_DEL'] = '';
            $this->listeDelegataires[0]['NOM_DEL'] = '';
            $this->listeDelegataires[0]['CODE_STE'] = '';
            $this->listeDelegataires[0]['RAIS_SOC'] = '';
            $this->listeDelegataires[0]['MONTANT'] = FormatageData::formatMontant(0, 2, ' ');
            $this->listeDelegataires[0]['TYPE_DEL'] = '';
            $this->listeDelegataires[0]['TOUS'] = 0;
        }
        
        if (is_array($this->listeDelegataires)) {
            $zoom_delegataire = "OpenPopup('ctrl_liste_delegataires.php?action=initPopup&popup_id=SIGN_DELEGATAIRES&formName=form_delegataire&inputField=code_del&CODE_STE=" . $_SESSION['Session_SocUsr'];
            $zoom_delegataire .= "&backPopup=1&backCtrl={$this->script_cible}&backAction=saisieDelegataire&backMode=form&backForm=form_delegataire&backField=code_del'";
            $zoom_delegataire .= ",'popup_liste_sign_delegataires',700,600);";
            
            if ('' == $this->listeDelegataires[0]['CODE_STE'])
                $this->listeDelegataires[0]['RAIS_SOC'] = trad('Toutes');
            
            $listeDelegatairesXML = array(
                'MODE_ACCES' => $mode_acces, // Indique si l'accès à la délégation est réalisée en mode création : 'C' ou modification 'M'
                                                    // En modification, le délégataire et la société ne sont pas modifiable
                'CODE_DEL' => $this->listeDelegataires[0]['CODE_DEL'], // Login du delegataire
                'NOM_DEL' => $this->listeDelegataires[0]['NOM_DEL'], // Nom du delegataire
                'CODE_STE' => $this->listeDelegataires[0]['CODE_STE'], // Code de la société
                'RAIS_SOC' => $this->listeDelegataires[0]['RAIS_SOC'], // Raison sociale de la société
                'MONTANT' => FormatageData::formatMontant($this->listeDelegataires[0]['MONTANT'], 2, ' '), // Montant plafond de la délégation
                'MONTANT_LIBT' => Trad((Param::isWorkflowTTC()) ? 'TTC' : 'HT'),
                'TYPE_DEL' => $this->listeDelegataires[0]['TYPE_DEL'], // Type de délégation : P => Permanente, E => En cas d'absence
                'DEVISE' => $_SESSION['DEVISE_BASE'],
                'ZOOM_DEL' => $zoom_delegataire, // Action d'appel de la popup : liste des délégataires
                'ONBLUR_DEL' => "CallUrl('{$this->script_cible}?action=saisieDelegataire&code_del='+this.value);", // Action de saisie d'une délégataire
                'ONBLUR_MONTANT' => "CallUrl('{$this->script_cible}?action=saisieMontant&montant='+this.value);" // Action de saisie d'un montant plafond de délégation
            );
        }
        return $listeDelegatairesXML;
    }

    /**
     * Fonction construisant le tableau de donnée xml qui sera transmis à la xsl permettant d'afficher les déclencheurs d'une délégation donnée
     * 
     * @param string $delegataire
     *            : Login du délégataire
     * @param string $mode_acces
     *            : Mode d'accès à la délégation Création => 'C' ou Modification 'M'
     * @param string $type
     *            : Documents ou Fournisseurs
     */
    public function &buildXmlListeDeclencheursDelegation($delegataire, $mode_acces, $societe, & $type)
    {
        $indice_trigger = 0;
        $listeDeclencheurXML = null;
        
        $UOSectorise = Param::IsUOSecto();
        $SISectorise = Param::IsSISecto();
        $CDCSectorise = Param::IsCDCSecto();
        $SCASectorise = Param::IsSCASecto();
        
        // Déclencheurs sur les documents
        
        switch ($type) {
            case 'Documents':
                $sortedKeys = array_keys($this->listeTableRef);
                break;
            case 'Fournisseurs':
                $sortedKeys = array_keys($this->listeTableRefFOURNISS);
                break;
            default:
                $sortedKeys = NULL;
                break;
        }
        asort($sortedKeys);
        // foreach ($this->listeTableRef as $key => $value)
        foreach ($sortedKeys as $key) { // $key = ACD,ARTICLES,CENTRANA,CENTRE_E,CENTRE_R,CODECOMP,DIRECTIO,FAMILLE,FOURNISS,MARCHES,NATANA,SECTIMPU,SSCPTANA,SSFAMILL,SSITESTO,TYPDOC,UO
            if ($societe == '' && ($key == 'CENTRE_E' || $key == 'CENTRE_R' || $key == 'SSITESTO' || ($key == 'UO' && $UOSectorise) || (($key == 'SECTIMPU' || $key == 'DIRECTIO') && $SISectorise) || (($key == 'CODECOMP' || $key == 'NATANA') && $CDCSectorise) || (($key == 'SSCPTANA' || $key == 'CENTRANA') && $SCASectorise))) {
                $declencheurOk = false;
            } else {
                $declencheurOk = true;
            }
            if ($declencheurOk) {
                $declencheur = null;
                if ('M' == $mode_acces) {
                    $this->initListeDeclencheurs($delegataire, $key);
                    if (isset($this->declencheurs[0]))
                        $declencheur = $this->declencheurs[0];
                }
                if (! is_array($declencheur)) {
                    $declencheur['OPERATEUR'] = '';
                    $declencheur['CODE_ENREG'] = '';
                }
                switch ($type) {
                    case 'Documents':
                        $libelleTable = $this->getLibelleTable($key);
                        break;
                    case 'Fournisseurs':
                        $libelleTable = $this->getLibelleTableFourniss($key);
                        break;
                    default:
                        $libelleTable = '';
                        break;
                }
                
                $listeDeclencheurXML['declencheurs'][] = array(
                    'CODE_TABLE' => $key,
                    'LIB_TABLE' => trad($libelleTable),
                    'OPERATEUR' => $declencheur['OPERATEUR'] == '=' ? 'E' : 'D',
                    'ID_OPERATEUR' => 'op_' . $indice_trigger . '_' . $type,
                    'CODE_ENREG' => $declencheur['CODE_ENREG'],
                    'ONCHANGE_TRIGGER' => 'TraiteUrl(\'' . $this->script_cible . '?action=selectTrigger&type=' . $type . '\',this);',
                    'ID_DECLENCHEUR' => 'trigger_' . $indice_trigger . '_' . $type,
                    'ONBLUR_CODE_ENREG' => 'TraiteUrl(\'' . $this->script_cible . '?action=saisieTriggerValue&type=' . $type . '\',document.getElementById(\'trigger_' . $indice_trigger . '_' . $type . '\'));',
                    'ID_CODE_ENREG' => 'enreg_' . $indice_trigger . '_' . $type,
                    'ID_ZONE_VALUE' => 'zoneValue_' . $indice_trigger . '_' . $type,
                    'ZOOM_VALUE' => 'TraiteUrl(\'' . $this->script_cible . '?action=zoomValue\',document.getElementById(\'trigger_' . $indice_trigger . '_' . $type . '\'));',
                    'ZOOM_ID_IMG' => 'zoom_' . $indice_trigger . '_' . $type
                );
                $indice_trigger ++;
            }
        }
        
        return $listeDeclencheurXML;
    }

    /**
     * Fonction construisant le tableau de donnée xml qui sera transmis à la xsl permettant d'afficher les déclencheurs d'une délégation donnée pour les documents
     * 
     * @param string $delegataire
     *            : Login du délégataire
     * @param string $mode_acces
     *            : Mode d'accès à la délégation Création => 'C' ou Modification 'M'
     */
    public function &buildXmlListeRolesDelegation($delegataire)
    {
        $listeDelegatairesXML = null;
        $this->initListeRoles($delegataire);
        
        // On vérifie ensuite si le délégataire a tous les rôles
        $result = SqlDelegation::rqGetInfoDelegataireBySignat($this->signataire, $delegataire)->Trouve1();
        $tousLesRoles = BoolSql($result['TOUS']);
        
        if (is_array($this->listeRoles)) {
            $idTousRoles = 'all_roles_document';
            foreach ($this->listeRoles as & $role)
                $listeDelegatairesXML['roles'][] = array(
                    'NOM_PAR' => trad($role['NOM_PAR']),
                    'LIB_ROLE' => trad($role['LIB_ROLE']),
                    'IS_SELECTED' => ($role['CODE_DEL'] !== '' || $tousLesRoles),
                    'CHECKBOX_NAME' => 'role_' . $role['ID_PAR'] . '_' . $role['ID_ROLE'] . '_Document',
                    'CLICK_ROLE' => 'document.getElementById(\'' . $idTousRoles . '\').checked = false;'
                );
            $listeDelegatairesXML['roles_tous']['ID_TOUS_ROLES'] = $idTousRoles;
            $listeDelegatairesXML['roles_tous']['ALL_ROLES'] = $tousLesRoles;
            $listeDelegatairesXML['roles_tous']['ONCLICK_ALL_ROLES'] = 'TraiteUrl(\'' . $this->script_cible . '?action=checkAllRolesDocument\',document.getElementById(\'' . $idTousRoles . '\'));'; // Action de cocher/décocher la case "Tous les rôles
        }
        return $listeDelegatairesXML;
    }

    /**
     * Fonction construisant le tableau de donnée xml qui sera transmis à la xsl permettant d'afficher les déclencheurs d'une délégation donnée pour les fournisseurs
     * 
     * @param string $delegataire
     *            : Login du délégataire
     * @param string $mode_acces
     *            : Mode d'accès à la délégation Création => 'C' ou Modification 'M'
     */
    public function &buildXmlListeRolesDelegationFournisseur($delegataire)
    {
        $listeDelegatairesXML = null;
        $this->initListeRoles($delegataire);
        
        // On vérifie ensuite si le délégataire a tous les rôles
        $result = SqlDelegation::rqGetInfoDelegataireBySignat($this->signataire, $delegataire)->Trouve1();
        $tousLesRoles = BoolSql($result['TOUS']);
        
        if (is_array($this->listeRolesFOURNISS)) {
            $idTousRoles = 'all_roles_fournisseur';
            foreach ($this->listeRolesFOURNISS as & $role)
                $listeDelegatairesXML['roles'][] = array(
                    'NOM_PAR' => $role['NOM_PAR'],
                    'LIB_ROLE' => $role['LIB_ROLE'],
                    'IS_SELECTED' => ($role['CODE_DEL'] !== '' || $tousLesRoles),
                    'CHECKBOX_NAME' => 'role_' . $role['ID_PAR'] . '_' . $role['ID_ROLE'] . '_Fournisseurs',
                    'CLICK_ROLE' => 'document.getElementById(\'' . $idTousRoles . '\').checked = false;'
                );
            $listeDelegatairesXML['roles_tous']['ID_TOUS_ROLES'] = $idTousRoles;
            $listeDelegatairesXML['roles_tous']['ALL_ROLES'] = $tousLesRoles;
            $listeDelegatairesXML['roles_tous']['ONCLICK_ALL_ROLES'] = 'TraiteUrl(\'' . $this->script_cible . '?action=checkAllRolesFournisseur\',document.getElementById(\'' . $idTousRoles . '\'));'; // Action de cocher/décocher la case "Tous les rôles
        }
        return $listeDelegatairesXML;
    }

    /**
     * Fonction retournant la liste des sociétés communes entre 2 utilisateurs
     *
     * @param string $signataire
     * @param string $delegataire
     * @return string sql
     */
    public function initListeSocieteCommuneSignataireDelegataire($delegataire)
    {
        return SqlDelegation::rqGetListeSocieteCommuneSignataireDelegataire($this->signataire, $delegataire)->TrouveTous();
    }

    /**
     * Fonction permettant de récupérer la liste des déclencheurs possibles dans le cadre d'une délégation
     */
    public function getListeDeclencheurs()
    {
        $envoi = "<WFStdDecDelIn LngUtilisation='{$_SESSION['Session_Langue']}'>
                    <Declencheur>
                        <CodeDeclencheur>DEMANDEU</CodeDeclencheur>
                        <LibelleDeclencheur>Demandeurs</LibelleDeclencheur>
                    </Declencheur>
                </WFStdDecDelIn>";
        $resultat = Wsdl::wsdlCallGen('Oxaproc_WF_Standard.wsdl', 'OXAPRC_WF_DEC_DEL', $envoi);
        
        if (is_array($resultat) && array_key_exists('ListeDeclencheurs', $resultat)) {
            $this->listeTableRef = array();
            foreach ($resultat['ListeDeclencheurs']['Declencheur'] as & $declencheur)
                $this->listeTableRef[$declencheur['CodeDeclencheur']] = $declencheur['LibelleDeclencheur'];
            
            $this->listeTableRefFOURNISS = array();
            foreach ($resultat['ListeDeclencheursFOURNISS']['Declencheur'] as & $declencheur)
                $this->listeTableRefFOURNISS[$declencheur['CodeDeclencheur']] = $declencheur['LibelleDeclencheur'];
        }
    }

    /**
     * Fonction appelant le wsdl de création/modification/suppression de délégation
     *
     * @param string $type_action
     *            : Type d'action requis c => Création, M => Modification, S => Suppression
     * @param array $array_data
     *            : Tableau contenant les données de la délégation
     * @return array : résultat de l'appel au wsdl
     */
    public static function &manageDelegation($type_action, $array_data)
    {
        XmlEntities($array_data);
        
        $envoi = "<WFStdDelegIn LngUtilisation='{$_SESSION['Session_Langue']}'>";
        
        $envoi .= "<Mode>{$type_action}</Mode>";
        $envoi .= "<Entete>";
        $envoi .= "<CodeSignataire>{$_SESSION['Session_Login']}</CodeSignataire>";
        $envoi .= "<CodeDelegataire>{$array_data['code_del']}</CodeDelegataire>";
        $envoi .= "<CodeSociete>{$array_data['societe']}</CodeSociete>";
        $envoi .= "<Montant>{$array_data['montant']}</Montant>";
        $envoi .= "<TypeDelegation>{$array_data['type_del']}</TypeDelegation>";
        $envoi .= '<TousRoles>' . (array_key_exists('all_roles', $array_data) ? BoolWsdl($array_data['all_roles']) : 'false') . '</TousRoles>';
        $envoi .= '</Entete>';
        
        $envoi .= '<ListeDeclencheurs>';
        foreach ($array_data as $key => & $value)
            if (false !== stripos($key, 'trigger_') && '' != $value) {
                $info_trigger = explode('_', $key);
                $num_trigger = $info_trigger[1];
                $type_trigger = $info_trigger[2];
                
                if ('E' == $array_data['op_' . $num_trigger . '_' . $type_trigger])
                    $array_data['op_' . $num_trigger . '_' . $type_trigger] = '=';
                else
                    $array_data['op_' . $num_trigger . '_' . $type_trigger] = htmlspecialchars('<>');
                
                $envoi .= '<Declencheur>';
                $envoi .= '<CodeDeclencheur>' . $value . '</CodeDeclencheur>';
                if ('Fournisseurs' == $type_trigger) {
                    $envoi .= '<TypeEntite>FOURNISS</TypeEntite>';
                } else {
                    $envoi .= '<TypeEntite></TypeEntite>';
                }
                $envoi .= "<OperateurDeclencheur>{$array_data['op_'.$num_trigger.'_'.$type_trigger]}</OperateurDeclencheur>";
                $envoi .= "<ValeurDeclencheur>{$array_data['enreg_'.$num_trigger.'_'.$type_trigger]}</ValeurDeclencheur>";
                $envoi .= '</Declencheur>';
            }
        
        $envoi .= '</ListeDeclencheurs>';
        
        $envoi .= '<ListeRoles>';
        foreach ($array_data as $key => & $value)
            if (false !== stripos($key, 'role_') && '' != $value) {
                $info_roles = explode('_', $key);
                $num_wf = $info_roles[1];
                $num_role = $info_roles[2];
                $type_role = $info_roles[3];
                
                $envoi .= '<Role>';
                if ('Fournisseurs' == $type_role) {
                    $envoi .= '<TypeEntite>FOURNISS</TypeEntite>';
                } else {
                    $envoi .= '<TypeEntite></TypeEntite>';
                }
                $envoi .= "<NumIdWF>{$num_wf}</NumIdWF>";
                $envoi .= "<NumIdRole>{$num_role}</NumIdRole>";
                $envoi .= '</Role>';
            }
        $envoi .= '</ListeRoles>';
        $envoi .= '</WFStdDelegIn>';
        return Wsdl::wsdlCallGen('Oxaproc_WF_Standard.wsdl', 'OXAPRC_WF_CMS_DEL', $envoi);
    }
}

// Fin de la classe DelegationSignature