function updateUserOrganization($idUser, $name, $md5password, $password1, $extension, $fax_extension, $countryCode, $areaCode, $clidNumber, $cldiName, $idGrupo, $quota, $userLevel1, &$reAsterisk)
 {
     require_once "apps/general_settings/libs/paloSantoGlobalsPBX.class.php";
     $pACL = new paloACL($this->_DB);
     $pEmail = new paloEmail($this->_DB);
     $pFax = new paloFax($this->_DB);
     $continuar = true;
     $Exito = false;
     $error = "";
     $cExten = false;
     $cFExten = false;
     $arrBackup = array();
     $editFax = false;
     $faxProperties = array();
     $arrUser = $pACL->getUsers2($idUser);
     if ($arrUser === false || count($arrUser) == 0 || !isset($idUser)) {
         $this->errMsg = _tr("User dosen't exist");
         return false;
     }
     if ($pACL->isUserSuperAdmin($arrUser[0]['username'])) {
         $this->errMsg = _tr("Invalid Action");
         return false;
     }
     $arrOrgz = $this->getOrganizationById($arrUser[0]['id_organization']);
     $username = $arrUser[0]['username'];
     $oldExten = $arrUser[0]['extension'];
     $oldFaxExten = $arrUser[0]['fax_extension'];
     $pDevice = new paloDevice($arrOrgz["domain"], "sip", $this->_DB);
     $arrExtUser = $pDevice->getExtension($oldExten);
     $listFaxs = $pFax->getFaxList(array("exten" => $oldFaxExten, "organization_domain" => $arrOrgz['domain']));
     $faxUser = $listFaxs[0];
     if ($name == "") {
         $name = $username;
     }
     if ($userLevel1 == "other") {
         $extension = $arrUser[0]['extension'];
         $fax_extension = $arrUser[0]['fax_extension'];
         $quota = $pACL->getUserProp($idUser, "email_quota");
         $idGrupo = $arrUser[0]['id_group'];
         $modificarExts = false;
     } else {
         //verificar si el usuario cambio de extension y si es asi que no este siendo usado por otro usuario
         if ($extension != $oldExten) {
             if ($pDevice->existDevice($extension, "{$arrOrgz["code"]}_{$extension}", $arrExtUser["tech"]) == true) {
                 $this->errMsg = $pDevice->errMsg;
                 return false;
             } else {
                 $cExten = true;
             }
         }
         if ($fax_extension != $oldFaxExten) {
             //si el usairo quiere cambiar el patron de marcado asociado al fax verificar que el nuevo
             //patron de marcado no este siendo usado dentro de la organizacion
             if ($pDevice->tecnologia->existExtension($fax_extension, $pDevice->getDomain())) {
                 $this->errMsg = $pDevice->errMsg;
                 return false;
             } else {
                 $cFExten = true;
             }
         }
         //para cambiar al usuario de extension o faxextension es necesario que se haya llenado el campo password para
         //poder crear las extensiones con la clave correcta
         if ($cExten || $cFExten) {
             if (is_null($md5password) || $md5password == "" || is_null($password1) || $password1 == "") {
                 $this->errMsg = _tr("Please set a password");
                 return false;
             }
         }
     }
     if (empty($clidNumber) && $clidNumber != 0) {
         $clidNumber = $faxUser['clid_number'];
     }
     if (empty($cldiName) && $cldiName != 0) {
         $cldiName = $faxUser['clid_name'];
     }
     if (empty($country_code)) {
         $country_code = $faxUser['country_code'];
     }
     if (empty($area_code)) {
         $area_code = $faxUser['area_code'];
     }
     $this->_DB->beginTransaction();
     //actualizamos la informacion de usuario que esta en la tabla acl_user
     if ($pACL->updateUser($idUser, $name, $extension, $fax_extension)) {
         //actualizamos el grupo al que pertennece el usuario
         if ($pACL->addToGroup($idUser, $idGrupo)) {
             $old_quota = $pACL->getUserProp($idUser, "email_quota");
             if ($old_quota === false) {
                 $old_quota = 1;
             }
             //actualizamos la quota de correo
             if (isset($quota) && $quota != "" && $continuar) {
                 if ($pEmail->updateQuota($old_quota * 1024, $quota * 1024, $username)) {
                     if (!$pACL->setUserProp($idUser, "email_quota", $quota, "email")) {
                         $error = _tr("Error setting email quota") . $pACL->errMsg;
                         $pEmail->updateQuota($quota, $old_quota);
                         $this->_DB->rollBack();
                         $continuar = false;
                     }
                 } else {
                     $error = _tr("Error setting email quota") . $pEmail->errMsg;
                     $continuar = false;
                 }
             }
             if ($continuar) {
                 if ($cExten && $userLevel1 != "other") {
                     if (!$this->modificarExtensionUsuario($arrOrgz["domain"], $oldExten, $extension, $password1, $name, $username, $arrBackup)) {
                         $error = "Couldn't updated user extension. " . $this->errMsg;
                         $continuar = false;
                     }
                 }
             }
             //actualizamos el password del usuario
             if ($password1 !== "" && $continuar) {
                 if ($pACL->changePassword($idUser, $md5password)) {
                     //en caso que no se hayan modificado la extensiones del usuario
                     //entonces es necesario actualizar el passoword para la extension y el fax
                     if (!$cExten) {
                         if (!$pDevice->changePasswordExtension($password1, $extension)) {
                             $this->errMsg = _tr("Extension password couldn't be updated") . $pDevice->errMsg;
                             $continuar = false;
                         }
                     }
                     //editamos la configuracion del fax
                     if ($continuar) {
                         if ($cFExten && $userLevel1 != "other") {
                             //cuando se cambia el patron de marcado asociado al fax del usuario
                             //es necesario incluir el parametro oldFaxExten entre los parametros para
                             //la actualizacion correcta de los datos
                             if (!$pFax->editFaxToUser(array("idUser" => $idUser, "oldFaxExten" => $oldFaxExten, "country_code" => $countryCode, "area_code" => $areaCode, "clid_name" => $cldiName, "clid_number" => $clidNumber))) {
                                 $error = "Couldn't updated user fax. " . $pFax->errMsg;
                                 $continuar = false;
                             }
                         } else {
                             if (!$pFax->editFaxToUser(array("idUser" => $idUser, "country_code" => $countryCode, "area_code" => $areaCode, "clid_name" => $cldiName, "clid_number" => $clidNumber))) {
                                 $error = "Couldn't updated user fax. " . $pFax->errMsg;
                                 $continuar = false;
                             }
                         }
                     }
                     if ($continuar) {
                         if (!$pEmail->setAccountPassword($username, $password1)) {
                             $continuar = false;
                             $error = _tr("Password couldn't be updated") . " " . $pEmail->errMsg;
                             $editFax = true;
                         }
                     }
                     //debemos actualizar el password en las variable de session
                     if ($continuar && $_SESSION['elastix_user'] == $username) {
                         $_SESSION['elastix_pass'] = $md5password;
                         $_SESSION['elastix_pass2'] = $password1;
                     }
                 } else {
                     $error = _tr("Password couldn't be updated") . " " . $pACL->errMsg;
                     $continuar = false;
                 }
             } else {
                 //editamos la configuracion del fax
                 if ($continuar) {
                     if ($cFExten && $userLevel1 != "other") {
                         //cuando se cambia el patron de marcado asociado al fax del usuario
                         //es necesario incluir el parametro oldFaxExten entre los parametros para
                         //la actualizacion correcta de los datos
                         if (!$pFax->editFaxToUser(array("idUser" => $idUser, "oldFaxExten" => $oldFaxExten, "country_code" => $countryCode, "area_code" => $areaCode, "clid_name" => $cldiName, "clid_number" => $clidNumber))) {
                             $error = "Couldn't updated user fax. " . $pFax->errMsg;
                             $continuar = false;
                         }
                     } else {
                         if (!$pFax->editFaxToUser(array("idUser" => $idUser, "country_code" => $countryCode, "area_code" => $areaCode, "clid_name" => $cldiName, "clid_number" => $clidNumber))) {
                             $error = "Couldn't updated user fax. " . $pFax->errMsg;
                             $continuar = false;
                         }
                     }
                 }
             }
             if ($continuar) {
                 $Exito = true;
                 $this->_DB->commit();
                 //recargamos la configuracion en realtime de los dispositivos para que tomen efectos los cambios
                 if ($cExten) {
                     //se cambio la extension del usuario hay que eliminar de cache la anterior
                     $pDevice->tecnologia->prunePeer($arrExtUser["device"], $arrExtUser["tech"]);
                 } else {
                     $pDevice->tecnologia->prunePeer($arrExtUser["device"], $arrExtUser["tech"]);
                     $pDevice->tecnologia->loadPeer($arrExtUser["device"], $arrExtUser["tech"]);
                 }
                 if ($cFExten) {
                     //se cambio la faxextension del usuario hay que eliminar de cache la anterior
                     $pDevice->tecnologia->prunePeer($faxUser["device"], $faxUser["tech"]);
                 } else {
                     //se recarga la faxextension del usuario por los cambios que pudo haber
                     $pDevice->tecnologia->prunePeer($faxUser["device"], $faxUser["tech"]);
                     $pDevice->tecnologia->loadPeer($faxUser["device"], $faxUser["tech"]);
                 }
                 $pFax->restartService();
             } else {
                 $this->_DB->rollBack();
                 if ($editFax == true) {
                     $pFax->editFaxFileConfig($faxUser['dev_id'], $faxUser['country_code'], $faxUser['area_code'], $faxUser['clid_name'], $faxUser['clid_number'], $arrUser[0]['md5_password'], 0, $arrOrgz['domain']);
                 }
                 if ($cExten == true) {
                     $pDevice->deleteAstDBExt($extension, "sip");
                     $pDevice->restoreBackupAstDBEXT($arrBackup);
                 }
             }
         } else {
             $error = _tr("Failed Updated Group") . " " . $pACL->errMsg;
             $this->_DB->rollBack();
         }
     } else {
         $error = _tr("User couldn't be update") . " " . $pACL->errMsg;
         $this->_DB->rollBack();
     }
     if ($cExten || $cFExten) {
         $reAsterisk = true;
     }
     $this->errMsg = $error . " " . $this->errMsg;
     return $Exito;
 }
 function createFaxToUser($arrProp)
 {
     require_once 'libs/paloSantoPBX.class.php';
     $tech = 'iax2';
     $pACL = new paloACL($this->_DB);
     // 1) Averiguar el numero de dispositivo que se puede usar
     if (!isset($arrProp['devId'])) {
         $devId = $this->getNewDevID();
         if ($devId == false) {
             $this->errMsg = _tr("Error to get Fax Device Identifier");
             return false;
         }
     } else {
         $devId = $arrProp['devId'];
     }
     if (!isset($arrProp['port'])) {
         $port = $this->getNextAvailablePort();
         if ($port == false) {
             $this->errMsg = _tr("Error to get Port for Fax");
             return false;
         }
     } else {
         $port = $arrProp['port'];
     }
     // 2) obtenemos los datos dle usuario para el cual se esta creando el fax
     //    comprobando de que este realmente exista
     if (isset($arrProp['idUser'])) {
         if (empty($arrProp['idUser'])) {
             $this->errMsg = _tr("Invalid User");
             return false;
         }
     } else {
         $this->errMsg = _tr("Invalid User");
         return false;
     }
     $arrUser = $pACL->getUsers2($arrProp['idUser']);
     if ($arrUser === false) {
         $this->errMsg = _tr("An error has occured when retrieved user data.");
         return false;
     } elseif (count($arrUser) == 0) {
         $this->errMsg = _tr("User does not exist.");
         return false;
     }
     $user = $arrUser[0];
     //cuando de crea un fax para un usario el nombre del peer usado para el fax
     //es igual code_username. Donde username es el useraname sin la parte del @dominio
     $username = strstr($user['username'], '@', true);
     $domain = $this->getDomainOrganization($user["id_organization"]);
     // 3) debemos crear el peer para el fax y ademas comprabar que la extension pasada como parametrono se este usando
     //    para los faxes siempre se usa tecnologia iax
     $pDevice = new paloDevice($domain, $tech, $this->_DB);
     if (!$pDevice->validatePaloDevice()) {
         $this->errMsg = $pDevice->errMsg;
         return false;
     }
     $orgCode = $pDevice->getCode();
     $extension = $user["fax_extension"];
     $device = "{$username}FX_{$orgCode}";
     if ($pDevice->existDevice($extension, $device, $tech) == true) {
         $this->errMsg = "Error Fax Number. " . $pDevice->errMsg;
         return false;
     }
     $clid_name = isset($arrProp['clid_name']) ? $arrProp['clid_name'] : $extension;
     if (!preg_match("/^[[:alnum:]_[:space:]-]+\$/", $clid_name)) {
         $clid_name = $extension;
     }
     $clid_number = isset($arrProp['clid_number']) ? $arrProp['clid_number'] : $extension;
     if (!preg_match("/^[[:alnum:]_[:space:]-]+\$/", $clid_number)) {
         $clid_number = $extension;
     }
     //creamos el peer
     $arrPeer = $arrProp;
     $arrPeer["name"] = "{$username}FX";
     $arrPeer["defaultip"] = "127.0.0.1";
     $arrPeer['secret'] = $user["md5_password"];
     $arrPeer["fullname"] = $clid_name;
     $arrPeer["cid_number"] = $clid_number;
     $arrPeer["port"] = $port;
     $arrPeer['dial'] = strtoupper($tech) . "/" . $device;
     $arrPeer['organization_domain'] = $domain;
     $pDevice->tecnologia->setGroupProp($arrPeer, $domain);
     if (empty($pDevice->tecnologia->context)) {
         $pDevice->tecnologia->context = 'from-internal';
     }
     $arrPeer['context'] = $pDevice->tecnologia->context;
     if ($pDevice->tecnologia->insertDB() == false) {
         $this->errMsg = "Error setting parameter {$type} device " . $pDevice->tecnologia->errMsg;
         return false;
     }
     $RT = 15;
     if (isset($ringTime)) {
         if (preg_match("/^[[:digit:]]+\$/", $arrProp['ringTime']) && ($arrProp['ringTime'] > 0 && $arrProp['ringTime'] < 60)) {
             $RT = $arrProp['ringTime'];
         }
     }
     // 3) creamos el registro en la tabla fax
     if (!$this->insertFaxDB($domain, $arrPeer['context'], $extension, $tech, $arrPeer['dial'], $device, $RT, $clid_name, $clid_number, $arrProp['area_code'], $arrProp['country_code'], $port, $devId, $arrProp['fax_content'], $arrProp['fax_subject'], $user['username'])) {
         return false;
     }
     // 4) Añadir el fax a los archivos de configuración
     if ($this->addFaxConfiguration($port, $devId, $arrProp['country_code'], $arrProp['area_code'], $clid_name, $clid_number, $device, $user['md5_password'], $user['username'])) {
         return true;
     } else {
         $this->errMsg = _tr("Error to create fax") . " " . $this->errMsg;
         return false;
     }
 }