634 lines
16 KiB
PHP
Executable File
634 lines
16 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;
|
|
}
|
|
|
|
/* 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,
|
|
'type' => 'pie',
|
|
'title' => 'Répartition des appels',
|
|
'pointFormat' => '{series.name}: <b>{point.percentage:.1f}%</b>',
|
|
'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,
|
|
'type' => 'pie',
|
|
'title' => 'Répartition des types de communication',
|
|
'pointFormat' => '{series.name}: <b>{point.percentage:.1f}%</b>',
|
|
'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,
|
|
'type' => 'pie',
|
|
'title' => 'Répartition des genres',
|
|
'pointFormat' => '{series.name}: <b>{point.percentage:.1f}%</b>',
|
|
'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,
|
|
'type' => 'column',
|
|
'xlabels' => $labels,
|
|
'title' => 'Répartition des ages',
|
|
'zoom' => 'x',
|
|
'pointFormat' => '{series.name}: <b>{point.y:.1f}%</b>',
|
|
'ytitle' => "apparitition (%)",
|
|
'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,
|
|
'type' => 'bar',
|
|
'ytitle' => "apparitition (%)",
|
|
'xlabels' => $labels,
|
|
'title' => 'Répartition des relations',
|
|
'pointFormat' => '{series.name}: <b>{point.y:.1f}%</b>',
|
|
'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,
|
|
'type' => 'column',
|
|
'ytitle' => "apparititions",
|
|
'xlabels' => $labels,
|
|
'title' => 'Répartition dans la semaine',
|
|
'pointFormat' => '{series.name}: {point.y}<br/>Total: {point.stackTotal}',
|
|
'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 < 24 ; $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,
|
|
'type' => 'column',
|
|
'xlabels' => $labels,
|
|
'zoom' => 'x',
|
|
'title' => 'Répartition dans la journée',
|
|
'series' => array(
|
|
array( // En fonction des appels
|
|
'name' => 'communications',
|
|
'data' => array_values($times)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
?>
|