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; } /* MODIFIE LES COULEURS DONNEES * * @colors Tableau de couleurs au format hsla * @tint Valeur a ajouter à tint * @constract Valeur a ajouter à constract * @lightness Valeur a ajouter à lightness * @opacity Valeur a ajouter à opacity * * @return darken Copie du tableau d'entrée, mais en plus foncé * */ private static function cFilter($colors, $tint=0, $contrast=0, $lightness=0, $opacity=0){ $darken = $colors; /* [1] Pour chaque couleur =========================================================*/ foreach($colors as $i=>$color){ /* (1) On vérifie que c'est bien au format hsl(tint, saturation%, lightness%, ) */ if( !preg_match('/^hsl\((\d+) ?, ?(\d+)% ?, ?(\d+)%\ ?, ?(\d+?.\d*)\)$/i', $color, $matches) ) continue; $newTint = intval($matches[1]) + $tint; $newContrast = intval($matches[2]) + $contrast; $newLightness = intval($matches[3]) + $lightness; $newOpacity = floatval($matches[4]) + $opacity; $darken[$i] = "hsl($newTint,$newContrast%, $newLightness%, $newOpacity)"; } return $darken; } /* 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; } } /* [4] Gestion des couleurs =========================================================*/ $colors = array(); $colors['default'] = array( 'hsla(347,100%,69%,1)', 'hsla(204,82%,57%,1)' ); $colors['hover'] = self::cFilter($colors['default'], 0, 0, -2); 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; /* [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; } } 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 ) ) )) ); } /* 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', 'series' => array( array( 'name' => 'Parmi les communications', 'data' => array_values($age_classes) ), array( 'name' => 'Parmi les 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', 'series' => array( array( // En fonction du log 'name' => 'Parmi les communications', 'data' => $relations ), array( // Parmi les contacts 'name' => 'Parmi les contacts', 'data' => $relationsByContact ) ) ); } } ?>