2016-04-08 14:58:40 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace manager\module;
|
|
|
|
use \manager\Database;
|
|
|
|
use \manager\sessionManager;
|
2016-04-20 13:21:01 +00:00
|
|
|
use \manager\ResourceDispatcher;
|
2016-04-08 14:58:40 +00:00
|
|
|
use \manager\ManagerError;
|
|
|
|
use \manager\Repo;
|
|
|
|
|
2016-04-11 08:18:10 +00:00
|
|
|
class call_log{
|
2016-04-08 14:58:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* DESERIALISATION D'UN JOURNAL D'APPEL
|
|
|
|
*
|
2016-04-20 13:21:01 +00:00
|
|
|
* @number<String> Numéro de téléphone du propriétaire du journal d'appel
|
2016-04-08 14:58:40 +00:00
|
|
|
*
|
2016-04-20 13:21:01 +00:00
|
|
|
* @return logs<Array> Retourne un tableau associatif les logs
|
|
|
|
* @return directory<Array> Retourne un tableau associatif contenant l'annuaire des contacts
|
2016-04-08 14:58:40 +00:00
|
|
|
*
|
|
|
|
*/
|
2016-04-18 09:30:38 +00:00
|
|
|
public static function unserialize($params){
|
|
|
|
extract($params);
|
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
// On formatte le numéro de téléphone
|
2016-04-18 20:45:55 +00:00
|
|
|
$phone_number = Database::formatNumber($phone_number);
|
2016-04-18 14:21:24 +00:00
|
|
|
|
2016-04-20 13:21:01 +00:00
|
|
|
/* [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";
|
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
/* [1] On parse/récupère le xml
|
2016-04-08 14:58:40 +00:00
|
|
|
=========================================================*/
|
2016-04-20 13:21:01 +00:00
|
|
|
// 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 );
|
2016-04-08 14:58:40 +00:00
|
|
|
|
|
|
|
// Si le format XML n'est pas bon, on retourne une erreur
|
|
|
|
if( $xml === false )
|
|
|
|
return array('ModuleError' => ManagerError::ParsingFailed);
|
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
/* [2] On lit chaque élément
|
2016-04-08 14:58:40 +00:00
|
|
|
=========================================================*/
|
2016-04-18 14:21:24 +00:00
|
|
|
$phone_directory = array(); // Contiendra les correspondances num->Nom
|
|
|
|
$phone_logs = array(); // Contiendra nos logs (appels/sms)
|
2016-04-08 14:58:40 +00:00
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
foreach($xml->Item as $log){
|
|
|
|
/* (1) On formatte le numéro */
|
2016-04-18 20:45:55 +00:00
|
|
|
$number = Database::formatNumber($log['Number']);
|
2016-04-18 14:21:24 +00:00
|
|
|
|
|
|
|
/* (2) On enregistre le contact dans l'annuaire s'il y est pas déjà */
|
|
|
|
if( !isset($phone_directory[$number]) )
|
2016-04-27 17:54:11 +00:00
|
|
|
$phone_directory[$number] = array(
|
|
|
|
'name' => strlen($log['Name']) ? (string) $log['Name'] : null,
|
|
|
|
'calls' => 0,
|
|
|
|
'sms' => 0
|
|
|
|
);
|
2016-04-18 14:21:24 +00:00
|
|
|
|
2016-04-27 17:54:11 +00:00
|
|
|
|
|
|
|
/* (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 */
|
2016-04-18 14:21:24 +00:00
|
|
|
$phone_log = array(
|
2016-04-18 20:45:55 +00:00
|
|
|
'source' => ($log['Direction']=='INCOMING') ? $number : Database::formatNumber($phone_number),
|
|
|
|
'target' => ($log['Direction']=='INCOMING') ? Database::formatNumber($phone_number) : $number,
|
2016-04-18 14:21:24 +00:00
|
|
|
'type' => strtolower($log['Type']),
|
|
|
|
'date' => strtotime($log['Date']),
|
|
|
|
'duration' => (int) $log['Duration']
|
|
|
|
);
|
|
|
|
array_push($phone_logs, $phone_log);
|
|
|
|
}
|
2016-04-08 14:58:40 +00:00
|
|
|
|
2016-04-27 17:54:11 +00:00
|
|
|
/* [5] On trie les contacts par nombre d'apparition
|
|
|
|
=========================================================*/
|
|
|
|
// Système de poids -> 5 sms = 1 appel
|
|
|
|
// 0 -> {number, name, calls, sms} (closest contact)
|
|
|
|
// 1 -> {number, name, calls, sms} (2nd closest contact)
|
2016-04-27 20:18:58 +00:00
|
|
|
$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 (sms+5*cal ls)
|
|
|
|
$sorted_directory = 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']+5*$data['calls'] > $maxVal || is_null($maxVal) ){
|
|
|
|
// On met à jour la valeur max
|
|
|
|
$maxVal = $data['sms']+5*$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($sorted_directory, array(
|
|
|
|
'number' => $maxNumber,
|
|
|
|
'name' => $tmp[$maxNumber]['name'],
|
|
|
|
'calls' => $tmp[$maxNumber]['calls'],
|
|
|
|
'sms' => $tmp[$maxNumber]['sms'],
|
|
|
|
'total' => $tmp[$maxNumber]['sms'] + 5*$tmp[$maxNumber]['calls']
|
|
|
|
));
|
|
|
|
|
|
|
|
unset($tmp[$maxNumber]);
|
|
|
|
}
|
2016-04-27 17:54:11 +00:00
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
|
2016-04-27 17:54:11 +00:00
|
|
|
/* [6] Gestion du retour
|
2016-04-08 14:58:40 +00:00
|
|
|
=========================================================*/
|
2016-04-18 14:21:24 +00:00
|
|
|
return array(
|
|
|
|
'ModuleError' => ManagerError::Success,
|
2016-04-28 14:32:09 +00:00
|
|
|
'directory' => $sorted_directory,
|
2016-04-18 14:21:24 +00:00
|
|
|
'logs' => $phone_logs
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-08 14:58:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-18 09:30:38 +00:00
|
|
|
|
2016-04-08 14:58:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* DESERIALISATION D'UN JOURNAL D'APPEL
|
|
|
|
*
|
|
|
|
* @content<String> Le contenu du journal d'appel a deserialiser
|
|
|
|
*
|
|
|
|
* @return sms<Array> Retourne un tableau associatif contenant les sms triees
|
|
|
|
* @return call<Array> Retourne un tableau associatif contenant les appels triees
|
|
|
|
* @return contact<Array> Retourne un tableau associatif contenant les correspondances numero/nom de contact
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
private static function unserializeOld($params){
|
|
|
|
$filecontent = null;
|
|
|
|
extract($params);
|
|
|
|
|
|
|
|
/* [2] On recupere le xml
|
|
|
|
=========================================================*/
|
|
|
|
$xml = simplexml_load_string($filecontent);
|
|
|
|
|
|
|
|
// Si le format XML n'est pas bon, on retourne une erreur
|
|
|
|
if( $xml === false )
|
|
|
|
return array('ModuleError' => ManagerError::ParsingFailed);
|
|
|
|
|
|
|
|
return array( 'ModuleError' => ManagerError::Success, 'xml' => $xml );
|
|
|
|
|
|
|
|
|
|
|
|
/* [3] Initialisation des variables
|
|
|
|
=========================================================*/
|
|
|
|
$names = array(); // Contiendra les correspondances numero/contact
|
|
|
|
$msms = array(); // Contiendra les personnes utilisant SMS/MMS
|
|
|
|
$call = array(); // Contiendra les personnes utilisant CALL
|
|
|
|
|
|
|
|
|
|
|
|
/* [4] On traite les donnees pour chaque champ du xml
|
|
|
|
=========================================================*/
|
|
|
|
foreach($xml->Item as $log){
|
|
|
|
// On recupere le numero en string
|
|
|
|
$num = (string) $log['Number'];
|
|
|
|
|
|
|
|
// On formatte le numero
|
|
|
|
if( preg_match("/^(?:\+33|33|0)(.+)/", $num, $m) )
|
|
|
|
$num = '0'.$m[1];
|
|
|
|
// Si pas un numero, on sort de la boucle
|
2016-04-18 09:30:38 +00:00
|
|
|
else
|
2016-04-18 14:21:24 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
/* (1) Si le type est MMS ou SMS */
|
|
|
|
if( $log['Type'] == 'SMS' || $log['Type'] == 'MMS' ){
|
|
|
|
|
|
|
|
// Si la personne n'est pas referencee, on l'ajoute
|
|
|
|
// Sinon on incremente son nombre d'apparition
|
|
|
|
if( isset($msms[$num]) )
|
|
|
|
$msms[$num]+= 1;
|
|
|
|
else
|
|
|
|
$msms[$num] = 1;
|
|
|
|
|
|
|
|
// On enregistre le nom si c'est pas fait
|
|
|
|
if( !isset($names[$num]) ) $names[$num] = $log['Name'];
|
2016-04-18 09:30:38 +00:00
|
|
|
|
2016-04-08 14:58:40 +00:00
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
/* (2) Si le type est PHONE */
|
|
|
|
}else if( $log['Type'] == 'PHONE' ){
|
|
|
|
|
|
|
|
// Si la personne n'est pas referencee, on l'ajoute
|
|
|
|
// Sinon on incremente son nombre d'apparition
|
|
|
|
if( isset($call[$num]) )
|
|
|
|
$call[$num]+= 1;
|
|
|
|
else
|
|
|
|
$call[$num] = 1;
|
|
|
|
|
|
|
|
// On enregistre le nom si c'est pas fait
|
|
|
|
if( !isset($names[$num]) ) $names[$num] = $log['Name'];
|
|
|
|
|
|
|
|
}
|
2016-04-08 14:58:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
/* [4] On trie par nombre d'interactions (sms/appel)
|
|
|
|
=========================================================*/
|
|
|
|
$tmp = $msms;
|
|
|
|
/* (1) Tri des SMS/MMS */
|
|
|
|
$sortedMSMS = array();
|
|
|
|
// On fait le tri pour les 10 premiers elements sauf s'il en a moins
|
|
|
|
for( $i = 0 ; $i < 10 && $i < count($tmp) ; $i++ ){
|
|
|
|
$maxval = max($tmp);
|
|
|
|
$maxkey = array_search($maxval, $tmp);
|
|
|
|
array_push( $sortedMSMS, array($maxkey, $maxval) );
|
|
|
|
unset($tmp[$maxkey]);
|
|
|
|
}
|
2016-04-08 14:58:40 +00:00
|
|
|
|
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
$tmp = $call;
|
|
|
|
/* (2) Tri des appels */
|
|
|
|
$sortedCALL = array();
|
|
|
|
// On fait le tri pour les 10 premiers elements sauf s'il en a moins
|
|
|
|
for( $i = 0 ; $i < 10 && $i < count($tmp) ; $i++ ){
|
|
|
|
$maxval = max($tmp);
|
|
|
|
$maxkey = array_search($maxval, $tmp);
|
|
|
|
array_push( $sortedCALL, array($maxkey, $maxval) );
|
|
|
|
unset($tmp[$maxkey]);
|
|
|
|
}
|
2016-04-08 14:58:40 +00:00
|
|
|
|
|
|
|
|
2016-04-18 14:21:24 +00:00
|
|
|
/* [5] Gestion du retour
|
|
|
|
=========================================================*/
|
|
|
|
return array(
|
|
|
|
'ModuleError' => ManagerError::Success,
|
|
|
|
'sms' => $sortedMSMS,
|
|
|
|
'call' => $sortedCALL,
|
|
|
|
'contact' => $names
|
|
|
|
);
|
|
|
|
}
|
2016-04-08 14:58:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-04-18 09:30:38 +00:00
|
|
|
?>
|