NxTIC/manager/module/chart.php

357 lines
8.9 KiB
PHP
Executable File

<?php
namespace manager\module;
use \manager\sessionManager;
use \manager\ManagerError;
use \manager\ResourceDispatcher;
use \manager\lightdb;
class chart{
/* CHARGE LE CONTENU DU DICTIONNAIRE
*
* @return dictionary<Array> 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<Array> Tableau de couleurs au format hsl
* @tint<int> Valeur a ajouter à tint
* @constract<int> Valeur a ajouter à constract
* @lightness<int> Valeur a ajouter à lightness
*
* @return darken<Array> Copie du tableau d'entrée, mais en plus foncé
*
*/
private static function cFilter($colors, $tint=0, $contrast=0, $lightness=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+)%\)$/i', $color, $matches) )
continue;
$newTint = intval($matches[1]) + $tint;
$newContrast = intval($matches[2]) + $contrast;
$newLightness = intval($matches[3]) + $lightness;
$darken[$i] = "hsl($newTint,$newContrast%, $newLightness%)";
}
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] Gestion des couleurs
=========================================================*/
$colors = array();
$colors['default'] = array( 'hsl(347,100%,69%)', 'hsl(204,82%,57%)', 'hsl(43,100%,67%)' );
$colors['hover'] = self::cFilter($colors['default'], 0, 0, -2);
return array(
'ModuleError' => ManagerError::Success,
'labels' => $labels,
'colors' => $colors,
'data' => array($INCOMING, $OUTGOING, $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( 'hsl(347,100%,69%)', 'hsl(204,82%,57%)' );
$colors['hover'] = self::cFilter($colors['default'], 0, 0, -2);
return array(
'ModuleError' => ManagerError::Success,
'colors' => $colors,
'labels' => array('APPELS', 'SMS'),
'data' => array($PHONE, $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;
}
}
/* [4] Gestion des couleurs
=========================================================*/
$colors = array();
$colors['default'] = array( 'hsl(347,100%,69%)', 'hsl(204,82%,57%)' );
$colors['hover'] = self::cFilter($colors['default'], 0, 0, -2);
return array(
'ModuleError' => ManagerError::Success,
'colors' => $colors,
'labels' => array('HOMME', 'FEMME'),
'data' => array($H, $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 initialise les compteurs */
$age_classes = array();
for( $i = 0 ; $i < 18 ; $i++ )
$age_classes[$i] = 0;
/* (2) On charge le dictionnaire */
$dict = self::loadDictionary();
if( $dict === false )
return array( 'ModuleError' => ManagerError::ParsingFailed );
/* (2) On initialise les labels */
$labels = array();
foreach($dict['contacts']['age'] as $i=>$label)
array_push($labels, $label);
/* [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 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'] ]++;
}
}
/* [4] Gestion des couleurs
=========================================================*/
$colors = array();
$colors['default'] = array();
$step = (int) (50/count($age_classes));
// Pour chaque classe, on ajoute une couleur
for( $i = 0 ; $i < count($age_classes) ; $i++ )
array_push($colors['default'], 'hsl(216,100%,'.(25+(50-$step*$i)).'%)');
$colors['hover'] = self::cFilter($colors['default'], 0, 0, -2);
return array(
'ModuleError' => ManagerError::Success,
'colors' => $colors,
'labels' => $labels,
'data' => $age_classes
);
}
}
?>