Code

Initial multi server functionality for phone queues
authorhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 9 Jan 2007 08:05:02 +0000 (08:05 +0000)
committerhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Tue, 9 Jan 2007 08:05:02 +0000 (08:05 +0000)
git-svn-id: https://oss.gonicus.de/repositories/gosa/branches/2.5@5490 594d385d-05f5-0310-b6e9-bd551577e9d8

plugins/admin/ogroups/class_ogroup.inc
plugins/admin/ogroups/class_phonequeue.inc
plugins/admin/ogroups/phonequeue.tpl

index ed44e8ea46b873609ce008b4eac4352f98b23ce1..1f9b454ab01c091d3fd4bb2b55b880dc643d6108 100644 (file)
@@ -479,7 +479,7 @@ class ogroup extends plugin
     $ldap= $this->config->get_ldap_link();
 
     /* Try to resolv the entry again, if it still fails, display error msg */
-    $ldap->cat($dn, array("cn", "sn", "givenName", "ou", "description", "objectClass"));
+    $ldap->cat($dn, array("cn", "sn", "givenName", "ou", "uid", "description", "objectClass"));
 
     /* It has failed, add entry with type flag I (Invalid)*/
     if ($ldap->error != "Success"){
index b665f91dff80356813ad728f8cca85e8317e5295..ac0107cc356cd8bb978bb7609f98c910deb212c8 100644 (file)
@@ -5,7 +5,7 @@ class phonequeue extends plugin
   /* plugin specific values */
   var $mail= "";
   var $cn= "";
-
+  var $old_cn ="";
 
   var $goFonTimeOut             ="20"; 
   var $goFonMaxLen              ="20"; // 
@@ -37,15 +37,18 @@ class phonequeue extends plugin
   var $goFonQueueStrategyOptions=array();
   var $goFonQueueStrategyOptionsR=array();
   
-
   var $old_phone_numbers        =array();
 
+  var $goFonHomeServer  = "0";
+  var $init_HomeServer  = "0";
+
   /* attribute list for save action */
   var $attributes= array( "goFonTimeOut","goFonMaxLen","goFonAnnounceFrequency","goFonDialOption_t","goFonDialOption_T",
-      "goFonDialOption_h","goFonDialOption_r","cn",
+      "goFonDialOption_h","goFonDialOption_r","cn","goFonHomeServer",
       "goFonDialOption_H","goFonMusiconHold","goFonWelcomeMusic","goFonQueueReportHold","goFonQueueYouAreNext",
       "goFonQueueThereAre","goFonQueueCallsWaiting","goFonQueueThankYou","goFonQueueMinutes","goFonQueueSeconds","goFonQueueLessThan",
       "telephoneNumber","goFonQueueLanguage","goFonQueueStrategy","goFonQueueAnnounceHoldtime","goFonQueueAnnounce","goFonDialOption","goFonQueueRetry");
+
   /* ObjectClass */
   var $objectclasses= array("goFonQueue");
 
@@ -59,48 +62,132 @@ class phonequeue extends plugin
     /* Save initial account state */
     $this->initially_was_account= $this->is_account;
 
+    /* Check server configurations
+     * Load all server configuration in $this->goFonHomeServers if available
+     *  and use first server as default if necessary.
+     */
+    if(array_key_exists('config',$_SESSION) &&
+        array_key_exists('SERVERS',$_SESSION['config']->data) &&
+        array_key_exists('FON',$_SESSION['config']->data['SERVERS']) &&
+        count($_SESSION['config']->data['SERVERS']['FON']) &&
+        is_callable("mysql_connect")
+      ) {
+
+      /* Set available server */
+      $this->goFonHomeServers = $_SESSION['config']->data['SERVERS']['FON'];
+
+      /* Set default server */
+      if($this->dn == "new"){
+        $this->goFonHomeServer = $this->goFonHomeServers[0]['DN'];
+      }
+
+      /* Remember inital home server, to be able to remove old entries */
+      $this->init_HomeServer = $this->goFonHomeServer;
+
+      /* get config */
+      if(!isset($this->goFonHomeServers[$this->goFonHomeServer])){
+        print_red(sprintf(_("The specified home server '%s' is not available in GOsa server configuration. Saving this account will create a new entry on the server '%s'. Use cancel if you do not want to create a new entry while ignoring old accounts."),$this->goFonHomeServer, $this->goFonHomeServers[0]['DN']));
+        $this->goFonHomeServer = $this->goFonHomeServers[0]['DN'];
+        $this->init_HomeServer = $this->goFonHomeServers[0]['DN'];
+      }
+      $cur_cfg = $this->goFonHomeServers[$this->goFonHomeServer];
+    }
+
+
+    /* Load telephone numbers */
     if($this->is_account){
       if(isset($this->attrs['telephoneNumber'])){
         $this->telephoneNumber=$this->attrs['telephoneNumber'];
         unset($this->telephoneNumber['count']); 
       }
-
       for($i = 0; $i < strlen($this->goFonDialOption); $i++){
         $name = "goFonDialOption_".$this->goFonDialOption[$i];
         $this->$name=$this->goFonDialOption[$i];
       }
     }
 
-    if($this->goFonQueueAnnounceHoldtime == "no"){
+    if(preg_match("/no/i",$this->goFonQueueAnnounceHoldtime)){
       $this->goFonQueueAnnounceHoldtime=false;
     }
     $this->old_phone_numbers = $this->telephoneNumber;
 
-   $types= array('ringall'    =>_("ring all"),
-          'roundrobin' =>_("round robin"),
-          'leastrecent'=>_("least recently called"),
-          'fewestcalls'=>_("fewest completed calls"),
-          'random'     =>_("random"),
-          'rrmemory'   =>_("round robin with memory"));
-
-   $i = 0;
-   foreach($types as $type => $name){
-     $i++;
-     $this->goFonQueueStrategyOptions[$i]    =$name;
-     $this->goFonQueueStrategyOptionsR[$i]   =$type;
-     $tmp[$type] = $i; 
-   }
-  
-  $this->goFonQueueStrategy= $tmp[$this->goFonQueueStrategy];
-  
+    $types= array('ringall'    =>_("ring all"),
+        'roundrobin' =>_("round robin"),
+        'leastrecent'=>_("least recently called"),
+        'fewestcalls'=>_("fewest completed calls"),
+        'random'     =>_("random"),
+        'rrmemory'   =>_("round robin with memory"));
+
+    $i = 0;
+    foreach($types as $type => $name){
+      $i++;
+      $this->goFonQueueStrategyOptions[$i]    =$name;
+      $this->goFonQueueStrategyOptionsR[$i]   =$type;
+      $tmp[$type] = $i; 
+    }
+
+    
+    $this->old_cn = $this->cn;
+    $this->goFonQueueStrategy= $tmp[$this->goFonQueueStrategy];
+  }
+
 
+  /* This function ensure that the selected home server 
+   * and the initially selecte home server are reachable and accessible  
+   **/
+  function check_database_accessibility()
+  {
+    /* Check if mysql extension is available */
+    if(!is_callable("mysql_pconnect")){
+      return(_("Can't save any changes to asterisk database, there is currently no mysql extension available in your php setup."));
+    }
+
+    /********************
+     * Check currently selected home server
+     ********************/
+
+    $cfg_Current  = $this->goFonHomeServers[$this->goFonHomeServer];
+    $r_current    =  @mysql_pconnect($cfg_Current['SERVER'],$cfg_Current['LOGIN'],$cfg_Current['PASSWORD']);
+    if(!$r_current){
+      gosa_log(@mysql_error($r_current));
+      return(sprintf(_("The MySQL home server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+            $cfg_Current['SERVER'],$cfg_Current['LOGIN']));
+    }
+    $db_current  =  @mysql_select_db($cfg_Current['DB'],$r_current);
+    if(!$db_current){
+      gosa_log(@mysql_error($r_current));
+      mysql_close($r_current);
+      return( sprintf(_("Can't select database '%s' on home server '%s'."),$cfg_Current['DB'],$cfg_Current['SERVER']));
+    }
+
+    /********************
+     * Check init home server
+     ********************/
+
+    if($this->initially_was_account){
+      $cfg_Init  = $this->goFonHomeServers[$this->init_HomeServer] ;
+      $r_init    =  @mysql_pconnect($cfg_Init['SERVER'],$cfg_Init['LOGIN'],$cfg_Init['PASSWORD']);
+      if(!$r_init){
+        gosa_log(@mysql_error($r_init));
+        return(sprintf(_("The MySQL initial home server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
+              $cfg_Init['SERVER'],$cfg_Init['LOGIN']));
+      }
+      $db_init  =  @mysql_select_db($cfg_Init['DB'],$r_init);
+      if(!$db_init){
+        gosa_log(@mysql_error($r_init));
+        mysql_close($r_init);
+        return( sprintf(_("Can't select database '%s' on initial home server '%s'."),$cfg_Init['DB'],$cfg_Init['SERVER']));
+      }
+    }
   }
 
 
+
+
   function execute()
   {
-       /* Call parent execute */
-       plugin::execute();
+    /* Call parent execute */
+    plugin::execute();
 
     /* Do we need to flip is_account state? */
     if (isset($_POST['modify_state'])){
@@ -159,26 +246,34 @@ class phonequeue extends plugin
       }
     }
 
+    /* Assign samrty variables */
     $smarty= get_smarty();
-
     $smarty->assign("goFonQueueLanguageOptions",array('de'=>_('German')));
     $smarty->assign("goFonQueueStrategyOptions", $this->goFonQueueStrategyOptions);
 
     foreach($this->attributes as $key => $val){
       $smarty->assign($val,$this->$val);  
-
       if($this->$val == false){
         $smarty->assign($val."CHK","");
       }else{
         $smarty->assign($val."CHK"," checked ");
       }
-
       if(chkacl($this->acl,$key)==""){
         $smarty->assign($val."ACL","");
       }else{
         $smarty->assign($val."ACL"," disabled ");
       }
     }
+    
+    /* Create array with goFonHomeServer */
+    $tmp = array();
+    foreach($this->goFonHomeServers as $dn => $val){
+      if(!is_numeric($dn)){
+        $tmp[$dn]  = $val['SERVER'];
+      }
+    }
+    $smarty->assign("goFonHomeServers",$tmp);
+
     return ($display.$smarty->fetch (get_template_path('phonequeue.tpl', TRUE)));
   }
 
@@ -188,15 +283,15 @@ class phonequeue extends plugin
   {
     /* Call common method to give check the hook */
     $message= plugin::check();
-
+    if(!count($this->goFonHomeServers)){
+      $message[] = _("There must be at least one server with an asterisk database to create a phone account.");
+    }
+    if(empty($this->goFonHomeServer)){
+      $message[] = _("Please select a valid goFonHomeServer.");
+    }
     if($this->is_number_used()){
       $message[] = $this->is_number_used();
     }
-
-    if($this->generate_mysql_table_entries()){
-      $message[] = $this->generate_mysql_table_entries();
-    }
-
     if(!((is_numeric($this->goFonTimeOut))||(empty($this->goFonTimeOut)))){
       $message[] = _("Timeout must be numeric");
     }
@@ -213,86 +308,214 @@ class phonequeue extends plugin
       $message[] = _("There must be least one queue number defined.");
     }
 
+    /* check if add to database could be successfull  */
+    $str = $this->add_to_database();
+    if(!empty($str)){
+      $message[] = $str;
+    }
     return $message;
   }
 
 
 
-  function generate_mysql_table_entries($save = false)
+  /* This function removes the old database entries. 
+   * If this entry should be removed or the home server has changed
+   *  this function is called to ensure that all old entries will be deleted.
+   */
+  function remove_from_database($save = false)
   {
+    /* Check if we must remove old entries */
+    if($this->initially_was_account){
 
-    $SQL = array();
+      /* Check if there is at least on server configuration */
+      if(!count($this->goFonHomeServers)){
+        return( _("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
+      }
 
-    if(!isset($_SESSION['config']->data['SERVERS']['FON'][0])){
-      return(_("There is currently no asterisk server defined. Your settings can't be saved."));
-    }
+      /********************
+       * Get configuration and check it
+       ********************/
 
-    // Get Configuration for Mysql database Server
-    $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'][0];
-    $s_parameter  ="";
+      /* Check if databases are reachable, returns an error string if anything fails  */
+      $error_str = $this->check_database_accessibility();
+      if($error_str){
+        return($error_str);
+      }
 
-    // Connect to DB server
-    $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
+      /* Connect to current database to be able to add new entries */
+      $cfg_Current  = $this->goFonHomeServers[$this->init_HomeServer] ;
+      $res_cur      =  @mysql_pconnect($cfg_Current['SERVER'],$cfg_Current['LOGIN'],$cfg_Current['PASSWORD']);
+      $db_cur       =  @mysql_select_db($cfg_Current['DB'],$res_cur);
+
+      /* Create sql entries */
+      $delete[]=    "DELETE FROM ".$cfg_Current['EXT_TABLE']."    WHERE exten='".$this->old_cn."';\n";
+      $delete[]=    "DELETE FROM ".$cfg_Current['QUEUE_TABLE']."  WHERE name='".$this->old_cn."'; \n";
+      $delete[]=    "DELETE FROM ".$cfg_Current['QUEUE_MEMBER_TABLE']." WHERE queue_name='".$this->old_cn."';\n";
+      foreach($this->old_phone_numbers as $number){
+        $delete[]=    "DELETE FROM ".$cfg_Current['EXT_TABLE']."    WHERE exten='".$number."';\n";
+      }
 
-    // Check if we are  connected correctly
-    if(!$r_con){
-      gosa_log(mysql_error());
-      return (sprintf(_("The MySQL server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-          $a_SETUP['SERVER'],$a_SETUP['LOGIN']));
+      /* Execute the queries */  
+      if($save){
+        foreach($delete as $sql){
+          $res = @mysql_query($sql,$res_cur);
+          if(!$res){
+            gosa_log(@mysql_error($res_cur));
+            return(_("Error while removing old queue entries from database.").
+                "&nbsp;"._("Please have a look a the gosa logfiles."));
+          }
+        }
+      }
     }
+  }
 
-    // Select database for Extensions
-    $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
 
-    // Test if we have the database selected correctly
-    if(!$db){
-      gosa_log(mysql_error());
-      return( sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']));
+  /* This function handles the database entries for this 
+   *  queue. 
+   * Existing entries will be updated if possible.
+   */
+  function add_to_database($save = false)
+  {
+    /* Check if there is at least on server configuration */
+    if(!count($this->goFonHomeServers)){
+      return( _("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
     }
 
-    if($save){
-      $i = 0;
-      $prio = 11; 
+    /********************
+     * Get configuration and check it
+     ********************/
 
-      $delete = array();
-      if(!empty($this->parent->by_object['ogroup'])){
-        $new_cn = $this->parent->by_object['ogroup']->cn;
+    /* Check if databases are reachable, returns an error string if anything fails  */
+    $error_str = $this->check_database_accessibility();
+    if($error_str){
+      return($error_str);
+    }
+
+    /* Connect to current database to be able to add new entries */
+    $cfg_Current  = $this->goFonHomeServers[$this->goFonHomeServer] ;
+    $res_cur      =  @mysql_pconnect($cfg_Current['SERVER'],$cfg_Current['LOGIN'],$cfg_Current['PASSWORD']);
+    $db_cur       =  @mysql_select_db($cfg_Current['DB'],$res_cur);
+
+    /* Connect to old home server and remove old entries if necessary */
+    if(($this->initially_was_account) && ($this->init_HomeServer != $this->goFonHomeServer)){
+      $str = $this->remove_from_database($save); 
+      if(!empty($str)){
+        return($str);;
       }
-      $old_cn = $this->cn;
+    }
 
-      $delete[]=    "DELETE FROM ".$a_SETUP['EXT_TABLE']."    WHERE exten='".$new_cn."';\n";
-      $delete[]=    "DELETE FROM ".$a_SETUP['QUEUE_TABLE']."  WHERE name='".$new_cn."'; \n";
-      $delete[]=    "DELETE FROM ".$a_SETUP['QUEUE_MEMBER_TABLE']." WHERE queue_name='".$new_cn."';\n";
-      $delete[]=    "DELETE FROM ".$a_SETUP['EXT_TABLE']."    WHERE exten='".$old_cn."';\n";
-      $delete[]=    "DELETE FROM ".$a_SETUP['QUEUE_TABLE']."  WHERE name='".$old_cn."'; \n";
-      $delete[]=    "DELETE FROM ".$a_SETUP['QUEUE_MEMBER_TABLE']." WHERE queue_name='".$old_cn."';\n";
+    /* Ensure that we have the new cn in $this->cn and the old cn in $this->old_cn */
+    $this->cn = $this->parent->by_object['ogroup']->cn;
 
-      // Delete old Entries 
-      if(is_array($this->old_phone_numbers)){
-        foreach($this->old_phone_numbers as $phone){
-          $delete[]= "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$phone."';\n";
-        }
+    if($save){
+   
+      /* Check if QUEUE_TABLE entry exists.
+       * If this entry is missing - create it 
+       *  else update the entry with new values.
+       */
+      $query = "SELECT * FROM ".$cfg_Current['QUEUE_TABLE']."  WHERE name='".$this->cn."';";
+      $res   = mysql_query($query,$res_cur);
+      if(!$res){
+        gosa_log(@mysql_error($res_cur));
+        return(_("Could not detect old queue entry, query failed.")."&nbsp;"._("Please have a look a the gosa logfiles."));
       }
+      $cnt = mysql_affected_rows($res_cur);
+
+      /* Create queue table entry */
+      $queue["announce"]              = "0";
+      $queue["monitor_join"]          = "0";
+      $queue["monitor_format"]        = "0";
+      $queue["queue_holdtime"]        = $this->goFonQueueAnnounce;
+      $queue["queue_lessthan"]        = $this->goFonQueueLessThan;   
+      $queue["announce_round_seconds"]= "0";   
+      $queue["retry"]                 = $this->goFonQueueRetry;
+      $queue["wrapuptime"]            = "0";
+      $queue["servicelevel"]          = "0";
+      $queue["joinempty"]             = "no";
+      $queue["leavewhenempty"]        = "yes";   
+      $queue["eventmemberstatus"]     = "0";
+      $queue["eventwhencalled"]       = "0";
+      $queue["reportholdtime"]        = "1";
+      $queue["memberdelay"]           = "0";
+      $queue["weight"]                = "0";
+      $queue["timeoutrestart"]        = "0";
+
+      $queue["context"]               = "default";
+      $queue["name"]                  = $this->cn;  
+      $queue["timeout"]               = $this->goFonTimeOut; 
+      $queue["maxlen"]                = $this->goFonMaxLen;
+      $queue["strategy" ]             = $this->goFonQueueStrategyOptionsR[$this->goFonQueueStrategy];
+      $queue["queue_thankyou"]        = $this->goFonQueueThankYou;   
+      $queue["queue_reporthold"]      = $this->goFonQueueReportHold; 
+      $queue["announce_frequency"]    = $this->goFonAnnounceFrequency;
+      $queue["queue_youarenext"]      = $this->goFonQueueYouAreNext;   
+      $queue["queue_thereare"]        = $this->goFonQueueThereAre;   
+      $queue["queue_callswaiting"]    = $this->goFonQueueCallsWaiting;
+      $queue["queue_minutes"]         = $this->goFonQueueMinutes;
+      $queue["queue_seconds"]         = $this->goFonQueueSeconds;   
+      $queue["announce_holdtime"]     = $this->goFonQueueAnnounceHoldtime;   
+      $queue["musiconhold"]           = $this->goFonMusiconHold;
+
+
+      /* Create new queue table entry 
+       */
+      if($cnt == 0){
+
+        /* Parse and Add Queue */
+        $entries = "";
+        $values  = "";
+        foreach($queue as $attr=>$val){
+          if($val == "") continue;
+          $entries.= "`".$attr."`,";
+          $values .= "'".$val."',";
+        }
+        $values  = preg_replace("/,$/","",$values);
+        $entries = preg_replace("/,$/","",$entries );
+        $SQL[]="INSERT INTO ".$cfg_Current['QUEUE_TABLE']." (".$entries.") VALUES (".$values.");";
+      }elseif($cnt == 1){
+
+        /* Update queue table entry 
+         */
+        $queue_old = @mysql_fetch_assoc($res);
+        foreach($queue_old as $name => $value){
+          if($queue[$name] == $value){
+            unset($queue[$name]);
+          }
+        }
 
-      /* Perform queries to delte old entries */
-      foreach($delete as $query){
-        if(!mysql_query($query)){
-          gosa_log(mysql_error());
-          return(mysql_error(). sprintf(_("Can't delete in Database %s, on Server %s."),$a_SETUP['DB'],$a_SETUP['SERVER']));
+        /* Parse and Add Queue */
+        if(count($queue)){
+          $query = "UPDATE ".$cfg_Current['QUEUE_TABLE']." SET ";
+          foreach($queue as $key => $val){
+            $query.= "".$key."='".$val."',";
+          }
+          $query = preg_replace("/,$/","",$query);
+          $query.= " WHERE name='".$this->cn."';";
+          $SQL[] = $query;
         }
+      }else{
+        return(sprintf(_("More than one entry in queue table found, that uses the name ('%s'). Please fix this issue manually first."),$this->cn));
       }
 
-      $this->attrs['cn'][0] = $new_cn;
-
+      
+      /* Add the queue member entries 
+       * First we must remove all old user entries. 
+       * to be able to add a clean set of members.
+       */ 
+      $SQL[]= "DELETE FROM ".$cfg_Current['QUEUE_MEMBER_TABLE']." WHERE queue_name='".$this->cn."';";
+      $SQL[]= "DELETE FROM ".$cfg_Current['QUEUE_MEMBER_TABLE']." WHERE queue_name='".$this->old_cn."';";
+      
       /* Append new Member for this queue */ 
-      $i = 0;
       $queueuser =array();
-      foreach($this->parent->by_object['ogroup']->memberList as $member){
-        if(isset($member['objectClass'])){
-          if(in_array("goFonAccount",$member['objectClass'])){
+      $i = 0;
+      $parent = $this->parent->by_object['ogroup'];
+      foreach($parent->memberList as $member => $mem_data){
+        $obj = $parent->objcache[$member];
+        if(isset($obj['objectClass'])){
+          if(in_array("goFonAccount",$obj['objectClass'])){
             $i ++ ;
-            $queueuser[$i]['queue_name']  = $this->attrs['cn'][0]
-            $queueuser[$i]['interface']   = "SIP/".$member['uid'][0]; 
+            $queueuser[$i]['queue_name']  = $this->cn
+            $queueuser[$i]['interface']   = "SIP/".$obj['uid'][0]; 
             $queueuser[$i]['penalty']     = 1; 
           }
         }
@@ -310,58 +533,63 @@ class phonequeue extends plugin
           $values  = preg_replace("/,$/","",$values);
           $entries = preg_replace("/,$/","",$entries );
 
-          $SQL[]="INSERT INTO ".$a_SETUP['QUEUE_MEMBER_TABLE']." (".$entries.") VALUES (".$values.")"; 
+          $SQL[]="INSERT INTO ".$cfg_Current['QUEUE_MEMBER_TABLE']." (".$entries.") VALUES (".$values.")"; 
         }
       }
       
-      /* generate Extension entries, with priority  */
+      
+      /* Add the extension entries 
+       * First we must remove all old entensions. 
+       */ 
+      $SQL[]=  "DELETE FROM ".$cfg_Current['EXT_TABLE']."  WHERE exten='".$this->cn."';\n";
+      $SQL[]=  "DELETE FROM ".$cfg_Current['EXT_TABLE']."  WHERE exten='".$this->old_cn."';\n";
 
-      $queueusers=0;
-      foreach($this->parent->by_object['ogroup']->memberList as $member){
-        if(isset($member['objectClass'])){
-          if(in_array("goFonAccount",$member['objectClass'])){
-            $queueusers++;
-          }
+      /* Delete old enxtension entries for the old telephone nubmer  */
+      if(is_array($this->old_phone_numbers)){
+        foreach($this->old_phone_numbers as $phone){
+          $SQL[]= "DELETE FROM ".$cfg_Current['EXT_TABLE']." WHERE exten='".$phone."';\n";
+        }
+      }
+      
+      /* Delete enxtension entries for telephone numbers  */
+      if(is_array($this->telephoneNumber)){
+        foreach($this->telephoneNumber as $phone){
+          $SQL[]= "DELETE FROM ".$cfg_Current['EXT_TABLE']." WHERE exten='".$phone."';\n";
         }
       }
 
-
-      $i = 0;
-
+      /* Create a extension entry fpr each telephoneNumber */
       $i_insert_only_once = false;
-      
+      $prio = 11;
       foreach($this->telephoneNumber as $num){
-       
-        // If there are no member in a Queue
-        // Play sound an quit
 
-        // A Queue is not deleted directly, it is stored until the o group is deleted
-        
+        /* The naming refrences */
         if($i_insert_only_once == false){
           $i_insert_only_once = true;
           $a_ext[$i]['context']  = 'GOsa';
-          $a_ext[$i]['exten']    = $this->attrs['cn'][0];
+          $a_ext[$i]['exten']    = $this->cn;
           $a_ext[$i]['priority'] = 1;
           $a_ext[$i]['app']      = "Goto";
           $a_ext[$i]['appdata']  = $num."|1";
           $i ++ ; 
         }
-    
-        if($queueusers == 0){
+
+        
+        if(count($queueuser)==0){
           $a_ext[$i]['context']  = 'GOsa';
           $a_ext[$i]['exten']    = $num;
           $a_ext[$i]['priority'] = 1;
           $a_ext[$i]['app']      = "SetLanguage";
           $a_ext[$i]['appdata']  = "de";
           $i ++ ; 
-          
+
           $a_ext[$i]['context']  = 'GOsa';
           $a_ext[$i]['exten']    = $num;
           $a_ext[$i]['priority'] = 2;
           $a_ext[$i]['app']      = "Playback";
           $a_ext[$i]['appdata']  = "ss-noservice";
           $i ++ ; 
-          
+
           $a_ext[$i]['context']  = 'GOsa';
           $a_ext[$i]['exten']    = $num;
           $a_ext[$i]['priority'] = 3;
@@ -395,7 +623,7 @@ class phonequeue extends plugin
           if(!empty($this->parent->by_object['ogroup']->description)){
             $a_ext[$i]['appdata']  = $this->parent->by_object['ogroup']->description;
           }else{
-            $a_ext[$i]['appdata']  = $this->attrs['cn'][0]." - ".$num;
+            $a_ext[$i]['appdata']  = $this->cn." - ".$num;
           }
           $i ++ ; 
           $a_ext[$i]['context']  = 'GOsa';
@@ -408,7 +636,7 @@ class phonequeue extends plugin
           $a_ext[$i]['exten']    = $num;
           $a_ext[$i]['priority'] = 6;
           $a_ext[$i]['app']      = "Queue";
-          $a_ext[$i]['appdata']  =  $this->attrs['cn'][0].
+          $a_ext[$i]['appdata']  =  $this->cn;
             "|".
             $this->goFonDialOption_t.
             $this->goFonDialOption_T.
@@ -417,48 +645,6 @@ class phonequeue extends plugin
             $this->goFonDialOption_r;
         }
 
-        if($this->goFonQueueAnnounceHoldtime != false) {
-          $this->goFonQueueAnnounceHoldtime = "yes";
-        }else{
-          $this->goFonQueueAnnounceHoldtime = "no";
-        }
-
-
-        /* Generate Priority Entry */
-        $queue["announce"]              = "";
-        $queue["monitor_join"]          = "";
-        $queue["monitor_format"]        = "";
-        $queue["queue_holdtime"]        = $this->goFonQueueAnnounce;
-        $queue["queue_lessthan"]        = $this->goFonQueueLessThan;   
-        $queue["announce_round_seconds"]= "";   
-        $queue["retry"]                 = $this->goFonQueueRetry;
-        $queue["wrapuptime"]            = "";
-        $queue["servicelevel"]          = "";
-        $queue["joinempty"]             = "no";
-        $queue["leavewhenempty"]        = "yes";   
-        $queue["eventmemberstatus"]     = "";
-        $queue["eventwhencalled"]       = "";
-        $queue["reportholdtime"]        = "yes";
-        $queue["memberdelay"]           = "";
-        $queue["weight"]                = "";
-        $queue["timeoutrestart"]        = "";
-
-        $queue["context"]               = "default";
-        $queue["name"]                  = $this->attrs['cn'][0];  
-        $queue["timeout"]               = $this->goFonTimeOut; 
-        $queue["maxlen"]                = $this->goFonMaxLen;
-        $queue["strategy" ]             = $this->goFonQueueStrategyOptionsR[$this->goFonQueueStrategy];
-        $queue["queue_thankyou"]        = $this->goFonQueueThankYou;   
-        $queue["queue_reporthold"]      = $this->goFonQueueReportHold; 
-        $queue["announce_frequency"]    = $this->goFonAnnounceFrequency;
-        $queue["queue_youarenext"]      = $this->goFonQueueYouAreNext;   
-        $queue["queue_thereare"]        = $this->goFonQueueThereAre;   
-        $queue["queue_callswaiting"]    = $this->goFonQueueCallsWaiting;
-        $queue["queue_minutes"]         = $this->goFonQueueMinutes;
-        $queue["queue_seconds"]         = $this->goFonQueueSeconds;   
-        $queue["announce_holdtime"]     = $this->goFonQueueAnnounceHoldtime;   
-        $queue["musiconhold"]           = $this->goFonMusiconHold;
-
         $i++;
       }
 
@@ -472,44 +658,33 @@ class phonequeue extends plugin
         }
         $values  = preg_replace("/,$/","",$values);
         $entries = preg_replace("/,$/","",$entries );
-        $SQL[]="INSERT INTO ".$a_SETUP['EXT_TABLE']." (".$entries.") VALUES (".$values.")";
-      }
-
-
-      /* Parse and Add Queue */
-      $entries = "";
-      $values  = "";
-      foreach($queue as $attr=>$val){
-        if($val == "") continue;
-        $entries.= "`".$attr."`,";
-        $values .= "'".$val."',";
+        $SQL[]="INSERT INTO ".$cfg_Current['EXT_TABLE']." (".$entries.") VALUES (".$values.")";
       }
-      $values  = preg_replace("/,$/","",$values);
-      $entries = preg_replace("/,$/","",$entries );
-      $SQL[]="INSERT INTO ".$a_SETUP['QUEUE_TABLE']." (".$entries.") VALUES (".$values.")";
 
-      foreach($SQL as $query){
-         if(!mysql_query($query)){
-          gosa_log(mysql_error());
-          print_red(mysql_error());
-          return(mysql_error(). sprintf(_("Can't delete in Database %s, on Server %s."),$a_SETUP['DB'],$a_SETUP['SERVER']));
-        }
+      foreach($SQL as $query)
+      $res   = mysql_query($query,$res_cur);
+      if(!$res){
+        gosa_log(@mysql_error($res_cur));
+        return(_("Mysql query failed.")."&nbsp;"._("Please have a look a the gosa logfiles."));
       }
-
     }
     @mysql_close($r_con);
     return(false);
   }
 
 
-
- /* This function checks if the given phonenumbers are available or already in use*/
-
+  /* This function checks if the given phonenumbers 
+   *  are available or already in use
+   */
   function is_number_used()
   {
     $ldap= $this->config->get_ldap_link();
     $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(|(objectClass=goFonAccount)(objectClass=goFonQueue)(objectClass=goFonConference))", array("telephoneNumber","cn","uid"));
+    $ldap->search("(&(& (!(uid=".$this->cn."))
+                        (!(cn=".$this->cn.")))
+                     (| (objectClass=goFonAccount)
+                        (objectClass=goFonQueue)
+                        (objectClass=goFonConference)))", array("telephoneNumber","cn","uid"));
     while($attrs = $ldap->fetch()) {
       unset($attrs['telephoneNumber']['count']);
       foreach($attrs['telephoneNumber'] as $tele){
@@ -531,9 +706,7 @@ class phonequeue extends plugin
   }
 
 
-
-
-
+  /* Get posted attributes */
   function save_object()
   {
     plugin::save_object();  
@@ -550,18 +723,16 @@ class phonequeue extends plugin
       }else{
         $this->goFonQueueAnnounceHoldtime = false;
       }
-      
     }
-
   }
 
+
   function save()
   {
   #fixme workaround : Tab is not initialised correct
        if(!$this->is_account) return;
-    $ldap= $this->config->get_ldap_link();
 
-    $this->generate_mysql_table_entries(true);
+    $ldap= $this->config->get_ldap_link();
 
     plugin::save();
     $this->attrs['goFonDialOption'] = "";
@@ -579,6 +750,12 @@ class phonequeue extends plugin
 
     $this->attrs['goFonQueueStrategy'] = $this->goFonQueueStrategyOptionsR[$this->goFonQueueStrategy];
 
+  
+    $str = $this->add_to_database(true);
+    if(!empty($str)){
+      print_red($str);
+    }
+
     /* Save data to LDAP */
     $ldap->cd($this->dn);
     $this->cleanup();
@@ -600,31 +777,20 @@ class phonequeue extends plugin
   /* remove object from parent */
   function remove_from_parent()
   {
-    $SQL = array();
-
-    // Get Configuration for Mysql database Server
-    $a_SETUP = $_SESSION['config']->data['SERVERS']['FON'][0];
-    $s_parameter  ="";
-
-    // Connect to DB server
-    $r_con =  @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
-
-    // Check if we are  connected correctly
-    if(!$r_con){
-      gosa_log(mysql_error());
-      return (sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
-            $a_SETUP['SERVER'],$a_SETUP['LOGIN']));
+    /* Cancel if nothing is to do here */
+    if (!$this->initially_was_account){
+      return;
     }
 
-    // Select database for Extensions
-    $db  =  @mysql_select_db($a_SETUP['DB'],$r_con);
-
-    // Test if we have the database selected correctly
-    if(!$db){
-      gosa_log(mysql_error());
-      return( sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']));
+    /* Remove database entries, 
+     *  if fails display errors and abort
+     */
+    $str = $this->remove_from_database(true);
+    if(!empty($str)){
+      print_red($str);
+      return false;
     }
-
+  
     /* Remove all temporary attributes */
     $tmp = array_flip($this->attributes);
     foreach(array("goFonDialOption_t","goFonDialOption_T","goFonDialOption_r","goFonDialOption_h","goFonDialOption_H","cn") as $val){
@@ -637,50 +803,16 @@ class phonequeue extends plugin
     } 
     $this->attributes = $tmp2;
 
-    $i = 0;
-    $prio = 11;
-
-    if(empty($this->cn)){
-      $this->cn = $this->parent->by_object['ogroup']->cn;
-      $this->attrs['cn'][0] = $this->parent->by_object['ogroup']->cn;
-    }
-
-    // Delete old Entries
-    $delete = array();
-    foreach($this->old_phone_numbers as $phone){
-      $delete[]= "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$phone."';\n";
-    }
-    $delete[]=    "DELETE FROM ".$a_SETUP['EXT_TABLE']."    WHERE exten='".$this->attrs['cn'][0]."';\n";
-    $delete[]=    "DELETE FROM ".$a_SETUP['QUEUE_TABLE']." WHERE name=\"".$this->attrs['cn'][0]."\"; \n";
-    $delete[]=    "DELETE FROM ".$a_SETUP['QUEUE_MEMBER_TABLE']." WHERE queue_name=\"".$this->attrs['cn'][0]."\";\n";
-
-    /* Perform queries to delte old entries */
-    foreach($delete as $query){
-      if(!mysql_query($query)){
-        gosa_log(mysql_error());
-        return(mysql_error(). sprintf(_("Can't delete in Database %s, on Server %s."),$a_SETUP['DB'],$a_SETUP['SERVER']));
-      }
-    }
-
-
-
-    /* Cancel if there's nothing to do here */
-    if (!$this->initially_was_account){
-      return;
-    }
-
     /* include global link_info */
     $ldap= $this->config->get_ldap_link();
 
     /* Remove and write to LDAP */
     plugin::remove_from_parent();
 
-    @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__,
-        $this->attributes, "Save");
+    @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__,$this->attributes, "Save");
     $ldap->cd($this->dn);
     $this->cleanup();
     $ldap->modify ($this->attrs); 
-
     show_ldap_error($ldap->get_error(), _("Removing phone queue failed"));
   }
 
index 95f7b52e49b278e362e3ca6defdb1476daa86b8d..5f4d59c69979f7de094fdd27e7c610808dd03be0 100644 (file)
                <tr>
                  <td colspan=2><h2><img class="center" alt="" src="images/select_ogroup.png" align="middle">&nbsp;{t}Options{/t}</h2></td>
                </tr>
+                       <tr>
+               <td><LABEL for="goFonHomeServer">{t}Home server{/t}</LABEL>{$must}</td>
+               <td>
+                       <select name='goFonHomeServer'>
+                        {html_options options=$goFonHomeServers selected=$goFonHomeServer}
+                       </select>
+               </td>
+               </tr>
+
                <tr>
                <td>
                        {t}Language{/t}