| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388 |
- <?php
- class userController extends mainController {
-
- function __construct() {
- parent::__construct();
-
- //To change for every Controller
- $this->viewDir = 'User';
-
- //$this->allow = [];
- }
-
- //Profile (Edit Profile) page
- public function index($args=null) {
-
- if (!$this->user->isLogged()) {
- return $this->redirect('login', 'permissionDenied');
- }
-
- $supportedLanguages = $this->locale->getLanguages();
- $languagesList = [];
- $userDataSession = $this->user->getUser(); //Get current user's data in session
- $userDataDB = $this->user->getUserDB();
- $userDefaultLanguage = '';
- $userAltLangs = [];
- $userRoles = [];
-
- if ((is_array($userDataDB) && !empty($userDataDB)) && (is_array($userDataSession) && !empty($userDataSession))) {
- $userDefaultLanguage = $userDataDB['language_default'];
- $userAltLangs = $this->user->getUserAltLangsDB();
- $userRoles = $userDataSession['userRoles'];
- }
-
- //Get all supported languages and select user's default language
- foreach($supportedLanguages as $index => $languages) {
- $selected = $userDefaultLanguage == $languages['lang_code'] ? true : false;
- $languagesList[$index] = $languages;
- $languagesList[$index]['selected'] = $selected;
- }
-
- $this->view->languageList = $languagesList;
-
- $alternativeLanguages = [];
- foreach($supportedLanguages as $index => $languages) {
- //if ($languages['lang_code'] != $userDefaultLanguage) {
- $alternativeLanguages[$index] = $languages;
- $alternativeLanguages[$index]['checked'] = isset($userAltLangs[$languages['id']]) ? true : false;
- //}
- }
-
- $this->view->userUpdatedAt = $userDataDB['updated_at'];
- $this->view->userEmail = trim($userDataDB['email']);
- $this->view->userAltEmail = trim($userDataDB['alternative_email']);
- $this->view->userRemarks = trim($userDataDB['remarks_public']);
- $this->view->userMobNumber = trim($userDataDB['mobile_number']);
- $this->view->userMobWA = trim($userDataDB['mobile_number_chat']);
- $this->view->userPhoneText = trim($userDataDB['allow_phone_text']);
- $this->view->userPhoneChat = trim($userDataDB['allow_phone_chat']);
- $this->view->userEmailMsgs = trim($userDataDB['allow_email_msgs']);
- $this->view->countries = $this->locale->getCountriesByISO2Code($userDataDB['country_code']);
- //$this->view->phoneCodes = $this->locale->getPhoneCodes();
- $this->view->alternativeLanguages = $alternativeLanguages;
- $this->view->userAvatar = $this->user->getAvatar();
- $this->view->hasAvatar = $this->user->hasAvatar();
-
- //$this->view->roles = $this->user->getRoleList(); <-- Deprecated
-
- $this->actionTitle = _('Profile');
- $this->breadcrumbs = [['hash'=>null, 'label'=>$this->actionTitle]];
-
- return $this->setJsonView('index');
- }
-
- //Save/Edit profile information
- public function editProfile() {
-
- if (!$this->user->isLogged()) {
- return $this->setRawJsonResponse('err', _('Session expired, please log in again.'));
- }
-
- $data = isset($_POST['data']) ? $_POST['data'] : null;
-
- $validation = $this->validateForm($data);
-
- if (is_array($validation)) {
- return $this->setRawJsonResponse('err', $validation['msg'], ['class'=>$validation['class']]);
- }
-
- if ($validation === true) {
-
- $userId = $this->user->getUserId();
- $passwd1 = trim($data['profile_passwd1']['value']);
- $passwd2 = trim($data['profile_passwd2']['value']);
-
- $publicRemarks = trim(strip_tags($data['public_remarks']['value']));
- $pubRemarksSize = $this->config['settings']['public-remarks-size'];
-
- if (strlen($publicRemarks) > (int)$pubRemarksSize) {
- return $this->setRawJsonResponse('err', vsprintf(_('The Remarks text is too long. Maximun allowed size is %s characters.'), $pubRemarksSize));
- }
-
- if ($userId !== false) {
- $updateAtDate = date('Y-m-d H:i:s');
- $updateData = [
- 'email' => $data['email']['value'],
- //'alternative_email' => $data['alt_email']['value'],
- 'language_default' => $data['default_lang']['value'],
- 'country_code' => $data['country']['value'],
- 'remarks_public' => $publicRemarks,
- 'mobile_number' => $data['default_mobile']['value'],
- 'mobile_number_chat' => $data['mobile_chat']['value'],
- 'allow_phone_text' => $data['phone_pref']['value'],
- 'allow_phone_chat' => $data['wa_pref']['value'],
- 'allow_email_msgs' => $data['wa_email']['value'],
- 'updated_at' => $updateAtDate
- ];
-
- if ($passwd1 != '') {
- if (!$this->security->validatePassword($passwd1)) {
- return $this->setRawJsonResponse('err', vsprintf(_('The password provided is not valid. The password must contain at least %s characters and at least 1 non-alphanumeric symbol (!, ?, -, etc.)'), [$this->security->passwordMinLength]), ['class'=>'field-passwd1']);
- }
-
- if ($passwd1 != $passwd2) {
- return $this->setRawJsonResponse('err', _('The password fields do not match.'), ['class'=>'field-passwd1']);
- }
-
- $updateData['password'] = md5($passwd1);
- }
-
- if ($this->db->where('id', $userId)->update('users', $updateData)) {
-
- if (isset($data['alt_langs']['value']) && is_array($data['alt_langs']['value']) && !empty($data['alt_langs']['value'])) {
- $this->db->where('user_id', $userId)->delete('users_languages_to');
-
- foreach($data['alt_langs']['value'] as $langId => $langCode) {
- $this->db->insert('users_languages_to', ['user_id'=>$userId, 'language_id'=>$langId]);
- }
- }
-
- //Refresh user's language in session
- $languageData = $this->db->where('lang_code', $data['default_lang']['value'])->getOne('users_languages');
- if (is_array($languageData) && !empty($languageData)) {
- if ($this->locale->filterValidLanguage($languageData['lang_code'])) {
- $this->user->refreshSessionField('userDefaultLang', $languageData['lang_code']);
- }
-
- $this->user->refreshSessionField('userDefaultString', $languageData['name_string']);
- }
-
- //Refresh last update field in user's session
- $this->user->refreshSessionField('userUpdatedAt', $updateAtDate);
-
- //Refresh country information in session
- $countryData = $this->db->where('country_iso2_code', $data['country']['value'])->getOne('countries');
-
- if (is_array($countryData) && !empty($countryData)) {
- $this->user->refreshSessionField('userCountryName', $countryData['country_name']);
- $this->user->refreshSessionField('userCountryCode', $countryData['country_iso2_code']);
- $this->user->refreshSessionField('userCountryId', $countryData['id']);
- }
-
- //Refresh the localised roles
- $localeRoles = $this->user->getUserRolesDB($userId);
- $roleList = [];
- if (is_array($localeRoles) && !empty($localeRoles)) {
- foreach($localeRoles as $roleId => $roleRow) {
- $roleList[$roleId] = $roleRow['role_names'];
- }
- $this->user->refreshSessionField('userRolesLocale', $roleList);
- }
-
- //Check for avatar file
- $file = isset($_FILES['data']) ? $_FILES['data']: null;
-
- //Update avatar
- if (is_array($file)) {
- if ((int)$file['error']['avatar']['value'] == 0) {
- $this->user->setAvatar($userId, $file['tmp_name']['avatar']['value']);
- }
- }
-
- //Check whether remove avatar or don't (without replacing it)
- if (isset($data['remove_avatar']['value'])) {
- if ((int)$data['remove_avatar']['value'] == 1) {
- $this->user->deleteAvatar($userId);
- }
- }
-
- return $this->setRawJsonResponse('ok', _('Profile information successfully updated.'), ['log'=>''], ['button'=>'refresh-page']);
-
- } else {
- return $this->setRawJsonResponse('err', _('Unable to update the profile right now. Please try again in a few minutes.').' (Err. cod. 0)');
- }
-
- } else {
- return $this->setRawJsonResponse('err', _('Incorrect user information, please log in again.'));
- }
-
- return $this->setRawJsonResponse('err', _('Unable to perform the request right now. Please try again in a few minutes.').' (Err. cod. 1)');
- }
-
- return $this->setRawJsonResponse('err', _('Unable to perform the request right now. Please try again in a few minutes.').' (Err. cod. 2)');
- }
-
- //Users list action
- public function usersList($args=null) {
-
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->redirect('login', 'permissionDenied');
- }
-
- $userGroupId = $this->user->getUserField('userGroupId');
- $groupInfo = $this->db->where('id', $userGroupId)->getOne('users_groups');
- //$this->view->groupName = isset($groupInfo['group_name']) ? $groupInfo['group_name'] : '';
-
- $this->view->currentPage = $this->getPost('pageNumb', 1);
- $this->view->orderField = $this->getPost('orderField', 'surname');
- $this->view->orderDir = $this->getPost('orderDir', 'desc');
- $this->view->roleSelectList = [];
-
- //$this->db->pageLimit = 3;
-
- if ($this->view->orderDir == 'asc')
- $dynOrderDir = 'desc';
- else
- $dynOrderDir = 'asc';
-
- //$this->view->strOutput = null;
- $searchData = $this->getPost('searchData');
- parse_str($searchData, $this->view->strOutput);
-
- //$totalRows = $this->db->where('group_id', $userGroupId)->getValue('users', 'COUNT(*)');
-
- $fields = [
- 'users.id',
- 'users.username',
- 'users.surname',
- 'users.name',
- 'users.email',
- 'users.updated_at',
- 'users.created_at',
- "(SELECT GROUP_CONCAT(GET_JSON_VALUE_BY_KEY(ur.name_translations, '".$this->user->getUserLang()."', '".$this->defLang."') SEPARATOR ', ') AS role_string FROM users_roles_to AS urt JOIN users_roles AS ur ON ur.id=urt.role_id WHERE urt.user_id = users.id GROUP BY urt.user_id ORDER BY role_string) AS roles",
- 'users.status'
- ];
-
- $this->db->where('group_id', $userGroupId);
-
- if (isset($this->view->strOutput['search']['username'])) {
- $keyword = $this->view->strOutput['search']['username'];
- $this->db->where('users.username', "%$keyword%", 'like');
- }
-
- if (isset($this->view->strOutput['search']['surname'])) {
- $keyword = $this->view->strOutput['search']['surname'];
- $this->db->where('users.surname', "%$keyword%", 'like');
- }
-
- if (isset($this->view->strOutput['search']['name'])) {
- $keyword = $this->view->strOutput['search']['name'];
- $this->db->where('users.name', "%$keyword%", 'like');
- }
-
- if (isset($this->view->strOutput['search']['email'])) {
- $keyword = $this->view->strOutput['search']['email'];
- $this->db->where('users.email', "%$keyword%", 'like');
- }
-
- $roleKeyword = '';
- if (isset($this->view->strOutput['search']['roles']) && trim($this->view->strOutput['search']['roles']) != '') {
- $roleKeyword = $this->view->strOutput['search']['roles'];
- $fields[] = "(SELECT COUNT(*) FROM users_roles_to WHERE users_roles_to.user_id=users.id AND users_roles_to.role_id = $roleKeyword) AS total_user_roles";
- $this->db->having('total_user_roles', 0, '>');
- }
-
- $this->db->orderBy($this->view->orderField, $dynOrderDir);
- $this->view->usersList = $this->db->paginate('users', $this->view->currentPage, $fields);
- //
- $this->view->getTotUsers = $this->db->totalUsers;
- $this->view->getTotRoles = $this->db->TotUsersRoles;
- // Max Add Roles for Users
- $this->view->getMaxAddRoles = $this->db->MaxAddRoles;
- // Max type Roles
- $this->view->getMaxAddAdmins = $this->db->MaxAddAdmins;
- $this->view->getMaxAddModerators = $this->db->MaxAddModerators;
- $this->view->getMaxAddRequesters = $this->db->MaxAddRequesters;
- $this->view->getMaxAddResponders = $this->db->MaxAddResponders;
- $this->view->getMaxAddGuests = $this->db->MaxAddGuests;
- //Total Roles for Users
- $this->view->getTotAdmins = $this->db->TotAdmins;
- $this->view->getTotModerators = $this->db->TotModerators;
- $this->view->getTotRequesters = $this->db->TotRequesters;
- $this->view->getTotResponders = $this->db->TotResponders;
- $this->view->getTotGuests = $this->db->TotGuests;
-
- // USER ROLES
- $this->view->getUserHasRoles = 111;
-
- $this->setPagination($this->db, $this->db->totalCount, $this->view->currentPage, 'users/'.time().'/'.$this->view->orderField.'/'.$this->view->orderDir);
-
- $this->view->lastQuery = $this->db->getLastQuery();
-
- //Selected list for column filter
- $roleSelectList = $this->user->getRoles();
- $this->view->roleSelectList = [];
-
- foreach($roleSelectList as $roleId => $role) {
- $this->view->roleSelectList[$roleId]['value'] = $roleId;
- $this->view->roleSelectList[$roleId]['name'] = $role;
- $this->view->roleSelectList[$roleId]['selected'] = $roleKeyword == $roleId ? true : false;
- }
-
- $this->actionTitle = _('Users');
- $this->breadcrumbs = [['hash'=>null, 'label'=>$this->actionTitle]];
- $this->view->editLinkHash = 'users-edit/'.time().'/%s/'.$this->view->orderField.'/'.$this->view->orderDir.'/'.$this->view->currentPage;
- return $this->setJsonView('usersList');
- }
-
- //Users add/edit action (view)
- public function usersEdit($args=null) {
-
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->redirect('login', 'permissionDenied');
- }
-
- //Needed by "Home" breadcrumbs' link
- $page = $this->getPost('pageNumb', 1);
- $orderField = $this->getPost('orderField', 'surname');
- $orderDir = $this->getPost('orderDir', 'desc');
-
- $userId = $this->getPost('userId', 0);
-
- //Check whether the current logged user is the current editing user
- $this->view->isSelf = $userId == $this->user->getUserId() ? true : false;
-
- $this->view->userId = $userId;
- $this->view->userData = [];
- $this->view->supportedLanguages = $this->locale->getLanguages();
- $this->view->userAltLanguages = $this->view->supportedLanguages;
- $this->view->roles = [];
- $this->view->countries = $this->locale->getCountriesByISO2Code();
- $this->view->clinicalCenterCountries = $this->getClinicalCenterCountries(true); //true = group by continent
- $this->view->clinicalCenters = $this->db->where('group_id', $this->userGroupId)->orderBy('description', 'asc')->get('clinical_centers');
- $this->view->medicalSpecialties = $this->db->orderBy('description', 'asc')->get('users_medical_specialties');
-
- //Default values
- $this->view->userClinicalCenters[APPLICANT_ROLE_ID] = 0;
- $this->view->userClinicalCenters[REFERRER_ROLE_ID] = 0;
- $this->view->userClinicalCenters[MODERATOR_ROLE_ID] = 0;
- $this->view->userClinicalCenters[GUEST_ROLE_ID] = 0;
- $roleForClinicalCenters = [];
- $this->view->responderStructure = [];
-
- $this->view->userMedicalSpecialties = [];
- $this->view->userAvatar = $this->user->getDefaultAvatar();
- $this->view->hasAvatar = false;
-
- // Max type Roles
- $this->view->getMaxAddAdmins = $this->db->MaxAddAdmins;
- $this->view->getMaxAddModerators = $this->db->MaxAddModerators;
- $this->view->getMaxAddRequesters = $this->db->MaxAddRequesters;
- $this->view->getMaxAddResponders = $this->db->MaxAddResponders;
- $this->view->getMaxAddGuests = $this->db->MaxAddGuests;
- //Total Roles for Users
- $this->view->getTotAdmins = $this->db->TotAdmins;
- $this->view->getTotModerators = $this->db->TotModerators;
- $this->view->getTotRequesters = $this->db->TotRequesters;
- $this->view->getTotResponders = $this->db->TotResponders;
- $this->view->getTotGuests = $this->db->TotGuests;
-
- // USER ROLES
- $this->view->getUserHasRoles = $this->user->getUserRolesDB($userId);
-
- $userRoles = $userId > 0 ? $this->user->getUserRolesDB($userId) : [];
- $supportedRoles = $this->user->getRoles(); //All roles
- $responderStructure = $this->db->orderBy('description', 'asc')->get('users_structures');
- //$thid->view->responderStructure = $responderStructure;
-
- //Check the user roles for the Clinical Centers
- $roleForClinicalCenters = [];
-
- if (is_array($supportedRoles)) {
- $c = 0;
- foreach($supportedRoles as $roleId => $role) {
-
- //Get the checked roles based on all supported roles (if true, that role id has been checked)
- //$supportedRoles[$c]['checked'] = isset($userRoles[$roleId]) ? true : false;
-
- $this->view->roles[$c]['id'] = $roleId;
- $this->view->roles[$c]['name'] = $role;
- $this->view->roles[$c]['checked'] = isset($userRoles[$roleId]) ? true : false;
-
- //Assign the roles for select the relative Clinical Centers
- if ($this->view->roles[$c]['checked']) {
-
- if ($roleId == APPLICANT_ROLE_ID) {
- $roleForClinicalCenters[APPLICANT_ROLE_ID] = APPLICANT_ROLE_ID; //Change the default value 0
- }
-
- if ($roleId == REFERRER_ROLE_ID) {
- $roleForClinicalCenters[REFERRER_ROLE_ID] = REFERRER_ROLE_ID; //Change the default value 0
- }
-
- if ($roleId == MODERATOR_ROLE_ID) {
- $roleForClinicalCenters[MODERATOR_ROLE_ID] = MODERATOR_ROLE_ID; //Change the default value 0
- }
-
- if ($roleId == GUEST_ROLE_ID) {
- $roleForClinicalCenters[GUEST_ROLE_ID] = GUEST_ROLE_ID; //Change the default value 0
- }
-
- if ($roleId == GLOBAL_MANAGER_ID) {
- $roleForClinicalCenters[GLOBAL_MANAGER_ID] = GLOBAL_MANAGER_ID; //Change the default value 0
- }
-
- if ($roleId == MANAGER_ID) {
- $roleForClinicalCenters[MANAGER_ID] = MANAGER_ID; //Change the default value 0
- }
- }
-
- $c++;
- }
-
- //$this->view->roles = $supportedRoles;
- }
-
-
- //Default avatar image
- $this->view->userAvatarImage = $this->user->getDefaultAvatar();
-
- if ((int)$userId > 0) {
-
- $this->view->userData = $this->db->where('id', $userId)->getOne('users');
- $this->view->userData['language_default'] = isset($this->view->userData['language_default']) ? $this->convertOldUserLang($this->view->userData['language_default']) : '';
-
- //Set the current user avatar image
- $this->view->userAvatarImage = $this->user->getAvatar($userId);
-
- $userAltLangs = $this->user->getUserAltLangsDB($userId);
-
- foreach($this->view->supportedLanguages as $index => $language) {
-
- //Select the user's default language in the select box
- $this->view->supportedLanguages[$index]['selected'] = ($this->view->userData['language_default'] == $language['lang_code']) ? true : false;
-
- //Check all languages known by the user
- $this->view->supportedLanguages[$index]['checked'] = isset($userAltLangs[$language['id']]) ? true : false;
- }
-
- //Set the alternative language array and remove the user's default language
- $this->view->userAltLanguages = $this->view->supportedLanguages;
-
- foreach($this->view->userAltLanguages as $index => $language) {
- if ($language['lang_code'] == $this->view->userData['language_default']) {
- unset($this->view->userAltLanguages[$index]);
- break;
- }
- }
-
- //If the user is Applicant, search the Clinical Center assigned as Applicant
- if (isset($roleForClinicalCenters[APPLICANT_ROLE_ID]) && $roleForClinicalCenters[APPLICANT_ROLE_ID] > 0) {
- //The method is in mainController
- $this->view->userClinicalCenters[APPLICANT_ROLE_ID] = $this->getUserClinicalCenters($userId, APPLICANT_ROLE_ID);
- } else {
- $this->view->userClinicalCenters[APPLICANT_ROLE_ID] = [];
- }
-
- //If the user is Referrer, search the Clinical Center assigned as Referrer
- if (isset($roleForClinicalCenters[REFERRER_ROLE_ID]) && $roleForClinicalCenters[REFERRER_ROLE_ID] > 0) {
- //The method is in mainController
- $this->view->userClinicalCenters[REFERRER_ROLE_ID] = $this->getUserClinicalCenters($userId, REFERRER_ROLE_ID);
- } else {
- $this->view->userClinicalCenters[REFERRER_ROLE_ID] = [];
- }
-
- //If the user is Moderator, search the Clinical Center assigned as Moderator
- if (isset($roleForClinicalCenters[MODERATOR_ROLE_ID]) && $roleForClinicalCenters[MODERATOR_ROLE_ID] > 0) {
- //The method is in mainController
- $this->view->userClinicalCenters[MODERATOR_ROLE_ID] = $this->getUserClinicalCenters($userId, MODERATOR_ROLE_ID);
- } else {
- $this->view->userClinicalCenters[MODERATOR_ROLE_ID] = [];
- }
-
- //If the user is Guest, search the Clinical Center assigned as Guest
- if (isset($roleForClinicalCenters[GUEST_ROLE_ID]) && $roleForClinicalCenters[GUEST_ROLE_ID] > 0) {
- //The method is in mainController
- $this->view->userClinicalCenters[GUEST_ROLE_ID] = $this->getUserClinicalCenters($userId, GUEST_ROLE_ID);
- } else {
- $this->view->userClinicalCenters[GUEST_ROLE_ID] = [];
- }
-
- //If the user is Manager, search the Clinical Center assigned as Manager
- if (isset($roleForClinicalCenters[MANAGER_ID]) && $roleForClinicalCenters[MANAGER_ID] > 0) {
- //The method is in mainController
- $this->view->userClinicalCenters[MANAGER_ID] = $this->getUserClinicalCenters($userId, MANAGER_ID);
- } else {
- $this->view->userClinicalCenters[MANAGER_ID] = [];
- }
-
- //If the user is Global Manager, search the Clinical Center assigned as Global Manager
- if (isset($roleForClinicalCenters[GLOBAL_MANAGER_ID]) && $roleForClinicalCenters[GLOBAL_MANAGER_ID] > 0) {
- //The method is in mainController
- $this->view->userClinicalCenters[GLOBAL_MANAGER_ID] = $this->getUserClinicalCenters($userId, GLOBAL_MANAGER_ID);
- } else {
- $this->view->userClinicalCenters[GLOBAL_MANAGER_ID] = [];
- }
-
- //Method is in mainController
- $this->view->userMedicalSpecialties = $this->getUserMedicalSpecialties($userId);
-
- $this->view->userAvatar = $this->user->getAvatar($userId);
- $this->view->hasAvatar = $this->user->hasAvatar($userId);
- }
-
- $this->actionTitle = $userId==0 ? _('User : Add') : _('User : Edit');
- $this->breadcrumbs = [['hash'=>'users/'.time().'/'.$orderField.'/'.$orderDir.'/'.$page, 'label'=>_('Users')], ['hash'=>null, 'label'=>$this->actionTitle]];
-
-
- return $this->setJsonView('usersEdit');
- }
-
- //Users add/edit action (save/update)
- public function usersSave() {
- if (!$this->user->isLogged()) {
- return $this->setRawJsonResponse('err', _('Session expired, please log in again.'), [], ['button'=>'login']);
- }
-
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->setRawJsonResponse('err', _('Permission denied.'));
- }
-
- $data = isset($_POST['data']) ? $_POST['data'] : null;
- $file = isset($_FILES['data']) ? $_FILES['data']: null;
-
- //return $this->setRawJsonResponse('err', json_encode($data['med_specialties']['value']));
-
- //Check required values
- $validation = $this->validateForm($data);
-
- if (is_array($validation)) {
- return $this->setRawJsonResponse('err', $validation['msg'], ['class'=>$validation['class']]);
- }
-
- if ($validation === true) {
- $userId = (int)$data['user_id']['value'];
- $isSelf = $userId == $this->user->getUserId() ? true : false;
- $isEditing = $userId > 0 ? true : false; //Editing or Saving?
-
- //Check username
- $isUsernameInUse = $this->user->isUsernameInUse(trim($data['username']['value']));
- if (!$isEditing && $isUsernameInUse) {
- return $this->setRawJsonResponse('err', _('The Username provided is already in use.'));
- }
-
- $passwd1 = trim($data['profile_passwd1']['value']);
- $passwd2 = trim($data['profile_passwd2']['value']);
-
- //Check roles number
- if (!isset($data['role']) || !is_array($data['role'])) {
- return $this->setRawJsonResponse('err', _('Please provide at least one role.'));
- }
-
- //Check if current logged user is an administrator and Administrator role checkbox is unchecked
- if ($isSelf && $this->user->is(ADMIN_ROLE_ID)) {
- if (!isset($data['role']['value'][ADMIN_ROLE_ID])) {
- return $this->setRawJsonResponse('err', _('You cannot downgrade your Administrator role.'));
- }
- }
-
- $userStatus = isset($data['status']['value']) ? $data['status']['value'] : 0;
-
- if (isset($data['role']['value'][ADMIN_ROLE_ID])) {
- if ($userStatus == STATUS_TECH_ID) {
- return $this->setRawJsonResponse('err', _("The user status selected doesn't allow to add the Administrator role."));
- }
- }
-
- //Roles are ok, check the data related to the roles
- if (is_array($data['role']['value'])) {
-
- //User is a Referrer
- if (isset($data['role']['value'][REFERRER_ROLE_ID])) {
-
- //Check Medical specialties
- if (!isset($data['med_specialties']['value']) || empty($data['med_specialties']['value'])) {
- return $this->setRawJsonResponse('err', _('Please provide at least one Medical specialty for this user.'));
- }
-
- //Check Clinical centers
- if (!isset($data['cc_referrer']['value']) || empty($data['cc_referrer']['value'])) {
- return $this->setRawJsonResponse('err', _('Please provide at least one Clinical Center (Responder) for this user.'));
- }
- }
-
- //User is Applicant
- if (isset($data['role']['value'][APPLICANT_ROLE_ID])) {
- //Check Clinical centers
- if (!isset($data['cc_applicant']['value']) || empty($data['cc_applicant']['value'])) {
- return $this->setRawJsonResponse('err', _('Please provide at least one Clinical Center (Requester) for this user.'));
- }
- }
-
- //User is Moderator
- if (isset($data['role']['value'][MODERATOR_ROLE_ID])) {
- //Check Clinical centers
- if (!isset($data['cc_moderator']['value']) || empty($data['cc_moderator']['value'])) {
- return $this->setRawJsonResponse('err', _('Please provide at least one Clinical Center (Moderator) for this user.'));
- }
- }
-
- //User is Guest
- if (isset($data['role']['value'][GUEST_ROLE_ID])) {
- //Check Clinical centers
- if (!isset($data['cc_guest']['value']) || empty($data['cc_guest']['value'])) {
- return $this->setRawJsonResponse('err', _('Please provide at least one Clinical Center (Guest) for this user.'));
- }
- }
-
- if (isset($data['role']['value'][GLOBAL_MANAGER_ID])) {
- //Check Clinical centers
- if (!isset($data['cc_global_manager']['value'][0]) || (int)$data['cc_global_manager']['value'][0] == 0) {
- return $this->setRawJsonResponse('err', _('Please provide at least one Clinical Center (Global Manager) for this user.'));
- }
- }
-
- if (isset($data['role']['value'][MANAGER_ID])) {
- //Check Clinical centers
- if (!isset($data['cc_manager']['value'][0]) || (int)$data['cc_manager']['value'][0] == 0) {
- return $this->setRawJsonResponse('err', _('Please provide at least one Clinical Center (Manager) for this user.'));
- }
- }
-
- }
-
- $publicRemarks = trim(strip_tags($data['public_remarks']['value']));
- $pubRemarksSize = $this->config['settings']['public-remarks-size'];
-
- if (strlen($publicRemarks) > (int)$pubRemarksSize) {
- return $this->setRawJsonResponse('err', vsprintf(_('The Public Remarks text is too long. Maximun allowed size is %s characters.'), $pubRemarksSize));
- }
-
- $insertData = [
- 'group_id' => $this->userGroupId,
- 'username' => trim($data['username']['value']),
- 'language_default' => $data['default_lang']['value'],
- 'remarks_public' => $publicRemarks,
- 'remarks_private' => trim($data['private_remarks']['value']),
- 'name' => trim($data['name']['value']),
- 'surname' => trim($data['surname']['value']),
- //'fiscal_code' => trim($data['fiscal_code']['value']),
- // BIRTH
- //'birth_date' => trim($data['birth_date']['value']),
- //'city_birth' => trim($data['city_birth']['value']),
- //'province_birth' => trim($data['province_birth']['value']),
- // RESIDENCE
- //'residence_province' => trim($data['residence_province']['value']),
- //'residence_city' => trim($data['residence_city']['value']),
- //'residence_address' => trim($data['residence_address']['value']),
- // DOMICILE
- //'domicile_province' => trim($data['domicile_province']['value']),
- //'domicile_city' => trim($data['domicile_city']['value']),
- //'domicile_address' => trim($data['domicile_address']['value']),
- //'country_id' => $data['country']['value'],
- 'country_code' => $data['country']['value'],
- 'email' => trim($data['email']['value']),
- //'alternative_email' => trim($data['alt_email']['value']),
- 'advanced_request' => $data['advanced_request']['value'],
- 'mobile_number' => trim($data['default_mobile']['value']),
- 'mobile_number_chat' => trim($data['mobile_chat']['value']),
- 'allow_phone_text' => $data['phone_pref']['value'],
- 'allow_phone_chat' => $data['wa_pref']['value'],
- 'allow_email_msgs' => $data['email_pref']['value']
- ];
-
- //Change the status (if this user is not the current logged user)
- if (!$isSelf) {
- /*if (isset($data['status']['value'])) {
- $insertData['status'] = $data['status']['value'];
- }*/
-
- $insertData['status'] = $userStatus;
- }
-
- //Check passwords
- $passwd1 = trim($data['profile_passwd1']['value']);
- $passwd2 = trim($data['profile_passwd2']['value']);
-
- if ($passwd1 != '') {
- if (!$this->security->validatePassword($passwd1)) {
- return $this->setRawJsonResponse('err', vsprintf(_('The password provided is not valid. The password must contain at least %s characters and at least 1 non-alphanumeric symbol (!, ?, -, etc.)'), [$this->security->passwordMinLength]));
- }
-
- if ($passwd1 != $passwd2) {
- return $this->setRawJsonResponse('err', _('The password fields do not match.'));
- }
-
- $insertData['password'] = md5($passwd1);
- }
-
- /*if ($this->user->getUserStatus() == STATUS_TECH_ID) {
- return $this->setRawJsonResponse('ok', _('All fields have been correctly validated. The current user cannot save the new information.'));
- }*/
-
- $updatedAtDate = date('Y-m-d H:i:s'); //Also used to refresh the current user session
- if ($userId > 0) { //Update
-
- $insertData['updated_at'] = $updatedAtDate;
- $this->db->where('id', $userId);
- if (!$this->db->update('users', $insertData)) {
- $this->logger->logUserAction($this->user->getUserId(), "UPDATE USER ERROR", $this->db->getLastError());
- return $this->setRawJsonResponse('err', $this->db->getLastError());
- }
- $this->logger->logUserAction($this->user->getUserId(), "UPDATE USER $userId");
- } else { //Insert
-
- $insertData['created_at'] = $updatedAtDate;
- $insertData['updated_at'] = $updatedAtDate;
-
- $insertId = $this->db->insert('users', $insertData);
- if ($insertId) {
- $userId = $insertId;
- $this->logger->logUserAction($this->user->getUserId(), "INSERT USER $userId");
- } else {
- $this->logger->logUserAction($this->user->getUserId(), "INSERT USER ERROR", $this->db->getLastError());
- return $this->setRawJsonResponse('err', $this->db->getLastError());
- }
- }
-
- //Updating or inserting ok
- if ($userId > 0) {
-
- $userIsSelf = $userId == $this->user->getUserId() ? true : false;
- $userDisplayName = $this->user->setDisplayName(['userName'=>trim($data['name']['value']), 'userSurname'=>trim($data['surname']['value'])]);
-
-
-
- //Update the Medical spacialties
- $this->db->where('user_id', $userId)->delete('users_medical_specialties_to');
- if (isset($data['med_specialties']['value'])) {
- $medSpecialties = $data['med_specialties']['value'];
-
- if (is_array($medSpecialties) && !empty($medSpecialties)) {
-
- foreach($medSpecialties as $specialityId) {
- $this->db->insert('users_medical_specialties_to', ['user_id'=>$userId, 'specialty_id'=>$specialityId]);
- }
-
- $this->memoryCache->remove('medical:specialties:'.$userId);
-
- /*$this->db->where('user_id', $userId);
- if ($this->db->delete('users_medical_specialties_to')) {
- foreach($medSpecialties as $specialityId) {
- $this->db->insert('users_medical_specialties_to', ['user_id'=>$userId, 'specialty_id'=>$specialityId]);
- }
-
- $this->memoryCache->remove('medical:specialties:'.$userId);
- }*/
- }
- } else {
- $this->memoryCache->remove('medical:specialties:'.$userId);
- }
-
- //Update Clinical Center for these roles
- $checkRoles = [REFERRER_ROLE_ID, APPLICANT_ROLE_ID, MODERATOR_ROLE_ID, GUEST_ROLE_ID, MANAGER_ID, GLOBAL_MANAGER_ID];
-
-
- //return $this->setRawJsonResponse('err', json_encode($data['cc_manager']['value']));
-
- //Loop the roles
- foreach($checkRoles as $checkRole) {
-
- switch($checkRole) {
- case REFERRER_ROLE_ID:
- $fieldName = 'cc_referrer';
- break;
-
- case APPLICANT_ROLE_ID:
- $fieldName = 'cc_applicant';
- break;
-
- case MODERATOR_ROLE_ID:
- $fieldName = 'cc_moderator';
- break;
-
- case GUEST_ROLE_ID:
- $fieldName = 'cc_guest';
- break;
-
- case GLOBAL_MANAGER_ID:
- $fieldName = 'cc_global_manager';
- break;
-
- case MANAGER_ID:
- $fieldName = 'cc_manager';
- break;
- }
-
- //Check whether this role is checked
- if (isset($data['role']['value'][$checkRole])) {
-
- //Check if field data exist in POST request
- if (isset($data[$fieldName]['value'])) {
-
- //Take the center id values (array)
- $centerIDs = $data[$fieldName]['value'];
-
- //Check if there are clinical center ids
- if (is_array($centerIDs) && !empty($centerIDs)) {
-
- //Clean the relationship without assigned role id (role_id = 0)
- $this->db->where('user_id', $userId)->where('role_id', 0)->delete('users_clinical_centers_to');
-
- //Delete the previous clinical center <-> user/role relationship
- $this->db->where('user_id', $userId)->where('role_id', $checkRole)->delete('users_clinical_centers_to');
-
- //Add the new clinical center for this user and this role
- foreach($centerIDs as $centerId) {
- $this->db->insert('users_clinical_centers_to', ['user_id'=>$userId, 'center_id'=>$centerId, 'role_id'=>$checkRole]);
- }
-
-
- }
-
- }
-
- } else {
- //If the role is not checked, delete the corresponding clinical centers if exist
- $this->db->where('user_id', $userId)->where('role_id', 0)->delete('users_clinical_centers_to');
- $this->db->where('user_id', $userId)->where('role_id', $checkRole)->delete('users_clinical_centers_to');
- }
-
- //Delete the keys in cache
- $this->memoryCache->remove('clinical:center:'.$userId.':'.$checkRole);
- $this->memoryCache->remove('clinical:center:'.$userId.':0');
-
- }
-
- //Update the selected roles
- $checkedRoles = $data['role']['value'];
-
- //Clean the previuoses user/role relationships
- $this->db->where('user_id', $userId);
-
- if ($this->db->delete('users_roles_to')) {
- foreach($checkedRoles as $checkedRole) {
- $this->db->insert('users_roles_to', ['user_id'=>$userId, 'role_id'=>$checkedRole]);
- }
- }
-
- //Update alternative languages
- if (isset($data['alt_langs']['value']) && is_array($data['alt_langs']['value'])) {
- $checkedAltLangs = $data['alt_langs']['value'];
-
- //Clean previouse user/languages relationship
- $this->db->where('user_id', $userId);
- if ($this->db->delete('users_languages_to')) {
- foreach($checkedAltLangs as $checkedAltLang) {
- $this->db->insert('users_languages_to', ['user_id'=>$userId, 'language_id'=>$checkedAltLang]);
- }
- }
- }
-
- //Update avatar
- if (is_array($file)) {
- if ((int)$file['error']['avatar']['value'] == 0) {
- $this->user->setAvatar($userId, $file['tmp_name']['avatar']['value']);
- }
- }
-
- //Check whether remove avatar or don't (without replacing it)
- if (isset($data['remove_avatar']['value'])) {
- if ((int)$data['remove_avatar']['value'] == 1) {
- $this->user->deleteAvatar($userId);
- }
- }
-
- //Delete user session
- if (!$isSelf) {
- $this->user->removeAllUserSessionRecords($userId);
- } else {
- $countryData = $this->db->where('country_iso2_code', $data['country']['value'])->getOne('countries');
- $languageData = $this->db->where('lang_code', $data['default_lang']['value'])->getOne('users_languages');
- $this->user->refreshUserSession([
- 'id'=>$userId,
- 'username'=>trim($data['username']['value']),
- 'name'=>trim($data['name']['value']),
- 'surname'=>trim($data['surname']['value']),
- 'language_default'=>$data['default_lang']['value'],
- 'roles'=>$this->user->getUserRolesDB($userId),
- 'country_data'=> is_array($countryData) ? $countryData : [],
- 'language_data'=> is_array($languageData) ? $languageData : [],
- 'updated_at'=>$updatedAtDate,
- 'group_id'=>$this->userGroupId
- ]);
- }
-
- $jsPopupButton = $isEditing ? 'refresh-hash' : 'refresh-user-edit';
- return $this->setRawJsonResponse('ok', _('User information successfully updated.'), [], ['userId'=>$userId, 'button'=>$jsPopupButton]);
-
- } else {
- return $this->setRawJsonResponse('err', _('An error occurred saving the data. Please try again in a few minutes.'));
- }
- } //validation
- }
-
- public function usersSearch() {
- if (!$this->user->isLogged()) {
- return $this->setRawJsonResponse('err', _('Session expired, please log in again.'), [], ['button'=>'login']);
- }
-
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->setRawJsonResponse('err', _('Permission denied.'));
- }
-
- $this->view->supportedLanguages = $this->locale->getLanguages();
- $this->view->countries = $this->locale->getCountriesByISO2Code();
-
- $clinicalCenters = $this->db->orderBy('description', 'asc')->get('clinical_centers');
- $this->view->clinicalCentersPerRole = [];
- $this->view->clinicalCenterCountries = $this->getClinicalCenterCountries(true); //true = group by continent
-
- //Array structure: role id => html select field name
- $checkCcRoles = [APPLICANT_ROLE_ID=>'cc_applicant', REFERRER_ROLE_ID=>'cc_referrer', MODERATOR_ROLE_ID=>'cc_moderator', GUEST_ROLE_ID=>'cc_guest'];
- $checkCcCountries = [APPLICANT_ROLE_ID=>'cn_applicant', REFERRER_ROLE_ID=>'cn_referrer', MODERATOR_ROLE_ID=>'cn_moderator', GUEST_ROLE_ID=>'cn_guest'];
-
- //Pass the role array to the view too
- $this->view->checkCcRoles = $checkCcRoles;
- $this->view->checkCcCountries = $checkCcCountries;
- $this->view->checkCcRolesLabels = [APPLICANT_ROLE_ID=>_('Requester'), REFERRER_ROLE_ID=>_('Responder'), MODERATOR_ROLE_ID=>_('Moderator'), GUEST_ROLE_ID=>_('Guest')];
-
- //Set the clinical center list for all roles
- foreach($checkCcRoles as $roleId => $roleField) {
- $this->view->clinicalCentersPerRole[$roleId] = $clinicalCenters;
- }
-
- $this->view->medicalSpecialties = $this->db->orderBy('description', 'asc')->get('users_medical_specialties');
-
- $supportedRoles = $this->user->getRoles();
- $c = 0;
- foreach($supportedRoles as $roleId => $roleName) {
- $this->view->supportedRoles[$c]['id'] = $roleId;
- $this->view->supportedRoles[$c]['name'] = $roleName;
- $c++;
- }
-
- $this->view->status = -1; //Default selected "All"
-
- $searchData = $this->getPost('searchData');
-
- if (!is_null($searchData)) {
- parse_str($searchData, $parsedData);
- $data = $parsedData['data'];
-
- if (is_null($data)) {
- $data = $this->memoryCache->read('user:search:'.$this->user->getUserId());
- }
- }
-
- //For debugging
- $this->view->searchData = $data;
-
- $this->view->isSearch = false;
- $this->view->results = [];
- $this->view->resultCount = 0;
- $this->view->tableHasCcApplicant = false;
- $this->view->tableHasCcReferrer = false;
- $this->view->tableHasSpecialties = false;
-
- if (!is_null($data)) {
-
- $this->view->isSearch = true;
-
- $this->memoryCache->write('user:search:'.$this->user->getUserId(), $data, '+10 years');
-
- $this->view->currentPage = $this->getPost('pageNumb', 1);
- $this->view->orderField = $this->getPost('orderField', 'surname');
- $this->view->orderDir = $this->getPost('orderDir', 'desc');
-
- $fields[] = "COUNT(u.id) AS total_users";
-
- $fields = ['u.id', 'u.name', 'u.surname', 'u.updated_at', "(SELECT GROUP_CONCAT(GET_JSON_VALUE_BY_KEY(ur.name_translations, '".$this->user->getUserLang()."', '".$this->defLang."') SEPARATOR ', ') FROM users_roles_to rrt JOIN users_roles ur ON ur.id=rrt.role_id WHERE rrt.user_id=u.id ORDER BY ur.role_name) AS role_list"];
-
- if (isset($data['default_lang']) && $data['default_lang'] != '') {
- $this->db->where('u.language_default', $data['default_lang'], 'like');
-
- foreach($this->view->supportedLanguages as $index => $language) {
- $this->view->supportedLanguages[$index]['selected'] = $language['lang_code'] == $data['default_lang'] ? true : false;
- }
- }
-
- if (isset($data['country']) && $data['country'] != '') {
- $this->db->where('u.country_code', $data['country']);
-
- foreach($this->view->countries as $index => $country) {
- $this->view->countries[$index]['selected'] = $country['country_iso2_code'] == $data['country'] ? true : false;
- }
- }
-
- if (isset($data['status'])) {
- if ((int)$data['status'] > -1) {//-1 = Any
- $this->db->where('u.status', $data['status']);
- }
- $this->view->status = (int)$data['status'];
- }
-
- if (isset($data['role']) && is_array($data['role']) && !empty($data['role'])) {
-
- $c = 0;
- foreach($supportedRoles as $roleId => $roleName) {
- $this->view->supportedRoles[$c]['checked'] = isset($data['role'][$roleId]) ? true : false;
- $c++;
- }
-
- $this->view->tableHasRoles = true;
-
- $roleList = implode(',', $data['role']);
- $fields[] = "(SELECT COUNT(*) FROM users_roles_to urt WHERE urt.user_id=u.id AND urt.role_id IN($roleList)) AS role_results";
- $this->db->having('role_results', 0, '>');
- }
-
- $this->view->tableHasCcColumn = [];
-
- $countCC = 0;
- foreach($checkCcRoles as $roleId => $fieldName) {
-
- if (isset($data['role'][$roleId])) {
-
- $this->view->tableHasCcColumn[$roleId] = true;
-
- $filterForCount = "";
- $filterForList = "";
-
- if (isset($data[$fieldName]) && is_array($data[$fieldName]) && !empty($data[$fieldName])) {
-
- $ccRoleList = implode(',', $data[$fieldName]);
- $filterForCount = "AND ucct.center_id IN($ccRoleList)";
- $filterForList = "AND cc.id IN($ccRoleList)";
-
- foreach($this->view->clinicalCentersPerRole[$roleId] as $index => $ccItem) {
- $this->view->clinicalCentersPerRole[$roleId][$index]['selected'] = in_array($ccItem['id'], $data[$fieldName]) ? true : false;
- }
-
- //Count how many clinical centers are in this role and filter by the centers id
- $fields[] = "(SELECT COUNT(*) FROM users_clinical_centers_to ucct WHERE ucct.user_id=u.id AND ucct.role_id=$roleId $filterForCount) AS ".$fieldName."_results";
-
- //Create the clinical center comma separated list
- $fields[] = "(SELECT GROUP_CONCAT(cc.description SEPARATOR ', ') FROM users_clinical_centers_to ucct JOIN clinical_centers cc ON cc.id=ucct.center_id WHERE ucct.user_id=u.id $filterForList ORDER BY cc.description) AS ".$fieldName."_list";
-
- //If is the firs role, use having, if it isn't, use orHaving
- if ($countCC == 0) {
- $this->db->having($fieldName.'_results', 0, '>');
- } else {
- $this->db->orHaving($fieldName.'_results', 0, '>');
- }
-
- } else {
- //If there aren't clinical centers, just count how many centers are in this role
- $fields[] = "(SELECT COUNT(*) FROM users_clinical_centers_to ucct WHERE ucct.user_id=u.id AND ucct.role_id=$roleId $filterForCount) AS ".$fieldName."_results";
-
- //Create the clinical center comma separated list
- $fields[] = "(SELECT GROUP_CONCAT(cc.description SEPARATOR ', ') FROM users_clinical_centers_to ucct JOIN clinical_centers cc ON cc.id=ucct.center_id WHERE ucct.user_id=u.id AND ucct.role_id=$roleId $filterForList ORDER BY cc.description) AS ".$fieldName."_list";
- }
-
- $countCC++;
-
- } else {
- $this->view->tableHasCcColumn[$roleId] = false;
- }
-
- }
-
- if (isset($data['med_specialties']) && is_array($data['med_specialties']) && !empty($data['med_specialties'])) {
-
- $this->view->tableHasSpecialties = true;
-
- foreach($this->view->medicalSpecialties as $index => $specialtyItem) {
- $this->view->medicalSpecialties[$index]['selected'] = in_array($specialtyItem['id'], $data['med_specialties']) ? true : false;
- }
-
- $specialtyList = implode(',', $data['med_specialties']);
- $fields[] = "(SELECT COUNT(*) FROM users_medical_specialties_to umst WHERE umst.user_id=u.id AND umst.specialty_id IN($specialtyList)) AS specialty_result";
-
- $fields[] = "(SELECT GROUP_CONCAT(ms.description SEPARATOR ', ') FROM users_medical_specialties_to umst JOIN users_medical_specialties ms ON ms.id=umst.specialty_id WHERE umst.user_id=u.id ORDER BY ms.description) AS specialty_list";
-
- $this->db->having('specialty_result', 0, '>');
- }
-
- $this->db->where('u.group_id', $this->userGroupId);
-
- $this->view->results = $this->db->orderBy('u.surname', 'asc')->paginate('users u', $this->view->currentPage, $fields);
-
- $this->setPagination($this->db, $this->db->totalCount, $this->view->currentPage, 'users-search/'.time().'/'.$this->view->orderField.'/'.$this->view->orderDir);
-
- //$this->view->totalResults = $resultsTotal;
- //$this->view->queryDebug = $this->db->getLastQuery();
- }
-
-
- $this->actionTitle = _('Users : Search');
- $this->breadcrumbs = [['hash'=>'users/'.time().'/surname/desc/1', 'label'=>_('Users')], ['hash'=>null, 'label'=>$this->actionTitle]];
-
- return $this->setJsonView('usersSearch');
- }
-
- public function exportUsers() {
- if (!$this->user->isLogged()) {
- return $this->setRawJsonResponse('err', _('Session expired, please log in again.'), [], ['button'=>'login']);
- }
-
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->setRawJsonResponse('err', _('Permission denied.'));
- }
-
-
- $parsedData = null;
- $formData = $this->getPost('formData', null);
- parse_str($formData, $parsedData);
- $returnValues = [];
- $userNames = [];
- $exportedUsers = '';
-
- if (isset($parsedData['export_user_list'])) {
-
- foreach($parsedData['export_user_list'] as $userId) {
- $userInfo = $this->db
- ->where('u.id', $userId)
- ->where('urt.role_id', APPLICANT_ROLE_ID)
- ->join('users_roles_to urt', 'urt.user_id=u.id', 'INNER')
- ->getOne('users u', 'u.*');
-
- if (is_array($userInfo) && !empty($userInfo)) {
- $returnValues['users'][$userId] = $userInfo;
- $userNames[] = $userInfo['surname'].' '.$userInfo['name'];
-
- $userCc = $this->db
- ->where('ucct.user_id', $userId)
- ->join('clinical_centers cc', 'cc.id=ucct.center_id', 'INNER')
- ->get('users_clinical_centers_to ucct', null, ['ucct.*']);
- if (is_array($userCc) && !empty($userCc)) {
- $returnValues['userCc'][$userId] = $userCc;
- }
-
- $userLangs = $this->db
- ->where('ult.user_id', $userId)
- ->get('users_languages_to ult');
- if (is_array($userLangs) && !empty($userLangs)) {
- $returnValues['userLangs'][$userId] = $userLangs;
- } else {
- $returnValues['userLangs'][$userId] = [];
- }
-
- //Set user's role
- $returnValues['userRole'][$userId] = ['user_id'=>$userId, 'role_id'=>APPLICANT_ROLE_ID];
- }
- }
-
- if (!empty($returnValues)) {
- $returnValues['cc'] = [];
- $returnValues['ccMs'] = [];
- $returnValues['ms'] = [];
-
- $clinicalCenter = $this->db->get('clinical_centers');
- if (is_array($clinicalCenter) && !empty($clinicalCenter)) {
- $returnValues['cc'] = $clinicalCenter;
- }
-
- $clinicalCenterMs = $this->db->get('clinical_center_medical_specialties_to');
- if (is_array($clinicalCenterMs) && !empty($clinicalCenterMs)) {
- $returnValues['ccMs'] = $clinicalCenterMs;
- }
-
- $medicalSpecialties = $this->db->get('users_medical_specialties');
- if (is_array($medicalSpecialties) && !empty($medicalSpecialties)) {
- $returnValues['ms'] = $medicalSpecialties;
- }
-
- $exportedUsers = implode(', ', $userNames);
- }
-
- if (!empty($returnValues)) {
-
- $tmpDir = DATA_TMP_DIR;
- $fileName = 'GHT-User-Export_'.date('YmdHis').'.ghtusr';
- $fileContent = gzcompress(json_encode($returnValues));
- $filePath = $tmpDir.$fileName;
- $ret = file_put_contents($filePath, $fileContent);
-
- if ($ret === false) {
-
- return $this->setRawJsonResponse('err', _('Unable to create the users file.'), [], ['log'=>$filePath]);
-
- } else {
-
- return $this->setRawJsonResponse('ok', '', ['log'=>$returnValues, 'dwnFileName'=>$fileName, 'dwnFilePath'=>$filePath]);
-
- }
-
- } else {
- return $this->setRawJsonResponse('err', _('Unable to export the selected users. Please check the users role.'));
- }
-
-
- } else {
- return $this->setRawJsonResponse('err', _('Please provide at least one user.'));
- }
-
- }
-
- public function searchClean() {
- if (!$this->user->isLogged()) {
- return $this->setRawJsonResponse('err', _('Session expired, please log in again.'), [], ['button'=>'login']);
- }
-
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->setRawJsonResponse('err', _('Permission denied.'));
- }
-
- $ret = $this->db->where('cache_key', 'user:search:'.$this->user->getUserId())->delete('cache_memory');
-
- return $this->setRawJsonResponse('ok', _('Search field successfully cleaned.'), ['log'=>$ret]);
- }
-
- public function getCCentersByCountries() {
- if (!$this->user->isLogged()) {
- return $this->setRawJsonResponse('err', _('Session expired, please log in again.'), [], ['button'=>'login']);
- }
-
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->setRawJsonResponse('err', _('Permission denied.'));
- }
-
- $ids = isset($_POST['ids']) ? $_POST['ids'] : null;
- $selectAll = []; //Selected "All in this continent"
- $selectCountries = []; //Selected some other countries
-
- if (!is_null($ids)) {
-
- if(is_array($ids)) {
-
- foreach($ids as $countryCode) {
- if (strpos($countryCode, '|') !== false) {
- $selectAll[] = "'".explode('|', $countryCode)[1]."'";
- } else {
- $selectCountries[] = "'".$countryCode."'";
- }
- }
-
- //Select all countries of these continents
- if (!empty($selectAll)) {
- $countryCodes = implode(',', $selectAll);
- $resultsAll = $this->db->where('continent_code IN('.$countryCodes.')')->get('clinical_centers', null, ['id']);
- }
-
- //Select all countries in this array
- if (!empty($selectCountries)) {
- $countryCodes = implode(',', $selectCountries);
- $resultsCountries = $this->db->where('country_code IN('.$countryCodes.')')->get('clinical_centers', null, ['id']);
- }
-
- //Merge and remove duplicates
-
- $allCcIds = [];
-
- if (is_array($resultsAll)) {
- foreach($resultsAll as $item) {
- $allCcIds[] = $item['id'];
- }
- }
-
- if (is_array($resultsCountries)) {
- foreach($resultsCountries as $item) {
- $allCcIds[] = $item['id'];
- }
- }
-
- $allIds = array_unique($allCcIds);
-
- return $this->setRawJsonResponse('ok', '', ['ids'=>$allCcIds]);
-
- }
- }
-
- //If the passed ids array is empty, clear the Clinical center list on the right side
- return $this->setRawJsonResponse('ok', '', ['ids'=>[]]);
- }
-
- //Users sessions action
- public function usersSessions() {
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->redirect('login', 'permissionDenied');
- }
-
- $userGroupId = $this->user->getUserField('userGroupId');
- $groupInfo = $this->db->where('id', $userGroupId)->getOne('users_groups');
- $this->view->groupName = isset($groupInfo['group_name']) ? $groupInfo['group_name'] : '';
-
- $page = $this->getPost('pageNumb', 1);
- $totalRows = $this->db
- ->join('users u', 'u.id=s.user_id', 'INNER')
- ->where('s.user_id', 0, '>')
- ->where('u.group_id', $userGroupId)
- ->getValue('sessions s', 'COUNT(*)');
-
- $sessions = $this->db
- ->join('users u', 'u.id=s.user_id', 'INNER')
- ->where('s.user_id', 0, '>')
- ->where('u.group_id', $userGroupId)
- ->orderBy('s.session_updated_at', 'DESC')
- ->paginate('sessions s', $page);
-
- $this->setPagination($this->db, $totalRows, $page, 'users-sessions');
-
- $this->view->sessions = $sessions;
- $this->actionTitle = _('Users : Sessions');
- $this->breadcrumbs = [['hash'=>null, 'label'=>$this->actionTitle]];
-
- return $this->setJsonView('usersSessions');
- }
-
- //Users access logs action
- public function usersAccessLogs() {
- if(!$this->checkPermissions([ADMIN_ROLE_ID])) {
- return $this->redirect('login', 'permissionDenied');
- }
-
- $userGroupId = $this->user->getUserField('userGroupId');
- $groupInfo = $this->db->where('id', $userGroupId)->getOne('users_groups');
- $this->view->groupName = isset($groupInfo['group_name']) ? $groupInfo['group_name'] : '';
-
- $page = $this->getPost('pageNumb', 1);
- $accesses = $this->db
- ->join('users u', 'u.id=a.user_id', 'INNER')
- ->where('a.user_id', 0, '>')
- ->where('u.group_id', $userGroupId)
- ->orderBy('a.created_at', 'DESC')
- ->paginate('log_access a', $page, ['a.*', 'a.created_at AS access_date', 'u.id AS user_id', 'u.username', 'u.surname', 'u.name']);
-
- $totalRows = $this->db
- ->join('users u', 'u.id=a.user_id', 'INNER')
- ->where('a.user_id', 0, '>')
- ->where('u.group_id', $userGroupId)
- ->getValue('log_access a', 'COUNT(*)');
-
- $this->setPagination($this->db, $totalRows, $page, 'users-access-logs');
-
- $this->view->accesses = $accesses;
- $this->actionTitle = _('Users : Access logs');
- $this->breadcrumbs = [['hash'=>null, 'label'=>$this->actionTitle]];
- return $this->setJsonView('usersAccessLogs');
- }
-
- public function usersNotificationTracker() {
- if(!$this->checkPermissions([ADMIN_ROLE_ID, MODERATOR_ROLE_ID])) {
- return $this->redirect('login', 'permissionDenied');
- }
-
- $this->view->currentPage = $this->getPost('pageNumb', 1);
- $this->view->notifType = $this->getPost('notifType', 'email');
- //$this->view->orderField = $this->getPost('orderField', 'surname');
- //$this->view->orderDir = $this->getPost('orderDir', 'desc');
- $this->view->trackers = [];
-
- $results = $this->db
- ->where('u.group_id', $this->userGroupId)
- ->where('el.notif_type', $this->view->notifType)
- ->join('users u', 'u.id=el.user_id', 'INNER')
- //->groupBy('el.id')
- ->orderBy('el.created_at', 'desc')
- ->paginate('log_notifications el', $this->view->currentPage, ['u.id user_id', 'u.name', 'u.surname', 'el.id mail_code', 'el.request_result', 'el.mail_to', 'el.mail_subject', 'el.mail_opened', 'el.mail_opened_at', 'el.phone_to', 'el.phone_msg', 'el.created_at']);
-
- $this->setPagination($this->db, $this->db->totalCount, $this->view->currentPage, 'notification-tracker/'.time().'/'.$this->view->notifType);
-
- $this->view->queryDebug = $this->db->getLastQuery();
- $this->view->trackers = $results;
-
- $this->actionTitle = _('Notification tracker');
- $this->breadcrumbs = [['hash'=>null, 'label'=>$this->actionTitle]];
- return $this->setJsonView('usersNotificationTracker');
- }
-
- public function allowAccess() {
- if (!$this->user->isLogged()) {
- return $this->redirect('login', 'index');
- }
-
- return false;
- }
-
- }
|