511 lines
14 KiB
PHP
Executable File
511 lines
14 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 hsla
|
|
* @tint<int> Valeur a ajouter à tint
|
|
* @constract<int> Valeur a ajouter à constract
|
|
* @lightness<int> Valeur a ajouter à lightness
|
|
* @opacity<int> Valeur a ajouter à opacity
|
|
*
|
|
* @return darken<Array> 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] Gestion des couleurs
|
|
=========================================================*/
|
|
$colors = array();
|
|
|
|
$colors['default'] = array( 'hsla(347,100%,69%,1)', 'hsla(204,82%,57%,1)', 'hsla(43,100%,67%,1)' );
|
|
$colors['hover'] = self::cFilter($colors['default'], 0, 0, -2);
|
|
|
|
|
|
return array(
|
|
'ModuleError' => ManagerError::Success,
|
|
'labels' => $labels,
|
|
'datasets' => array(array(
|
|
'data' => array($INCOMING, $OUTGOING, $MISSED),
|
|
'backgroundColor' => $colors['default'],
|
|
'hoverBackgroundColor' => $colors['hover']
|
|
))
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 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,
|
|
'labels' => array('APPELS', 'SMS'),
|
|
'datasets' => array(array(
|
|
'data' => array($PHONE, $SMS),
|
|
'backgroundColor' => $colors['default'],
|
|
'hoverBackgroundColor' => $colors['hover']
|
|
))
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 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( 'hsla(347,100%,69%,1)', 'hsla(204,82%,57%,1)' );
|
|
$colors['hover'] = self::cFilter($colors['default'], 0, 0, -2);
|
|
|
|
|
|
return array(
|
|
'ModuleError' => ManagerError::Success,
|
|
'labels' => array('HOMME', 'FEMME'),
|
|
'datasets' => array(array(
|
|
'data' => array($H, $F),
|
|
'backgroundColor' => $colors['default'],
|
|
'hoverBackgroundColor' => $colors['hover']
|
|
))
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 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();
|
|
$labels = array();
|
|
foreach($dict['contacts']['age'] as $i=>$label){
|
|
array_push($labels, $label);
|
|
$age_classes[$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 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,
|
|
'labels' => $labels,
|
|
'datasets' => array(array(
|
|
'data' => $age_classes,
|
|
'backgroundColor' => $colors['default'],
|
|
'hoverBackgroundColor' => $colors['hover']
|
|
))
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
|
|
|
|
/* [5] Gestion des couleurs
|
|
=========================================================*/
|
|
$colors = array();
|
|
|
|
$colors['default'] = array();
|
|
$colors['defaultContact'] = array();
|
|
|
|
$step = (int) (50/count($relations));
|
|
|
|
// Pour chaque classe, on ajoute une couleur
|
|
for( $i = 0 ; $i < count($relations) ; $i++ )
|
|
array_push($colors['default'], 'hsla(216,100%,'.(25+(50-$step*$i)).'%,.5)');
|
|
|
|
$colors['hover'] = self::cFilter($colors['default'], 0, 0, -2);
|
|
|
|
// Pour chaque classe PAR CONTACT, on ajoute une couleur
|
|
for( $i = 0 ; $i < count($relationsByContact) ; $i++ )
|
|
array_push($colors['defaultContact'], 'hsla(20,100%,'.(25+(50-$step*$i)).'%,.5)');
|
|
|
|
$colors['hoverContact'] = self::cFilter($colors['defaultContact'], 0, 0, -2);
|
|
|
|
|
|
|
|
return array(
|
|
'ModuleError' => ManagerError::Success,
|
|
'labels' => $labels,
|
|
'datasets' => array(
|
|
array( // En fonction du log
|
|
'label' => 'Répartition des communications',
|
|
'data' => $relations,
|
|
'backgroundColor' => $colors['default'],
|
|
'hoverBackgroundColor' => $colors['hover'],
|
|
'borderWidth' => 1,
|
|
'borderColor' => 'hsla(216,100%,80%,1)'
|
|
),
|
|
array( // Répartition dans les contacts
|
|
'label' => 'Répartition des contacts',
|
|
'data' => $relationsByContact,
|
|
'backgroundColor' => $colors['defaultContact'],
|
|
'hoverBackgroundColor' => $colors['hoverContact'],
|
|
'borderWidth' => 1,
|
|
'borderColor' => 'hsla(20,100%,80%,1)'
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
?>
|