NxTIC/manager/module/input.php

432 lines
12 KiB
PHP

<?php
namespace manager\module;
use \manager\sessionManager;
use \manager\Database;
use \manager\ManagerError;
use \manager\ModuleRequest;
use \manager\Repo;
use \manager\lightdb;
class input{
/* TRAITE LES DONNÉES D'UN FORMULAIRE DE TYPE TÉLÉPHONIQUE
*
* @subject<Array> Tableau contenant les données du sujet
* @contacts<Array> Tableau contenant les données des contacts
* @mini<Array> Tableau contenant les données des mini fiches relation
* @fiches<Array> Tableau contenant les données des fiches relation
*
* @return subject_id<int> Retourne l'id sujet de l'enquête
*
*/
public static function phone($params){
extract($params);
/* [0] On récupère l'id unique actuel
=========================================================*/
$funiq = fopen( __ROOT__.'/src/dynamic/uniqid', 'r+' );
flock($funiq, LOCK_EX); // On verrouille le fichier
$uniqid = fgets( $funiq );
if( !is_numeric($uniqid) )
$uniqid = 0;
// Décalage à appliquer à tous les ids
$offset = intval($uniqid) + 1;
// on enregistre l'id du sujet
$subject_id = $subject['subject_id'];
// Contiendra la valeur de l'id maximum
$maxId = 0;
/* [1] On récupère les logs s'ils existent
=========================================================*/
// Contiendra le contenu du fichier
$file = array( 'logs' => array() );
/* (1) On définit les 2 fichiers utiles */
$tmpfile = __ROOT__.'/tmp/phone_'.$subject['tmp_id'].'.json';
/* (2) Si on a déja crée le fichier avec le journal d'appel dedans, on le récupère */
$storage_already = is_string($subject['tmp_id']) && strlen($subject['tmp_id']) == 40 && file_exists($tmpfile);
/* (3) Si on a déja crée le fichier, on essaie de récupérer son contenu */
if( $storage_already ){
$file = json_decode( file_get_contents($tmpfile), true );
// erreur
if( $file == null )
return array( 'ModuleRequest' => ManagerError::ParsingFailed );
// On incrémente tous les ids de l'offset
foreach($file['logs'] as $i=>$log){
$file['logs'][$i]['id'] = $offset + $log['id'];
if( $log['id'] > $maxId )
$maxId = (int) $log['id'];
}
}
/* [2] On enregistre les données du sujet
=========================================================*/
$file['subject'] = array( 'id' => $subject_id );
/* [3] On enregistre les contacts des MINI
=========================================================*/
$file['contacts'] = array();
$file['relations'] = array();
foreach($mini as $miniData){
// On récupère les données du contact associé
$contact = $contacts[ $miniData['uid'] ];
if( $miniData['uid'] > $maxId )
$maxId = (int) $miniData['uid'];
$newId = $offset + $miniData['uid'];
// On remplit les données qui iront dans le fichier pour ce contact
array_push($file['contacts'], array(
'id' => $newId,
'name' => $contact['username'],
'sexe' => $miniData['sexe'],
'age' => $miniData['age'],
'studies1' => $miniData['studies'],
'reltype' => ($miniData['reltype']==10) ? $miniData['reltypeSpecial'] : $miniData['reltype'], // si 'autre' -> valeur, sinon le code
'dist' => $miniData['loc']
));
// On enregistre la relation avec EGO
array_push($file['relations'], array(
'idA' => $subject_id,
'idB' => $newId,
'type' => 2 // relation cellulaire mineure
));
}
/* [4] On enregistre les contacts des FICHES
=========================================================*/
foreach($fiches as $f=>$ficheData){
// On récupère les données du contact associé
$contact = $contacts[ $ficheData['uid'] ];
if( $ficheData['uid'] > $maxId )
$maxId = (int) $ficheData['uid'];
$newId = $offset + $ficheData['uid'];
// On remplit les données qui iront dans le fichier pour ce contact
array_push($file['contacts'], array(
'id' => $newId,
'name' => $contact['username'],
'sexe' => $ficheData['sexe'],
'age' => $ficheData['age'],
'studies2' => $ficheData['studies'],
'reltype' => ($ficheData['reltype']==10) ? $ficheData['reltypeSpecial'] : $ficheData['reltype'], // si 'autre' -> valeur, sinon le code
'dist' => $ficheData['loc'],
'job' => $ficheData['job'],
'famsit' => $ficheData['famsit'],
'city' => $ficheData['city'],
'cp' => $ficheData['cp'],
'quartier' => $ficheData['quartier'],
'duration' => $ficheData['duration'],
'context' => $ficheData['context'],
'contextExtra' => $ficheData['contextSpecial'],
'freq' => $ficheData['freq'],
'connect' => $ficheData['connect'],
'connectExtra' => $ficheData['connectSpecial']
));
// On enregistre la relation avec EGO
array_push($file['relations'], array(
'idA' => $subject_id,
'idB' => $newId,
'type' => ($f<10) ? 4 : 5 // 4->appels 5->sms
));
}
/* [5] On enregistre les relations de la MATRICE
=========================================================*/
$clen = count($file['contacts']);
/* (1) On récupére les ids des contacts */
$cIdList = array();
foreach($file['contacts'] as $c=>$contact){
$id = $contact['id'] - $offset;
if( !in_array($id, $cIdList) )
$cIdList[$id] = null;
}
ksort($cIdList);
/* (2) On remplit les relations */
foreach($cIdList as $y=>$yNull){
foreach($cIdList as $x=>$xNull)
if( $x < $y ){ // On affiche que sous la diagonale
$idY = $file['contacts'][$y]['id'] - $offset;
$idX = $file['contacts'][$x]['id'] - $offset;
// Si relation alter-alter
$relationXY = isset($matrice[$y]) && in_array($x, $matrice[$y])
|| ( isset($matrice[$x]) && in_array($y, $matrice[$x]) );
array_push($file['relations'], array(
'idA' => $offset + $x,
'idB' => $offset + $y,
'type' => $relationXY ? 1 : 0 // 0->aucune relation 1->relation alter alter
));
}
}
/* [6] On enregistre tout dans 'lightdb'
=========================================================*/
$db = new lightdb('phone_db', __ROOT__.'/src/dynamic/');
$db->insert( $subject_id, $file );
$db->close();
/* [7] On met à jour le nouvel ID unique
=========================================================*/
// $maxId += $offset;
rewind($funiq); // On revient au début du fichier
fwrite($funiq, $offset+$maxId); // On écrit la nouvelle valeur (forcément plus grande)
flock($funiq, LOCK_UN); // On débloque le verrou
fclose($funiq);
/* [8] On supprime le fichier temporaire si existe
=========================================================*/
if( file_exists($tmpfile) )
unlink($tmpfile);
/* [9] Gestion du retour
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'subject_id' => $subject_id
);
}
/* TRAITE LES DONNÉES D'UN FORMULAIRE DE TYPE FACEBOOK
*
* @subject<Array> Tableau contenant les données du sujet
* @contacts<Array> Tableau contenant les données des contacts
* @mini<Array> Tableau contenant les données des mini fiches relation
* @fiches<Array> Tableau contenant les données des fiches relation
*
* @return subject_id<int> Retourne l'id sujet de l'enquête
*
*/
public static function facebook($params){
extract($params);
/* [0] On récupère l'id unique actuel
=========================================================*/
$funiq = fopen( __ROOT__.'/src/dynamic/uniqid', 'r+' );
flock($funiq, LOCK_EX); // On verrouille le fichier
$uniqid = fgets( $funiq );
if( !is_numeric($uniqid) )
$uniqid = 0;
// Décalage à appliquer à tous les ids
$offset = intval($uniqid) + 1;
// on enregistre l'id du sujet
$subject_id = $subject['subject_id'];
// Contiendra la valeur de l'id maximum
$maxId = 0;
/* [1] On enregistre les données du sujet
=========================================================*/
$file['subject'] = array( 'id' => $subject_id );
/* [2] On enregistre les contacts des MINI
=========================================================*/
$file['contacts'] = array();
$file['relations'] = array();
foreach($mini as $miniData){
// On récupère les données du contact associé
$contact = $contacts[ $miniData['uid'] ];
if( $miniData['uid'] > $maxId )
$maxId = (int) $miniData['uid'];
$newId = $offset + $miniData['uid'];
// On remplit les données qui iront dans le fichier pour ce contact
array_push($file['contacts'], array(
'id' => $newId,
'name' => $contact['username'],
'sexe' => $miniData['sexe'],
'age' => $miniData['age'],
'studies1' => $miniData['studies'],
'reltype' => ($miniData['reltype']==10) ? $miniData['reltypeSpecial'] : $miniData['reltype'], // si 'autre' -> valeur, sinon le code
'dist' => $miniData['loc']
));
// On enregistre la relation avec EGO
array_push($file['relations'], array(
'idA' => $subject_id,
'idB' => $newId,
'type' => 3 // relation facebook mineure
));
}
/* [4] On enregistre les contacts des FICHES
=========================================================*/
foreach($fiches as $f=>$ficheData){
// On récupère les données du contact associé
$contact = $contacts[ $ficheData['uid'] ];
if( $ficheData['uid'] > $maxId )
$maxId = (int) $ficheData['uid'];
$newId = $offset + $ficheData['uid'];
// On remplit les données qui iront dans le fichier pour ce contact
array_push($file['contacts'], array(
'id' => $newId,
'name' => $contact['username'],
'sexe' => $ficheData['sexe'],
'age' => $ficheData['age'],
'studies2' => $ficheData['studies'],
'reltype' => ($ficheData['reltype']==10) ? $ficheData['reltypeSpecial'] : $ficheData['reltype'], // si 'autre' -> valeur, sinon le code
'dist' => $ficheData['loc'],
'job' => $ficheData['job'],
'famsit' => $ficheData['famsit'],
'city' => $ficheData['city'],
'cp' => $ficheData['cp'],
'quartier' => $ficheData['quartier'],
'duration' => $ficheData['duration'],
'context' => $ficheData['context'],
'contextExtra' => $ficheData['contextSpecial'],
'freq' => $ficheData['freq'],
'connect' => $ficheData['connect'],
'connectExtra' => $ficheData['connectSpecial']
));
// On enregistre la relation avec EGO
array_push($file['relations'], array(
'idA' => $subject_id,
'idB' => $newId,
'type' => ($f<10) ? 6 : 7 // 6->historique 7->messenger
));
}
/* [5] On enregistre les relations de la MATRICE
=========================================================*/
foreach($file['contacts'] as $y=>$yContact)
foreach($file['contacts'] as $x=>$xContact)
if( $x < $y ){ // On affiche que sous la diagonale
// Si relation alter-alter
$relationXY = isset($matrice[$yContact['id']]) && in_array($xContact['id'], $matrice[$yContact['id']]);
array_push($file['relations'], array(
'idA' => $yContact['id'],
'idB' => $xContact['id'],
'type' => $relationXY ? 1 : 0 // 0->aucune relation 1->relation alter alter
));
}
/* [5] On enregistre tout dans 'lightdb'
=========================================================*/
$db = new lightdb('facebook_db', __ROOT__.'/src/dynamic/');
$db->insert( $subject_id, $file );
$db->close();
/* [6] On met à jour le nouvel ID unique
=========================================================*/
// $maxId += $offset;
rewind($funiq); // On revient au début du fichier
fwrite($funiq, $offset+$maxId); // On écrit la nouvelle valeur (forcément plus grande)
flock($funiq, LOCK_UN); // On débloque le verrou
fclose($funiq);
/* [7] Gestion du retour
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'subject_id' => $subject_id
);
}
}
?>