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 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 ); } } ?>