2020-08-14 13:36:36 +02:00
< ? php
/**
* Analize urejanja
*
* Author : Uroš Podkrižnik
* Created : 14.4 . 2017
*/
define ( 'GRAPH_REDUCE' , '1.22' ); # količnik za koliko zmanjšamo širino grafa da ne prebije
class SurveyEditsAnalysis {
private $anketa ; # id ankete
private $db_table ; # katere tabele uporabljamo
function __construct ( $anketa ){
if (( int ) $anketa > 0 ){
$this -> anketa = $anketa ;
# polovimo vrsto tabel (aktivne / neaktivne)
SurveyInfo :: getInstance () -> SurveyInit ( $this -> anketa );
if ( SurveyInfo :: getInstance () -> getSurveyColumn ( 'db_table' ) == 1 ) {
$this -> db_table = '_active' ;
}
}
else {
echo 'Invalid Survey ID!' ;
exit ();
}
}
function displayTable (){
global $lang ;
// Legenda statusov
$statuses = array (
- 1 => $lang [ 'srv_vsi' ],
0 => $lang [ 'srv_urejanje' ],
1 => $lang [ 'import_data' ],
2 => $lang [ 'export_analisys' ],
3 => $lang [ 'srv_reporti' ],
4 => $lang [ 'srv_podatki' ],
5 => $lang [ 'srv_inv_nav_email' ],
20 => $lang [ 'srv_hierarchy' ], // Splošni podatki o hierarhiji
21 => $lang [ 'srv_hierarchy_structure' ], // Grajenje hierarhije
22 => $lang [ 'srv_hierarchy_users' ], // Urejanje uporabnikov
);
//se ponovi v funkciji ajax_drawContinuEditsTable
if ( $_GET [ 'seansa' ] > 0 )
$seansa = $_GET [ 'seansa' ];
else
$seansa = '30' ;
if ( isset ( $_GET [ 'time' ]))
$time = $_GET [ 'time' ];
else
$time = '1 month' ;
if ( isset ( $_GET [ 'status' ]))
$status = $_GET [ 'status' ];
else
$status = 0 ;
if ( isset ( $_GET [ 'from' ]))
$from = $_GET [ 'from' ];
else
$from = '' ;
if ( isset ( $_GET [ 'to' ]))
$to = $_GET [ 'to' ];
else
$to = '' ;
echo '<form id="diagnostics_form" action="index.php" method="get">' ;
echo '<input type="hidden" name="a" value="edits_analysis" />' ;
echo '<input type="hidden" name="anketa" value="' . $this -> anketa . '" />' ;
echo '' . $lang [ 'srv_edits_analysis_seansa' ] . ' <select name="seansa" onchange="this.form.submit();">' ;
echo '<option value="5"' . ( $seansa == '5' ? ' selected' : '' ) . '>' . $lang [ 'srv_edits_analysis_seansa_5min' ] . '</option>' ;
echo '<option value="10"' . ( $seansa == '10' ? ' selected' : '' ) . '>' . $lang [ 'srv_edits_analysis_seansa_10min' ] . '</option>' ;
echo '<option value="30"' . ( $seansa == '30' ? ' selected' : '' ) . '>' . $lang [ 'srv_edits_analysis_seansa_30min' ] . '</option>' ;
echo '<option value="60"' . ( $seansa == '60' ? ' selected' : '' ) . '>' . $lang [ 'srv_edits_analysis_seansa_1h' ] . '</option>' ;
echo '</select> ' ;
echo '' . $lang [ 'status' ] . ' <select name="status" id="edits_analysis_status" onchange="this.form.submit();">' ;
echo '<option value="-1"' . ( $status == - 1 ? ' selected' : '' ) . '>' . $statuses [ - 1 ] . '</option>' ;
echo '<option value="0"' . ( $status == 0 ? ' selected' : '' ) . '>' . $statuses [ 0 ] . '</option>' ;
echo '<option value="1"' . ( $status == 1 ? ' selected' : '' ) . '>' . $statuses [ 1 ] . '</option>' ;
echo '<option value="2"' . ( $status == 2 ? ' selected' : '' ) . '>' . $statuses [ 2 ] . '</option>' ;
echo '<option value="3"' . ( $status == 3 ? ' selected' : '' ) . '>' . $statuses [ 3 ] . '</option>' ;
echo '<option value="4"' . ( $status == 4 ? ' selected' : '' ) . '>' . $statuses [ 4 ] . '</option>' ;
echo '<option value="5"' . ( $status == 5 ? ' selected' : '' ) . '>' . $statuses [ 5 ] . '</option>' ;
/* echo '<option value="20"' . ( $status == 20 ? ' selected' : '' ) . '>' . $statuses [ 20 ] . '</option>' ;
echo '<option value="21"' . ( $status == 21 ? ' selected' : '' ) . '>' . $statuses [ 21 ] . '</option>' ;
echo '<option value="22"' . ( $status == 22 ? ' selected' : '' ) . '>' . $statuses [ 22 ] . '</option>' ; */
echo '</select> ' . $lang [ 'srv_diagnostics_in' ] . ' ' ;
echo '<select id="diagnostics_date_selected" name="time" onchange="diagnosticsChooseDate();">' ;
/* echo '<option value="10 minute"' . ( $time == '10 minute' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_10 minute' ] . '</option>' ;
echo '<option value="30 minute"' . ( $time == '30 minute' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_30 minute' ] . '</option>' ; */
echo '<option value="lifetime"' . ( $time == 'lifetime' ? ' selected' : '' ) . '>' . $lang [ 'srv_edits_analysis_period_lifetime' ] . '</option>' ;
echo '<option value="1 hour"' . ( $time == '1 hour' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_1 hour' ] . '</option>' ;
echo '<option value="6 hour"' . ( $time == '6 hour' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_6 hour' ] . '</option>' ;
echo '<option value="12 hour"' . ( $time == '12 hour' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_12 hour' ] . '</option>' ;
echo '<option value="1 day"' . ( $time == '1 day' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_1 day' ] . '</option>' ;
echo '<option value="2 day"' . ( $time == '2 day' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_2 day' ] . '</option>' ;
echo '<option value="5 day"' . ( $time == '5 day' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_5 day' ] . '</option>' ;
echo '<option value="7 day"' . ( $time == '7 day' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_7 day' ] . '</option>' ;
echo '<option value="14 day"' . ( $time == '14 day' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_14 day' ] . '</option>' ;
echo '<option value="1 month"' . ( $time == '1 month' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_1 month' ] . '</option>' ;
echo '<option value="3 month"' . ( $time == '3 month' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_3 month' ] . '</option>' ;
echo '<option value="6 month"' . ( $time == '6 month' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_6 month' ] . '</option>' ;
echo '<option id="option_99date" value="99date"' . ( $time == '99date' ? ' selected' : '' ) . '>' . $lang [ 'srv_diagnostics_choose_date' ] . '</option>' ;
echo '</select> ' ;
// Datum - od
echo '' . $lang [ 'srv_diagnostics_orfrom' ] . ' <input type="text" id="from" name="from" value="' . $from . '" ' . ( $time != '99date' ? ' disabled' : '' ) . ' />' ;
echo ' <span class="faicon calendar_icon icon-as_link" onclick="changeSelectOption()" id="from_img"></span>' ;
// Datum - do
echo ' ' . $lang [ 'srv_diagnostics_to' ] . ' <input type="text" id="to" name="to" value="' . $to . '" ' . ( $time != '99date' ? ' disabled' : '' ) . '/>' ;
echo ' <span class="faicon calendar_icon icon-as_link" onclick="changeSelectOption()" id="to_img"></span>' ;
echo '<input type="submit" class="spaceLeft pointer" value="' . $lang [ 'hour_show' ] . '" />' ;
echo '</form><div>' ;
//create iterval - SQL where statement
$interval = $this -> createInterval ( $time , $from , $to );
//get object of all edits data
$data = $this -> getData ( $status , $interval );
if ( sizeof ( $data ) == 0 )
$this -> echoNoData ();
else {
echo '<div id="edits_analysis_time_tables">' ;
echo '<div>' ;
$sum_data = $this -> drawTimeEdits ( $data [ 'timeEdits' ], $seansa * 60 , $status );
echo '</div>' ;
$this -> GraphData ( $this -> graphQuery ( $status , $interval ));
echo '</div>' ;
echo '<table class="dashboard" id="edits_analysis_info">' ;
echo '<tr>' ;
//draw edits counter and sums of editors
$this -> drawCountEdits ( $sum_data );
//draw continuous editing box
$continu_data = $this -> continuEditsQuery ( $status , $interval );
$this -> drawContinuEdits ( $continu_data , $sum_data );
echo '</tr>' ;
echo '</table>' ;
//prestavi vse tabele na konec, da bo info na vrhu
echo '<script>var myElement = document.getElementById("edits_analysis_time_tables");'
. 'myElement.parentNode.appendChild(myElement);</script>' ;
}
echo '</div>' ;
}
function GraphData ( $data ){
global $lang , $site_url ;
//error_log(json_encode($data));
//$DataSetJson = json_decode('{"Data":[{"Vrednosti":5,"Vrednosti2":2,"Name":0,"Variable":"0-1000"},{"Vrednosti":20,"Vrednosti2":15,"Name":1,"Variable":"1001-5000"},{"Vrednosti":20,"Vrednosti2":20,"Name":2,"Variable":"5001-10000"},{"Vrednosti":0,"Vrednosti2":8,"Name":3,"Variable":"10001-50000"}],'
// . '"DataDescription":{"Position":"Variable","Format":{"X":"number","Y":"number"},"Unit":{"X":null,"Y":null},"Values":["Vrednosti", "Vrednosti2"],"Description":{"Vrednosti":"prvi-prvi-prvi-prvi-prvi", "Vrednosti2":"drugi-drugi-drugi-drugi-drugi"}},"numerus":45,"average":4721,"Other":[]}');
//polnimo podatke
$DataSet = new pData ;
$vrednosti = array ();
$vrednostiVariable = array ();
$avg_count = 0 ;
$avg_sum = 0 ;
/* foreach ( $DataSetJson -> Data as $value ){
$vrednosti [] = $value -> Vrednosti ;
$vrednosti2 [] = $value -> Vrednosti2 ;
$avg_sum += $value -> Vrednosti ;
$vrednostiVariable [] = $value -> Variable ;
$avg_count ++ ;
} */
$start_date = new DateTime ( $data [ 'first_date' ]);
$temp_date = $start_date ;
$end_date = new DateTime ( $data [ 'last_date' ]);
$diff = $this -> differDateTimeInDays ( $start_date , $end_date );
$DayFormat = '' ;
$DayIncrease = 'month' ;
if ( $diff < 32 ){
$DayFormat = '-d' ;
$DayIncrease = 'day' ;
}
else
$temp_date -> setDate ( $start_date -> format ( 'Y' ), $start_date -> format ( 'm' ), 1 );
while ( $temp_date <= $end_date ){
foreach ( $data [ 'edits' ] as $user => $value ){
$datestring = $temp_date -> format ( 'Y-m' . $DayFormat );
$cnt = isset ( $value [ $datestring ]) ? $value [ $datestring ] : 0 ;
$vrednosti [ $user ][] = $cnt ;
$avg_sum += $cnt ;
}
$vrednostiVariable [] = $datestring ;
$avg_count ++ ;
$temp_date -> modify ( '+1 ' . $DayIncrease );
}
foreach ( $data [ 'edits' ] as $user => $value ){
$DataSet -> AddPoint ( $vrednosti [ $user ], $user );
$DataSet -> AddSerie ( $user );
$DataSet -> SetSerieName ( $user , $user );
}
// nastavimo NUMERUS, ki se izpise pod legendo
$numerus = $avg_sum ;
$DataSet -> SetNumerus ( $numerus );
// nastavimo POVPRECJE
$avg = ( $avg_count > 0 ) ? $avg_sum / $avg_count : 0 ;
$DataSet -> SetAverage ( round ( $avg , 1 ));
$DataSet -> AddPoint ( $vrednostiVariable , " Variable " );
$DataSet -> SetAbsciseLabelSerie ( " Variable " );
//$DataSet->SetYAxisUnit("null");
$DataSet -> SetYAxisFormat ( " number " );
2021-01-29 10:55:01 +01:00
$Cache = new pCache ( dirname ( __FILE__ ) . '/../../pChart/Cache/' );
2020-08-14 13:36:36 +02:00
$ID = self :: generateChartId ( $DataSet -> GetNumerus ());
echo '<div style="margin-top:-2.5em;">' ;
echo '<div class="chart_holder" style="margin: auto !important; width: auto !important;" id="chart_edits_' . $this -> anketa . '">' ;
echo '<div class="chart_title" style="width: auto !important">' . $lang [ 'srv_edits_analysis_graph' ];
echo '<span class="numerus">' ;
echo '(n = ' . $DataSet -> GetNumerus () . ')' ;
echo '</span>' ;
echo '</div>' ;
if ( ! $Cache -> isInCache ( $ID , $DataSet -> GetData ())){
$graph = SurveyChart :: createLine ( $DataSet , null , 1 );
$Cache -> WriteToCache ( $ID , $DataSet -> GetData (), $graph );
}
// dobimo ime slike c cache-u
$imgName = $Cache -> GetHash ( $ID , $DataSet -> GetData ());
$imgPath = 'pChart/Cache/' . $imgName ;
$imgUrl = $site_url . 'admin/survey/' . $imgPath ;
echo '<div class="chart_img" style="float: none !important" title="' . $lang [ 'srv_edits_analysis_graph' ] . '">' ;
// dodamo timestamp ker browser shrani sliko v cache in jo v dolocenih primerih ajaxa ne refresha
echo '<img src="' . $imgUrl . '?' . time () . '" />' ;
echo '</div></div></div>' ;
}
/**
* Run querry for action times
* @ param type $status - int of status
* @ param type $interval - where clause for time interval
* @ return type array of results from DB
*/
function graphQuery ( $status , $interval ){
$sql2 = " SELECT min(DATE_FORMAT(st.datetime, '%Y-%m-%d')) as first_date, max(DATE_FORMAT(st.datetime, '%Y-%m-%d')) as last_date "
. " FROM srv_tracking $this->db_table st, users u WHERE st.ank_id=' $this->anketa ' AND u.id = st.user " .
( $status != - 1 ? " AND st.status= $status " : " " ) . " $interval " ;
$output2 = sisplet_query ( $sql2 , 'obj' );
$diff = $this -> differDateTimeInDays ( new DateTime ( $output2 -> first_date ), new DateTime ( $output2 -> last_date ));
$queryDayFormat = '' ;
$queryDayGroup = '' ;
if ( $diff < 32 ){
$queryDayFormat = '-%d' ;
$queryDayGroup = ', DAY(st.datetime)' ;
}
$sql = " SELECT count(*) as cnt, u.email, u.id, DATE_FORMAT(st.datetime, '%Y-%m $queryDayFormat ') as date "
. " FROM srv_tracking $this->db_table st, users u WHERE st.ank_id=' $this->anketa ' AND u.id = st.user " .
( $status != - 1 ? " AND st.status= $status " : " " ) . " $interval "
. " GROUP BY u.email, YEAR(st.datetime), MONTH(st.datetime) $queryDayGroup "
. " ORDER BY u.email, date ASC " ;
$output = sisplet_query ( $sql , 'array' );
$data = array ( 'edits' => array (), 'first_date' => $output2 -> first_date , 'last_date' => $output2 -> last_date );
foreach ( $output as $row ){
$data [ 'edits' ][ $row [ 'email' ]][ $row [ 'date' ]] = $row [ 'cnt' ];
}
return $data ;
}
private function differDateTimeInDays ( $start_date , $end_date ){
return $end_date -> diff ( $start_date ) -> format ( " %a " );
}
// Zgeneriramo ID grafa za hash
private function generateChartId ( $numerus ){
$ID = $this -> anketa . '_chart_' . $numerus . 'edits_analysis' ;
return $ID ;
}
/**
* Get data to show in table
*
* @ param type $status - status or type of edits
* @ param type $interval - where statement including interval for SQL
* @ return type
*/
function getData ( $status , $interval ){
$data = array ();
$data_temp = $this -> timeEditsQuery ( $status , $interval );
if ( sizeof ( $data_temp ) == 0 )
return array ();
else
$data [ 'timeEdits' ] = $data_temp ;
return $data ;
}
/**
* Create interval for SQL query from criteria
*
* @ param type $time - time selected from dropdown
* @ param type $from - from calendat
* @ param type $to - to calendar
* @ return type - string WHERE statement
*/
function createInterval ( $time , $from , $to ){
if ( $time == 'lifetime' || ( $time == '99date' && $from == '' && $to == '' ))
$interval = " " ;
else if ( $from == '' && $to == '' )
$interval = " AND st.datetime > NOW() - INTERVAL $time " ;
else if ( $to == '' )
$interval = " AND ' $from ' <= st.datetime " ;
else if ( $from == '' )
$interval = " AND st.datetime <= ' $to ' " ;
else
$interval = " AND ' $from ' <= st.datetime AND st.datetime <= ' $to ' " ;
return $interval ;
}
/**
* Run querry for action times
* @ param type $status - int of status
* @ param type $interval - where clause for time interval
* @ return type array of results from DB
*/
function timeEditsQuery ( $status , $interval ){
$sql = " SELECT u.email, u.id, st.datetime " . ( $status == 0 ? " , st.get, st.post " : " " ) . ( $status == - 1 ? " , st.status " : " " )
. " FROM srv_tracking $this->db_table st, users u WHERE st.ank_id=' $this->anketa ' AND u.id = st.user " .
( $status != - 1 ? " AND st.status= $status " : " " ) . " $interval ORDER BY u.email, st.datetime DESC " ;
return sisplet_query ( $sql , 'array' );
}
/**
* Draw box of number of edit actions
* @ global type $lang
* @ param type $data - object data of sums
*/
function drawCountEdits ( $data ){
global $lang ;
echo '<td>' ;
$sum_akcij = 0 ;
$sum_time = 0 ;
$sum_seans = 0 ;
echo '<div class="dashboard_cell" name="div_edits_analysis_counter" id="div_edits_analysis_counter" >' . " \n " ;
echo '<span class="floatLeft dashboard_title">' . $lang [ 'srv_edits_analysis_counter' ];
echo '</span>' ;
echo '<br class="clr"/><br/>' ;
echo '<span class="dashboard_status_span">' . $lang [ 'srv_edits_analysis_counter_editors' ] . ' :</span>' . sizeof ( $data ) . '<br/><br/>' ;
echo '<table id="tbl_answ_state">' ;
echo '<tr class="anl_dash_bb "><th><strong>' . $lang [ 'srv_edits_analysis_counter_editor' ] . '</strong></th>'
. '<td><strong>' . $lang [ 'srv_edits_analysis_time_time' ] . '</strong></td>'
. '<td><strong>' . $lang [ 'srv_edits_analysis_num_sessions' ] . '</strong></td>'
. '<td><strong>' . $lang [ 'srv_edits_analysis_time_actions' ] . '</strong></td></tr>' ;
foreach ( $data as $key => $value ) {
$this -> echoCountEditsRow ( $key , $this -> calculateTimeFromSeconds ( $value [ 'time_sum' ]), $value [ 'st_akcij_sum' ], $value [ 'st_seans_sum' ], $value [ 'user_id' ]);
$sum_akcij += $value [ 'st_akcij_sum' ];
$sum_time += $value [ 'time_sum' ];
$sum_seans += $value [ 'st_seans_sum' ];
}
// vsota vlejavnih
$this -> echoCounterEditsFootRow ( $sum_time , $sum_akcij , $sum_seans );
echo '</table>' ;
echo '</div>' ;
echo '</td>' ;
}
/**
* Run querry for continuous editing
* @ param type $status - int of status
* @ param type $interval - where clause for time interval
* @ param type $interval_criteria - criteria for interval - continued 'day' or 'hour'
* @ return type array of results from DB
*/
function continuEditsQuery ( $status , $interval , $interval_criteria = 'day' , $user_criteria = 'all' ){
$interval_criteria = ( $interval_criteria == 'day' ) ? '' : ' %H' ;
$sqlString = " SELECT DATE_FORMAT(st.datetime, '%Y-%m-%d $interval_criteria ') AS formatdate, count(*) as cnt FROM srv_tracking $this->db_table st WHERE ank_id = ' $this->anketa ' " .
( $status != - 1 ? " AND st.status= $status " : " " ) . " " .
( $user_criteria != 'all' ? " AND st.user= $user_criteria " : " " ) . " $interval GROUP BY formatdate ORDER BY formatdate desc " ;
return sisplet_query ( $sqlString , 'array' );
}
/**
* Draw box of continuous editing
* @ global type $lang
* @ param type $data - object data of continued editing
* @ param type $sum_data - object data of sums
* @ param type $interval_criteria - criteria for interval - continued 'day' or 'hour'
*/
function drawContinuEdits ( $data , $sum_data , $interval_criteria = 'day' ){
global $lang ;
echo '<td>' ;
echo '<div class="dashboard_cell" name="div_edits_analysis_countinu" id="div_edits_analysis_countinu" >' . " \n " ;
echo '<span class="floatLeft dashboard_title">' . $lang [ 'srv_edits_analysis_countinu' ];
echo '</span>' ;
echo '<br class="clr"/><br/>' ;
//user/s
echo '<span id="span_timelineDropDownType">' ;
echo $lang [ 'srv_edits_analysis_counter_editor' ] . ': ' ;
echo '<select id="edits_analysis_continu_user" name="edits_analysis_continu_user" onchange="editsAnalysisContinuousEditing();">' ;
echo '<option value="all" selected>' . $lang [ 'srv_edits_analysis_counter_all' ] . '</option>' ;
foreach ( $sum_data as $email => $row ) {
echo '<option value="' . $row [ 'user_id' ] . '">' . $email . '</option>' ;
}
echo '</select> ' ;
echo '</span>' ;
// Oblika
echo '<span>' ;
echo '<label>' . $lang [ 'srv_statistic_period' ] . '</label>:' . " \n " ;
echo '<select id="edits_analysis_continu_period" name="edits_analysis_continu_period" size="1" autocomplete="off" onchange="editsAnalysisContinuousEditing();">' . " \n " ;
echo '<option value="hour" ' . (( $interval_criteria == " hour " ) ? " selected " : " " ) . '>' . $lang [ 'srv_statistic_period_hour_period' ] . '</option>' ;
echo '<option value="day" ' . (( $interval_criteria == " day " ) ? " selected " : " " ) . '>' . $lang [ 'srv_statistic_period_day_period' ] . '</option>' ;
echo '</select>' . " \n " ;
echo '</span>' ;
//data table
echo '<div name="edits_analysis_continu_table" id="edits_analysis_continu_table" >' . " \n " ;
//draw table
$this -> drawContinuEditsTable ( $data , $interval_criteria );
echo '</div>' ;
}
/**
* Draw table with bars od continued editing
* @ param type $data - object data of continued editing
* @ param type $interval_criteria - criteria for interval - continued 'day' or 'hour'
*/
function drawContinuEditsTable ( $data , $interval_criteria = 'day' ){
$maxValue = 0 ;
$interval_seconds = ( $interval_criteria == 'day' ) ? 86400 : 3600 ;
$interval_crit = ( $interval_criteria == 'day' ) ? '' : ' H' ;
echo '<table class="survey_referals_tbl">' . " \n " ;
if ( $data ) {
$temp_time = null ;
//units
$zapored = 0 ;
$results = array ();
foreach ( $data as $row ) {
if ( $temp_time == null )
$temp_time = DateTime :: createFromFormat ( 'Y-m-d' . $interval_crit , $row [ 'formatdate' ]);
else {
//calculate seconds between actions (rounded on 3600 or 86400)
$interval = $this -> calculateTimeBetweenActions ( $temp_time , DateTime :: createFromFormat ( 'Y-m-d' . $interval_crit , $row [ 'formatdate' ]));
//if interval between actions are 1 unit (1 hour or 1 day), add it to continued editing session
if ( $interval / $interval_seconds - $zapored < 2 ){
$zapored ++ ;
//set maxValue, needed for width of bars
$maxValue = max ( $maxValue , $zapored );
}
//interval is more than 1 unit apart, not in continued editing session
else {
//if there is continued editing session until previous action, store it to array - ignore otherwise
if ( $zapored > 0 )
array_push ( $results , array ( 'time' => $temp_time , 'zapored' => $zapored ));
//restart all
$temp_time = DateTime :: createFromFormat ( 'Y-m-d' . $interval_crit , $row [ 'formatdate' ]);
$zapored = 0 ;
}
}
}
//if there is continued editing session in last actions, store it to array - ignore otherwise
if ( $zapored > 0 )
//$this->drawContinuRow($temp_time, $zapored, $maxValue, $value);
array_push ( $results , array ( 'time' => $temp_time , 'zapored' => $zapored ));
if ( ! $results )
$this -> echoNoData ();
else {
//reduce bars a little
$maxValue *= GRAPH_REDUCE ; //najvecje stevilo
//draw all data and bars
foreach ( $results as $row ) {
$this -> drawContinuRow ( $row [ 'time' ], $row [ 'zapored' ], $maxValue , $interval_criteria );
}
}
} else
$this -> echoNoData ();
echo '</table>' . " \n " ;
}
/**
* Draws a row with bar of continuous editing
* @ param type $temp_time - the last edit
* @ param type $zapored - hour of continuoed editing
* @ param type $maxValue - max value of bars
* @ param type $interval_criteria - criteria for interval - continued 'day' or 'hour'
*/
function drawContinuRow ( $temp_time , $zapored , $maxValue , $interval_criteria ){
$time_last = clone $temp_time ;
//edit DateTime get starting of continued editting session by subtracting units
$temp_time -> modify ( '- ' . $zapored . ' ' . $interval_criteria );
//if hour criteria
if ( $interval_criteria == 'hour' ){
//add 1 hour because of from to view
$time_last -> modify ( '+ 1 ' . $interval_criteria );
$s_time = $temp_time -> format ( 'Y-m-d H:00' ) . ' - ' . $time_last -> format ( 'H:00' );
}
else if ( $interval_criteria == 'day' )
$s_time = $temp_time -> format ( 'Y-m-d' ) . ' - ' . $time_last -> format ( 'Y-m-d' );
//echo data
echo '<tr>' . " \n " ;
echo '<td style="width:90px;">' . $s_time . '</td>' . " \n " ;
$width = ( $maxValue && $zapored ) ? ( round ( $zapored / $maxValue * 100 , 0 )) : " 0 " ;
echo '<td style=""><div class="graph_db" style="text-align:right; float:left; width:' . $width . '%"> </div><span style="display:block; margin:auto; margin-left:5px; width:20px; float:left">' . ( $zapored + 1 ) . '</span></td>' . " \n " ;
echo '</tr>' . " \n " ;
}
/**
* Draw box of editing times
* @ param type $data - $data [ 'timeEdits' ]
* @ param type $seansa - cas nastavljene dolzine seanse v min
* @ param type $status - code of status criteria
* @ return Object - object of editors e . g . { admin : { time_sum : 500 , st_akcij_sum : 30 , st_seans_sum : 5 }, ... }
*/
function drawTimeEdits ( $data , $seansa , $status ){
global $lang ;
$sum_data = array ();
$datetime_last = null ;
$datetime_start = null ;
$st_akcij = 0 ;
$st_akcij_sum = 0 ;
$st_seans_sum = 0 ;
$time_sum = 0 ;
$user_temp = null ;
$user_id = 0 ;
$row_id = 0 ;
$action_type = null ;
$action_type_sum = null ;
$statuses = null ;
if ( $status == - 1 ){
$statuses = array (
0 => array ( " name " => $lang [ 'srv_urejanje' ], " sum " => 0 ),
1 => array ( " name " => $lang [ 'import_data' ], " sum " => 0 ),
2 => array ( " name " => $lang [ 'export_analisys' ], " sum " => 0 ),
3 => array ( " name " => $lang [ 'srv_reporti' ], " sum " => 0 ),
4 => array ( " name " => $lang [ 'srv_podatki' ], " sum " => 0 ),
5 => array ( " name " => $lang [ 'srv_inv_nav_email' ], " sum " => 0 ),
//20 => array("name"=>$lang['srv_hierarchy'], "sum"=>0),// Splošni podatki o hierarhiji
//21 => array("name"=>$lang['srv_hierarchy_structure'], "sum"=>0),// Grajenje hierarhije
//22 => array("name"=>$lang['srv_hierarchy_users'], "sum"=>0),// Urejanje uporabnikov
);
$action_type = $statuses ;
$action_type_sum = $statuses ;
}
else if ( $status == 0 ){
$statuses = array ();
$action_type = array ();
$action_type_sum = array ();
}
echo '<h2>' . $lang [ " srv_edits_analysis_editing_details " ] . '</h2>' ;
foreach ( $data as $rowGrupa ) {
//$post = $this->convertToJSON($rowGrupa['post']);
$akcija = null ;
if ( $status == - 1 )
$akcija = $rowGrupa [ 'status' ];
else if ( $status == 0 ){
$get = $this -> convertToJSON ( $rowGrupa [ 'get' ]);
$akcija = $get [ 'a' ];
}
//zacetek risanja
if ( ! isset ( $user_temp )){
$user_temp = $rowGrupa [ 'email' ];
$user_id = $rowGrupa [ 'id' ];
echo '<table class="text_analysis_table floatLeft" border="1">' ; //border zaradi printa - css na strani ga povozi
$this -> echoTimeTalbeHeader ( $user_temp , $status , $user_id );
}
//naslednji editor
else if ( $user_temp != $rowGrupa [ 'email' ]){
//izrisi se zadnjo vrstico prejsnjega urejevalca
$time_sum += $this -> drawTimeEditsRow ( $datetime_start , $datetime_last , $st_akcij , $action_type , $user_id . '_' . $row_id );
$this -> echoTimeEditsFootRow ( $time_sum , $st_akcij_sum , $action_type_sum , $user_id . '_sum' );
$sum_data [ $user_temp ][ 'time_sum' ] = $time_sum ;
$sum_data [ $user_temp ][ 'st_akcij_sum' ] = $st_akcij_sum ;
$sum_data [ $user_temp ][ 'st_seans_sum' ] = $st_seans_sum ;
$sum_data [ $user_temp ][ 'user_id' ] = $user_id ;
$action_type_sum = $statuses ;
//nova tabela - nov urejevalec
$user_temp = $rowGrupa [ 'email' ];
$user_id = $rowGrupa [ 'id' ];
$this -> echoTimeTalbeHeader ( $user_temp , $status , $user_id );
//ponastavi spremenljivke
$datetime_last = null ;
$datetime_start = null ;
$st_akcij = 0 ;
$st_akcij_sum = 0 ;
$st_seans_sum = 0 ;
$time_sum = 0 ;
}
//izpis vrstic
//nov start seanse
if ( ! isset ( $datetime_start )){
$datetime_start = new DateTime ( $rowGrupa [ 'datetime' ]);
$st_akcij ++ ;
$st_seans_sum ++ ;
$action_type = $statuses ;
}
//se ni druge akcije
else if ( ! isset ( $datetime_last )){
$temp_time = new DateTime ( $rowGrupa [ 'datetime' ]);
$interval = $this -> calculateTimeBetweenActions ( $datetime_start , $temp_time );
//ce je akcija od starta v kriteriju seanse, jo dodaj k seansi
if ( $interval <= $seansa ){
$datetime_last = clone $temp_time ;
$st_akcij ++ ;
}
//akcija je izven kriterija seanse, izpisi samo to akcijo
else {
$datetime_last = clone $datetime_start ;
$datetime_last -> add ( new DateInterval ( 'PT5S' ));
$time_sum += $this -> drawTimeEditsRow ( $datetime_start , $datetime_last , $st_akcij , $action_type , $user_id . '_' . $row_id );
$st_akcij = 1 ;
$st_seans_sum ++ ;
$datetime_start = clone $temp_time ;
$datetime_last = null ;
$action_type = $statuses ;
}
}
//seasna ze ima vsaj dve akciji
else {
$temp_time = new DateTime ( $rowGrupa [ 'datetime' ]);
$interval = $this -> calculateTimeBetweenActions ( $datetime_last , $temp_time );
//ce je akcija od prejsnje v kriteriju seanse, jo dodaj k seansi
if ( $interval <= $seansa ){
$datetime_last = clone $temp_time ;
$st_akcij ++ ;
}
//akcija je izven kriterija seanse, izpisi vse prejsnje akcije
else {
$time_sum += $this -> drawTimeEditsRow ( $datetime_start , $datetime_last , $st_akcij , $action_type , $user_id . '_' . $row_id );
$st_akcij = 1 ;
$st_seans_sum ++ ;
$datetime_start = clone $temp_time ;
$datetime_last = null ;
$action_type = $statuses ;
}
}
$st_akcij_sum ++ ;
$row_id ++ ;
if ( $status == - 1 ){
$action_type [ $akcija ][ 'sum' ] ++ ;
$action_type_sum [ $akcija ][ 'sum' ] ++ ;
}
else if ( $status == 0 ){
$action_type [ $akcija ] = isset ( $action_type [ $akcija ]) ? $action_type [ $akcija ] + 1 : 1 ;
$action_type_sum [ $akcija ] = isset ( $action_type_sum [ $akcija ]) ? $action_type_sum [ $akcija ] + 1 : 1 ;
}
}
//izrisi se zadnjo vrstico, ki jo ni foreach ter footer
if ( $datetime_last == null ){
$datetime_last = clone $datetime_start ;
$datetime_last -> add ( new DateInterval ( 'PT5S' ));
}
$time_sum += $this -> drawTimeEditsRow ( $datetime_start , $datetime_last , $st_akcij , $action_type , $user_id . '_' . $row_id );
$this -> echoTimeEditsFootRow ( $time_sum , $st_akcij_sum , $action_type_sum , $user_id . '_sum' );
$sum_data [ $user_temp ][ 'time_sum' ] = $time_sum ;
$sum_data [ $user_temp ][ 'st_akcij_sum' ] = $st_akcij_sum ;
$sum_data [ $user_temp ][ 'st_seans_sum' ] = $st_seans_sum ;
$sum_data [ $user_temp ][ 'user_id' ] = $user_id ;
echo '</table>' ;
return $sum_data ;
}
/**
* Izrisi header tabele za cas urejanja vsakega urejevalca
* @ param type $user_temp - email of user
* @ param type $status - status from criteria
* @ param type $user_num - int sequence nuber of user ( unique , for this site , no need to be ID )
*/
function echoTimeTalbeHeader ( $user_temp , $status , $user_num ){
global $lang ;
echo '<tr id="edits_analysis_user_' . $user_num . '"><th colspan="100"><strong>' . $user_temp . '</strong></th></tr>' ;
echo '<tr><th>' . $lang [ 'srv_edits_analysis_time_span' ] . '</th><th>' . $lang [ 'srv_edits_analysis_time_time' ] .
'</th><th>' . $lang [ 'srv_edits_analysis_time_actions' ] . '</th>' . ( $status < 1 ? '<th>' . $lang [ 'srv_edits_analysis_action_type' ] . '</th>' : '' ) . '</tr>' ;
}
/**
* Nastavi in kasneje izrise vrstico urejanja
*
* @ param type $datetime_start - datetime start of editing
* @ param type $datetime_last - datetime end of editing
* @ param type $st_akcij - num ob actions during editing
* @ param type $action_type - string of type of action
* @ param type $row_id - int sequence nuber of row ( unique , for this site , no need to be ID )
* @ return type int - calculated second of editing session
*/
function drawTimeEditsRow ( $datetime_start , $datetime_last , $st_akcij , $action_type = null , $row_id = null ){
$seconds = 0 ;
//create string of actions type
$action_type_string = ( $action_type != null ) ? $this -> createActionsTypeString ( $action_type , $row_id ) : null ;
if ( isset ( $datetime_last )){
$seconds = $this -> calculateTimeBetweenActions ( $datetime_start , $datetime_last );
$this -> echoTimeEditsRow ( $datetime_last -> format ( 'Y-m-d H:i:s' ) . ' - ' . $datetime_start -> format ( 'Y-m-d H:i:s' ),
$this -> calculateTimeFromSeconds ( $seconds ), $st_akcij , $action_type_string );
}
//ce je samo ena akcija
else
$this -> echoTimeEditsRow ( $datetime_start -> format ( 'Y-m-d H:i:s' ), 0 , 1 , $action_type_string );
return $seconds ;
}
/**
* Create / convert array of action types to string for table cell
* @ param type $action_type - array of action types
* @ param type $row_id - int sequence nuber of row ( unique user int and row in table )
* @ return string - converter array to string to put it in table cell
*/
function createActionsTypeString ( $action_type , $row_id ){
$action_type_string = '' ;
//urejanje - ali drug specificen status
if ( ! isset ( $action_type [ 0 ][ 'sum' ])){
global $lang ;
$i = 0 ;
foreach ( $action_type as $key => $at ){
if ( $i == 3 )
$action_type_string .= '<div class="srv_edits_analysis_' . $row_id . ' as_link" onclick="$(\'.srv_edits_analysis_' . $row_id . '\').toggle();">' . $lang [ 'srv_more' ] . '</div>' ;
if ( $i < 3 )
$action_type_string .= '<div>' . $key . ' (' . $at . ')' . '</div>' ;
else
$action_type_string .= '<div class="srv_edits_analysis_' . $row_id . ' displayNone">' . $key . ' (' . $at . ')' . '</div>' ;
$i ++ ;
}
if ( $i > 3 )
$action_type_string .= '<div class="srv_edits_analysis_' . $row_id . ' as_link displayNone" onclick="$(\'.srv_edits_analysis_' . $row_id . '\').toggle();">' . $lang [ 'srv_less' ] . '</div>' ;
}
//vsi statusi
else {
foreach ( $action_type as $at ){
if ( $at [ 'sum' ] > 0 ){
if ( $action_type_string != '' )
$action_type_string .= '</br>' ;
$action_type_string .= $at [ 'name' ] . ' (' . $at [ 'sum' ] . ')' ;
}
}
}
return $action_type_string ;
}
/**
* Izrise vrstico urejanja
* @ param type $datetime - string from to editing
* @ param type $cas_seanse - editing time
* @ param type $st_akcij - num of editing actions
* @ param type $action_type - string of type of action
*/
function echoTimeEditsRow ( $datetime , $cas_seanse , $st_akcij , $action_type = null ){
//casovni razpon urejanja
echo '<tr><td>' . $datetime . '</td>' ;
//cas urejanja
echo '<td>' . $cas_seanse . '</td>' ;
//stevilo akcij
echo '<td>' . $st_akcij . '</td>' ;
if ( $action_type != null )
//vrsta akcij
echo '<td>' . $action_type . '</td>' ;
echo '</tr>' ;
}
/**
* Izrise vrstico editor info
* @ param type $user - string of editor
* @ param type $time_sum - editing time
* @ param type $st_akcij - num of sum editing actions
* @ param type $st_seans_sum - num of sessions
* @ param type $user_num - int sequence nuber of user ( unique user int and row in table )
*/
function echoCountEditsRow ( $user , $time_sum , $st_akcij , $st_seans_sum , $user_num ){
//casovni razpon urejanja
echo '<tr><th><a href="#edits_analysis_user_' . $user_num . '">' . $user . '</a></th>' ;
//cas urejanja
echo '<td>' . $time_sum . '</td>' ;
//stevilo seans
echo '<td>' . $st_seans_sum . '</td>' ;
//stevilo akcij
echo '<td>' . $st_akcij . '</td>' ;
echo '</tr>' ;
}
/**
* Izrise total / footer vrstico urejanja
* @ param type $time - seconds of editing
* @ param type $st_akcij - num of editing actions
* @ param type $action_type - string of type of actions
* @ param type $row_id - int sequence nuber of user ( unique , for this site , no need to be ID )
*/
function echoTimeEditsFootRow ( $time , $st_akcij , $action_type = null , $row_id = 0 ){
global $lang ;
//casovni razpon urejanja
echo '<tr class="colored"><td>' . $lang [ 'srv_edits_analysis_time_total' ] . '</td>' ;
//cas urejanja
echo '<td>' . $this -> calculateTimeFromSeconds ( $time ) . '</td>' ;
//stevilo akcij
echo '<td>' . $st_akcij . '</td>' ;
if ( $action_type != null )
//vrsta akcij
echo '<td>' . $this -> createActionsTypeString ( $action_type , $row_id ) . '</td>' ;
echo '</tr>' ;
}
/**
* Izrise total / footer vrstico urejanja
* @ param type $time - seconds of editing
* @ param type $st_akcij - num of editing actions
* @ param type $st_seans_sum - num of sessions
*/
function echoCounterEditsFootRow ( $time , $st_akcij , $st_seans_sum ){
global $lang ;
//casovni razpon urejanja
echo '<tr class="anl_dash_bt full strong"><th>' . $lang [ 'srv_edits_analysis_time_total' ] . '</th>' ;
//cas urejanja
echo '<td>' . $this -> calculateTimeFromSeconds ( $time ) . '</td>' ;
//stevilo seans
echo '<td>' . $st_seans_sum . '</td>' ;
//stevilo akcij
echo '<td>' . $st_akcij . '</td>' ;
echo '</tr>' ;
}
/**
* Calculate
* @ param type $datetime_start - datetime start of editing
* @ param type $datetime_last - datetime end of editing
* @ return type - float in time in minutes between actions
*/
function calculateTimeBetweenActions ( $datetime_start , $datetime_last ){
return abs ( $datetime_last -> getTimestamp () - $datetime_start -> getTimestamp ());
}
/**
* Get readable time from seconds
* @ param type $seconds - time in seconds
* @ return type string - readable time
*/
function calculateTimeFromSeconds ( $seconds ){
$hours = floor ( $seconds / 3600 );
$mins = floor ( $seconds / 60 % 60 );
$secs = floor ( $seconds % 60 );
return sprintf ( '%02d:%02d:%02d' , $hours , $mins , $secs );
}
/**
* Convert false JSON ( with keys without quotes and no stat and end braces )
* from DB to valid JSON
* @ param type $toJSON string to convert to JSON ( with keys without
* quotes and no stat and end braces )
* @ return type valid converted JSON
*/
function convertToJSON ( $toJSON ){
$toJSON = preg_replace ( '/("(.*?)"|(\w+))(\s*:\s*(".*?"|.))/s' , '"$2$3"$4' , $toJSON );
$toJSON = '{' . $toJSON . '}' ;
return json_decode ( $toJSON , true );
}
/**
* Echo 'no data in DB'
*/
function echoNoData (){
global $lang ;
echo '<p><b>' . $lang [ 'srv_edits_analysis_no_data' ] . '</b></p>' . " \n " ;
}
function ajax_drawContinuEditsTable (){
if ( isset ( $_POST [ 'user' ]))
$user = $_POST [ 'user' ];
else
$user = 'all' ;
if ( isset ( $_POST [ 'period' ]))
$period = $_POST [ 'period' ];
else
$period = 'day' ;
if ( isset ( $_POST [ 'time' ]))
$time = $_POST [ 'time' ];
else
$time = '1 month' ;
if ( isset ( $_POST [ 'status' ]))
$status = $_POST [ 'status' ];
else
$status = 0 ;
if ( isset ( $_POST [ 'from' ]))
$from = $_POST [ 'from' ];
else
$from = '' ;
if ( isset ( $_POST [ 'to' ]))
$to = $_POST [ 'to' ];
else
$to = '' ;
//create iterval - SQL where statement
$interval = $this -> createInterval ( $time , $from , $to );
//get data
$data = $this -> continuEditsQuery ( $status , $interval , $period , $user );
//draw table
$this -> drawContinuEditsTable ( $data , $period );
}
function getList ( $status , $interval ){
$sql = " SELECT st.datetime, u.email, st.post, st.get FROM srv_tracking $this->db_table st, users u WHERE st.ank_id=' $this->anketa ' AND u.id = st.user " . ( $status != - 1 ? " AND st.status= $status " : " " ) . " $interval " ;
// Loop cez vse vrednosti v vprasanjih na straneh v anketi
$sqlGrupa = sisplet_query ( $sql );
$vrstic = 0 ;
while ( $rowGrupa = mysqli_fetch_array ( $sqlGrupa )){
$vrstic ++ ;
}
}
}