NxTIC/manager/module/call_log.php

182 lines
6.0 KiB
PHP

<?php
namespace manager\module;
use \manager\Database;
use \manager\sessionManager;
use \manager\ResourceDispatcher;
use \manager\ManagerError;
use \manager\Repo;
class call_log{
/* DESERIALISATION D'UN JOURNAL D'APPEL
*
* @number<String> Numéro de téléphone du propriétaire du journal d'appel
*
* @return logs<Array> Retourne un tableau associatif les logs
* @return directory<Array> Retourne un tableau associatif contenant l'annuaire des contacts
*
*/
public static function unserialize($params){
extract($params);
// On formatte le numéro de téléphone
$phone_number = Database::formatNumber($phone_number);
/* [0] On récupère dans la config le chemin du fichier
=========================================================*/
/* (1) On récupère le fichier */
$uploadAuth = ResourceDispatcher::getResource('f/json/upload-auth/conf');
/* (2) Si une erreur pour le fichier de conf */
if( $uploadAuth === false )
return ManagerError::UnreachableResource;
/* (3) On récupère la config sous forme de tableau */
$uploadAuth = json_decode( $uploadAuth, true );
/* (4) Si erreur de PARSAGE */
if( !is_array($uploadAuth) )
return ManagerError::ParsingFailed;
/* (5) On construit le chemin du fichier */
$prefix = 'call_log'; $extension = 'xml';
$path = __ROOT__.$uploadAuth['root']."/$prefix/".$_SESSION['username'].".$extension";
/* [1] On parse/récupère le xml
=========================================================*/
// Si le fichier n'existe pas, on quitte
if( !file_exists($path) )
return array('ModuleError' => ManagerError::UnreachableResource);
$file_content = file_get_contents($path);
if( $file_content === false )
return array('ModuleError' => ManagerError::UnreachableResource);
$xml = simplexml_load_string( $file_content );
// Si le format XML n'est pas bon, on retourne une erreur
if( $xml === false )
return array('ModuleError' => ManagerError::ParsingFailed);
/* [2] On lit chaque élément
=========================================================*/
$phone_directory = array(); // Contiendra les correspondances num->Nom
$phone_logs = array(); // Contiendra nos logs (appels/sms)
foreach($xml->Item as $log){
/* (1) On formatte le numéro */
$number = Database::formatNumber($log['Number']);
/* (2) On enregistre le contact dans l'annuaire s'il y est pas déjà */
if( !isset($phone_directory[$number]) )
$phone_directory[$number] = array(
'name' => strlen($log['Name']) ? (string) $log['Name'] : null,
'calls' => 0,
'sms' => 0
);
/* (3) Si c'est un appel, on incrémente le compteur pour ce numéro */
if( strtolower($log['Type']) == 'phone' ) $phone_directory[$number]['calls']++;
/* (4) Si c'est un sms, on incrémente le compteur pour ce numéro */
else $phone_directory[$number]['sms']++;
/* (5) On complète le log */
$phone_log = array(
'source' => ($log['Direction']=='INCOMING') ? $number : Database::formatNumber($phone_number),
'target' => ($log['Direction']=='INCOMING') ? Database::formatNumber($phone_number) : $number,
'type' => strtolower($log['Type']),
'date' => strtotime($log['Date']),
'duration' => (int) $log['Duration']
);
array_push($phone_logs, $phone_log);
}
/* [5] On trie les contacts par nombre d'apparition d'APPEL
=========================================================*/
$tmp = $phone_directory; // Permet de ne pas efface $phone_directory
$maxNumber = -1; // Contiendra le numéro du plus gros
$maxVal = null; // Contiendra la valeur max (total calls)
$call_sorted = array(); // Contiendra l'annuaire trié par nombre d'interraction
/* (1) Tant qu'on a pas tout trié */
while( count($tmp) > 0 ){
$maxNumber = -1;
$maxVal = null;
/* (2) On parcours toutes les entrées puor trouver le plus proche */
foreach($tmp as $number=>$data)
if( $data['calls'] > $maxVal || is_null($maxVal) ){
// On met à jour la valeur max
$maxVal = $data['calls'];
// On met à jour l'indice
$maxNumber = $number;
}
/* (3) On supprime le plus proche qu'on a trouvé et on l'ajoute au tableau trié */
array_push($call_sorted, array(
'number' => $maxNumber,
'name' => $tmp[$maxNumber]['name'],
'count' => $tmp[$maxNumber]['calls']
));
unset($tmp[$maxNumber]);
}
/* [6] On trie les contacts par nombre d'apparition de SMS/MMS
=========================================================*/
$tmp = $phone_directory; // Permet de ne pas efface $phone_directory
$maxNumber = -1; // Contiendra le numéro du plus gros
$maxVal = null; // Contiendra la valeur max (total calls)
$sms_sorted = array(); // Contiendra l'annuaire trié par nombre d'interraction
/* (1) Tant qu'on a pas tout trié */
while( count($tmp) > 0 ){
$maxNumber = -1;
$maxVal = null;
/* (2) On parcours toutes les entrées puor trouver le plus proche */
foreach($tmp as $number=>$data)
if( $data['sms'] > $maxVal || is_null($maxVal) ){
// On met à jour la valeur max
$maxVal = $data['sms'];
// On met à jour l'indice
$maxNumber = $number;
}
/* (3) On supprime le plus proche qu'on a trouvé et on l'ajoute au tableau trié */
array_push($sms_sorted, array(
'number' => $maxNumber,
'name' => $tmp[$maxNumber]['name'],
'count' => $tmp[$maxNumber]['sms']
));
unset($tmp[$maxNumber]);
}
/* [6] Gestion du retour
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'directory' => $phone_directory,
'calls' => $call_sorted,
'sms' => $sms_sorted,
'logs' => $phone_logs
);
}
}
?>