0) { $this->anketa = $anketa; } } // Vrne string zadnje verzije mobilne app //!! to je samo nek ostanek, ki se trenutno rabi samo zato, da se pac gre cez login in da po loginu klice neko funkcijo public function getMobileVersion() { /* $sql = sisplet_query("SELECT value FROM misc WHERE what='mobileApp_version'"); if(mysqli_num_rows($sql) > 0){ $row = mysqli_fetch_array($sql); return $row['value']; } else return 0; */ return 'ABORTED'; } // Preveri username in pass ce sta ok za login public function checkLogin($pass, $uname) { global $lang; global $pass_salt; $login_check = false; $sql = sisplet_query("SELECT id, pass, status FROM users WHERE email='" . $uname . "'"); if (mysqli_num_rows($sql) > 0) { $row = mysqli_fetch_array($sql); //if($row['pass'] == base64_encode(bin2hex(hash(SHA256, $pass.$pass_salt)))) if ($row['pass'] == base64_encode(hash('SHA256', $pass . $pass_salt))) $login_check = true; } if ($login_check && $row['id'] > 0 && $row['status'] > 0) return $row['id']; else if ($login_check && $row['id'] > 0 && $row['status'] == 0) return -1; else return 0; } // Login preko google account api public function googleLogin($user_email) { if ($user_email != '') { $res = sisplet_query("SELECT id, pass FROM users WHERE email='" . $user_email . "'"); // Je noter, ga samo prijavim... if (mysqli_num_rows($res) > 0) { $r = mysqli_fetch_row($res); return $r[0]; } // Ni se registriran, ga je potrebno dodati na prijavno formo else { // geslo med 00000 in zzzzz $pass = base_convert(mt_rand(0x19A100, 0x39AA3FF), 10, 36); $EncPass = base64_encode((hash('SHA256', $pass))); $fn = explode("@", $user_email); sisplet_query("INSERT INTO users (name, surname, email, pass, lang) VALUES ('" . $fn[0] . "', '', '" . $user_email . "', '" . $EncPass . "', '" . (isset($_GET['regFromEnglish']) && $_GET['regFromEnglish'] == "1" ? '2' : '1') . "')"); $uid = mysqli_insert_id($GLOBALS['connect_db']); sisplet_query("INSERT INTO oid_users (uid) VALUES ('$uid')"); return $uid; } } else return 0; } // update vrstnega reda vprasanj public function updateQuestionOrder($ank_id, $data) { if (!isset($data['to_place']) && !isset($data['que_id'])){ $json_array['error'] = 'Question ID or order number missing'; return $json_array; } //poizvedi, koliko je vseh spremenljivk $sql = sisplet_query("SELECT MAX(vrstni_red) FROM srv_branching WHERE ank_id = '$ank_id'"); $row = mysqli_fetch_assoc($sql); //ali se da spremenljivko na zadnje mesto? ce da, nastavi page_break = 2 $page_break = $row['MAX(vrstni_red)'] == $data['to_place'] ? 2 : 0; //poizvedi, ali se premakne vprasanje navzgor ali navzdol //to se rabi, ker ce se prestavi navzgor, je treba odsteti vrstni_red za 1 //zato, ker se v branchingu lahko razvrsca med vsako spremenljivko, pred prvo ter za zadnjo - to je skupaj vse +1 $sql = sisplet_query("SELECT vrstni_red FROM srv_branching WHERE element_spr = '" . $data['que_id'] . "'"); $row = mysqli_fetch_assoc($sql); $vrstni_red = $row['vrstni_red'] >= $data['to_place'] ? $data['to_place'] - 1 : $data['to_place']; $ba = new BranchingAjax($ank_id); $json_array = $ba->ajax_accept_droppable($data['que_id'], $vrstni_red, $page_break, true); if (empty($json_array)) $json_array['note'] = 'Question order updated'; Common::getInstance()->updateEditStamp(); Common::prestevilci(); return $json_array; } //MAZA /** * Check login data for MAZA modul app * @param boolean $loginAction - true if action is only to check login, false otherwise * @param type $identifier - identifier code for maza app user * @param type $id_server - id of maza app user on server * @return if $loginAction is true, return object with data, otherwise return id of maza app user */ public function checkMazaLogin($loginAction, $identifier, $id_server, $registration_id) { global $lang; global $pass_salt; $login_check = false; $id = 0; $response; if ($identifier == 'no_identifier') { $maza = new MAZA(); $newuser = $maza -> insertNewUsers('self'); $login_check = true; $id = $newuser['id']; $response['note'] = "login OK"; $response['identifier'] = $newuser['identifier']; $response['id_server'] = $newuser['id']; $response['update'] = 'deviceInfo'; } elseif($identifier == 'no_login'){ $response['note'] = "login OK"; } else { //$salted_identifier = base64_encode(hash(SHA256, $identifier . $pass_salt)); $check_id = ''; $does_id_serever_exist = false; if(!$loginAction || ($loginAction && (isset($id_server) && $id_server!=''))){ $check_id = "id='".$id_server."' AND "; $does_id_serever_exist = true; } $sql = sisplet_query("SELECT id, deviceInfo FROM maza_app_users WHERE ".$check_id."identifier='" . $identifier . "'"); if (mysqli_num_rows($sql) > 0) { $row = mysqli_fetch_array($sql); $login_check = true; $id = $row['id']; $deviceInfo = $row['deviceInfo']; //update datetime_last_active $maza = new MAZA(); $maza -> maza_update_user_active($id, $registration_id); if(!isset($deviceInfo)) $response['update'] = 'deviceInfo'; if(!$does_id_serever_exist){ $response['identifier'] = $identifier; $response['id_server'] = $id; } $response['note'] = "login OK"; } //if only login if($loginAction){ //update datetime_started in table maza_user_srv_access to set datetime of user linking to his survey is already existing (generated users) sisplet_query("UPDATE maza_user_srv_access SET datetime_started = NOW() WHERE maza_user_id = '$id' AND datetime_started IS NULL;"); } } if ($login_check && $id > 0) return $loginAction ? $response : $id; else return 0; } /** * Udates device info with sensors * @global type $global_user_id * @return array */ public function mazaUpdateDeviceInfo($data) { global $global_user_id; $gotData = json_decode($data); $sqldi = sisplet_query("SELECT deviceInfo FROM maza_app_users WHERE id = '$global_user_id'", 'obj'); if($sqldi->deviceInfo[0] == '{'){ $odlInfo = json_decode($sqldi->deviceInfo); $lastInfo = end($odlInfo)->device_info; $gotInfo = $gotData->device_info; if($lastInfo->os_version == $gotInfo->os_version && $lastInfo->release == $gotInfo->release && $lastInfo->serial == $gotInfo->serial){ $json_array['note'] = 'Device info already up to date'; } else{ $temptime = time(); $odlInfo->$temptime = $gotData; $newInfo = $odlInfo; sisplet_query("UPDATE maza_app_users SET deviceInfo = '" . json_encode($newInfo) . "' WHERE id = '$global_user_id'"); $json_array['note'] = 'Device info added'; } } else{ $newInfo = array(time()=>$gotData); sisplet_query("UPDATE maza_app_users SET deviceInfo = '" . json_encode($newInfo) . "' WHERE id = '$global_user_id'"); $json_array['note'] = 'Device info inserted'; } return $json_array; } /** * Get all alarms of surveys for this user * @global type $global_user_id * @return array */ public function mazaGetAlarms() { global $global_user_id; $sql_arr = sisplet_query("SELECT ma.alarm_notif_title, ma.alarm_notif_message, ma.repeat_by AS alarm_repeat_by, " . "ma.alarm_notif_sound, ma.time_in_day AS alarm_time_in_day, ma.day_in_week AS alarm_day_in_week, " . "ma.every_which_day AS alarm_every_which_day, mr.every_which_day AS repeater_every_which_day, " . "mr.time_in_day AS repeater_time_in_day, mr.repeat_by AS repeater_repeat_by, ma.ank_id, an.url, an.naslov, " . "mr.day_in_week AS repeater_day_in_week, mr.datetime_start, mr.datetime_end, MAX(sa.srv_version_datetime) AS last_answered_version_datetime, " . "CASE WHEN sa.datetime_started < mr.datetime_start THEN mr.datetime_start ELSE sa.datetime_started END AS datetime_user_started FROM maza_srv_alarms AS ma " . "LEFT JOIN (SELECT sua.ank_id, sua.maza_user_id, sua.datetime_started, su.srv_version_datetime FROM maza_user_srv_access AS sua " . "LEFT JOIN (SELECT msu.srv_version_datetime, msu.maza_user_id, su.ank_id FROM maza_srv_users AS msu " . "LEFT JOIN (SELECT id, ank_id FROM srv_user) AS su ON su.id=msu.srv_user_id) AS su " . "ON sua.maza_user_id=su.maza_user_id AND su.ank_id=sua.ank_id) AS sa ON ma.ank_id = sa.ank_id " . "LEFT JOIN maza_srv_repeaters AS mr ON mr.ank_id = sa.ank_id " . "LEFT JOIN (SELECT id, url, naslov FROM srv_anketa) AS an ON an.id = sa.ank_id " . "WHERE sa.maza_user_id='$global_user_id' AND mr.repeater_on='1' GROUP BY ma.ank_id", 'array'); $alarms = array(); foreach ($sql_arr as $row) { $last_answered_version_datetime = ($row['last_answered_version_datetime']) ? $row['last_answered_version_datetime'] : null; $alarm = array('title' => $row['alarm_notif_title'], 'message' => $row['alarm_notif_message'], 'ank_id' => $row['ank_id'], 'sound' => $row['alarm_notif_sound'], 'link' => $row['url'].'a/'.$row['ank_id'], 'srv_title' => $row['naslov'], 'repeat' => array("repeat_by" => $row['alarm_repeat_by'], "time_in_day" => json_decode($row['alarm_time_in_day']), "day_in_week" => json_decode($row['alarm_day_in_week']), "every_which_day" => $row['alarm_every_which_day']), 'repeater' => array("repeat_by" => $row['repeater_repeat_by'], "time_in_day" => json_decode($row['repeater_time_in_day']), "day_in_week" => json_decode($row['repeater_day_in_week']), "every_which_day" => $row['repeater_every_which_day'], "datetime_start" => $row['datetime_start'], "datetime_end" => $row['datetime_end'], "last_answered_version_datetime" => $last_answered_version_datetime, "datetime_user_started" => $row['datetime_user_started'])); array_push($alarms, $alarm); } return $alarms; } /** * Get all geofences of surveys for this user * @global type $global_user_id * @return array */ public function mazaGetGeofences() { global $global_user_id; $sql_arr = sisplet_query("SELECT mg.id, mg.ank_id, mg.geofence_on, mg.lat, mg.lng, mg.radius, mg.address, mg.name, mg.notif_title, mg.trigger_survey, " . "mg.notif_message, mg.notif_sound, mg.on_transition, mg.after_seconds, mg.location_triggered, an.url, an.naslov FROM maza_srv_geofences AS mg " . "LEFT JOIN (SELECT ank_id, maza_user_id FROM maza_user_srv_access) AS sua ON mg.ank_id = sua.ank_id " . "LEFT JOIN (SELECT id, url, naslov, active FROM srv_anketa) AS an ON an.id = sua.ank_id " . "WHERE sua.maza_user_id='$global_user_id' AND mg.geofence_on='1' AND an.active='1'", 'array'); //array of all surveys with geofences $surveys = array(); //object of one survey with its geofences $survey = array(); //array of geofences of one survey $geofences = array(); //temporary survey id $srv_id_temp = -1; //loop trough geofences foreach ($sql_arr as $row) { //if survey id is not equal to previous, create new survey array if($srv_id_temp != $row['ank_id']){ //ingor first time if($srv_id_temp > -1){ $survey['geofences'] = $geofences; array_push($surveys, $survey); } //set survey array $survey = array('ank_id' => $row['ank_id'], 'link' => $row['url'].'a/'.$row['ank_id'], 'srv_title' => $row['naslov']); //reset geofences $geofences = array(); //set temporary survey id $srv_id_temp = $row['ank_id']; } //set geofence array $geofence = array('id' => $row['id'], 'lat' => $row['lat'], 'lng' => $row['lng'], 'radius' => $row['radius'], 'address' => $row['address'], 'notif_title' => $row['notif_title'], 'notif_message' => $row['notif_message'], 'notif_sound' => $row['notif_sound'], 'on_transition' => $row['on_transition'], 'name' => $row['name'], 'after_seconds' => $row['after_seconds'], 'location_triggered' => $row['location_triggered'], 'trigger_survey' => $row['trigger_survey']); //add geofence to geofences array of one survey array_push($geofences, $geofence); } if(sizeof($sql_arr) > 0){ //add geofences to last survey $survey['geofences'] = $geofences; //add last survey to surveys aray array_push($surveys, $survey); } return $surveys; } /** * Get all activities of surveys for this user * @global type $global_user_id * @return array */ public function mazaGetActivities() { global $global_user_id; $sql_arr = sisplet_query("SELECT ma.id, ma.ank_id, ma.activity_on, ma.notif_title, ma.notif_message, ma.notif_sound, " . "ma.activity_type, ma.after_seconds, ank.naslov, ank.id as ank_id, ank.url, sua.nextpin_tracking_permitted FROM maza_srv_activity AS ma " . "LEFT JOIN (SELECT ank_id, maza_user_id, nextpin_tracking_permitted FROM maza_user_srv_access) AS sua ON ma.ank_id = sua.ank_id " . "LEFT JOIN (SELECT id, url, naslov FROM srv_anketa) AS ank ON ma.ank_id = ank.id " . "WHERE sua.maza_user_id='$global_user_id' AND ma.activity_on='1'", 'array'); //array of all surveys with activities $surveys = array(); //object of one survey with its activities $survey = array(); //loop trough activities foreach ($sql_arr as $row) { //set survey array $survey = array('ank_id' => $row['ank_id'], 'link' => $row['url'].'a/'.$row['ank_id'], 'srv_title' => $row['naslov'], 'notif_title' => $row['notif_title'], 'notif_message' => $row['notif_message'], 'notif_sound' => $row['notif_sound'], 'activity' => array('id' => $row['id'], 'activity_type' => $row['activity_type'], 'after_seconds' => $row['after_seconds']), 'permitted'=>$row['nextpin_tracking_permitted']); array_push($surveys, $survey); } return $surveys; } /** * Get all tracking of surveys for this user * @global type $global_user_id * @return array */ public function mazaGetTracking() { global $global_user_id; $sql_arr = sisplet_query("SELECT ank.id, ma.ank_id, ma.tracking_on, ma.activity_recognition, ma.tracking_accuracy, ma.interval_wanted, " . "ma.interval_fastes, ma.displacement_min, ma.ar_interval_wanted, ank.naslov, ank.url, sua.tracking_permitted FROM maza_srv_tracking AS ma " . "LEFT JOIN (SELECT ank_id, maza_user_id, tracking_permitted FROM maza_user_srv_access) AS sua ON ma.ank_id = sua.ank_id " . "LEFT JOIN (SELECT id, url, naslov, active FROM srv_anketa) AS ank ON ma.ank_id = ank.id " . "WHERE sua.maza_user_id='$global_user_id' AND ma.tracking_on='1' AND ank.active='1'", 'array'); //array of all surveys with tracking $surveys = array(); //object of one survey with its tracking $survey = array(); //loop trough trackings foreach ($sql_arr as $row) { //set survey array $survey = array('ank_id' => $row['ank_id'], 'link' => $row['url'].'a/'.$row['ank_id'], 'srv_title' => $row['naslov'], 'tracking' => array('id' => $row['id'], 'activity_recognition' => $row['activity_recognition'], 'tracking_accuracy' => $row['tracking_accuracy'], 'displacement_min' => $row['displacement_min'], 'interval_wanted' => $row['interval_wanted'], 'interval_fastes' => $row['interval_fastes'], 'ar_interval_wanted' => $row['ar_interval_wanted'], 'permitted'=>$row['tracking_permitted'])); array_push($surveys, $survey); } return $surveys; } /** * Get all data entries of surveys for this user * @global type $global_user_id * @return array */ public function mazaGetEntries() { global $global_user_id; $sql_arr = sisplet_query("SELECT ank.id, me.ank_id, me.entry_on, me.location_check, ank.naslov, ank.url FROM maza_srv_entry AS me " . "LEFT JOIN (SELECT ank_id, maza_user_id FROM maza_user_srv_access) AS sua ON me.ank_id = sua.ank_id " . "LEFT JOIN (SELECT id, url, naslov, active FROM srv_anketa) AS ank ON sua.ank_id = ank.id " . "WHERE sua.maza_user_id='$global_user_id' AND me.entry_on='1' AND ank.active='1'", 'array'); //array of all surveys with tracking $surveys = array(); //object of one survey with its tracking $survey = array(); //loop trough trackings foreach ($sql_arr as $row) { //set survey array $survey = array('ank_id' => $row['ank_id'], 'link' => $row['url'].'a/'.$row['ank_id'], 'srv_title' => $row['naslov'], 'entry' => array('id' => $row['id'], 'location_check' => $row['location_check'])); array_push($surveys, $survey); } return $surveys; } /** * Get all locations and AR of user * @global type $global_user_id * @return array */ public function mazaGetMyLocations() { global $global_user_id; //array of locations of user $sql_loc = sisplet_query("SELECT lat, lng, provider, UNIX_TIMESTAMP(timestamp) as timestamp, " . "accuracy, altitude, bearing, speed, vertical_acc, bearing_acc, speed_acc, extras, is_mock " . "FROM maza_user_locations WHERE maza_user_id='$global_user_id' ORDER BY timestamp ASC", 'array'); //array of all AR of user $sql_ar = sisplet_query("SELECT UNIX_TIMESTAMP(timestamp) as timestamp, in_vehicle, on_bicycle, " . "on_foot, still, unknown, tilting, running, walking FROM maza_user_activity_recognition " . "WHERE maza_user_id='$global_user_id' ORDER BY timestamp ASC", 'array'); return array("locations" => $sql_loc, "ar" => $sql_ar); } /** * Update tracking log for this user * @global type $global_user_id * @param type $jsonArray - array of logs to save */ public function mazaUpdateTrackingLog($jsonArray) { global $global_user_id; $update = ""; foreach ($jsonArray as $obj) { $date = new DateTime(); $date->setTimestamp($obj['tsSec']); $update .= $obj['value'] . " " . $obj['event'] . " " . $date->format('Y-m-d H:i:s') . "; "; } sisplet_query("UPDATE maza_app_users SET tracking_log = CONCAT(tracking_log, '" . $update . "') WHERE id = '$global_user_id'"); } /** * Insert tracking locations for this user * @global type $global_user_id * @param type $jsonArray - array of locations to insert * @param type $triggered_geofence_id - ID of triggered geofence to pin location on */ public function mazaInsertTrackingLocations($jsonArray, $triggered_geofence_id=null) { global $global_user_id; $querryFirst = $querry = "INSERT INTO maza_user_locations (maza_user_id, lat, lng, provider, timestamp, accuracy, altitude, bearing, speed, vertical_acc, bearing_acc, speed_acc, extras, is_mock, tgeof_id) VALUES "; foreach ($jsonArray as $obj) { $date = new DateTime(); $date->setTimestamp($obj['timestamp']); $date = $date->format('Y-m-d H:i:s'); if(!isset($obj['server_input_id']) || $obj['server_input_id'] == -1){ $querry .= "($global_user_id, ".$obj['lat'].", ".$obj['lng'].", '".$obj['provider']."', '".$date."', ".($obj['accuracy'] ? $obj['accuracy'] : "NULL").", ". ($obj['altitude'] ? $obj['altitude'] : "NULL").", ".($obj['bearing'] ? $obj['bearing'] : "NULL").", ".($obj['speed'] ? $obj['speed'] : "NULL").", ". ($obj['vertical_acc'] ? $obj['vertical_acc'] : "NULL").", ".($obj['bearing_acc'] ? $obj['bearing_acc'] : "NULL").", ". ($obj['speed_acc'] ? $obj['speed_acc'] : "NULL").", '".($obj['extras'] ? $obj['extras'] : "")."', ".$obj['is_mock'].", ".($triggered_geofence_id ? $triggered_geofence_id : "NULL")."), "; } else{ $querry1 = "INSERT INTO maza_user_locations (maza_user_id, lat, lng, provider, timestamp, accuracy, altitude, bearing, speed, vertical_acc, bearing_acc, speed_acc, extras, is_mock, tgeof_id) VALUES " . "($global_user_id, ".$obj['lat'].", ".$obj['lng'].", '".$obj['provider']."', '".$date."', ".($obj['accuracy'] ? $obj['accuracy'] : "NULL").", ". ($obj['altitude'] ? $obj['altitude'] : "NULL").", ".($obj['bearing'] ? $obj['bearing'] : "NULL").", ".($obj['speed'] ? $obj['speed'] : "NULL").", ". ($obj['vertical_acc'] ? $obj['vertical_acc'] : "NULL").", ".($obj['bearing_acc'] ? $obj['bearing_acc'] : "NULL").", ". ($obj['speed_acc'] ? $obj['speed_acc'] : "NULL").", '".($obj['extras'] ? $obj['extras'] : "")."', ".$obj['is_mock'].", ".($triggered_geofence_id ? $triggered_geofence_id : "NULL").");"; $loc_id = sisplet_query($querry1, 'id'); $querry2 = "UPDATE maza_srv_users SET loc_id='$loc_id' WHERE srv_user_id='".$obj['server_input_id']."';"; sisplet_query($querry2); } } if($querryFirst != $querry){ $querry = substr($querry, 0, -2); sisplet_query($querry); } } /** * Edit tracking locations for this user * @global type $global_user_id * @param type $jsonArray - array of locations to edit */ public function mazaEditTrackingLocations($jsonArray) { global $global_user_id; if(isset($jsonArray['delete']) && !empty($jsonArray['delete'])){ $set_timestamp = ""; $where_delete=""; foreach ($jsonArray['delete'] as $obj) { $set_timestamp.=" when UNIX_TIMESTAMP(timestamp)=".$obj['timestamp']." then FROM_UNIXTIME(".$obj['extras'].")"; $where_delete.=$obj['timestamp'].", "; } $where_delete = substr($where_delete, 0, -2); $querry_delete = "UPDATE maza_user_locations SET timestamp = (case$set_timestamp end), " . "lat=999, lng=999, provider='deleted', accuracy=NULL, altitude=NULL, bearing=NULL, speed=NULL, vertical_acc=NULL, bearing_acc=NULL, speed_acc=NULL, extras=NULL, is_mock=NULL WHERE maza_user_id=$global_user_id AND " . "UNIX_TIMESTAMP(timestamp) IN (".$where_delete.");"; sisplet_query($querry_delete); } if(isset($jsonArray['edit']) && !empty($jsonArray['edit'])){ $set_lat = ""; $set_lng = ""; $where_edit=""; foreach ($jsonArray['edit'] as $obj) { $set_lat.=" when UNIX_TIMESTAMP(timestamp)=".$obj['timestamp']." then ".$obj['lat']; $set_lng.=" when UNIX_TIMESTAMP(timestamp)=".$obj['timestamp']." then ".$obj['lng']; $where_edit.=$obj['timestamp'].", "; } $where_edit = substr($where_edit, 0, -2); $querry_delete = "UPDATE maza_user_locations SET lat = (case$set_lat end), lng = (case$set_lng end), " . "provider='manual' WHERE maza_user_id=$global_user_id AND " . "UNIX_TIMESTAMP(timestamp) IN (".$where_edit.");"; sisplet_query($querry_delete); } } /** * Insert tracking locations for this user * @global type $global_user_id * @param type $jsonArray - array of locations to insert */ public function mazaInsertTrackingAR($jsonArray) { global $global_user_id; $querry = "INSERT INTO maza_user_activity_recognition (maza_user_id, timestamp, in_vehicle, on_bicycle, on_foot, still, unknown, tilting, running, walking) VALUES "; foreach ($jsonArray as $obj) { $date = new DateTime(); $date->setTimestamp($obj['timestamp']); $date = $date->format('Y-m-d H:i:s'); $querry .= "($global_user_id, '$date', ".$obj['in_vehicle'].", ". $obj['on_bicycle'].", ".$obj['on_foot'].", ".$obj['still'].", ". $obj['unknown'].", ".$obj['tilting'].", ". $obj['running'].", ".$obj['walking']."), "; } $querry = substr($querry, 0, -2); sisplet_query($querry); } /** * Insert new triggered geofences * @global type $global_user_id * @param type $jsonArray - arrays of triggered geofences to save */ public function mazaInsertTriggeredGeofences($jsonArray) { global $global_user_id; $new_tgeof_id = 0; foreach ($jsonArray as $obj) { $date = new DateTime(); $triggered_timestamp = $date->setTimestamp($obj['geofence']['tsSec'])->format('Y-m-d H:i:s'); $enter_timestamp = $date->setTimestamp($obj['geofence']['enter_timestamp'])->format('Y-m-d H:i:s'); $dwell_timestamp = $date->setTimestamp($obj['geofence']['dwell_timestamp'])->format('Y-m-d H:i:s'); $tgeo_id = sisplet_query("INSERT INTO maza_srv_triggered_geofences (geof_id, maza_user_id, triggered_timestamp, enter_timestamp, dwell_timestamp) VALUES " . "('".$obj['geofence']['value']."','$global_user_id', '$triggered_timestamp', '$enter_timestamp' ,'$dwell_timestamp')", "id"); $this->mazaInsertTrackingLocations($obj['locations'], $tgeo_id); if(isset($obj['geofence']['return_server_id']) && $obj['geofence']['return_server_id'] == true) $new_tgeof_id = $tgeo_id; } return $new_tgeof_id; } /** * Unsubscribe survey for this user * @global type $global_user_id * @param type $ank_id - survey ID to unsuscribe */ public function mazaUnsubscribeSurvey($ank_id) { global $global_user_id; sisplet_query("UPDATE maza_user_srv_access SET datetime_unsubscribed = NOW() WHERE maza_user_id = '$global_user_id' AND ank_id = '$ank_id';"); $json_array['note'] = 'Unsubscribed from survey'; return $json_array; } /** * Set agreed permission for tracking and register listener on nextpin API * @global type $global_user_id * @param type $data - array of data */ public function mazaSetNextpinTrackingPermission($data) { global $global_user_id; if (isset($data['tracking_permission']) && isset($data['srv_id'])) { sisplet_query("UPDATE maza_user_srv_access SET nextpin_tracking_permitted = '" . $data['tracking_permission'] . "' WHERE maza_user_id = '$global_user_id' AND ank_id = '".$data['srv_id']."'"); if($data['tracking_permission'] == 1){ $sql_pass = sisplet_query("SELECT nextpin_password, identifier FROM maza_app_users WHERE id='$global_user_id';", 'obj'); if($sql_pass){ $maza = new MAZA($data['srv_id']); //password is null, user is not registered on nextpin yet if(!$sql_pass->nextpin_password){ //generate new password $newpass = $maza -> randomAlphaNumericCode(4); //set password in db sisplet_query("UPDATE maza_app_users SET nextpin_password = '$newpass' WHERE id = '$global_user_id'"); $json_array['data']['nextpin_password'] = $newpass; //create new user in nextpin $maza -> nextpin_create_user($sql_pass->identifier, $newpass); } //create new activity listener for this identifier $maza -> nextpin_set_activity_listener($sql_pass->identifier); } } $json_array['note'] = 'Tracking permission updated'; } else $json_array['error'] = 'Param tracking_permission or srv_id missing'; return $json_array; } /** * Set agreed permission for tracking and register listener * @global type $global_user_id * @param type $data - array of data */ public function mazaSetTrackingPermission($data) { global $global_user_id; if (isset($data['tracking_permission']) && isset($data['srv_id'])) { sisplet_query("UPDATE maza_user_srv_access SET tracking_permitted = '" . $data['tracking_permission'] . "' WHERE maza_user_id = '$global_user_id' AND ank_id = '".$data['srv_id']."'"); $json_array['note'] = 'Tracking permission updated'; } else $json_array['error'] = 'Param tracking_permission or srv_id missing'; return $json_array; } /** * Merge identifiers * @global type $global_user_id * @param type $identifier - identifier to merge */ public function mazaMergeIdentifier($identifier) { global $global_user_id; //check if this identifier exists $sql_arr = sisplet_query("SELECT id FROM maza_app_users WHERE identifier='$identifier';", 'obj'); if($sql_arr->id == $global_user_id) return array('error' => 'incorrect identifier'); //identifier exsits else if($sql_arr){ //get survey access of user $sql_user_access = sisplet_query("SELECT ank_id FROM maza_user_srv_access WHERE maza_user_id='$global_user_id';", 'array'); //get survey access of identifier $sql_identifier_access = sisplet_query("SELECT ank_id FROM maza_user_srv_access WHERE maza_user_id='$sql_arr->id';", 'array'); $user_access_arr = array(); $identifier_access_arr = array(); //create array of user accesses foreach($sql_user_access as $ua) array_push($user_access_arr, $ua['ank_id']); //create array of identifier accesses foreach($sql_identifier_access as $ia) array_push($identifier_access_arr, $ia['ank_id']); //array of which surveys does indentifier has access and not user $what_to_add_array = array_diff($identifier_access_arr, $user_access_arr); //if not empty, go insert if($what_to_add_array){ $sql_values = ""; //create string of values(accesses) to insert to user access foreach($what_to_add_array as $add) $sql_values .= "('$global_user_id','$add', NOW()),"; //remove last comma $sql_values = substr($sql_values, 0, -1); //insert new accesses from identifier to user sisplet_query("INSERT INTO maza_user_srv_access (maza_user_id, ank_id, datetime_started) VALUES $sql_values"); } //delete all accesses of identifier sisplet_query("DELETE FROM maza_user_srv_access WHERE maza_user_id = '$sql_arr->id'"); //delete identifier from user table sisplet_query("DELETE FROM maza_app_users WHERE id = '$sql_arr->id'"); return array('note' => 'merge OK'); } //identifier does not exist else return array('error' => 'identifier does not exist'); } /** * Get info of surveys to merge (by identifier) * @global type $global_user_id * @param type $identifier - identifier to get linked surveys info from */ public function mazaGetSurveysInfoByIdentifier($identifier) { global $global_user_id; //check if this identifier exists $sql_arr = sisplet_query("SELECT id FROM maza_app_users WHERE identifier='$identifier';", 'obj'); //identifier exsits if($sql_arr){ //get survey access of user $sql_user_access = sisplet_query("SELECT ank_id FROM maza_user_srv_access WHERE maza_user_id='$global_user_id';", 'array'); //get survey access of identifier $sql_identifier_access = sisplet_query("SELECT ank_id FROM maza_user_srv_access WHERE maza_user_id='$sql_arr->id';", 'array'); $user_access_arr = array(); $identifier_access_arr = array(); //create array of user accesses foreach($sql_user_access as $ua) array_push($user_access_arr, $ua['ank_id']); //create array of identifier accesses foreach($sql_identifier_access as $ia) array_push($identifier_access_arr, $ia['ank_id']); //array of which surveys does indentifier has access and not user $what_to_add_array = array_diff($identifier_access_arr, $user_access_arr); //if not empty, or get info about users identifier, go selelct if($sql_arr->id == $global_user_id || $what_to_add_array){ $sur_ids_in_string = "(".implode( ", ", $what_to_add_array ).")"; //get surveys info $sql = "SELECT s.id, s.naslov, s.active, s.starts, s.expire, s.url, " . "ge.geofences, sr.repeater_on, sr.repeat_by, sr.datetime_start, sr.datetime_end, " . "ac.activities, se.entry_on, se.location_check, tr.tracking_on, tr.activity_recognition " . "FROM srv_anketa AS s " . "LEFT JOIN maza_srv_repeaters AS sr ON s.id = sr.ank_id " . "LEFT JOIN (SELECT ank_id, COUNT(id) as geofences FROM maza_srv_geofences WHERE geofence_on='1' GROUP BY ank_id) AS ge ON s.id = ge.ank_id " . "LEFT JOIN (SELECT ank_id, COUNT(id) as activities FROM maza_srv_activity WHERE activity_on='1' GROUP BY ank_id) AS ac ON s.id = ac.ank_id " . "LEFT JOIN (SELECT entry_on, location_check, ank_id FROM maza_srv_entry) AS se ON s.id = se.ank_id " . "LEFT JOIN (SELECT tracking_on, activity_recognition, ank_id FROM maza_srv_tracking) AS tr ON s.id = tr.ank_id " . "WHERE s.id IN $sur_ids_in_string;"; $sql_surveys_info = sisplet_query($sql, 'array'); return $sql_surveys_info; } else return array('note' => 'already participant'); } //identifier does not exist else return array('error' => 'identifier does not exist'); } /** * Get all subscriptions/surveys of user * @global type $global_user_id * @return type */ public function mazaGetSubscriptionsList($timeZone){ global $global_user_id; //get surveys $Sql = "SELECT *, UNIX_TIMESTAMP(datetime_started) as unixstart FROM maza_user_srv_access AS sa " . "LEFT JOIN (SELECT id AS srv_id, naslov, active, starts, expire, url FROM srv_anketa) AS s ON s.srv_id = sa.ank_id " . "LEFT JOIN maza_srv_repeaters AS sr ON s.srv_id = sr.ank_id " . "LEFT JOIN (SELECT ank_id, COUNT(id) as geofences FROM maza_srv_geofences WHERE geofence_on='1' GROUP BY ank_id) AS ge ON s.srv_id = ge.ank_id " . "LEFT JOIN (SELECT ank_id, COUNT(id) as activities FROM maza_srv_activity WHERE activity_on='1' GROUP BY ank_id) AS ac ON s.srv_id = ac.ank_id " . "LEFT JOIN (SELECT entry_on, location_check, ank_id FROM maza_srv_entry) AS se ON s.srv_id = se.ank_id " . "LEFT JOIN (SELECT tracking_on, activity_recognition, ank_id FROM maza_srv_tracking) AS tr ON s.srv_id = tr.ank_id " . "LEFT JOIN (SELECT srv_description, srv_id as ank_id FROM maza_survey) AS ms ON ms.ank_id = s.srv_id " . "WHERE sa.maza_user_id = '$global_user_id' AND s.active = '1' AND sa.datetime_unsubscribed IS NULL;"; //all active surveys on which user has access $sarray = sisplet_query($Sql, 'array'); $resultarray = array(); //get nuber of unfidished questionnaires $surveyListArray = $this->mazaGetSurveyList($timeZone); foreach($sarray as $survey){ $survey['unfinished_cnt'] = $surveyListArray[$survey['srv_id']]['unfinished_cnt']; $survey['url'] = $survey['url'].'a/'.$survey['srv_id']; $resultarray[] = $survey; } return $resultarray; } /** * Vrne seznam anket na katere je uporabnik narocen * @param type $timeZone - timezone ID of user * @return array */ public function mazaGetSurveyList($timeZone, $srv_id = null) { global $global_user_id; $surveyWhere = $srv_id == null ? '' : ' AND s.srv_id = '.$srv_id; $json_array = array(); //get surveys $Sql = "SELECT * FROM maza_user_srv_access AS sa " . "LEFT JOIN (SELECT id AS srv_id, naslov, active, starts, expire, url FROM srv_anketa) AS s ON s.srv_id = sa.ank_id " . "LEFT JOIN maza_srv_repeaters AS sr ON s.srv_id = sr.ank_id " . "LEFT JOIN (SELECT id, ank_id, COUNT(id) as geofences FROM maza_srv_geofences WHERE geofence_on='1' GROUP BY ank_id) AS ge ON s.srv_id = ge.ank_id " . "LEFT JOIN (SELECT id, ank_id, COUNT(id) as activities FROM maza_srv_activity WHERE activity_on='1' GROUP BY ank_id) AS ac ON s.srv_id = ac.ank_id " . "LEFT JOIN (SELECT tracking_on, ank_id FROM maza_srv_tracking) AS st ON s.srv_id = st.ank_id " . "LEFT JOIN (SELECT entry_on, ank_id FROM maza_srv_entry) AS se ON s.srv_id = se.ank_id " . "WHERE sa.maza_user_id = '$global_user_id' AND s.active = '1' AND sa.datetime_unsubscribed IS NULL$surveyWhere;"; //all active surveys on which user has access $sarray = sisplet_query($Sql, 'array'); //get existing surveys for this user $Sql = "SELECT *, UNIX_TIMESTAMP(srv_version_datetime) as unixver FROM maza_srv_users AS msu " . "LEFT JOIN (SELECT id, cookie, ank_id, last_status, time_insert FROM srv_user) AS su ON msu.srv_user_id = su.id " . "LEFT JOIN (SELECT id AS srv_id, active, starts, naslov, url FROM srv_anketa) AS s ON su.ank_id = s.srv_id " . "LEFT JOIN (SELECT maza_user_id, ank_id, datetime_unsubscribed FROM maza_user_srv_access) AS sa ON sa.ank_id = s.srv_id " . "WHERE s.active = '1' AND msu.maza_user_id = '$global_user_id' AND sa.maza_user_id = '$global_user_id' AND sa.datetime_unsubscribed IS NULL$surveyWhere;"; //cookies of surveys for all active surveys of this user $uarray = sisplet_query($Sql, 'array'); //do we have any active survey with data entries? $dataEntryArray = null; //create array of users surveys to later access it $cookies_array = array(); foreach($uarray as $row){ //if we have a entry mode and didnt get data entry array yet, run it if($dataEntryArray == null && $row['mode'] == 'entry'){ $dataEntryArray = $this->getDataEntryArray(); } $link = $row['url'].'a/'.$row['srv_id'].'&survey-'.$row['srv_id'].'='.$row['cookie']; $srv_version_datetime = ($row['srv_version_datetime'] != null && $row['unixver'] != null) ? $row["srv_version_datetime"] : $row["time_insert"]; $temp_date = new DateTime($srv_version_datetime); //$srv_version_datetime = $temp_date->format('Hi_d_m_Y'); $srv_version_timestamp = $row['unixver'] != null ? $row['unixver'] : $temp_date->getTimestamp(); $cookies_array[$row['srv_id']][$srv_version_timestamp] = array('status'=>$row['last_status'], 'link'=>$link, 'naslov'=>$row['naslov'], 'srv_id'=>$row['ank_id'], 'timestamp'=>$srv_version_timestamp, 'datetime'=>$srv_version_datetime, 'mode'=>$row['mode'], 'srv_version'=>$srv_version_datetime, 'latitude'=>$dataEntryArray[$row['srv_user_id']]['latitude'], 'longitude'=>$dataEntryArray[$row['srv_user_id']]['longitude'], 'srv_user_id'=>$row['srv_user_id']); } //set users timezone (all calculations are for users timezone) $dateTz = new DateTimeZone($timeZone); //what is now a time of users device $Udate = new DateTime("now", $dateTz); //get offset in hours of user timezone versus server timezone (for calculations of datetime from DB) $offset = $dateTz->getOffset($Udate)-date('Z'); //set users timestamp based on time of DB datetimes $user_timestamp_now = $Udate->getTimestamp()+$offset; //geofences $sql_geo = sisplet_query("SELECT g.ank_id, tg.id, tg.geof_id, tg.triggered_timestamp, g.address, g.name, g.trigger_survey, s.naslov, s.url, sa.ank_id, sa.maza_user_id, sa.datetime_unsubscribed " . "FROM maza_srv_triggered_geofences AS tg " . "LEFT JOIN (SELECT ank_id, geofence_on, id, address, name, trigger_survey FROM maza_srv_geofences) AS g ON g.id=tg.geof_id " . "LEFT JOIN (SELECT id as srv_id, active, naslov, url FROM srv_anketa) AS s ON g.ank_id = s.srv_id " . "LEFT JOIN (SELECT maza_user_id, ank_id, datetime_unsubscribed FROM maza_user_srv_access) AS sa ON sa.ank_id = g.ank_id " . "WHERE tg.maza_user_id='$global_user_id' AND s.active = '1' AND sa.maza_user_id = '$global_user_id' AND sa.datetime_unsubscribed IS NULL$surveyWhere;", 'array'); //this survey has geofencing if (count($sql_geo) > 0) { foreach($sql_geo as $tgeo){ if($tgeo['trigger_survey']!=null){ $triggered_datetime = new DateTime($tgeo['triggered_timestamp']); $triggered_timestamp = $triggered_datetime->getTimestamp(); $link = isset($cookies_array[$tgeo['ank_id']][$triggered_timestamp]) ? $cookies_array[$tgeo['ank_id']][$triggered_timestamp]['link'] : $tgeo['url'].'a/'.$tgeo['ank_id']; $user_status = isset($cookies_array[$tgeo['ank_id']][$triggered_timestamp]) ? $cookies_array[$tgeo['ank_id']][$triggered_timestamp]['status'] : ''; $srv_user_id = isset($cookies_array[$tgeo['ank_id']][$triggered_timestamp]) ? $cookies_array[$tgeo['ank_id']][$triggered_timestamp]['srv_user_id'] : ''; //$srv_version = $temp_date->format('Hi_d_m_Y'); /*$new_array = array('timestamp' => $triggered_timestamp, 'datetime' => $tgeo['triggered_timestamp'], 'srv_id' => $tgeo['ank_id'], 'naslov' => $tgeo['naslov'], 'name' => $tgeo['name'], 'srv_version' => $tgeo['triggered_timestamp'], 'link' => $link, 'status' => $user_status, 'address' => $tgeo['address'], 'tgeof_id' => $tgeo['id'], 'mode' => 'geofence', 'srv_user_id'=>$srv_user_id);*/ $unfinished = $user_status == 6 ? 0 : 1; if(isset($json_array[$tgeo['ank_id']]['surveys'])){ $json_array[$tgeo['ank_id']]['surveys'][]=array('timestamp' => $triggered_timestamp, 'datetime' => $tgeo['triggered_timestamp'], 'srv_version' => $tgeo['triggered_timestamp'], 'link' => $link, 'status' => $user_status, 'tgeof_id' => $tgeo['id'], 'mode' => 'geofence', 'srv_user_id'=>$srv_user_id, 'name' => $tgeo['name'], 'address' => $tgeo['address']); $json_array[$tgeo['ank_id']]['unfinished_cnt']+=$unfinished; } else{ $json_array[$tgeo['ank_id']]=array('srv_id' => $tgeo['ank_id'], 'naslov' => $tgeo['naslov'], 'unfinished_cnt' => $unfinished, 'surveys' => array(array('timestamp' => $triggered_timestamp, 'datetime' => $tgeo['triggered_timestamp'], 'srv_version' => $tgeo['triggered_timestamp'], 'link' => $link, 'status' => $user_status, 'tgeof_id' => $tgeo['id'], 'mode' => 'geofence', 'srv_user_id'=>$srv_user_id, 'name' => $tgeo['name'], 'address' => $tgeo['address']))); } //array_push($json_array, $new_array); if(isset($cookies_array[$tgeo['ank_id']][$triggered_timestamp])) unset($cookies_array[$tgeo['ank_id']][$triggered_timestamp]); } } } //activity $sql_act = sisplet_query("SELECT a.ank_id, ta.id, ta.act_id, ta.triggered_timestamp, s.naslov, s.url, sa.ank_id, sa.maza_user_id, sa.datetime_unsubscribed " . "FROM maza_srv_triggered_activities AS ta " . "LEFT JOIN (SELECT ank_id, activity_on, id FROM maza_srv_activity) AS a ON a.id=ta.act_id " . "LEFT JOIN (SELECT id as srv_id, active, naslov, url FROM srv_anketa) AS s ON a.ank_id = s.srv_id " . "LEFT JOIN (SELECT maza_user_id, ank_id, datetime_unsubscribed FROM maza_user_srv_access) AS sa ON sa.ank_id = g.ank_id " . "WHERE ta.maza_user_id='$global_user_id' AND s.active = '1' AND sa.maza_user_id = '$global_user_id' AND sa.datetime_unsubscribed IS NULL$surveyWhere;", 'array'); //this survey has activities if (count($sql_act) > 0) { foreach($sql_act as $tact){ $triggered_datetime = new DateTime($tact['triggered_timestamp']); $triggered_timestamp = $triggered_datetime->getTimestamp(); $link = isset($cookies_array[$tact['ank_id']][$triggered_timestamp]) ? $cookies_array[$tact['ank_id']][$triggered_timestamp]['link'] : $tact['url'].'a/'.$tact['ank_id']; $user_status = isset($cookies_array[$tact['ank_id']][$triggered_timestamp]) ? $cookies_array[$tact['ank_id']][$triggered_timestamp]['status'] : ''; $srv_user_id = isset($cookies_array[$tact['ank_id']][$triggered_timestamp]) ? $cookies_array[$tact['ank_id']][$triggered_timestamp]['srv_user_id'] : ''; //$srv_version = $temp_date->format('Hi_d_m_Y'); /*$new_array = array('timestamp' => $triggered_timestamp, 'datetime' => $tact['triggered_timestamp'], 'srv_id' => $tact['ank_id'], 'naslov' => $tact['naslov'], 'srv_version' => $tact['triggered_timestamp'], 'link' => $link, 'status' => $user_status, 'tact_id' => $tact['id'], 'mode' => 'activity', 'srv_user_id'=>$srv_user_id);*/ $unfinished = $user_status == 6 ? 0 : 1; if(isset($json_array[$tact['ank_id']]['surveys'])){ $json_array[$tgeo['ank_id']]['surveys'][]= array('timestamp' => $triggered_timestamp, 'datetime' => $tact['triggered_timestamp'], 'srv_version' => $tact['triggered_timestamp'], 'link' => $link, 'status' => $user_status, 'tact_id' => $tact['id'], 'mode' => 'activity', 'srv_user_id'=>$srv_user_id); $json_array[$tgeo['ank_id']]['unfinished_cnt']+=$unfinished; } else $json_array[$tact['ank_id']]=array('srv_id' => $tact['ank_id'], 'naslov' => $tact['naslov'], 'unfinished_cnt' => $unfinished, 'surveys' => array(array('timestamp' => $triggered_timestamp, 'datetime' => $tact['triggered_timestamp'], 'srv_version' => $tact['triggered_timestamp'], 'link' => $link, 'status' => $user_status, 'tact_id' => $tact['id'], 'mode' => 'activity', 'srv_user_id'=>$srv_user_id))); //array_push($json_array, $new_array); if(isset($cookies_array[$tact['ank_id']][$triggered_timestamp])) unset($cookies_array[$tact['ank_id']][$triggered_timestamp]); } } foreach($sarray as $survey){ //if($survey["repeater_on"] != '2'){ //survey with no repeater if($survey["repeater_on"] == '0'){ //only basic survey with no answer if(($survey['geofences'] == null || $survey['geofences'] == '0') && ($survey['activities'] == null || $survey['activities'] == '0') && ($survey['entry_on'] == null || $survey['entry_on'] == '0') && ($survey['tracking_on'] == null || $survey['tracking_on'] == '0') && !isset($cookies_array[$survey['srv_id']])){ $link = $survey['url'].'a/'.$survey['srv_id']; $user_status = ''; $temp_timestamp = strtotime($survey['starts']); //$srv_version = $temp_date->format('Hi_d_m_Y'); /*$new_array = array('timestamp' => $temp_timestamp, 'datetime' => $survey['starts'], 'srv_id' => $survey['srv_id'], 'naslov' => $survey['naslov'], 'srv_version' => '', 'link' => $link, 'status' => $user_status, 'mode' => 'basic', 'srv_user_id'=>'');*/ $json_array[$survey['srv_id']] = array('srv_id' => $survey['srv_id'], 'naslov' => $survey['naslov'], 'unfinished_cnt' => 1, 'surveys' => array(array('timestamp' => $temp_timestamp, 'datetime' => $survey['starts'], 'link' => $link, 'srv_version' => '', 'status' => $user_status, 'mode' => 'basic', 'srv_user_id'=>''))); //array_push($json_array, $new_array); } } //survey with repeater else{ //use latest datetime to start repeater for this user (when repeater started or when user accessed) $Accessdate = new DateTime($survey["datetime_started"]); $Startdate = new DateTime($survey["datetime_start"]); $Startdate = $Startdate < $Accessdate ? $Accessdate : $Startdate; $Startdate_string = $Startdate->format('Y-m-d'); //if, based on timezone user-server differences, users timestamp is less than starting of repeater, there are no avalible surveys yet //we have to wait until users date and time gets at least to date and time of servers datetime of repeater started if(strtotime($Startdate_string) <= $user_timestamp_now /*&& $user_timestamp_now <= $Endtimestamp*/){ switch($survey["repeat_by"]){ case 'everyday': $temp_date_by_day = new DateTime($Startdate_string); $edited_arr = $this->createArrayRepeater($json_array, $temp_date_by_day, $user_timestamp_now, $survey, $cookies_array, 1); $json_array = $edited_arr['surveys']; $cookies_array = $edited_arr['cookies']; break; case 'daily': $temp_date_by_day = new DateTime($Startdate_string); $edited_arr = $this->createArrayRepeater($json_array, $temp_date_by_day, $user_timestamp_now, $survey, $cookies_array, $survey['every_which_day']); $json_array = $edited_arr['surveys']; $cookies_array = $edited_arr['cookies']; break; case 'weekly': foreach(json_decode($survey['day_in_week']) as $dayinweek){ $temp_date_by_day = new DateTime($Startdate_string); $dayinweek_string = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; if($temp_date_by_day->format('l') != $dayinweek_string[$dayinweek-1]) $temp_date_by_day->modify('next '.$dayinweek_string[$dayinweek-1]); $edited_arr = $this->createArrayRepeater($json_array, $temp_date_by_day, $user_timestamp_now, $survey, $cookies_array, 7); $json_array = $edited_arr['surveys']; $cookies_array = $edited_arr['cookies']; } break; } } } //} } //for data entry surveys and basic survey with answer foreach($cookies_array as $survey){ foreach($survey as $cookie){ //include basic survey with answer and data entry if it is still on if(!isset($cookie['mode']) || ($cookie['mode'] == 'entry')){ //array_push($json_array, $cookie); if(isset($json_array[$cookie['srv_id']]['surveys'])) $json_array[$cookie['srv_id']]['surveys'][] = $cookie; else $json_array[$cookie['srv_id']] = array('srv_id' => $cookie['srv_id'], 'naslov' => $cookie['naslov'], 'surveys'=>array($cookie)); $json_array[$cookie['srv_id']]['unfinished_cnt']+=($cookie['status']==6 ? 0:1); } } } //krsort($json_array); //tole mislim da sicer razvrsti, ampak pobrise keye /*usort($json_array, function ($a, $b) { return -strcmp($a['timestamp'], $b['timestamp']); });*/ return $json_array; } /** * Get array of data entry latitude and longitude values from answers * @global type $global_user_id * @return type array of data with usr_id as keys */ private function getDataEntryArray(){ global $global_user_id; $dataEntryArray = array(); $Sql = "SELECT * FROM maza_srv_users AS msu " . "LEFT JOIN (SELECT id, ank_id FROM srv_user) AS su ON msu.srv_user_id = su.id " . "LEFT JOIN (SELECT id AS srv_id, active FROM srv_anketa) AS s ON su.ank_id = s.srv_id " . "LEFT JOIN (SELECT id as gru_id, ank_id FROM srv_grupa) AS gru ON su.ank_id = gru.ank_id " . "LEFT JOIN (SELECT id AS lat_spr_id, gru_id FROM srv_spremenljivka WHERE variable='latitude' AND sistem='1') AS spr1 ON gru.gru_id = spr1.gru_id " . "LEFT JOIN (SELECT text as latitude, usr_id, spr_id FROM srv_data_text_active) AS dt1 ON msu.srv_user_id = dt1.usr_id AND dt1.spr_id = spr1.lat_spr_id " . "LEFT JOIN (SELECT id AS lng_spr_id, gru_id FROM srv_spremenljivka WHERE variable='longitude' AND sistem='1') AS spr2 ON gru.gru_id = spr2.gru_id " . "LEFT JOIN (SELECT text as longitude, usr_id, spr_id FROM srv_data_text_active) AS dt2 ON msu.srv_user_id = dt2.usr_id AND dt2.spr_id = spr2.lng_spr_id " . "WHERE s.active = '1' AND msu.maza_user_id = '$global_user_id' AND msu.mode='entry' AND dt1.latitude IS NOT NULL AND dt2.longitude IS NOT NULL;"; //coordinates of data entries for all active surveys of this user $entryarray = sisplet_query($Sql, 'array'); foreach($entryarray as $array){ $dataEntryArray[$array['srv_user_id']] = $array; } return $dataEntryArray; } /** * MAZA function * Creates or modifies a json array of surveys with repeater * @param type $json_array - array to modify or empty array * @param type $temp_date_by_day - DateTime object of starting day * @param type $user_timestamp_now - timestamp of users now (by users timezone) * @param type $survey - array of surveys and repeaters data for survey, to which user has access * @param type $cookies_array - array of existing surveys for this user * @param type $every_which_day - every which day has to be repeated (every day - 1, weekly - 7,...) * @return type json array of surveys for this user */ private function createArrayRepeater($json_array, $temp_date_by_day, $user_timestamp_now, $survey, $cookies_array, $every_which_day){ //get ending timestamp time of repeater $Endtimestamp = $survey["datetime_end"] != null ? (new DateTime($survey["datetime_end"]))->getTimestamp() : null; //loop until users timestamp of now while($temp_date_by_day->getTimestamp() <= $user_timestamp_now && ($Endtimestamp != null ? $temp_date_by_day->getTimestamp() <= $Endtimestamp : true)){ //iterate trough times in day foreach(json_decode($survey['time_in_day']) as $timeinday){ //set temporary datetime of given date and time in day $temp_date = DateTime::createFromFormat('Y-m-d Hi', $temp_date_by_day->format('Y-m-d').' '.$timeinday); $temp_date_timestamp = $temp_date->getTimestamp(); if(/*$temp_date_timestamp > strtotime($survey["datetime_started"]) &&*/ $temp_date_timestamp < $user_timestamp_now){ $srv_version = $temp_date->format('Hi_d_m_Y'); $link = isset($cookies_array[$survey['srv_id']][$temp_date_timestamp]) ? $cookies_array[$survey['srv_id']][$temp_date_timestamp]['link'] : $survey['url'].'a/'.$survey['srv_id']; $user_status = isset($cookies_array[$survey['srv_id']][$temp_date_timestamp]) ? $cookies_array[$survey['srv_id']][$temp_date_timestamp]['status'] : ''; $srv_user_id = isset($cookies_array[$survey['srv_id']][$temp_date_timestamp]) ? $cookies_array[$survey['srv_id']][$temp_date_timestamp]['srv_user_id'] : ''; /*$new_array = array('timestamp' => $temp_date_timestamp, 'datetime' => $temp_date->format('Y-m-d H:i:s'), 'srv_id' => $survey['srv_id'], 'naslov' => $survey['naslov'], 'srv_version' => $srv_version, 'link' => $link, 'status' => $user_status, 'mode' => 'repeater', 'srv_user_id'=>$srv_user_id);*/ //array_push($json_array, $new_array); $unfinished = $user_status == 6 ? 0:1; $survey_array = array('timestamp' => $temp_date_timestamp, 'datetime' => $temp_date->format('Y-m-d H:i:s'), 'link' => $link, 'srv_version' => $srv_version, 'status' => $user_status, 'mode' => 'repeater', 'srv_user_id'=>$srv_user_id); if(isset($json_array[$survey['srv_id']]['surveys'])){ array_push($json_array[$survey['srv_id']]['surveys'], $survey_array); $json_array[$survey['srv_id']]['unfinished_cnt']+=$unfinished; } else $json_array[$survey['srv_id']] = array('srv_id' => $survey['srv_id'], 'naslov' => $survey['naslov'], 'unfinished_cnt' => $unfinished, 'surveys'=>array($survey_array)); if(isset($cookies_array[$survey['srv_id']][$temp_date_timestamp])) unset($cookies_array[$survey['srv_id']][$temp_date_timestamp]); } } //increase date by given number of days $temp_date_by_day->modify('+'.$every_which_day.' day'); } $result = array('surveys' => $json_array, 'cookies' => $cookies_array); return $result; } //END MAZA }