0, 'nonvalid'=>0, 'invitation'=>0); public $cntUserByStatus = array(); public $appropriateStatus = array(6,5); public $unAppropriateStatus = array('6l','5l',4,3); public $invitationStatus = array(2,1,0); public $testDataCount = 0; public $cntValidRedirections = 0; // Stejemo vlejavne referale (ki vsebujejo tekst) public $cntNonValidRedirections = 0; // Stejemo neveljavne referale (ki ne vsebujejo teksta) public $userRedirections = array(3=>0,4=>0,5=>0,6=>0,'valid' => array('email'=>0),'email'=>0,'direct'=>0); // za porazdelitev redirekcij na anketo public $maxRedirection = 0; // koliko je maksimalno število klikov (za primerno širino diva) public $maxCharRedirection = 0; // max stevilo znakovv v "host" (za lepsi izpis redirekcij) public $realUsersByStatus_all = 0; // skupaj frekvenc public $realUsersByStatus = array(); // frekvenca po posameznem statusu (uposeteva da ce je kdo koncal anketo jo je tudi zacel) public $respondentLangArray = array(); # grupiranje po jezikih public $tmp_direct = 0; public $emailStatus = array(0,1,2); function __construct($cntAnswers,$answers,$surveyId) { global $lang; $this->cntUserByStatus = $cntAnswers; $this->userByStatus = $answers; $this->_surveyId = $surveyId; //$this->izracunajPodatke($this->_surveyId); //error_log("ID: ".$surveyId); $sur = new SurveyUsableResp($surveyId, $generateDatafile=false); if(!$sur->hasDataFile()) echo $lang['srv_dashboard_no_file']; // Ce se ni zgenerirana datoteka s podatki izpisemo error else $this->usability = $sur->calculateData(); // Dobimo array z usability podatki //var_dump($this->usability); $page = $_GET['m']; if(strcmp($page,'aapor2') == 0) $this->calculateFullAapor(); else if(strcmp($page,'aapor1') == 0) $this->calculateAapor(); } function calculateAapor() { global $lang; $s6 = (int)$this->userByStatus['valid'][6]; $s5 = (int)$this->userByStatus['valid'][5]; $s6l = (int)$this->userByStatus['nonvalid']['6l']; $s5l = (int)$this->userByStatus['nonvalid']['5l']; $s4 = (int)$this->userByStatus['nonvalid'][4]; $s3 = (int)$this->userByStatus['nonvalid'][3]; $s2 = (int)$this->userByStatus['nonvalid'][2]; $s1 = (int)$this->userByStatus['nonvalid'][1]; $s0 = (int)$this->userByStatus['nonvalid'][0]; $s_1 = (int)$this->userByStatus['nonvalid'][-1]; /* debug echo '
'.$s6; echo '
'.$s5; echo '
'.$s6l; echo '
'.$s5l; echo '
'.$s4; echo '
'.$s3; echo '
'.$s2; echo '
'.$s1; echo '
'.$s0; echo '
'.$s_1; */ /* Po starem še * $rr1 = @$s6 / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)+($s2+$s0)); $rr2 = @($s6+$s5) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)+($s2+$s0)); $rr3 = @$s6 / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)+0.5*($s2+$s0)); $rr4 = @($s6+$s5) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)+0.5*($s2+$s0)); $rr5 = @$s6 / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)); $rr6 = @($s6+$s5) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)); $con1 = @($s6+$s5+$s6l+$s5l+$s4+$s3) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)+($s2+$s0)); $con2 = @($s6+$s5+$s6l+$s5l+$s4+$s3) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)+0.5*($s2+$s0)); $con3 = @($s6+$s5+$s6l+$s5l+$s4+$s3) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)); $pror = @($s6+$s5) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)); $comr = @($s6+$s5) / ( ($s6+$s5)+($s6l+$s5l+$s4+$s3+$s1)); pregledovanje $crr = $pror * $comr; */ //$this->izracunajPodatke($this->_surveyId); $usable = $this->usability['usable']; $partusable = $this->usability['partusable']; $all = $this->usability['all']; $niodgo = (int)$this->_answwers['invitation'][1]; $rr1_apro = 0; $rr2_apro = 0; $rr5_apro = 0; $rr6_apro = 0; if($all > 0){ $rr1_apro = $this->formatNumber(($usable)/$all,3,''); //$rr5_apro = $this->formatNumber(($usable)/($all-$niodgo),3,''); $rr2_apro = $this->formatNumber(($usable+$partusable)/$all,3,''); //$rr6_apro = $this->formatNumber(($usable+$partusable)/($all-$niodgo),3,''); } echo '
'; //echo 'Uporabni: '.$usability['usable'].'
Delno uporabni: '.$usability['partusable'].'
Vsi:'.$usability['all'].'

'; echo ''.$lang['srv_aapor_show_approximate_calculation'].'
'; echo '
'; echo '
'; //echo '
'; //echo '
'; echo '
'; /*echo 'AAPOR response rate glede na 1KA statuse:'; echo '
RR1 = '.$this->formatNumber($rr1,3,''); echo '
RR2 = '.$this->formatNumber($rr2,3,''); echo '
RR3 = '.$this->formatNumber($rr3,3,'').''; echo '
RR4 = '.$this->formatNumber($rr4,3,''); echo '
RR5 = '.$this->formatNumber($rr5,3,''); echo '
RR6 = '.$this->formatNumber($rr6,3,''); echo '
'; echo '
Contact rates:'; echo '
CON1 = '.$this->formatNumber($con1,3,''); echo '
CON2 = '.$this->formatNumber($con2,3,''); echo '
CON3 = '.$this->formatNumber($con3,3,''); echo '
'; echo '
AAPOR paneli:'; echo '
Profile rate: PROR = '.$this->formatNumber($pror,3,''); echo '
Completion rate: COMR = '.$this->formatNumber($comr,3,''); echo '
'; echo '
Cumulative response rate:'; echo '
CUMRR = '.$this->formatNumber($crr,3,'');*/ //echo ''; echo '
'; echo 'Statusi:'; echo '
'; $arrayStatusi = array('6'=>$s6,'6l'=>$s6l,'5'=>$s5,'5l'=>$s5l,'4'=>$s4,'3'=>$s3,'2'=>$s2,'1'=>$s1,'0'=>$s0); foreach ($arrayStatusi as $status => $value) { echo '' . $lang['srv_userstatus_'.$status] . ' ('.$status.') :' . $value . '
'; } echo '

'; echo 'Povezave:
'; // echo ''; echo ''; echo 'Standard Definitions – Final Dispositions of Case Codes and Outcome Rates for Surveys (PDF)'; echo ''; echo '
'; echo '
'; } function calculateFullAapor(){ global $lang; echo '
'; echo '

'.$lang['srv_lnk_AAPOR2'].'

'; echo'
Returne questionaire (1.0)
Complete (1.1)
Partial or break-off (1.2)
Eligible (2.0)
Refusal (2.11)
Explicit refusal (2.111)
Implicit refusal (2.112)
Logged on to survay, did not complete any items (2.1121)
Read receipt confirmation, refusal (2.1122)
Brak-off or partial with insufficient information (2.12)
Not-Contact (2.20)
Respondenr was unavailable during field period (2.26)
Completed questionnaire, but not retuned during field period (2.27)
Other (2.30)
Language barrier (2.33)
Unknown eligible, "non-interview" (3.0)
Nothing known about respondent or address (3.10)
No invitation sent (3.11)
Nothing ever returned (3.19)
Invitation returned undelivered (3.30)
Invitation returned with forwarding information (3.40)
Other (3.90)
Returned from a unsampled email address (3.91)
Not eligible, Returned (4.0)
Selected Respondent Screende Out of Sample (4.10)
Quota Filled (4.80)
Duplicate Listing (4.81)
Other (4.90)
Skupna vsota:
'.$lang['srv_statistic_sum_all'].'
e ['.$lang['srv_statistic_e_description'].']
'; echo '
'; echo '
'; echo '

'.$lang['srv_aapor_show_calculation'].'

'; echo '
RR1:
RR2:
RR3:
RR4:
RR5:
RR6:
'; echo '
';; } function calculationForFullAapor(){ $data = array(); $rr1 = 0; $rr2 = 0; $rr3 = 0; $rr4 = 0; $rr5 = 0; $rr6 = 0; $refusal = $_POST['refusal']; $refusal = $refusal=='' || !is_numeric($refusal) ? 0:$refusal; $breakOff = $_POST['breakOff']; $breakOff = $breakOff=='' || !is_numeric($breakOff) ? 0:$breakOff; $invitationReturnedUndelivered = $_POST['invitationReturnedUndelivered']; $invitationReturnedUndelivered = $invitationReturnedUndelivered=='' || !is_numeric($invitationReturnedUndelivered) ? 0:$invitationReturnedUndelivered; $invitationReturnedForwarding = $_POST['invitationReturnedForwarding']; $invitationReturnedForwarding = $invitationReturnedForwarding=='' || !is_numeric($invitationReturnedForwarding) ? 0:$invitationReturnedForwarding; $otherUnknownEligible = $_POST['otherUnknownEligible']; $otherUnknownEligible = $otherUnknownEligible=='' || !is_numeric($otherUnknownEligible) ? 0:$otherUnknownEligible; $i = $_POST['complete']; $i = $i=='' || !is_numeric($i) ? 0:$i; $p = $_POST['partial']; $p = $p=='' || !is_numeric($p) ? 0:$p; $r = $refusal+$breakOff; $nc = $_POST['nonContact']; $nc = $nc=='' || !is_numeric($nc) ? 0:$nc; $o = $_POST['otherEligible']; $o = $o == '' || !is_numeric($o) ? 0:$o; $uh = $_POST['nothingKnown']; $uh = $uh=='' || !is_numeric($uh) ? 0:$uh; $uo = $invitationReturnedUndelivered + $invitationReturnedForwarding + $otherUnknownEligible; $e = $_POST['e']; $e = $e=='' || !is_numeric($e) ? 100:$e; if($e > 100 || $e<0){ $e = 100; } $e = $e/100; //error_log("E je ".$e); $sub1 = $i+$p+$r+$nc+$o+$uh+$uo; $sub2 = $i+$p+$r+$nc+$o+$e*($uh+$uo); $sub3 = $i+$p+$r+$nc+$o; //error_log($refusal." - ".$breakOff." - ".$invitationReturnedUndelivered." - ".$invitationReturnedForwarding." - ".$otherUnknownEligible." - ".$i."- ".$p." - ".$r." - ".$nc." - ".$o." - ".$uh." - ".$uo." - ".$e); if($sub1 > 0){ $rr1 = $i/($sub1); $rr2 = ($i+$p)/($sub1); } if($sub2 > 0){ $rr3 = $i/($sub2); $rr4 = ($i+$p)/($sub2); } if($sub3 > 0){ $rr5 = $i/($sub3); $rr6 = ($i+$p)/($sub3); } $data['rr1'] = $this->formatNumber($rr1,3,''); $data['rr2'] = $this->formatNumber($rr2,3,''); $data['rr3'] = $this->formatNumber($rr3,3,''); $data['rr4'] = $this->formatNumber($rr4,3,''); $data['rr5'] = $this->formatNumber($rr5,3,''); $data['rr6'] = $this->formatNumber($rr6,3,''); echo json_encode($data); } function izracunajPodatke($id){ /*$sur = new SurveyUsableResp($id, $generateDatafile=false); if($sur->hasDataFile()) $this->usability = $sur->calculateData(); // Dobimo array z usability podatki*/ $qry_string = "SELECT id, language, last_status, lurker, inv_res_id, referer FROM srv_user WHERE ank_id = '".$id."' AND preview = '0' AND deleted='0'"; $qry = sisplet_query($qry_string); if (mysqli_num_rows($qry) > 0) { $user_id_to_check_link = array(); # id-ji uporabnikov pri katerih imamo direkten klik. naknadno ugotavljamo ali je slučajno e-mail vabilo while ($row = mysqli_fetch_assoc($qry)) { if ((int)$row['testdata'] > 0) { $this->testDataCount++; } // dodamo statuse if (in_array($row['last_status'], $this->appropriateStatus)) { # če ni lurker je ok if ($row['lurker'] == 0) { $this->userByStatus['valid'][$row['last_status']] += 1; $this->cntUserByStatus['valid'] += 1; } else { # če je lurker ga dodamo k neveljavnim $this->userByStatus['nonvalid'][$row['last_status'].'l'] += 1; $this->cntUserByStatus['nonvalid'] += 1; } } # neveljavne enote else if (in_array($row['last_status'], $this->unAppropriateStatus)) { $this->userByStatus['nonvalid'][$row['last_status']] += 1; $this->cntUserByStatus['nonvalid'] += 1; } # emaili else if (in_array($row['last_status'], $this->invitationStatus)) { $this->userByStatus['invitation'][$row['last_status']] += 1; $this->cntUserByStatus['invitation'] += 1; } #polovimo redirekte if (in_array((int)$row['last_status'], $this->invitationStatus)) { # email vabila ... ne lovimo redirektov # podatek o referalu je prazen lahko da email ni bil poslan, ali pa gre za direkten link #$this->cntNonValidRedirections += 1; #$this->userRedirections[(int)$row['last_status']] += 1; } else { # če so vabila if ($row['inv_res_id'] != null ) { $this->cntValidRedirections += 1; $this->userRedirections["valid"]['email'] += 1; $this->maxRedirection = max($this->maxRedirection , $this->userRedirections["valid"]['email']); } # če imamo referal else if ($row['referer'] != "") { $parsed = parse_url($row['referer']); $this->cntValidRedirections += 1; $this->userRedirections["valid"][$parsed['host']] += 1; $this->maxCharRedirection = max($this->maxCharRedirection , strlen ($parsed['host']) ); $this->maxRedirection = max($this->maxRedirection , $this->userRedirections["valid"][$parsed['host']] ); } # če ne je najbrž direkten link else { # shranimo id_userjev za katere nato ugotavljamo ali je link res direkten ali obstaja kaksen zapis da je slo preko e-maila $user_id_to_check_link[] = $row['id']; $this->tmp_direct +=1; } } #polovimo jezike if (isset($respondentLangArray[$row['language']])) { $respondentLangArray[$row['language']] ++; } else { $respondentLangArray[$row['language']] = 1; } } } # od direktnega klika odštejemo e-mail vabila if (count($user_id_to_check_link)> 0) { $qry_stringEmail = "SELECT COUNT(*) as cnt FROM srv_userstatus WHERE usr_id IN (".implode(',', $user_id_to_check_link).") AND status IN (".implode(',', $this->emailStatus).")"; $qryEmail = sisplet_query($qry_stringEmail); $rwsEmail = mysqli_fetch_assoc($qryEmail); $this->userRedirections["email"] = (int)$rwsEmail['cnt']; $this->userRedirections["direct"] = (int)$this->tmp_direct - (int)$rwsEmail['cnt']; } // prestejemo max stevilo klikov za lepsi izris tabele $this->maxRedirection = max($this->maxRedirection , $this->userRedirections["2"], $this->userRedirections["1"], $this->userRedirections["0"],$this->userRedirections["direct"], $this->userRedirections['email']); # izracunamo realne frekvence po statusih # Klik na anketo - vsak ki je končal anketo (itd...) je "najbrž" tudi kliknil na anketo.. $this->realUsersByStatus_all = $this->userByStatus['valid'][6] + $this->userByStatus['valid'][5] + $this->userByStatus['nonvalid']['5l'] + $this->userByStatus['nonvalid']['6l'] + $this->userByStatus['nonvalid'][4] + $this->userByStatus['nonvalid'][3] + $this->userByStatus['nonvalid'][-1]; // Klik na prvo stran - vsak ki je končal anketo (itd...) je "najbrž" tudi kliknil na anketo.. # končal anketo => 6 $this->realUsersByStatus[6] = array('cnt'=>$this->userByStatus['valid'][6], 'percent'=>0); # začel izpolnjevat => 5 = 6 + 5 $this->realUsersByStatus[5] = array('cnt'=>$this->userByStatus['valid'][5]+$this->realUsersByStatus[6]['cnt'], 'percent'=>0); # Koliko ljudi je dejansko končalo anketo ne glede na to ali so lurkerji 6 + 6l $this->realUsersByStatus['6ll'] = array('cnt'=>$this->userByStatus['nonvalid']['6l']+$this->realUsersByStatus[6]['cnt'], 'percent'=>0); # delno izpolnjena 4ll => 6 + 5 + 6l + 5l $this->realUsersByStatus['5ll'] = array('cnt'=>$this->userByStatus['nonvalid']['6l']+$this->userByStatus['nonvalid']['5l']+$this->realUsersByStatus[5]['cnt'], 'percent'=>0); # klik na prvo stran => 4 = 6 + 6l + 5l + 5 + 4 $this->realUsersByStatus['4ll'] = array('cnt'=>$this->userByStatus['nonvalid'][4]+$this->realUsersByStatus['5ll']['cnt'], 'percent'=>0); # klik na anketo => 3 = 6 + 6l + 5l + 5 + 4 + 3 $this->realUsersByStatus['3ll'] = array('cnt'=>$this->userByStatus['nonvalid'][3]+$this->userByStatus['nonvalid'][-1]+$this->realUsersByStatus['4ll']['cnt'], 'percent'=>0); //if ($this->emailInvitation == 1) { $this->realUsersByStatus['email'] = array('cnt'=>(isset($this->userByStatus['valid']['email'])?$this->userByStatus['valid']['email']:0), 'percent'=>0); } $qry_string = "SELECT * FROM srv_invitations_recipients WHERE ank_id='".$id."' AND deleted='0'"; $qry = sisplet_query($qry_string); $this->userByStatus['invitation'][0]=0; $this->userByStatus['invitation'][1]=0; $this->userByStatus['invitation'][2]=0; while ($row = mysqli_fetch_assoc($qry)) { if(in_array($row['last_status'], $this->invitationStatus)){ $this->userByStatus['invitation'][$row['last_status']] += 1; } } } function prikaziPriblizek(){ $data = array(); error_log("Id v metodi priblizek: ".$this->_surveyId); /*$ss = new SurveyStatistic(); $ss->Init($this->_surveyId); $ss->PrepareDateView(); $this->userByStatus = $ss->getUserByStatus();*/ //$this->izracunajPodatke($id); //var_dump($this->cntUserByStatus); $usable = $this->usability['usable']; $partusable = $this->usability['partusable']; $unusable = $this->usability['unusable']; $status3 = $this->userByStatus['nonvalid'][3]; $status4 = $this->userByStatus['nonvalid'][4]; $status34 = 0; $status0 = $this->userByStatus['invitation'][0]; $status2 = $this->userByStatus['invitation'][2]; $status02 = 0; $status1 = $this->userByStatus['invitation'][1]; //if(!is_null($status3) && !is_null($status4) && is_int($status3) && is_int($status4)){ $status34 = $status3+$status4; //} //if(!is_null($status0) && !is_null($status2) && is_int($status0) && is_int($status2)){ $status02 = $status0+$status2; //} $skupaj = $this->cntUserByStatus['valid']+$this->cntUserByStatus['nonvalid']+$this->cntUserByStatus['invitation']; $data['usable'] = is_null($usable) || !is_int($usable) ? 0 : $usable; $data['partusable'] = is_null($partusable) || !is_int($partusable) ? 0 : $partusable; $data['unusable'] = is_null($unusable) || !is_int($unusable) ? 0 : $unusable; $data['status1'] = is_null($status1) || !is_int($status1) ? 0 : $status1; $data['status34'] = $status34; $data['status02'] = $status02; $data['skupaj'] = $skupaj; echo json_encode($data); } /** Lepo oblikuje number string * * @param float $value * @param int $digit * @param string $sufix * @return string */ function formatNumber ($value, $digit = 0, $sufix = "") { if ($value <> 0 && $value != null) $result = round($value, $digit); else $result = "0"; $result = number_format($result, $digit, '.', ',') . $sufix; return $result; } }