Tableau contenant les données du sujet * @contacts Tableau contenant les données des contacts * @mini Tableau contenant les données des mini fiches relation * @fiches Tableau contenant les données des fiches relation * * @return subject_id 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( __BUILD__.'/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 = [ 'logs' => [] ]; /* (1) On définit les 2 fichiers utiles */ $tmpfile = __BUILD__.'/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 [ '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'] = [ 'id' => $subject_id ]; /* [3] On enregistre les contacts des MINI =========================================================*/ $file['contacts'] = []; $file['relations'] = []; 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'], [ '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'], [ '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'], [ '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'], [ '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 = []; 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'], [ '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'); $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 [ 'ModuleError' => ManagerError::Success, 'subject_id' => $subject_id ]; } /* TRAITE LES DONNÉES D'UN FORMULAIRE DE TYPE FACEBOOK * * @subject Tableau contenant les données du sujet * @contacts Tableau contenant les données des contacts * @mini Tableau contenant les données des mini fiches relation * @fiches Tableau contenant les données des fiches relation * * @return subject_id 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( __BUILD__.'/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'] = [ 'id' => $subject_id ]; /* [2] On enregistre les contacts des MINI =========================================================*/ $file['contacts'] = []; $file['relations'] = []; 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'], [ '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'], [ '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'], [ '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'], [ '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'], [ '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'); $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 [ 'ModuleError' => ManagerError::Success, 'subject_id' => $subject_id ]; } } ?>