Contenu du dictionnaire, ou FALSE si erreur * */ private static function loadDictionary(){ $dict = ResourceDispatcher::getResource('f/json/dictionary/dy/phone'); $dict = json_decode( $dict, true ); // Si erreur, on retourne false if( is_null($dict) ) return false; return $dict; } /* RETOURNE UN JEU DE DONNEES POUR LE SENS DE COMMUNICATION (MANQUE/ENTRANT/SORTANT) * */ public static function direction($params){ extract($params); $subject = intval($subject); /* [1] On récupère les données de ce sujet =========================================================*/ $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $data = $db->fetch($subject); $db->close(); // Si erreur if( $data === false ) return array( 'ModuleError' => ManagerError::ModuleError ); /* [2] On initialise les compteurs =========================================================*/ $labels = array('ENTRANT', 'SORTANT', 'MANQUÉ'); $MISSED = 0; $OUTGOING = 0; $INCOMING = 0; /* [3] S'il a un journal d'appel, on renvoie les données =========================================================*/ if( isset($data['logs']) && is_array($data['logs']) ){ /* (1) On incrémente les compteurs */ foreach($data['logs'] as $log){ /* (2) Si ce n'est pas un appel, on passe au suivant */ if( $log['type'] != 0 ) continue; /* (3) On incrémente les types */ $MISSED += ($log['direction']==2) ? 1 : 0; $OUTGOING += ($log['direction']==1) ? 1 : 0; $INCOMING += ($log['direction']==0) ? 1 : 0; } } /* [4] On construit l'objet =========================================================*/ return array( 'ModuleError' => ManagerError::Success, 'title' => 'Répartition des appels', 'pointFormat' => '{series.name}: {point.percentage:.1f}%', 'series' => array(array( 'colorByPoint' => true, 'data' => array( array( 'name' => 'Entrant', 'y' => $INCOMING ), array( 'name' => 'Sortant', 'y' => $OUTGOING ), array( 'name' => 'Manqué', 'y' => $MISSED ), ) )) ); } /* RETOURNE UN JEU DE DONNEES POUR LE TYPE DE COMMUNICATION (APPEL/SMS) * */ public static function type($params){ extract($params); $subject = intval($subject); /* [1] On récupère les données de ce sujet =========================================================*/ $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $data = $db->fetch($subject); $db->close(); // Si erreur if( $data === false ) return array( 'ModuleError' => ManagerError::ModuleError ); /* [2] On initialise les compteurs =========================================================*/ $PHONE = 0; $SMS = 0; /* [2] S'il a un journal d'appel, on renvoie les données =========================================================*/ if( isset($data['logs']) && is_array($data['logs']) ){ /* (1) On incrémente les compteurs */ foreach($data['logs'] as $log){ /* (2) On incrémente les compteurs */ $PHONE += ($log['type']==0) ? 1 : 0; $SMS += ($log['type']==1) ? 1 : 0; } } return array( 'ModuleError' => ManagerError::Success, 'title' => 'Répartition des types de communication', 'pointFormat' => '{series.name}: {point.percentage:.1f}%', 'series' => array(array( 'colorByPoint' => true, 'data' => array( array( 'name' => 'Appels', 'y' => $PHONE ), array( 'name' => 'SMS', 'y' => $SMS ) ) )) ); } /* RETOURNE UN JEU DE DONNEES POUR LE SEXE DES COMMUNICATIONS (HOMME/FEMME) * */ public static function sexe($params){ extract($params); $subject = intval($subject); /* [1] On récupère les données de ce sujet =========================================================*/ $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $data = $db->fetch($subject); $db->close(); // Si erreur if( $data === false ) return array( 'ModuleError' => ManagerError::ModuleError ); /* [2] On initialise les compteurs =========================================================*/ $H = 0; $F = 0; $I = 0; /* [3] S'il a un journal d'appel, on renvoie les données =========================================================*/ if( isset($data['logs']) && is_array($data['logs']) ){ /* (1) On incrémente les compteurs */ foreach($data['logs'] as $log){ /* (2) On récupère le contact associé */ $associatedContact = null; foreach($data['contacts'] as $contact) if( $log['id'] == $contact['id'] ) $associatedContact = $contact; // Si on ne trouve pas, on passe au suivant if( is_null($associatedContact) ) continue; /* (3) On incrémente les compteurs */ $H += ($associatedContact['sexe']==0) ? 1 : 0; $F += ($associatedContact['sexe']==1) ? 1 : 0; $I += ($associatedContact['sexe']==2) ? 1 : 0; } } return array( 'ModuleError' => ManagerError::Success, 'title' => 'Répartition des genres', 'pointFormat' => '{series.name}: {point.percentage:.1f}%', 'series' => array(array( 'colorByPoint' => true, 'data' => array( array( 'name' => 'Homme', 'y' => $H ), array( 'name' => 'Femme', 'y' => $F ), array( 'name' => 'Indéterminé', 'y' => $I ) ) )) ); } /* RETOURNE UN JEU DE DONNEES POUR LES AGES DES COMMUNICATIONS * */ public static function ages($params){ extract($params); $subject = intval($subject); /* [1] On récupère les données de ce sujet =========================================================*/ $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $data = $db->fetch($subject); $db->close(); // Si erreur if( $data === false ) return array( 'ModuleError' => ManagerError::ModuleError ); /* [2] On initialise les valeurs =========================================================*/ /* (1) On charge le dictionnaire */ $dict = self::loadDictionary(); if( $dict === false ) return array( 'ModuleError' => ManagerError::ParsingFailed ); /* (2) On initialise les compteurs et les labels */ $age_classes = array(); $age_classesByContact = array(); $labels = array(); foreach($dict['contacts']['age'] as $i=>$label){ array_push($labels, $label); $age_classes[$i] = 0; $age_classesByContact[$i] = 0; } /* [3] S'il a un journal d'appel, on renvoie les données =========================================================*/ $tot = 0; if( isset($data['logs']) && is_array($data['logs']) ){ /* (2) On incrémente les compteurs */ foreach($data['logs'] as $log){ /* (3) On récupère le contact associé */ $associatedContact = null; foreach($data['contacts'] as $contact) if( $log['id'] == $contact['id'] ) $associatedContact = $contact; // Si on ne trouve pas, on passe au suivant if( is_null($associatedContact) ) continue; /* (4) On incrémente le compteur de la classe d'age en question */ if( isset($age_classes[ $associatedContact['age'] ]) ){ $age_classes[ $associatedContact['age'] ]++; $tot++; } } foreach($age_classes as $i=>$class) $age_classes[$i] = 100 * $class / $tot; } /* [4] On récupère les ages pour répartition des CONTACTS =========================================================*/ /* (1) On incrémente les compteurs */ $tot = 0; foreach($data['contacts'] as $c=>$contact){ /* (2) On incrémente le compteur de la classe d'age en question */ if( isset($age_classesByContact[ $contact['age'] ]) ){ $age_classesByContact[$contact['age']]++; $tot++; } } foreach($age_classesByContact as $i=>$class) $age_classesByContact[$i] = 100 * $class / $tot; return array( 'ModuleError' => ManagerError::Success, 'xlabels' => $labels, 'title' => 'Répartition des ages', 'zoom' => 'x', 'pointFormat' => '{series.name}: {point.y:.1f}%', 'series' => array( array( 'name' => 'communications', 'data' => array_values($age_classes) ), array( 'name' => 'contacts', 'data' => array_values($age_classesByContact) ) ) ); } /* RETOURNE UN JEU DE DONNEES POUR LES TYPES DE RELATION DES COMMUNICATIONS * */ public static function relations($params){ extract($params); $subject = intval($subject); /* [1] On récupère les données de ce sujet =========================================================*/ $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $data = $db->fetch($subject); $db->close(); // Si erreur if( $data === false ) return array( 'ModuleError' => ManagerError::ModuleError ); /* [2] On initialise les valeurs =========================================================*/ /* (1) On charge le dictionnaire */ $dict = self::loadDictionary(); if( $dict === false ) return array( 'ModuleError' => ManagerError::ParsingFailed ); /* (2) On initialise les compteurs et labels */ $relations = array(); // relations en fonction du log $relationsByContact = array(); // relations en fonction de la répartition des contacts $labels = array(); foreach($dict['contacts']['reltype'] as $i=>$label){ array_push($labels, $label); $relations[$i] = 0; $relationsByContact[$i] = 0; } /* [3] S'il a un journal d'appel, on renvoie les données =========================================================*/ if( isset($data['logs']) && is_array($data['logs']) ){ /* (2) On incrémente les compteurs */ $tot = 0; foreach($data['logs'] as $log){ /* (3) On récupère le contact associé */ $associatedContact = null; foreach($data['contacts'] as $contact) if( $log['id'] == $contact['id'] ) $associatedContact = $contact; // Si on ne trouve pas, on passe au suivant if( is_null($associatedContact) ) continue; /* (4) On incrémente le compteur de la classe d'age en question */ if( isset($relations[ $associatedContact['reltype'] ]) ){ $relations[ $associatedContact['reltype'] ]++; $tot++; } } foreach($relations as $r=>$rel) $relations[$r] = 100 * $relations[$r] / $tot; } /* [4] On récupère les données par CONTACT =========================================================*/ /* (1) On incrémente les compteurs */ $tot = 0; foreach($data['contacts'] as $contact){ /* (2) On incrémente le compteur de la classe d'age en question */ if( isset($relationsByContact[ $contact['reltype'] ]) ){ $relationsByContact[ $contact['reltype'] ]++; $tot++; } } foreach($relationsByContact as $r=>$rel) $relationsByContact[$r] = 100 * $relationsByContact[$r] / $tot; return array( 'ModuleError' => ManagerError::Success, 'xlabels' => $labels, 'title' => 'Répartition des relations', 'pointFormat' => '{series.name}: {point.y:.1f}%', 'series' => array( array( // En fonction du log 'name' => 'communications', 'data' => $relations ), array( // contacts 'name' => 'contacts', 'data' => $relationsByContact ) ) ); } /* RETOURNE UN JEU DE DONNEES POUR LES JOURS DE LA SEMAINE DES COMMUNICATIONS * */ public static function weekdays($params){ extract($params); $subject = intval($subject); /* [1] On récupère les données de ce sujet =========================================================*/ $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $data = $db->fetch($subject); $db->close(); // Si erreur if( $data === false ) return array( 'ModuleError' => ManagerError::ModuleError ); /* [2] On initialise les valeurs =========================================================*/ /* (1) On charge le dictionnaire */ $dict = self::loadDictionary(); if( $dict === false ) return array( 'ModuleError' => ManagerError::ParsingFailed ); /* (2) On initialise les compteurs et labels */ $weekdays = array( // jours de la semaine en fonction du log 'phone' => array(), // pour les appels 'sms' => array() // pour les sms ); $labels = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'); for( $i = 0 ; $i < 7 ; $i++ ){ $weekdays['phone'][$i] = 0; $weekdays['sms'][$i] = 0; } /* [3] S'il a un journal d'appel, on renvoie les données =========================================================*/ if( isset($data['logs']) && is_array($data['logs']) ){ /* (2) On incrémente les compteurs */ foreach($data['logs'] as $log){ /* (3) On récupére le jour de la semaine */ $weekday = date('N', $log['date']) - 1; /* (4) On incrémente le compteur de la classe d'age en question */ $weekdays['phone'][ $weekday ] += ($log['type']==0) ? 1 : 0; $weekdays['sms'][ $weekday ] += ($log['type']==1) ? 1 : 0; } } return array( 'ModuleError' => ManagerError::Success, 'xlabels' => $labels, 'title' => 'Répartition dans la semaine', 'pointFormat' => '{series.name}: {point.y:1f} communications', 'series' => array( array( // En fonction des appels 'name' => 'appels', 'data' => $weekdays['phone'] ), array( // En fonction des sms 'name' => 'sms', 'data' => $weekdays['sms'] ) ) ); } /* RETOURNE UN JEU DE DONNEES POUR LES TEMPS DE COMMUNICATIONS * */ public static function timeofday($params){ extract($params); $subject = intval($subject); /* [1] On récupère les données de ce sujet =========================================================*/ $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $data = $db->fetch($subject); $db->close(); // Si erreur if( $data === false ) return array( 'ModuleError' => ManagerError::ModuleError ); /* [2] On initialise les valeurs =========================================================*/ /* (1) On charge le dictionnaire */ $dict = self::loadDictionary(); if( $dict === false ) return array( 'ModuleError' => ManagerError::ParsingFailed ); /* (2) On initialise les compteurs et labels et compteurs*/ $labels = array(); // labels des heures $times = array(); // heure en fonction du log for( $h = 0 ; $h < 23 ; $h++ ){ array_push($labels, $h.'h00'); $times[ $h*60 ] = 0; // xx H 00 array_push($labels, $h.'h30'); $times[ $h*60+30 ] = 0; // xx H 30 } /* [3] S'il a un journal d'appel, on renvoie les données =========================================================*/ if( isset($data['logs']) && is_array($data['logs']) ){ /* (2) On incrémente les compteurs */ foreach($data['logs'] as $log){ /* (3) On récupére le jour de la semaine */ $timeofday = (int) strtotime( date('1970-01-01 H:i:s', $log['date']) ); $timearray = getdate($log['date']); $timeofday = $timearray['hours']*60 + 30*round($timearray['minutes']/30); /* (4) On incrémente le compteur de la classe d'age en question */ if( isset($times[$timeofday])) $times[ $timeofday ]++; } } return array( 'ModuleError' => ManagerError::Success, 'xlabels' => $labels, 'zoom' => 'x', 'title' => 'Répartition dans la journée', 'series' => array( array( // En fonction des appels 'name' => 'communications', 'data' => array_values($times) ) ) ); } } ?>