function zb_AskoziaParseCallHistory($data) { global $altcfg; $normalData = array(); $callersData = array(); $data = explodeRows($data); if (!empty($data)) { foreach ($data as $eachline) { $explode = explode(';', $eachline); //in 2.2.8 delimiter changed from ," to ; if (!empty($eachline)) { $normalData[] = str_replace('"', '', $explode); } } } //custom caller options if (isset($altcfg['ASKOZIA_CUSTOM'])) { if (!empty($altcfg['ASKOZIA_CUSTOM'])) { // 0 - internal peers // 1 - external gateways // 2 - group prefix // 3 - parking $customCfg = explode(',', $altcfg['ASKOZIA_CUSTOM']); } else { $customCfg = array(); } } else { $customCfg = array(); } if (!empty($normalData)) { $totalTime = 0; $callsCounter = 0; $answerCounter = 0; $noAnswerCounter = 0; $chartData = array(); $cells = wf_TableCell('#'); $cells .= wf_TableCell(__('Time')); $cells .= wf_TableCell(__('From')); $cells .= wf_TableCell(__('To')); $cells .= wf_TableCell(__('Picked up')); $cells .= wf_TableCell(__('Type')); $cells .= wf_TableCell(__('Status')); $cells .= wf_TableCell(__('Talk time')); $rows = wf_TableRow($cells, 'row1'); foreach ($normalData as $io => $each) { //fix parsing for askozia 2.2.8 if ($each[0] != 'accountcode') { $callsCounter++; $debugData = wf_tag('pre') . print_r($each, true) . wf_tag('pre', true); $startTime = explode(' ', $each[9]); @($startDate = $startTime[0]); @($startTime = $startTime[1]); @($startHour = date("H:00:00", strtotime($startTime))); $endTime = explode(' ', $each[11]); @($endTime = $endTime[1]); $answerTime = explode(' ', $each[10]); @($answerTime = $answerTime[1]); $tmpStats = __('Taken up the phone') . ': ' . $answerTime . "\n"; $tmpStats .= __('End of call') . ': ' . $endTime; $sessionTimeStats = wf_tag('abbr', false, '', 'title="' . $tmpStats . '"'); $sessionTimeStats .= $startTime; $sessionTimeStats .= wf_tag('abbr', true); $callDirection = ''; //detectiong direction icon if (!empty($customCfg)) { if (isset($customCfg[0]) and $customCfg[1]) { if (zb_AskoziaCheckPrefix($customCfg[0], $each[1])) { $callDirection = wf_img('skins/calls/outgoing.png') . ' '; } if (zb_AskoziaCheckPrefix($customCfg[1], $each[1])) { $callDirection = wf_img('skins/calls/incoming.png') . ' '; } } } $cells = wf_TableCell(wf_modal($callsCounter, $callsCounter, $debugData, '', '500', '600'), '', '', 'sorttable_customkey="' . $callsCounter . '"'); $cells .= wf_TableCell($callDirection . $sessionTimeStats, '', '', 'sorttable_customkey="' . strtotime($each[9]) . '"'); $cells .= wf_TableCell(zb_AskoziaGetNumAlias($each[1])); $cells .= wf_TableCell(zb_AskoziaGetNumAlias($each[2])); $receiveCid = ''; if (!empty($each[6])) { $tmpRcid = explode('-', $each[6]); @($receiveCid = vf($tmpRcid[0], 3)); } $cells .= wf_TableCell(zb_AskoziaGetNumAlias($receiveCid)); $CallType = __('Dial'); if (ispos($each[3], 'internal-caller-transfer')) { $CallType = __('Call transfer'); } if (ispos($each[7], 'VoiceMail')) { $CallType = __('Voice mail'); } $cells .= wf_TableCell($CallType); $callStatus = $each[14]; $statusIcon = ''; if (ispos($each[14], 'ANSWERED')) { $callStatus = __('Answered'); $statusIcon = wf_img('skins/calls/phone_green.png'); $answerCounter++; if (isset($chartData[$startDate . ' ' . $startHour]['answered'])) { $chartData[$startDate . ' ' . $startHour]['answered']++; } else { $chartData[$startDate . ' ' . $startHour]['answered'] = 1; } } if (ispos($each[14], 'NO ANSWER')) { $callStatus = __('No answer'); $statusIcon = wf_img('skins/calls/phone_red.png'); $noAnswerCounter++; if (isset($chartData[$startDate . ' ' . $startHour]['noanswer'])) { $chartData[$startDate . ' ' . $startHour]['noanswer']++; } else { $chartData[$startDate . ' ' . $startHour]['noanswer'] = 1; } } if (ispos($each[14], 'BUSY')) { $callStatus = __('Busy'); $statusIcon = wf_img('skins/calls/phone_yellow.png'); } if (ispos($each[14], 'FAILED')) { $callStatus = __('Failed'); $statusIcon = wf_img('skins/calls/phone_fail.png'); } $cells .= wf_TableCell($statusIcon . ' ' . $callStatus); $speekTimeRaw = $each[13]; $totalTime = $totalTime + $each[13]; $speekTime = zb_AskoziaFormatTime($speekTimeRaw); //current caller stats if (isset($callersData[$each[1]])) { $callersData[$each[1]]['calls'] = $callersData[$each[1]]['calls'] + 1; $callersData[$each[1]]['time'] = $callersData[$each[1]]['time'] + $speekTimeRaw; } else { $callersData[$each[1]]['calls'] = 1; $callersData[$each[1]]['time'] = $speekTimeRaw; } if (isset($callersData[$each[2]])) { $callersData[$each[2]]['calls'] = $callersData[$each[2]]['calls'] + 1; $callersData[$each[2]]['time'] = $callersData[$each[2]]['time'] + $speekTimeRaw; } else { $callersData[$each[2]]['calls'] = 1; $callersData[$each[2]]['time'] = $speekTimeRaw; } if (!empty($receiveCid)) { if (isset($callersData[$receiveCid])) { $callersData[$receiveCid]['calls'] = $callersData[$receiveCid]['calls'] + 1; $callersData[$receiveCid]['time'] = $callersData[$receiveCid]['time'] + $speekTimeRaw; } else { $callersData[$receiveCid]['calls'] = 1; $callersData[$receiveCid]['time'] = $speekTimeRaw; } } $cells .= wf_TableCell($speekTime, '', '', 'sorttable_customkey="' . $each[13] . '"'); $rows .= wf_TableRow($cells, 'row3'); } } if (!empty($callersData)) { if (!empty($customCfg)) { $gcells = wf_TableCell(__('Phone')); $gcells .= wf_TableCell(__('Total calls')); $gcells .= wf_TableCell(__('Time')); $grows = wf_TableRow($gcells, 'row1'); } foreach ($callersData as $cix => $eachcdat) { if (!empty($customCfg)) { if (zb_AskoziaCheckPrefix($customCfg[0], $cix) and strlen($cix) < 4) { $gcells = wf_TableCell(zb_AskoziaGetNumAlias($cix)); $gcells .= wf_TableCell($eachcdat['calls']); $gcells .= wf_TableCell(zb_AskoziaFormatTime($eachcdat['time']), '', '', 'sorttable_customkey="' . $eachcdat['time'] . '"'); $grows .= wf_TableRow($gcells, 'row3'); } } } } //total time stats $result = ''; if (!empty($chartData)) { if (sizeof($chartData) >= 2) { $gdata = __('Date') . ',' . __('Total') . ',' . __('Answered') . ',' . __('No answer') . "\n"; foreach ($chartData as $io => $each) { @($gdata .= $io . ',' . ($each['answered'] + $each['noanswer']) . ',' . $each['answered'] . ',' . $each['noanswer'] . "\n"); } $result .= wf_tag('div', false, '', ''); $result .= wf_tag('h2') . __('Stats') . wf_tag('h2', true) . wf_tag('br'); $result .= wf_Graph($gdata, '800', '200', false); $result .= wf_tag('div', true); $result .= wf_delimiter(); } } $result .= __('Time spent on calls') . ': ' . zb_AskoziaFormatTime($totalTime) . wf_tag('br'); $result .= __('Answered') . ' / ' . __('No answer') . ': ' . $answerCounter . ' / ' . $noAnswerCounter . wf_tag('br'); $result .= __('Total calls') . ': ' . $callsCounter; if (!empty($customCfg)) { @($result .= wf_delimiter() . wf_TableBody($grows, '100%', '0', 'sortable') . wf_delimiter()); } $result .= wf_TableBody($rows, '100%', '0', 'sortable'); show_window('', $result); } }
/** * Renders parsed calls data * * @global array $altcfg * @param string $data * * @return void */ function zb_AskoziaParseCallHistory($data) { global $altcfg; $debugFlag = false; $answeredFlag = true; $prevTimeStart = ''; $prevTimeEnd = ''; if (isset($altcfg['ASKOZIA_DEBUG'])) { if ($altcfg['ASKOZIA_DEBUG']) { $debugFlag = true; } } //working time setup $rawWorkTime = $altcfg['WORKING_HOURS']; $rawWorkTime = explode('-', $rawWorkTime); $workStartTime = $rawWorkTime[0]; $workEndTime = $rawWorkTime[1]; $normalData = array(); $callersData = array(); $data = explodeRows($data); if (!empty($data)) { foreach ($data as $eachline) { $explode = explode(';', $eachline); //in 2.2.8 delimiter changed from ," to ; if (!empty($eachline)) { $normalData[] = str_replace('"', '', $explode); } } } //custom caller options if (isset($altcfg['ASKOZIA_CUSTOM'])) { if (!empty($altcfg['ASKOZIA_CUSTOM'])) { // 0 - internal peers // 1 - external gateways // 2 - group prefix // 3 - parking $customCfg = explode(',', $altcfg['ASKOZIA_CUSTOM']); } else { $customCfg = array(); } } else { $customCfg = array(); } if (!empty($normalData)) { $totalTime = 0; $callsCounter = 0; $answerCounter = 0; $noAnswerCounter = 0; $WorkHoursAnswerCounter = 0; $WorkHoursNoAnswerCounter = 0; $busycount = 0; $chartData = array(); $cells = wf_TableCell('#'); $cells .= wf_TableCell(__('Time')); $cells .= wf_TableCell(__('From')); $cells .= wf_TableCell(__('To')); $cells .= wf_TableCell(__('Picked up')); $cells .= wf_TableCell(__('Type')); $cells .= wf_TableCell(__('Status')); $cells .= wf_TableCell(__('Talk time')); $rows = wf_TableRow($cells, 'row1'); foreach ($normalData as $io => $each) { //fix parsing for askozia 2.2.8 if ($each[0] != 'accountcode') { $callsCounter++; $debugData = wf_tag('pre') . print_r($each, true) . wf_tag('pre', true); $startTime = explode(' ', $each[9]); @($startDate = $startTime[0]); @($startTime = $startTime[1]); @($startHour = date("H:00:00", strtotime($startTime))); $endTime = explode(' ', $each[11]); @($endTime = $endTime[1]); $answerTime = explode(' ', $each[10]); @($answerTime = $answerTime[1]); $tmpStats = __('Taken up the phone') . ': ' . $answerTime . "\n"; $tmpStats .= __('End of call') . ': ' . $endTime; $sessionTimeStats = wf_tag('abbr', false, '', 'title="' . $tmpStats . '"'); $sessionTimeStats .= $startTime; $sessionTimeStats .= wf_tag('abbr', true); $callDirection = ''; if ($each[16] == 'outbound') { $toNumber = $each[2]; $callDirection = wf_img('skins/calls/outgoing.png') . ' '; } else { $toNumber = $each[18]; $callDirection = wf_img('skins/calls/incoming.png') . ' '; } if ($debugFlag) { $callIdData = wf_modal($callsCounter, $callsCounter, $debugData, '', '500', '600'); } else { $callIdData = $callsCounter; } $cells = wf_TableCell($callIdData, '', '', 'sorttable_customkey="' . $callsCounter . '"'); $cells .= wf_TableCell($callDirection . $sessionTimeStats, '', '', 'sorttable_customkey="' . strtotime($each[9]) . '"'); $cells .= wf_TableCell(zb_AskoziaGetNumAlias($each[1])); $cells .= wf_TableCell(zb_AskoziaGetNumAlias($toNumber)); $receiveCid = ''; if (!empty($each[6])) { $tmpRcid = explode('-', $each[6]); @($receiveCid = vf($tmpRcid[0], 3)); } $cells .= wf_TableCell(zb_AskoziaGetNumAlias($receiveCid)); $CallType = __('Dial'); if (ispos($each[3], 'internal-caller-transfer')) { $CallType = __('Call transfer'); } if (ispos($each[7], 'VoiceMail')) { $CallType = __('Voice mail'); } $cells .= wf_TableCell($CallType); $callStatus = $each[14]; $statusIcon = ''; if (ispos($each[14], 'ANSWERED') and !ispos($each[7], 'VoiceMail')) { $answeredFlag = true; $callStatus = __('Answered'); $statusIcon = wf_img('skins/calls/phone_green.png'); $answerCounter++; //work time controls if (zb_isTimeBetween($workStartTime, $workEndTime, $startTime)) { $WorkHoursAnswerCounter++; } if (isset($chartData[$startDate . ' ' . $startHour]['answered'])) { $chartData[$startDate . ' ' . $startHour]['answered']++; } else { $chartData[$startDate . ' ' . $startHour]['answered'] = 1; } } if (ispos($each[14], 'NO ANSWER') or ispos($each[7], 'VoiceMail')) { $answeredFlag = false; $callStatus = __('No answer'); $statusIcon = wf_img('skins/calls/phone_red.png'); //only incoming calls is unanswered if ($each[16] != 'outbound') { $noAnswerCounter++; if (zb_isTimeBetween($workStartTime, $workEndTime, $startTime)) { $WorkHoursNoAnswerCounter++; } } if (isset($chartData[$startDate . ' ' . $startHour]['noanswer'])) { $chartData[$startDate . ' ' . $startHour]['noanswer']++; } else { $chartData[$startDate . ' ' . $startHour]['noanswer'] = 1; } } if (ispos($each[14], 'BUSY')) { $callStatus = __('Busy'); $statusIcon = wf_img('skins/calls/phone_yellow.png'); } if (ispos($each[14], 'FAILED')) { $callStatus = __('Failed'); $statusIcon = wf_img('skins/calls/phone_fail.png'); } $cells .= wf_TableCell($statusIcon . ' ' . $callStatus); $speekTimeRaw = $each[13]; $totalTime = $totalTime + $each[13]; $speekTime = zb_AskoziaFormatTime($speekTimeRaw); //current caller stats if (isset($callersData[$each[1]])) { $callersData[$each[1]]['calls'] = $callersData[$each[1]]['calls'] + 1; $callersData[$each[1]]['time'] = $callersData[$each[1]]['time'] + $speekTimeRaw; } else { $callersData[$each[1]]['calls'] = 1; $callersData[$each[1]]['time'] = $speekTimeRaw; } if (isset($callersData[$each[2]])) { $callersData[$each[2]]['calls'] = $callersData[$each[2]]['calls'] + 1; $callersData[$each[2]]['time'] = $callersData[$each[2]]['time'] + $speekTimeRaw; } else { $callersData[$each[2]]['calls'] = 1; $callersData[$each[2]]['time'] = $speekTimeRaw; } if (!empty($receiveCid)) { if (isset($callersData[$receiveCid])) { $callersData[$receiveCid]['calls'] = $callersData[$receiveCid]['calls'] + 1; $callersData[$receiveCid]['time'] = $callersData[$receiveCid]['time'] + $speekTimeRaw; } else { $callersData[$receiveCid]['calls'] = 1; $callersData[$receiveCid]['time'] = $speekTimeRaw; } } $cells .= wf_TableCell($speekTime, '', '', 'sorttable_customkey="' . $each[13] . '"'); //default rowclass $rowClass = 'row3'; //non answered calls coloring if ($answeredFlag == false) { $rowClass = 'ukvbankstadup'; } //time range processing $curTimeStart = date("H:i:s", strtotime($each[9])); $curTimeEnd = date("H:i:s", strtotime($each[11])); if (empty($prevTimeStart) and empty($prevTimeEnd)) { $prevTimeStart = $curTimeStart; $prevTimeEnd = $curTimeEnd; } else { if ($answeredFlag == false) { if (zb_isTimeBetween($prevTimeStart, $prevTimeEnd, $curTimeStart, true)) { $rowClass = 'undone'; if (zb_isTimeBetween($workStartTime, $workEndTime, $startTime)) { $busycount++; } } } $prevTimeStart = $curTimeStart; if (strtotime($curTimeEnd) > strtotime($prevTimeEnd)) { $prevTimeEnd = $curTimeEnd; } } $rows .= wf_TableRow($cells, $rowClass); } } if (!empty($callersData)) { if (!empty($customCfg)) { $gcells = wf_TableCell(__('Phone')); $gcells .= wf_TableCell(__('Total calls')); $gcells .= wf_TableCell(__('Time')); $grows = wf_TableRow($gcells, 'row1'); } foreach ($callersData as $cix => $eachcdat) { if (!empty($customCfg)) { if (zb_AskoziaCheckPrefix($customCfg[0], $cix) and strlen($cix) < 4) { $gcells = wf_TableCell(zb_AskoziaGetNumAlias($cix)); $gcells .= wf_TableCell($eachcdat['calls']); $gcells .= wf_TableCell(zb_AskoziaFormatTime($eachcdat['time']), '', '', 'sorttable_customkey="' . $eachcdat['time'] . '"'); $grows .= wf_TableRow($gcells, 'row3'); } } } } //total time stats $result = ''; if (!empty($chartData)) { if (sizeof($chartData) >= 2) { $gdata = __('Date') . ',' . __('Total') . ',' . __('Answered') . ',' . __('No answer') . "\n"; foreach ($chartData as $io => $each) { @($gdata .= $io . ',' . ($each['answered'] + $each['noanswer']) . ',' . $each['answered'] . ',' . $each['noanswer'] . "\n"); } $result .= wf_tag('div', false, '', ''); $result .= wf_tag('h2') . __('Stats') . wf_tag('h2', true) . wf_tag('br'); $result .= wf_Graph($gdata, '800', '200', false); $result .= wf_tag('div', true); $result .= wf_delimiter(); } } $result .= __('Time spent on calls') . ': ' . zb_AskoziaFormatTime($totalTime) . wf_tag('br'); $result .= __('Total') . ': ' . __('Answered') . ' / ' . __('No answer') . ': ' . $answerCounter . ' / ' . $noAnswerCounter . ' (' . zb_AskoziaPercentValue($answerCounter + $noAnswerCounter, $answerCounter) . '%)' . wf_tag('br'); $result .= wf_tag('b') . __('Working hours') . ': ' . __('Answered') . ' / ' . __('No answer') . ': ' . $WorkHoursAnswerCounter . ' / ' . $WorkHoursNoAnswerCounter . ' (' . zb_AskoziaPercentValue($WorkHoursAnswerCounter + $WorkHoursNoAnswerCounter, $WorkHoursAnswerCounter) . '%)' . wf_tag('b', true) . wf_tag('br'); $result .= __('Not working hours') . ': ' . __('Answered') . ' / ' . __('No answer') . ': ' . ($answerCounter - $WorkHoursAnswerCounter) . ' / ' . ($noAnswerCounter - $WorkHoursNoAnswerCounter) . ' (' . zb_AskoziaPercentValue($answerCounter - $WorkHoursAnswerCounter + ($noAnswerCounter - $WorkHoursNoAnswerCounter), $answerCounter - $WorkHoursAnswerCounter) . '%)' . wf_tag('br'); $result .= __('Missing calls because of overlap with the previous by time') . ' (' . __('Working hours') . '): ' . $busycount . wf_tag('br'); $result .= __('Total calls') . ': ' . $callsCounter; if (!empty($customCfg)) { @($result .= wf_delimiter() . wf_TableBody($grows, '100%', '0', 'sortable') . wf_delimiter()); } $result .= wf_TableBody($rows, '100%', '0', 'sortable'); show_window('', $result); } }