]> _ Git - cubeextranet.git/commitdiff
(no commit message)
authorvincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Mon, 17 Jan 2011 08:54:28 +0000 (08:54 +0000)
committervincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Mon, 17 Jan 2011 08:54:28 +0000 (08:54 +0000)
inc/extranet/Controlleur/class.extranet.core.php
inc/extranet/Controlleur/class.extranet.url.php
inc/extranet/DAO/class.extranet.dao.utilisateur.php
inc/prepend.php
inc/ws/Controlleur/class.ws.droits.php
inc/ws/Controlleur/class.ws.url.php
inc/ws/Controlleur/class.ws.users.tree.php

index bceae880810080b0c7379d1efa092a71c999dbda..d728b1d0bddc5a00360ad3ee225fdfd85e4fd6d1 100644 (file)
@@ -141,6 +141,7 @@ class extranetCore extends cubeCore {
                $db->utilisateurs->ws_id('integer', 0, true);\r
                $db->utilisateurs->ws_password('varchar', 40, false);\r
                $db->utilisateurs->ws_settings('text', 0, false);\r
+               $db->utilisateurs->ws_rights('text', 0, false);\r
                // Clés\r
                $db->utilisateurs->primary('pk_utilisateurs', 'utilisateur_id');\r
                $db->utilisateurs->unique('unique_utilisateurs_email', 'email');\r
@@ -385,10 +386,8 @@ class extranetCore extends cubeCore {
                $db->ws_users_tree->utilisateur_id('integer', 0, false);\r
                $db->ws_users_tree->facturable_id('integer', 0, false);\r
                $db->ws_users_tree->administrateur_id('integer', 0, false);\r
-               // .\r
-               // Table des droits\r
-               $db->ws_rights->utilisateur_id('integer', 0, false);\r
-               $db->ws_rights->rights_on('integer', 0, false);\r
+               // Clé\r
+               $db->ws_users_tree->primary('pk_utilisateur_id', 'utilisateur_id');\r
 \r
                try {\r
                        $dbi = new CubeDbStruct($this->con);\r
@@ -484,7 +483,6 @@ class extranetCore extends cubeCore {
                         . 'LEFT JOIN books b ON t.theme_id=b.theme '\r
                         . 'GROUP BY t.theme_id');\r
                // cubeDb::mysqlConvert($this->con);\r
-               touch($cache);\r
        }\r
 \r
        public function sauvePreferencesUtilisateur()\r
index 069c289eec9356ef4aa11e7f883c130bc80930b2..afb8eb2f4608e6bf1341fbd6cbdd5d3b3b9aa136 100644 (file)
@@ -28,11 +28,20 @@ class extranetUrl {
 \r
                $f = $args[0];\r
 \r
+               if (MODE == 'extranet') {\r
+                       $order = array('extratetUrl', 'wsUrl');\r
+               } elseif (MODE == 'ws') {\r
+                       $order = array('wsUrl', 'extranetUrl');\r
+               }\r
+\r
                echo extranetPage::header($args);\r
-               if (is_callable(array('extranetUrl', $f))) {\r
-                       echo call_user_func(array('extranetUrl', $f), $args);\r
-               } else if (is_callable(array('wsUrl', $f))) {\r
-                       echo call_user_func(array('wsUrl', $f), $args);\r
+\r
+               foreach($order as $class) {\r
+                       $cb = array($class, $f);\r
+                       if (is_callable($cb)) {\r
+                               echo call_user_func($cb, $args);\r
+                               break;\r
+                       }\r
                }\r
                echo extranetPage::footer();\r
        }\r
index 682d5c30a244939c1f261be12714842a14765a84..2fca4b8cd78910646f720fb9ffbb65e006c64a7c 100644 (file)
@@ -48,6 +48,9 @@ class extranetDAOUtilisateur extends extranetDAO {
                } else {\r
                        $utilisateur->ws_settings = array('resolution' => 150, 'method' => 0, 'quality' => 85, 'objects' => 1800);\r
                }\r
+               if (isset($r->ws_grade)) {\r
+                       $utilisateur->ws_grade = $r->ws_grade;\r
+               }\r
 \r
                return $utilisateur;\r
        }\r
@@ -99,7 +102,7 @@ class extranetDAOUtilisateur extends extranetDAO {
 \r
        public function selectByLoginPassword($login, $password)\r
        {\r
-               $sql = 'SELECT * FROM utilisateurs WHERE (email=\'' . $this->con->escape($login) . '\' OR  login=\'' . $this->con->escape($login) . '\') AND (password=\'' . $this->con->escape($password) . '\' OR ws_password=\'' . $this->con->escape($password) . '\') LIMIT 1';\r
+               $sql = 'SELECT * FROM utilisateurs_entreprise WHERE (email=\'' . $this->con->escape($login) . '\' OR  login=\'' . $this->con->escape($login) . '\') AND (password=\'' . $this->con->escape($password) . '\' OR ws_password=\'' . $this->con->escape($password) . '\') LIMIT 1';\r
                $r = $this->con->select($sql);\r
                if ($r->count() == 0) {\r
                        return false;\r
index 6894bfc2d5343c98388b6ac91205985075e68a30..5b90bad76deda74a4b96ecd8bd1710827660d31e 100644 (file)
@@ -11,8 +11,14 @@ require_once(dirname(__FILE__) . '/extranet/DAO/_common.php');
 require_once(dirname(__FILE__) . '/ws/Metier/_common.php');\r
 require_once(dirname(__FILE__) . '/ws/Controlleur/_common.php');\r
 require_once(dirname(__FILE__) . '/ws/DAO/_common.php');\r
-$GLOBALS['ajaxClasses'][] = 'extranetAjax';\r
-$GLOBALS['ajaxClasses'][] = 'wsAjax';\r
+\r
+if (MODE == 'extranet') {\r
+       $GLOBALS['ajaxClasses'][] = 'extranetAjax';\r
+       $GLOBALS['ajaxClasses'][] = 'wsAjax';\r
+} else {\r
+       $GLOBALS['ajaxClasses'][] = 'wsAjax';\r
+       $GLOBALS['ajaxClasses'][] = 'extranetAjax';\r
+}\r
 // Instantiation de la classe de contrôle\r
 $core = new extranetCore();\r
 // Définition des handlers des urls\r
index 3fc26331671e015bbf71a714d1800cceaae126f0..d5f682978243fcce0ba08ac8add2063dd02dc27b 100644 (file)
@@ -4,10 +4,17 @@ class wsDroits {
        {\r
                global $core;\r
 \r
+               fb($core->user);\r
+\r
                $nav = array();\r
                $nav[__('Dashboard')] = 'dashboard';\r
                $nav[__('Publications')] = 'publications';\r
-               $nav[__('Traductions')] = 'traductions';\r
+               if ($core->user->ws_grade >= 3) {\r
+                       $nav[__('Clients')] = 'clients';\r
+               }\r
+               if ($core->user->ws_grade >= 5) {\r
+                       $nav[__('Traductions')] = 'traductions';\r
+               }\r
                return $nav;\r
        }\r
 \r
index 087d6bd0d9b4d4fa85feea44b863a7d2be77c582..abc398e245c143c2ced38ff1a2cada852cf61d16 100644 (file)
@@ -117,7 +117,7 @@ class wsUrl {
                $res .= '<form action="changeLang" method="post" class="submitonchange">';\r
                $res .= '<table class="liste">';\r
                $res .= '<tr><td class="center">' . __('Sélectionnez la langue à configurer') . ' : ' . form::combo('lang', $langs, $args[1]) . ' </td></tr>';\r
-               //$res .= '<tr class="odd"><td class="right"><a href="#" class="submit">' . $core->typo->Ajouter('OK') . '</a></td></tr>';\r
+               // $res .= '<tr class="odd"><td class="right"><a href="#" class="submit">' . $core->typo->Ajouter('OK') . '</a></td></tr>';\r
                $res .= '</table>';\r
                $res .= '</form>';\r
                $res .= extranetPage::bf();\r
@@ -367,6 +367,207 @@ html{height:100%}' . "\n";
                }\r
                return $res;\r
        }\r
+\r
+       public static function clients($args)\r
+       {\r
+               global $core;\r
+               cubePage::truePopup();\r
+               cubePage::autoComplete();\r
+               cubePage::emptyfield();\r
+               extranetDroits::min(1);\r
+               $settings = $core->user->getSettings('clients');\r
+\r
+               $shortcuts = array();\r
+               $shortcuts[] = '<a href="#" class="popup" rel="formClient/new">' . $core->typo->Ajouter('Créer un nouveau client') . '</a>';\r
+               $filtres = array();\r
+               $filtres[] = new extranetFiltre(__('Ayant un projet'), 'status_client_projet', $settings['filtres']);\r
+               $filtres[] = new extranetFiltre(__('Ayant des impayés'), 'impaye', $settings['filtres']);\r
+               $res = extranetPage::barre($filtres, 'filtreClients', 'clients', $shortcuts);\r
+               $res .= extranetPage::tMain();\r
+               $res .= extranetPage::bh();\r
+               $res .= '<div id="listeClients">';\r
+               $res .= self::listeClients();\r
+               $res .= '</div>';\r
+               $res .= extranetPage::bf();\r
+               $res .= extranetPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function listeClients($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               extranetDroits::min(1);\r
+               $settings = is_null($settings)?$core->user->getSettings('clients'):$settings;\r
+               $change = is_null($dashboard)?'Client':'Dashboard/' . $dashboard;\r
+               $dao = new extranetDAOEntreprise($core->con);\r
+               if (isset($settings['search']) && !is_null($settings['search'])) {\r
+                       $dao->setSearch($settings['search']);\r
+               }\r
+               $dao->setFiltres($settings['filtres']);\r
+               $liste = $dao->getListe($settings['orderby'], $settings['sens'], $settings['limit']);\r
+\r
+               $res = '<table class="liste">';\r
+               $res .= '<tr><th>' . extranetUrl::orderby('#', 'entreprise_id', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . extranetUrl::orderby(__('Raison sociale'), 'nom', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . __('Contacts') . '</th>';\r
+               $res .= '<th class="min"></th><th class="min"></th></tr>';\r
+               $i = 0;\r
+               foreach($liste as $id => $client) {\r
+                       if (!is_array($client->contacts)) {\r
+                               fb($client);\r
+                               continue;\r
+                       }\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $client->entreprise_id . '</td>';\r
+                       $res .= '<td>' . $client->nom . '</td>';\r
+                       $contacts = array();\r
+\r
+                       foreach($client->contacts as $c) {\r
+                               $contacts[] = '<a href="#" class="popup" rel="formContact/' . $c->utilisateur_id . '">' . $c->prenom . ' ' . $c->nom . '</a>';\r
+                       }\r
+\r
+                       $res .= '<td id="contacts_' . $client->entreprise_id . '">' . implode(', ', $contacts) . '</td>';\r
+                       $res .= '<td class="nowrap">';\r
+                       $res .= '</td>';\r
+                       $res .= '<td class="action"><a href="#" class="popup" rel="formClient/' . $client->entreprise_id . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               if (!isset($settings['search']) || is_null($settings['search'])) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '><td colspan="10">';\r
+                       $res .= extranetPage::pager($settings['page'], $dao->count() , $settings['par_page'], 'page' . $change . '/%d');\r
+                       $res .= extranetUrl::formParPage('parPage' . $change, $settings['par_page'], __('clients'));\r
+                       $res .= '</td></tr>';\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function formClient($entreprise_id = 'new')\r
+       {\r
+               global $core;\r
+               extranetDroits::min(1);\r
+               $dao = new extranetDAOEntreprise($core->con);\r
+               $daoUtilisateur = new extranetDAOUtilisateur($core->con);\r
+               if ($entreprise_id == 'new') {\r
+                       $client = $dao->cree();\r
+               } else {\r
+                       $client = $dao->selectById($entreprise_id);\r
+               }\r
+\r
+               $res = '<tr><td>' . __('Numéro de client') . '</td><td>' . form::hidden('entreprise_id', $client->entreprise_id) . '' . $client->entreprise_id . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Raison sociale') . '</td><td>' . form::field('nom', 30, 128, $client->nom) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse') . '</td><td>' . form::textarea('adresse', 40, 3, $client->adresse) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Code postal') . '</td><td>' . form::field('code_postal', 10, 20, $client->code_postal) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Ville') . '</td><td>' . form::field('ville', 30, 128, $client->ville) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Pays') . '</td><td>' . form::combo('pays', cubeCountry::getList(), $client->pays) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse de facturation') . '</td><td>' . form::textarea('adresse_facturation', 40, 3, $client->adresse_facturation) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Numéro de TVA intracommunautaire') . '</td><td>' . form::field('tva_intra', 15, 13, $client->tva_intra) . '</td></tr>';\r
+               $res .= '<tr class="light"><th colspan="2" class="light"><strong>' . __('Fluidbook Workshop') . '</strong></th></tr>';\r
+               $res .= '<tr class="odd"><td>' . __('Grade') . '</td><td>' . form::combo('ws_grade', array_flip($core->ws_grades), $client->ws_grade) . '</td></tr>';\r
+               if ($entreprise_id == 'new' || !$client->ws_admin) {\r
+                       $class = 'empty-field';\r
+                       $default_id = '';\r
+                       $default = __('Entrez le nom du revendeur ou de l\'administrateur');\r
+               } else {\r
+                       $class = '';\r
+                       $default_id = $client->ws_admin;\r
+                       $wsa = $daoUtilisateur->selectById($client->ws_admin, 'utilisateurs_entreprise');\r
+                       $default = $wsa->utilisateur_id . ' - ' . $wsa->rs . ' (' . $wsa->prenom . ' ' . $wsa->nom . ')';\r
+               }\r
+\r
+               $d = $dao->getWSDatas($entreprise_id);\r
+\r
+               $res .= '<tr class="odd"><td>' . __('Revendeur / Administrateur') . '</td><td>' . form::field('ws_admin_nom', 60, 128, $default, $class) . form::hidden('ws_admin', $default_id) . '</td></tr>';\r
+               if (!is_null($d)) {\r
+                       $res .= '<tr class="odd"><td>' . __('Entité facturable') . '</td><td>' . $d->facturable->prenom . ' ' . $d->facturable->nom . ' (' . $d->facturable->rs . ')</td></tr>';\r
+                       $res .= '<tr class="odd"><td>' . __('Administrateur responsable') . '</td><td>' . $d->administrateur->prenom . ' ' . $d->administrateur->nom . ' (' . $d->administrateur->rs . ')</td></tr>';\r
+               }\r
+               if ($entreprise_id == 'new') {\r
+                       $daoContact = new extranetDAOClient($core->con);\r
+                       $contact = $daoContact->cree();\r
+                       $res .= '<tr><th colspan="2" class="light"><strong>' . __('Contact') . '</strong></th></tr>';\r
+                       $res .= '<tr><td>' . __('Adresse e-mail') . '</td><td>' . form::field(array('contact[email]'), 30, 128, $contact->email) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Mot de passe') . '</td><td>' . form::field(array('contact[password]'), 30, 128, $contact->password) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Prénom') . '</td><td>' . form::field(array('contact[prenom]'), 30, 128, $contact->prenom) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Nom') . '</td><td>' . form::field(array('contact[nom]'), 30, 128, $contact->nom) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Téléphone') . '</td><td>' . form::field(array('contact[telephone]'), 20, 128, $contact->telephone) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Mobile') . '</td><td>' . form::field(array('contact[mobile]'), 20, 128, $contact->mobile) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Fax') . '</td><td>' . form::field(array('contact[fax]'), 20, 128, $contact->fax) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Langue') . '</td><td>' . form::combo(array('contact[lang]'), cubeLang::getAvailableLangs(true), $contact->lang) . '</td></tr>';\r
+               }\r
+               return $res;\r
+       }\r
+\r
+       public static function listeContacts($entreprise_id)\r
+       {\r
+               global $core;\r
+               extranetDroits::min(1);\r
+               $dao = new extranetDAOEntreprise($core->con);\r
+               $contacts = $dao->getContacts($entreprise_id);\r
+\r
+               $res = '<table class="liste light">';\r
+               $res .= '<tr class="light"><th colspan="4"><a href="" class="popup" rel="formContact/new/' . $entreprise_id . '">' . $core->typo->Contact('Ajouter un contact') . '</a></th></tr>';\r
+               $i = 0;\r
+               foreach($contacts as $contact) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '><td>' . trim($contact->prenom . ' ' . $contact->nom) . '</td>';\r
+                       $res .= '<td><a href="mailto:' . trim($contact->prenom . ' ' . $contact->nom) . '<' . $contact->email . '>">' . $contact->email . '</a></td>';\r
+                       $res .= '<td class="min"><a href="' . SITE_PATH . 'fichiers/' . $contact->utilisateur_id . '">FTP</a></td>';\r
+                       $res .= '<td class="right"><a href="#" rel="formContact/' . $contact->utilisateur_id . '" class="popup">' . cubeMedia::image(IMG . '/edit.png') . '</a></td></tr>';\r
+                       $i++;\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function formContact($client_id = 'new', $entreprise_id = null)\r
+       {\r
+               global $core;\r
+               extranetDroits::min(1);\r
+\r
+               $dao = new extranetDAOClient($core->con);\r
+               if ($client_id == 'new') {\r
+                       $client = $dao->creeFromEntreprise($entreprise_id);\r
+               } else {\r
+                       $client = $dao->selectById($client_id);\r
+               }\r
+\r
+               $res = '<tr><td>' . __('Numéro de client') . '</td><td>' . form::hidden('grade', 0) . form::hidden('entreprise', $client->entreprise) . form::hidden('utilisateur_id', $client->utilisateur_id) . '' . $client->utilisateur_id . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse e-mail') . '</td><td>' . form::field('email', 30, 128, $client->email) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Mot de passe') . '</td><td>' . form::field('password', 30, 128, $client->password) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Prénom du contact') . '</td><td>' . form::field('prenom', 30, 128, $client->prenom) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Nom du contact') . '</td><td>' . form::field('nom', 30, 128, $client->nom) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse') . '</td><td>' . form::textarea('adresse', 40, 3, $client->adresse) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Code postal') . '</td><td>' . form::field('code_postal', 10, 20, $client->code_postal) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Ville') . '</td><td>' . form::field('ville', 30, 128, $client->ville) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Pays') . '</td><td>' . form::combo('pays', cubeCountry::getList(), $client->pays) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Téléphone') . '</td><td>' . form::field('telephone', 20, 128, $client->telephone) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Mobile') . '</td><td>' . form::field('mobile', 20, 128, $client->mobile) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Fax') . '</td><td>' . form::field('fax', 20, 128, $client->fax) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Langue') . '</td><td>' . form::combo('lang', cubeLang::getAvailableLangs(true), $client->lang) . '</td></tr>';\r
+               if ($client_id != 'new') {\r
+                       $res .= '<tr><td colspan="2">' . cubeMedia::spacer(10, 10) . '</td></tr>';\r
+                       $res .= '<tr><td></td><td><a href="' . SITE_PATH . 'fichiers/' . $client->utilisateur_id . '">' . __('FTP') . '</a></td></tr>';\r
+                       $res .= '<tr><td>' . __("Paramètres de connexion au Fluidbook Workshop") . '</td><td>' . __('Adresse') . ' : http://' . $_SERVER['HTTP_HOST'] . '/<br />' . __("Nom d'utilisateur") . ' : ' . $client->email . '<br />' . __('Mot de passe') . ' : ' . $client->password . '</td></tr>';\r
+                       $res .= '<tr><td colspan="2">' . cubeMedia::spacer(10, 10) . '</td></tr>';\r
+               }\r
+               return $res;\r
+       }\r
+\r
+       public static function formNotes($utilisateur_id)\r
+       {\r
+               global $core;\r
+               extranetDroits::min(1);\r
+               $dao = new extranetDAOUtilisateur($core->con);\r
+               $utilisateur = $dao->selectById($utilisateur_id);\r
+               $res = '<tr><td colspan="2">' . form::hidden('utilisateur_id', $utilisateur_id) . '</td></tr>';\r
+               $res .= '<tr><td colspan="2">' . form::textarea('notes', 100, 30, $utilisateur->notes) . '</td></tr>';\r
+               $res .= '<tr><td colspan="2"></td></tr>';\r
+               return $res;\r
+       }\r
 }\r
 \r
 ?>
\ No newline at end of file
index 603c70d00df99251a2457e5e6368bb7157fbda25..cb3df73fa44688ed6797201274c03f7dad601f34 100644 (file)
@@ -19,31 +19,29 @@ class wsUsersTree {
        public function refreshWSUsersTree()\r
        {\r
                $this->con->execute('TRUNCATE TABLE ws_users_tree');\r
-               $this->con->execute('TRUNCATE TABLE ws_rights');\r
 \r
                $this->users = array();\r
                $this->admins = array();\r
                $this->grades = array();\r
                $this->entreprises = array();\r
-               $this->entreprises_tree = array();\r
 \r
                $this->rights = array();\r
 \r
-               $r = $this->con->select('SELECT * FROM utilisateurs u,entreprises e WHERE u.entreprise=e.entreprise_id AND e.ws_grade>0 ORDER BY e.ws_grade DESC');\r
+               $r = $this->con->select('SELECT * FROM utilisateurs u,entreprises e WHERE u.entreprise=e.entreprise_id AND e.ws_grade>0 ORDER BY e.ws_grade ASC');\r
                while ($r->fetch()) {\r
-                       $this->entreprises_tree[$r->entreprise_id] = $r->ws_admin;\r
                        $this->entreprises[$r->utilisateur_id] = $r->entreprise_id;\r
                        $this->users[$r->utilisateur_id] = $r->ws_admin;\r
                        $this->grades[$r->utilisateur_id] = $r->ws_grade;\r
                        if (!isset($this->admins[$r->ws_admin])) {\r
                                $this->admins[$r->ws_admin] = array();\r
                        }\r
+                       if (!isset($this->admins[$r->utilisateur_id])) {\r
+                               $this->admins[$r->utilisateur_id] = array();\r
+                       }\r
                        $this->admins[$r->ws_admin][] = $r->utilisateur_id;\r
                }\r
 \r
                $this->facturables = $this->getFacturables();\r
-\r
-\r
                // Fabrication de l'arbre\r
                $c = $this->con->openCursor('ws_users_tree');\r
 \r
@@ -55,8 +53,48 @@ class wsUsersTree {
                        $c->administrateur_id = $administrateur_id;\r
                        $c->insert();\r
                }\r
+               // Fabrication de la liste des droits à partir de l'arbre\r
+               for($i = 1;$i <= 4;$i++) {\r
+                       foreach($this->admins as $admin_id => $list) {\r
+                               $newlist = array_merge(array(), $list);\r
+                               foreach($list as $uid) {\r
+                                       if ($uid != $admin_id && isset($this->admins[$uid])) {\r
+                                               $newlist = array_merge($this->admins[$uid], $newlist);\r
+                                       }\r
+                               }\r
+                               $this->admins[$admin_id] = $newlist;\r
+                       }\r
+               }\r
+               // Ajout des droits personnels\r
+               foreach($this->users as $uid => $admin) {\r
+                       $this->admins[$uid][] = $uid;\r
+               }\r
 \r
-               // Fabrication de la liste des droits\r
+               // Echange des droits entre collègues\r
+               foreach($this->admins as $admin_id => $list) {\r
+                       $e = $this->entreprises[$admin_id];\r
+                       $collegues = array_keys($this->entreprises, $e);\r
+                       $newlist = $this->admins[$admin_id];\r
+                       foreach($collegues as $c) {\r
+                               $newlist = array_merge($newlist, $this->admins[$c]);\r
+                       }\r
+                       $newlist = array_unique($newlist);\r
+                       $this->admins[$admin_id] = $newlist;\r
+                       foreach($collegues as $c) {\r
+                               $this->admins[$c] = $newlist;\r
+                       }\r
+               }\r
+\r
+               foreach($this->admins as $admin=>$list){\r
+                       $this->admins[$admin]=array_unique($list);\r
+                       sort($this->admins[$admin]);\r
+               }\r
+\r
+               $c = $this->con->openCursor('utilisateurs');\r
+               foreach($this->admins as $admin => $list) {\r
+                       $c->ws_rights = implode(',', $list);\r
+                       $c->update('WHERE utilisateur_id=\'' . $this->con->escape($admin) . '\'');\r
+               }\r
        }\r
 \r
        protected function getFacturableOf($utilisateur_id, &$facturable_id, &$administrateur_id, $level)\r