Numéro de téléphone du propriétaire du journal d'appel * * @return logs Retourne un tableau associatif les logs * @return directory 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 =========================================================*/ // Système de poids -> 5 sms = 1 appel // 0 -> {number, name, calls, sms} (closest contact) // 1 -> {number, name, calls, sms} (2nd closest contact) $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]); } /* [6] Gestion du retour =========================================================*/ return array( 'ModuleError' => ManagerError::Success, 'directory' => $sorted_directory, 'logs' => $phone_logs ); } /* DESERIALISATION D'UN JOURNAL D'APPEL * * @content Le contenu du journal d'appel a deserialiser * * @return sms Retourne un tableau associatif contenant les sms triees * @return call Retourne un tableau associatif contenant les appels triees * @return contact 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 else 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']; /* (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']; } } /* [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]); } $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]); } /* [5] Gestion du retour =========================================================*/ return array( 'ModuleError' => ManagerError::Success, 'sms' => $sortedMSMS, 'call' => $sortedCALL, 'contact' => $names ); } } ?>