Added capability to add custom roles - work in progress.
authorNik Okuntseff <support@anuko.com>
Sun, 25 Feb 2018 19:35:45 +0000 (19:35 +0000)
committerNik Okuntseff <support@anuko.com>
Sun, 25 Feb 2018 19:35:45 +0000 (19:35 +0000)
36 files changed:
WEB-INF/lib/ttExportHelper.class.php
WEB-INF/lib/ttRoleHelper.class.php
WEB-INF/lib/ttTeamHelper.class.php
WEB-INF/resources/ca.lang.php
WEB-INF/resources/cs.lang.php
WEB-INF/resources/da.lang.php
WEB-INF/resources/de.lang.php
WEB-INF/resources/en.lang.php
WEB-INF/resources/es.lang.php
WEB-INF/resources/et.lang.php
WEB-INF/resources/fa.lang.php
WEB-INF/resources/fi.lang.php
WEB-INF/resources/fr.lang.php
WEB-INF/resources/he.lang.php
WEB-INF/resources/hu.lang.php
WEB-INF/resources/it.lang.php
WEB-INF/resources/ja.lang.php
WEB-INF/resources/ko.lang.php
WEB-INF/resources/nl.lang.php
WEB-INF/resources/no.lang.php
WEB-INF/resources/pl.lang.php
WEB-INF/resources/pt-br.lang.php
WEB-INF/resources/pt.lang.php
WEB-INF/resources/ro.lang.php
WEB-INF/resources/ru.lang.php
WEB-INF/resources/sk.lang.php
WEB-INF/resources/sl.lang.php
WEB-INF/resources/sr.lang.php
WEB-INF/resources/sv.lang.php
WEB-INF/resources/tr.lang.php
WEB-INF/resources/zh-cn.lang.php
WEB-INF/resources/zh-tw.lang.php
WEB-INF/templates/footer.tpl
WEB-INF/templates/role_add.tpl [new file with mode: 0644]
WEB-INF/templates/roles.tpl
role_add.php [new file with mode: 0644]

index cce9246..ef13e2e 100644 (file)
@@ -291,7 +291,7 @@ class ttExportHelper {
 
     // Write roles.
     fwrite($file, "<roles>\n");
-    $roles = ttTeamHelper::getRoles($user->team_id);
+    $roles = ttTeamHelper::getAllRoles($user->team_id);
     foreach ($roles as $role) {
       fwrite($file, "\t<role rank=\"".$role['rank']."\"".
         " rights=\"".$role['rights']."\">\n");
index 7e10394..f96d7c4 100644 (file)
@@ -56,7 +56,7 @@ class ttRoleHelper {
     $mdb2 = getConnection();
     global $user;
 
-    $sql = "select id from tt_roless where team_id = $user->team_id and name = ".
+    $sql = "select id from tt_roles where team_id = $user->team_id and name = ".
       $mdb2->quote($role_name)." and (status = 1 or status = 0)";
     $res = $mdb2->query($sql);
 
@@ -68,6 +68,24 @@ class ttRoleHelper {
     return false;
   }
 
+  // The getRoleByRank looks up a role by its rank.
+  static function getRoleByRank($rank) {
+    global $user;
+    $mdb2 = getConnection();
+
+    $rank = (int) $rank; // Cast to int just in case for better security.
+
+    $sql = "select id from tt_roles where team_id = $user->team_id and rank = $rank and (status = 1 or status = 0)";
+    $res = $mdb2->query($sql);
+
+    if (!is_a($res, 'PEAR_Error')) {
+      $val = $res->fetchRow();
+      if ($val['id'])
+        return $val;
+    }
+    return false;
+  }
+
   // update function updates a role in the database.
   static function update($fields) {
     global $user;
@@ -104,11 +122,12 @@ class ttRoleHelper {
     $team_id = (int) $fields['team_id'];
     $name = $fields['name'];
     $rank = (int) $fields['rank'];
+    $description = $fields['description'];
     $rights = $fields['rights'];
     $status = $fields['status'];
 
-    $sql = "insert into tt_roles (team_id, name, rank, rights, status)
-      values ($team_id, ".$mdb2->quote($name).", $rank, ".$mdb2->quote($rights).", ".$mdb2->quote($status).")";
+    $sql = "insert into tt_roles (team_id, name, rank, description, rights, status)
+      values ($team_id, ".$mdb2->quote($name).", $rank, ".$mdb2->quote($description).", ".$mdb2->quote($rights).", ".$mdb2->quote($status).")";
     $affected = $mdb2->exec($sql);
     if (is_a($affected, 'PEAR_Error'))
       return false;
index 3af484c..2344fe3 100644 (file)
@@ -269,7 +269,7 @@ class ttTeamHelper {
     $result = array();
     $mdb2 = getConnection();
 
-    $sql = "select id, name, description from tt_roles where team_id = $team_id and status = 1 order by rank";
+    $sql = "select id, name, rank, description from tt_roles where team_id = $team_id and status = 1 order by rank";
     $res = $mdb2->query($sql);
     $result = array();
     if (!is_a($res, 'PEAR_Error')) {
@@ -286,7 +286,7 @@ class ttTeamHelper {
     $result = array();
     $mdb2 = getConnection();
 
-    $sql = "select id, name, description from tt_roles
+    $sql = "select id, name, rank, description from tt_roles
       where team_id = $team_id and status = 0 order by rank";
     $res = $mdb2->query($sql);
     $result = array();
@@ -298,6 +298,23 @@ class ttTeamHelper {
     return $result;
   }
 
+  // getAllRoles - obtains all roles defined for team.
+  static function getAllRoles($team_id) {
+    $mdb2 = getConnection();
+
+    $result = array();
+    $sql = "select * from tt_roles where team_id = $team_id";
+    $res = $mdb2->query($sql);
+    $result = array();
+    if (!is_a($res, 'PEAR_Error')) {
+      while ($val = $res->fetchRow()) {
+        $result[] = $val;
+      }
+      return $result;
+    }
+    return false;
+  }
+
   // The getActiveClients returns an array of active clients for team.
   static function getActiveClients($team_id, $all_fields = false)
   {
@@ -520,23 +537,6 @@ class ttTeamHelper {
     return false;
   }
 
-  // getRoles - obtains all roles defined for team.
-  static function getRoles($team_id) {
-    $mdb2 = getConnection();
-
-    $result = array();
-    $sql = "select * from tt_roles where team_id = $team_id";
-    $res = $mdb2->query($sql);
-    $result = array();
-    if (!is_a($res, 'PEAR_Error')) {
-      while ($val = $res->fetchRow()) {
-        $result[] = $val;
-      }
-      return $result;
-    }
-    return false;
-  }
-
   // getExpenseItems - obtains all expense items for all users in team.
   static function getExpenseItems($team_id) {
     $mdb2 = getConnection();
index 5da5aa5..6365f12 100644 (file)
@@ -98,6 +98,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 'error.no_teams' => 'La seva base de dades està buida. Iniciï sessió com a administrador i creï un nou grup.',
@@ -453,7 +454,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 411dc55..232ba89 100644 (file)
@@ -100,6 +100,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 'error.no_teams' => 'Vaše databáze je prázdná. Přihlašte se jako admin a vytvořte nový tým.',
@@ -464,7 +465,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 6390680..83cdc88 100644 (file)
@@ -86,6 +86,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Opgavenavn eksistere allerede.',
 'error.client_exists' => 'Der eksistere allerede en klient med dette navn.',
 'error.invoice_exists' => 'Fakturanummer eksistere allerede.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Der er ingen fakturerbar emner.',
 'error.no_login' => 'Der finde ingen bruger med dette brugernavn.',
 'error.no_teams' => 'Din database er tom, log ind som administrator og lav et nyt team.',
@@ -405,7 +407,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Aktive Klienter',
index eb2dfda..b7b07d2 100644 (file)
@@ -86,6 +86,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Task mit diesem Namen existiert bereits.',
 'error.client_exists' => 'Der Kunde mit dem Namen existiert schon.',
 'error.invoice_exists' => 'Rechnung mit dieser Nummer existiert bereits.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Keine Einträge zur Rechnungsstellung gefunden.',
 'error.no_login' => 'Benutzer mit diesen Anmeldedaten nicht vorhanden.',
 'error.no_teams' => 'Die Datenbank ist leer. Als Administrator anmelden und ein neues Team erzeugen.',
@@ -403,7 +405,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Aktive Kunden',
index b53e483..e083f45 100644 (file)
@@ -85,6 +85,7 @@ $i18n_key_words = array(
 'error.task_exists' => 'Task with this name already exists.',
 'error.client_exists' => 'Client with this name already exists.',
 'error.invoice_exists' => 'Invoice with this number already exists.',
+'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 'error.no_login' => 'No user with this login.',
 'error.no_teams' => 'Your database is empty. Login as admin and create a new team.',
@@ -396,6 +397,7 @@ $i18n_key_words = array(
  // Roles form. See example at https://timetracker.anuko.com/roles.php
 'form.roles.active_roles' => 'Active Roles',
 'form.roles.inactive_roles' => 'Inactive Roles',
+'form.roles.rank' => 'Rank',
 'form.roles.rights' => 'Rights',
 'form.roles.assigned' => 'Assigned',
 'form.roles.not_assigned' => 'Not assigned',
index 2adf12e..d58791c 100644 (file)
@@ -96,6 +96,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 'error.no_teams' => 'Su base de datos esta vacía. Inicie sesión como administrador y cree un nuevo grupo.',
@@ -463,7 +464,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 9663f5f..1afc24b 100644 (file)
@@ -100,6 +100,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 'error.no_teams' => 'Sinu andmebaas on tühi. Logi adminina sisse ja loo uus meeskond.',
@@ -462,7 +463,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index d160589..3ce94e4 100644 (file)
@@ -92,6 +92,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'وظیفه ای با این نام هم اکنون وجود دارد.',
 'error.client_exists' => 'مشتری با این نام هم اکنون وجود دارد.',
 'error.invoice_exists' => 'فاکتوری با این شماره هم اکنون موجود است.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'آیتمی جهت فاکتور کردن وجود ندارد.',
 'error.no_login' => 'کاربری با این نام کاربری موجود نیست.',
 'error.no_teams' => 'پایگاه داده شما خالی است با کاربر admin وارد شوید و تیم ایجاد کنید.',
@@ -432,7 +434,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'مشتری های فعال',
index 639154e..6e69c4c 100644 (file)
@@ -88,6 +88,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Tämän niminen tehtävä on jo olemassa.',
 'error.client_exists' => 'Tämän niminen asiakas on jo olemassa.',
 'error.invoice_exists' => 'Tällä numerolla oleva lasku on jo olemassa.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Ei laskutettavia syötteitä.',
 'error.no_login' => 'Tuntematon käyttäjänimi.',
 'error.no_teams' => 'Tietokanta on tyhjä. Kirjaudu ylläpitäjänä ja luo uusi tiimi.',
@@ -412,7 +414,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Aktiiviset asiakkaat',
index e2babb3..772ea87 100644 (file)
@@ -86,6 +86,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Une tâche avec ce nom existe déjà.',
 'error.client_exists' => 'Un client avec ce nom existe déjà.',
 'error.invoice_exists' => 'Une facture avec ce numéro existe déjà.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Il n\\\'y a pas d\\\'éléments à facturer.',
 'error.no_login' => 'Aucun utilisateur avec cet identifiant.',
 'error.no_teams' => 'Votre base de données est vide. Connectez-vous comme administrateur et créez une nouvelle équipe.',
@@ -402,7 +404,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Clients actifs',
index a27e41e..fd76b9e 100644 (file)
@@ -102,6 +102,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'קיימת משימה עם שם דומה',
 'error.client_exists' => 'שם לקוח כבר קיים',
 'error.invoice_exists' => 'קיימת חשבונית עם מספר זה',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'אין פריטים לחיוב',
 'error.no_login' => 'משתמש זה אינו קיים',
 'error.no_teams' => 'בסיס הנתונים שלך ריק. התחבר כמנהל וצור צוות חדש',
@@ -438,7 +440,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'לקוחות פעילים',
index a15c681..517fc94 100644 (file)
@@ -97,6 +97,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 // 'error.no_teams' => 'Your database is empty. Login as admin and create a new team.',
@@ -455,7 +456,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index beed939..cc86812 100644 (file)
@@ -87,6 +87,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Esiste già un compito con questo nome.',
 'error.client_exists' => 'Esiste già un cliente con questo nome.',
 'error.invoice_exists' => 'Esiste già una fattura con questo numero.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Non ci sono voci fatturabili.',
 'error.no_login' => 'Non esiste un utente con questo username.',
 'error.no_teams' => 'Il database è vuoto. Loggati come amministratore e crea un nuovo gruppo.',
@@ -405,7 +407,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Clienti attivi',
index 669fe10..1bc641e 100644 (file)
@@ -98,6 +98,8 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 'error.no_login' => 'このログインと関連されたユーザーはいません。',
 'error.no_teams' => 'あなたのデータベースは空いています。管理者にログインして新規チームを作成してください。',
@@ -455,7 +457,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 2811722..9fd6401 100644 (file)
@@ -98,6 +98,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 'error.no_login' => '본 로그인과 연계된 사용자가 없습니다.',
 'error.no_teams' => '당신의 데이터베이스는 비어있습니다. 관리자로 로그인하여 새로운 팀을 생성하십시오.',
@@ -457,7 +458,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 89fec11..91fb611 100644 (file)
@@ -85,6 +85,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Er bestaat al een taak met deze naam.',
 'error.client_exists' => 'Een klant met deze naam bestaat al.',
 'error.invoice_exists' => 'Dit nummer is al eens toegekend aan een factuur.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Er zijn geen factuureerbare onderdelen.',
 'error.no_login' => 'Een medewerker met deze inlognaam bestaat niet.',
 'error.no_teams' => 'Uw database is leeg. Meld je aan als admin en maak een nieuw team.',
@@ -393,8 +395,13 @@ $i18n_key_words = array(
 
 // Roles form. See example at https://timetracker.anuko.com/roles.php
 'form.roles.active_roles' => 'Actieve rollen',
-'form.roles.inactive_roles' => 'Inactieve Rollen',
+'form.roles.inactive_roles' => 'Inactieve rollen',
+// TODO: translate the following.
+// 'form.roles.rank' => 'Rank',
 'form.roles.rights' => 'Rechten',
+// TODO: translate the following.
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Actieve klanten',
index 04fe3c4..6107838 100644 (file)
@@ -98,6 +98,7 @@ $i18n_key_words = array(
 'error.client_exists' => 'En klient med dette navnet er allerede opprettet.',
 // TODO: translate the following.
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 'error.no_login' => 'Det er ingen bruker med dette brukernavnet.',
 'error.no_teams' => 'Databasen din er tom. Logg inn som admin og opprett et nytt team.',
@@ -452,7 +453,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 8889ec2..389429f 100644 (file)
@@ -89,6 +89,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Zadanie o takiej nazwie już istnieje.',
 'error.client_exists' => 'Klient o takiej nazwie już istnieje.',
 'error.invoice_exists' => 'Faktura o tym numerze już istnieje.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Brak przedmiotów do faktury.',
 'error.no_login' => 'Użytkownik o takiej nazwie nie istnieje.',
 'error.no_teams' => 'Twoja baza danych jest pusta. Zaloguj się jako administrator i stwórz nowy zespół.',
@@ -415,7 +417,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.phpp
 'form.clients.active_clients' => 'Aktywni klienci',
index 8b49b7b..0b262ce 100644 (file)
@@ -87,6 +87,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Já existe tarefa com este nome.',
 'error.client_exists' => 'Já existe cliente com este nome.',
 'error.invoice_exists' => 'Já existe fatura com este número.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Não há items faturáveis.',
 'error.no_login' => 'Não há usuário com este login.',
 'error.no_teams' => 'Sua base de dados está vazia. Entre como admin e crie uma equipe nova.',
@@ -410,7 +412,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Clientes ativos',
index c8bb53c..a984471 100644 (file)
@@ -96,6 +96,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 // 'error.no_teams' => 'Your database is empty. Login as admin and create a new team.',
@@ -440,7 +441,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index f1ce037..254fc5b 100644 (file)
@@ -103,6 +103,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 'error.no_teams' => 'Baza de date este goala. Intra ca admin si adauga o noua echipa.',
@@ -459,7 +460,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index a612f95..f234baf 100644 (file)
@@ -84,6 +84,7 @@ $i18n_key_words = array(
 'error.task_exists' => 'Задача с таким названием уже есть.',
 'error.client_exists' => 'Клиент с таким именем уже есть.',
 'error.invoice_exists' => 'Счёт с таким номером уже есть.',
+'error.role_exists' => 'Роль с таким рангом уже есть.',
 'error.no_invoiceable_items' => 'Нет записей для включения в счёт.',
 'error.no_login' => 'Нет пользователя с таким логином.',
 'error.no_teams' => 'Ваша база данных пуста. Войдите в систему как администратор и создайте новую команду.',
@@ -393,7 +394,10 @@ $i18n_key_words = array(
 // Roles form. See example at https://timetracker.anuko.com/roles.php
 'form.roles.active_roles' => 'Активные роли',
 'form.roles.inactive_roles' => 'Неактивные роли',
+'form.roles.rank' => 'Ранг',
 'form.roles.rights' => 'Права',
+'form.roles.assigned' => 'Присвоены',
+'form.roles.not_assigned' => 'Не присвоены',
 
 // Deleting Client form. See example at https://timetracker.anuko.com/client_delete.php
 'form.client.client_to_delete' => 'Клиент для удаления',
index 25676d2..87a224a 100644 (file)
@@ -91,6 +91,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Úloha s týmto názvom už existuje.',
 'error.client_exists' => 'Klient s týmto menom už existuje.',
 'error.invoice_exists' => 'Faktúra s týmto číslom už existuje.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Neexistujú položky, ktoré by bolo možné fakturovať.',
 'error.no_login' => 'Neexistuje používateľ s týmto prihlasovacím menom.',
 'error.no_teams' => 'Vaša databáza je prázdna. Prihláste sa ako admin a vytvorte nový tím.',
@@ -430,7 +432,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Aktívny klienti',
index 839bdba..43a33d1 100644 (file)
@@ -95,6 +95,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 // 'error.no_teams' => 'Your database is empty. Login as admin and create a new team.',
@@ -435,7 +436,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 3bfa69c..4fa8325 100644 (file)
@@ -86,6 +86,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Zadatak pod ovim nazivom već postoji.',
 'error.client_exists' => 'Klijent pod ovim imenom već postoji.',
 'error.invoice_exists' => 'Račun pod ovim brojem već postoji.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Nema stavke za naplatu.',
 'error.no_login' => 'Nema korisnika pod ovom prijavom',
 'error.no_teams' => 'Vaša baza podataka je prazna. Prijavite se kao administrator i napravite novi tim.',
@@ -413,7 +415,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Forma klijenata. Pogledajte primer na https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Aktivni klijent',
index ae5e2d3..9136be4 100644 (file)
@@ -87,6 +87,8 @@ $i18n_key_words = array(
 'error.task_exists' => 'Det finns redan en arbetsuppgift med det här namnet.',
 'error.client_exists' => 'Det finns redan en kund med det här namnet.',
 'error.invoice_exists' => 'Det finns redan en faktura med det här numret.',
+// TODO: translate the following.
+// 'error.role_exists' => 'Role with this rank already exists.',
 'error.no_invoiceable_items' => 'Det finns inga debiterbara tidsregistreringar.',
 'error.no_login' => 'Det finns ingen användare med det här användarnamnet.',
 'error.no_teams' => 'Databasen är tom. Logga in som administratör och skapa en ny arbetsgrupp.',
@@ -410,7 +412,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 'form.clients.active_clients' => 'Aktiva kunder',
index dc15a2e..da1359c 100644 (file)
@@ -105,6 +105,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 // 'error.no_login' => 'No user with this login.',
 'error.no_teams' => 'Veritabanınız boş. Yeni bir ekip yaratmak için yönetici olarak giriş yapın.',
@@ -470,7 +471,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 3ab0904..819bda4 100644 (file)
@@ -91,6 +91,7 @@ $i18n_key_words = array(
 'error.client_exists' => '具有此名称的客户端已经存在。',
 // TODO: translate the following.
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 'error.no_login' => '没有该登录信息的用户。',
 'error.no_teams' => '您的数据库没有任何记录。请以管理员身份登录并创建一个新团队。',
@@ -442,7 +443,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index b9e73ba..0db3320 100644 (file)
@@ -96,6 +96,7 @@ $i18n_key_words = array(
 // 'error.task_exists' => 'Task with this name already exists.',
 // 'error.client_exists' => 'Client with this name already exists.',
 // 'error.invoice_exists' => 'Invoice with this number already exists.',
+// 'error.role_exists' => 'Role with this rank already exists.',
 // 'error.no_invoiceable_items' => 'There are no invoiceable items.',
 'error.no_login' => '沒有該登錄資訊的使用者。',
 'error.no_teams' => '您的資料庫沒有任何記錄。請以管理員身份登錄並創建一個新團隊。',
@@ -451,7 +452,10 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'form.roles.active_roles' => 'Active Roles',
 // 'form.roles.inactive_roles' => 'Inactive Roles',
+// 'form.roles.rank' => 'Rank',
 // 'form.roles.rights' => 'Rights',
+// 'form.roles.assigned' => 'Assigned',
+// 'form.roles.not_assigned' => 'Not assigned',
 
 // Clients form. See example at https://timetracker.anuko.com/clients.php
 // TODO: translate the following.
index 4302902..0589a0c 100644 (file)
@@ -12,7 +12,7 @@
       <br>
       <table cellspacing="0" cellpadding="4" width="100%" border="0">
         <tr>
-          <td align="center">&nbsp;Anuko Time Tracker 1.17.32.4029 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+          <td align="center">&nbsp;Anuko Time Tracker 1.17.32.4030 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
             <a href="https://www.anuko.com/lp/tt_4.htm" target="_blank">{$i18n.footer.credits}</a> |
             <a href="https://www.anuko.com/lp/tt_5.htm" target="_blank">{$i18n.footer.license}</a> |
             <a href="https://www.anuko.com/lp/tt_7.htm" target="_blank">{$i18n.footer.improve}</a>
diff --git a/WEB-INF/templates/role_add.tpl b/WEB-INF/templates/role_add.tpl
new file mode 100644 (file)
index 0000000..6a56fd2
--- /dev/null
@@ -0,0 +1,33 @@
+{$forms.roleForm.open}
+<table cellspacing="4" cellpadding="7" border="0">
+  <tr>
+    <td>
+      <table cellspacing="1" cellpadding="2" border="0">
+        <tr>
+          <td align="right">{$i18n.label.thing_name} (*):</td>
+          <td>{$forms.roleForm.name.control}</td>
+        </tr>
+        <tr>
+          <td align = "right">{$i18n.label.description}:</td>
+          <td>{$forms.roleForm.description.control}</td>
+        </tr>
+        <tr>
+          <td align = "right">{$i18n.form.roles.rank}:</td>
+          <td>{$forms.roleForm.rank.control} <a href="https://www.anuko.com/lp/tt_20.htm" target="_blank">{$i18n.label.what_is_it}</a></td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>{$i18n.label.required_fields}</td>
+        </tr>
+        <tr>
+          <td colspan="2" align="center" height="50">{$forms.roleForm.btn_submit.control}</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>&nbsp;</td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+</table>
+{$forms.roleForm.close}
index ead3ad3..ba3328c 100644 (file)
@@ -10,7 +10,8 @@
         <tr><td class="sectionHeaderNoBorder">{$i18n.form.roles.active_roles}</td></tr>
   {/if}
         <tr>
-          <td width="35%" class="tableHeader">{$i18n.label.thing_name}</td>
+          <td width="25%" class="tableHeader">{$i18n.label.thing_name}</td>
+          <td class="tableHeader">{$i18n.form.roles.rank}</td>
           <td width="35%" class="tableHeader">{$i18n.label.description}</td>
           <td class="tableHeader">{$i18n.label.edit}</td>
           <td class="tableHeader">{$i18n.label.delete}</td>
@@ -19,6 +20,7 @@
     {foreach $active_roles as $role}
         <tr bgcolor="{cycle values="#f5f5f5,#ffffff"}">
           <td>{$role.name|escape}</td>
+          <td>{$role.rank}</td>
           <td>{$role.description|escape}</td>
           <td><a href="role_edit.php?id={$role.id}">{$i18n.label.edit}</a></td>
           <td><a href="role_delete.php?id={$role.id}">{$i18n.label.delete}</a></td>
@@ -39,7 +41,8 @@
       <table cellspacing="1" cellpadding="3" border="0" width="100%">
         <tr><td class="sectionHeaderNoBorder">{$i18n.form.roles.inactive_roles}</td></tr>
         <tr>
-          <td width="35%" class="tableHeader">{$i18n.label.thing_name}</td>
+          <td width="25%" class="tableHeader">{$i18n.label.thing_name}</td>
+          <td class="tableHeader">{$i18n.form.roles.rank}</td>
           <td width="35%" class="tableHeader">{$i18n.label.description}</td>
           <td class="tableHeader">{$i18n.label.edit}</td>
           <td class="tableHeader">{$i18n.label.delete}</td>
@@ -47,6 +50,7 @@
     {foreach $inactive_roles as $role}
         <tr bgcolor="{cycle values="#f5f5f5,#ffffff"}">
           <td>{$role.name|escape}</td>
+          <td>{$role.rank}</td>
           <td>{$role.description|escape}</td>
           <td><a href="role_edit.php?id={$role.id}">{$i18n.label.edit}</a></td>
           <td><a href="role_delete.php?id={$role.id}">{$i18n.label.delete}</a></td>
diff --git a/role_add.php b/role_add.php
new file mode 100644 (file)
index 0000000..7122008
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+// +----------------------------------------------------------------------+
+// | Anuko Time Tracker
+// +----------------------------------------------------------------------+
+// | Copyright (c) Anuko International Ltd. (https://www.anuko.com)
+// +----------------------------------------------------------------------+
+// | LIBERAL FREEWARE LICENSE: This source code document may be used
+// | by anyone for any purpose, and freely redistributed alone or in
+// | combination with other software, provided that the license is obeyed.
+// |
+// | There are only two ways to violate the license:
+// |
+// | 1. To redistribute this code in source form, with the copyright
+// |    notice or license removed or altered. (Distributing in compiled
+// |    forms without embedded copyright notices is permitted).
+// |
+// | 2. To redistribute modified versions of this code in *any* form
+// |    that bears insufficient indications that the modifications are
+// |    not the work of the original author(s).
+// |
+// | This license applies to this document only, not any other software
+// | that it may be combined with.
+// |
+// +----------------------------------------------------------------------+
+// | Contributors:
+// | https://www.anuko.com/time_tracker/credits.htm
+// +----------------------------------------------------------------------+
+
+require_once('initialize.php');
+import('form.Form');
+import('ttTeamHelper');
+import('ttRoleHelper');
+
+// Access check.
+if (!ttAccessCheck(right_manage_team)) {
+  header('Location: access_denied.php');
+  exit();
+}
+
+if ($request->isPost()) {
+  $cl_name = trim($request->getParameter('name'));
+  $cl_description = trim($request->getParameter('description'));
+  $cl_rank = (int) $request->getParameter('rank');
+}
+
+$form = new Form('roleForm');
+$form->addInput(array('type'=>'text','maxlength'=>'100','name'=>'name','style'=>'width: 250px;','value'=>$cl_name));
+$form->addInput(array('type'=>'textarea','name'=>'description','style'=>'width: 250px; height: 40px;','value'=>$cl_description));
+for ($i = 0; $i < $user->role; $i++) {
+  $existing_role_name = null;
+  $rank_data[] = $i;
+}
+$form->addInput(array('type'=>'combobox','name'=>'rank','data'=>$rank_data));
+$form->addInput(array('type'=>'submit','name'=>'btn_submit','value'=>$i18n->getKey('button.submit')));
+
+if ($request->isPost()) {
+  // Validate user input.
+  if (!ttValidString($cl_name)) $err->add($i18n->getKey('error.field'), $i18n->getKey('label.thing_name'));
+  if (!ttValidString($cl_description, true)) $err->add($i18n->getKey('error.field'), $i18n->getKey('label.description'));
+
+  if ($err->no()) {
+    $existing_role = ttRoleHelper::getRoleByRank($cl_rank);
+    if (!$existing_role) {
+        // Update role information.
+        if (ttRoleHelper::insert(array(
+          'team_id' => $user->team_id,
+          'name' => $cl_name,
+          'rank' => $cl_rank,
+          'description' => $cl_description,
+          'status' => ACTIVE))) {
+          header('Location: roles.php');
+          exit();
+        } else
+          $err->add($i18n->getKey('error.db'));
+      } else
+        $err->add($i18n->getKey('error.role_exists'));
+    }
+} // isPost
+
+$smarty->assign('forms', array($form->getName()=>$form->toArray()));
+$smarty->assign('title', $i18n->getKey('title.add_role'));
+$smarty->assign('content_page_name', 'role_add.tpl');
+$smarty->display('index.tpl');