Liste des relations existantes * @idA id du premier sujet concerné * @idB id du second sujet concerné * @type type de relation * * @return already VRAI si déja dans la liste * */ private static function relAlready(&$relset, $idA, $idB, $type){ // relation alter-alter (0 aucun lien ; 1 lien) $alteralter = in_array($type, [0, 1]); /* (1) Pour chaque relation existante */ foreach($relset as $r=>$rel){ // {2} si même A / B // $sameAB = $rel['idA'] == $idA && $rel['idB'] == $idB; // {3} si même B / A // $sameBA = $rel['idA'] == $idB && $rel['idB'] == $idA; // {4} si même type // $sameType = $rel['type'] == $type; // {4} Cas particulier si on va mettre à jour une relation alter-alter // if( ($sameAB || $sameBA) && $alteralter && in_array($rel['type'], [0,1]) ){ // On remplace la valeur $relset[$r]['type'] = $type; // On fait comme si la relation existait déja return true; } // {5} si relation existante -> TRUE // if( ($sameAB || $sameBA) && $sameType ){ echo "already $idA and $idB with $type
"; return true; } } /* (2) Si rien trouvé -> */ return false; } /* TRAITE LES DONNÉES D'UN FORMULAIRE DE TYPE TÉLÉPHONIQUE * * @subject Données du sujet concerné * @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); $START_TIME = microtime(true); /* [1] On récupère l'id unique actuel =========================================================*/ $funiq = fopen( __BUILD__.'/lightdb/storage/uniqid', 'r+' ); flock($funiq, LOCK_EX); // On verrouille le fichier $uniqid = trim( 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 = intval($subject['subject_id']); // Contiendra la valeur de l'id maximum $maxId = $offset; /* [2] On initialise nos variables (lightdb + autres) =========================================================*/ /* (1) Fichiers de sortie */ $file = [ "subject" => "", "relations" => [] ]; /* (2) Bases de données */ $subjectdb = new lightdb('subject'); $contactdb = new lightdb('contact'); /* [3] Données du sujet =========================================================*/ $subject_set = $subjectdb->fetch($subject_id); /* (1) Si le sujet n'existe pas -> ERROR */ if( $subject_set === false ) return ['ModuleError'=>ManagerError::UnreachableResource]; /* (2) Initialisation des contacts si vide */ if( !isset($subject_set['contacts']) ) $subject_set['contacts'] = []; /* (3) Initialisation des relations si vide */ if( !isset($subject_set['relations']) ) $subject_set['relations'] = []; /* (4) Ajout de l'enquête */ if( !in_array('phone', $subject_set['subject']['surveys']) ) $subject_set['subject']['surveys'][] = 'phone'; /* (5) On met à jour si le sujet veut renouveller l'enquête plus tard */ $subject_set['subject']['coords'] = $subject['coords']; /* (6) On récupère les noms des contacts */ $contactsById = []; // idContact -> nomContact, typeEnquete ('mini' ou 'fiche') foreach($subject_set['contacts'] as $contactId){ $contactId = intval($contactId); $contactData = $contactdb->fetch( $contactId ); $contactsById[$contactId] = [ 'name' => $contactData['name'], 'type' => isset($contactData['studies2']) ? 'fiche' : 'mini' ]; } /* [4] On saisit les fiches + les contacts des fiches =========================================================*/ $contactsDone = [ "existing" => [], // Contacts exportés déja enregistrés "username" => [] // Nouveaux contacts déja enregistrés ]; $finalid = []; // id_contact -> id_final_contact (existant ou nouveau) foreach($fiches as $f=>$ficheData){ /* (1) On récupère les données du contact associé */ if( !isset($contacts[$ficheData['uid']]) ) continue; $contact = $contacts[ $ficheData['uid'] ]; /* (2) Si le contact a été importé d'une autre enquête */ if( isset($contact['existing']) && is_numeric($contact['existing']) ){ $newId = (int) $contact['existing']; $existingData = null; // si le contact existe bien déja -> on recup. ses données if( isset($contactsById[ $newId ]) ) $existingData = $contactsById[$newId]; $uname = $existingData['name']; // si aucune référence existante -> on oublie ce contact if( $existingData === null ){ $finalid[ intval($contact['uid']) ] = null; continue; } $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja une fiche ou qu'on a déja fait une fiche, on quitte if( $existingData['type'] === 'fiche' || isset($contactsDone['existing'][$newId]) ) continue; // On l'ajoute à la liste des contacts 'existing' fait $contactsDone['existing'][$newId] = $newId; /* (3) Si nouveau contact */ }else{ $newId = (int) ($offset+$contact['uid']); $uname = $contact['username']; $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja été saisi, on met l'ancienne référence puis on passe au suivant if( isset($contactsDone['username'][$uname]) ){ $finalid[ intval($contact['uid']) ] = $contactsDone['username'][$uname]; continue; } // On l'ajoute à la liste des contacts 'username' fait $contactsDone['username'][$uname] = $newId; } /* (4) Update du @maxId */ if( $newId > $maxId ) $maxId = (int) $newId; /* (5) On enregistre les données du contact */ $contactdb->insert($newId, [ 'id' => $newId, 'name' => $uname, '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'], 'medsoc' => $ficheData['medsoc'], 'interest' => $ficheData['interest'], 'irlfreq' => $ficheData['irlfreq'], 'relmark' => $ficheData['relmark'], 'medrel' => $ficheData['medrel'] ] ); // On ajoute le contact dans la liste des contacts du sujet (si pas déja) if( !in_array($newId, $subject_set['contacts']) ) $subject_set['contacts'][] = $newId; // On enregistre la relation avec EGO $reltype = ($f<20) ? 4 : 5; // 4->appels 5->sms if( !self::relAlready($subject_set['relations'], $subject_id, $newId, $reltype) ) $subject_set['relations'][] = [ 'idA' => $subject_id, 'idB' => $newId, 'type' => $reltype ]; } /* [5] On enregistre les mini + les contacts des mini =========================================================*/ foreach($mini as $miniData){ /* (1) On récupère les données du contact associé */ if( !isset($contacts[$miniData['uid']]) ) continue; $contact = $contacts[ $miniData['uid'] ]; /* (2) Si le contact a été importé d'une autre enquête */ if( isset($contact['existing']) && is_numeric($contact['existing']) ){ $newId = (int) $contact['existing']; $existingData = null; // si le contact existe bien déja -> on recup. ses données if( isset($contactsById[ $newId ]) ) $existingData = $contactsById[$newId]; $uname = $existingData['name']; // si aucune référence existante -> on oublie ce contact if( $existingData === null ){ $finalid[ intval($contact['uid']) ] = null; continue; } $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja une fiche ou qu'on a déja fait une fiche, on quitte if( $existingData['type'] === 'fiche' || isset($contactsDone['existing'][$newId]) ) continue; // On l'ajoute à la liste des contacts 'existing' fait $contactsDone['existing'][$newId] = $newId; /* (3) Si nouveau contact */ }else{ $newId = (int) ($offset+$contact['uid']); $uname = $contact['username']; $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja été saisi, on met l'ancienne référence puis on passe au suivant if( isset($contactsDone['username'][$uname]) ){ $finalid[ intval($contact['uid']) ] = $contactsDone['username'][$uname]; continue; } // On l'ajoute à la liste des contacts 'username' fait $contactsDone['username'][$uname] = $newId; } /* (4) Update du @maxId */ if( $newId > $maxId ) $maxId = (int) $newId; // On remplit les données qui iront dans le fichier pour ce contact $contactdb->insert($newId, [ 'id' => $newId, 'name' => $uname, '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 ajoute le contact dans la liste des contacts du sujet (si pas déja) if( !in_array($newId, $subject_set['contacts']) ) $subject_set['contacts'][] = $newId; // On enregistre la relation avec EGO if( !self::relAlready($subject_set['relations'], $subject_id, $newId, 2) ) $subject_set['relations'][] = [ 'idA' => $subject_id, 'idB' => $newId, 'type' => 2 // relation cellulaire mineure ]; } /* [6] On enregistre les relations de la MATRICE =========================================================*/ $clen = count($finalid); /* (1) On récupére les ids (initiaux) des contacts de manière unique */ $doneNewId = []; $cIdList = []; foreach($finalid as $lastid=>$newid){ // si id (ou reference) déja fait -> suivant if( array_key_exists($newid, $doneNewId) ) continue; $cIdList[$lastid] = null; $doneNewId[$newid] = false; } ksort($cIdList); /* (2) On remplit les relations */ foreach($cIdList as $x=>$yNull){ foreach($cIdList as $y=>$xNull) if( $x < $y ){ // On affiche que sous la diagonale // Si relation alter-alter $relation_type = isset($matrice[$y]) && in_array($x, $matrice[$y]) || ( isset($matrice[$x]) && in_array($y, $matrice[$x]) ); $relation_type = $relation_type ? 1 : 0; // 0->aucune relation 1->relation alter alter /* (3) Si la relation existe déja, on ne fait rien */ if( self::relAlready($subject_set['relations'], $finalid[$x], $finalid[$y], $relation_type) ) continue; $subject_set['relations'][] = [ 'idA' => $finalid[$x], 'idB' => $finalid[$y], 'type' => $relation_type ]; } } /* [6] On les données du sujet =========================================================*/ $subjectdb->delete($subject_id); $subjectdb->insert($subject_id, $subject_set); /* [7] Ferme les bases de données =========================================================*/ $subjectdb->close(); $contactdb->close(); /* [7] On met à jour le nouvel ID unique =========================================================*/ rewind($funiq); // On revient au début du fichier fwrite($funiq, $maxId); // On écrit la nouvelle valeur (forcément plus grande) flock($funiq, LOCK_UN); // On débloque le verrou fclose($funiq); /* [9] Gestion du retour =========================================================*/ return [ 'ModuleError' => ManagerError::Success, 'subject_id' => $subject_id, 'nb_contacts' => count($subject_set['contacts']), 'nb_relations' => count($subject_set['relations']), 'elapsed_time' => microtime(true) - $START_TIME ]; } /* TRAITE LES DONNÉES D'UN FORMULAIRE DE TYPE FACEBOOK * * @subject Données du sujet concerné * @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); $START_TIME = microtime(true); /* [1] On récupère l'id unique actuel =========================================================*/ $funiq = fopen( __BUILD__.'/lightdb/storage/uniqid', 'r+' ); flock($funiq, LOCK_EX); // On verrouille le fichier $uniqid = trim( 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 = intval($subject['subject_id']); // Contiendra la valeur de l'id maximum $maxId = $offset; /* [2] On initialise nos variables (lightdb + autres) =========================================================*/ /* (1) Fichiers de sortie */ $file = [ "subject" => "", "relations" => [] ]; /* (2) Bases de données */ $subjectdb = new lightdb('subject'); $contactdb = new lightdb('contact'); /* [3] Données du sujet =========================================================*/ $subject_set = $subjectdb->fetch($subject_id); /* (1) Si le sujet n'existe pas -> ERROR */ if( $subject_set === false ) return ['ModuleError'=>ManagerError::UnreachableResource]; /* (2) Initialisation des contacts si vide */ if( !isset($subject_set['contacts']) ) $subject_set['contacts'] = []; /* (3) Initialisation des relations si vide */ if( !isset($subject_set['relations']) ) $subject_set['relations'] = []; /* (4) Ajout de l'enquête */ if( !in_array('facebook', $subject_set['subject']['surveys']) ) $subject_set['subject']['surveys'][] = 'facebook'; /* (5) On met à jour si le sujet veut renouveller l'enquête plus tard */ $subject_set['subject']['coords'] = $subject['coords']; /* (6) On récupère les noms des contacts */ $contactsById = []; // idContact -> nomContact, typeEnquete ('mini' ou 'fiche') foreach($subject_set['contacts'] as $contactId){ $contactId = intval($contactId); $contactData = $contactdb->fetch( $contactId ); $contactsById[$contactId] = [ 'name' => $contactData['name'], 'type' => isset($contactData['studies2']) ? 'fiche' : 'mini' ]; } /* [4] On saisit les fiches + les contacts des fiches =========================================================*/ $contactsDone = [ "existing" => [], // Contacts exportés déja enregistrés "username" => [] // Nouveaux contacts déja enregistrés ]; $finalid = []; // id_contact -> id_final_contact (existant ou nouveau) foreach($fiches as $f=>$ficheData){ /* (1) On récupère les données du contact associé */ if( !isset($contacts[$ficheData['uid']]) ) continue; $contact = $contacts[ $ficheData['uid'] ]; /* (2) Si le contact a été importé d'une autre enquête */ if( isset($contact['existing']) && is_numeric($contact['existing']) ){ $newId = (int) $contact['existing']; $existingData = null; // si le contact existe bien déja -> on recup. ses données if( isset($contactsById[ $newId ]) ) $existingData = $contactsById[$newId]; $uname = $existingData['name']; // si aucune référence existante -> on oublie ce contact if( $existingData === null ){ $finalid[ intval($contact['uid']) ] = null; continue; } $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja une fiche ou qu'on a déja fait une fiche, on quitte if( $existingData['type'] === 'fiche' || isset($contactsDone['existing'][$newId]) ) continue; // On l'ajoute à la liste des contacts 'existing' fait $contactsDone['existing'][$newId] = $newId; /* (3) Si nouveau contact */ }else{ $newId = (int) ($offset+$contact['uid']); $uname = $contact['username']; $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja été saisi, on met l'ancienne référence puis on passe au suivant if( isset($contactsDone['username'][$uname]) ){ $finalid[ intval($contact['uid']) ] = $contactsDone['username'][$uname]; continue; } // On l'ajoute à la liste des contacts 'username' fait $contactsDone['username'][$uname] = $newId; } /* (4) Update du @maxId */ if( $newId > $maxId ) $maxId = (int) $newId; /* (5) On enregistre les données du contact */ $contactdb->insert($newId, [ 'id' => $newId, 'name' => $uname, '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 ajoute le contact dans la liste des contacts du sujet (si pas déja) if( !in_array($newId, $subject_set['contacts']) ) $subject_set['contacts'][] = $newId; // On enregistre la relation avec EGO $reltype = ($f<20) ? 6 : 7; // 4->historique 5->messenger if( !self::relAlready($subject_set['relations'], $subject_id, $newId, $reltype) ) $subject_set['relations'][] = [ 'idA' => $subject_id, 'idB' => $newId, 'type' => $reltype ]; } /* [5] On enregistre les mini + les contacts des mini =========================================================*/ foreach($mini as $miniData){ /* (1) On récupère les données du contact associé */ if( !isset($contacts[$miniData['uid']]) ) continue; $contact = $contacts[ $miniData['uid'] ]; /* (2) Si le contact a été importé d'une autre enquête */ if( isset($contact['existing']) && is_numeric($contact['existing']) ){ $newId = (int) $contact['existing']; $existingData = null; // si le contact existe bien déja -> on recup. ses données if( isset($contactsById[ $newId ]) ) $existingData = $contactsById[$newId]; $uname = $existingData['name']; // si aucune référence existante -> on oublie ce contact if( $existingData === null ){ $finalid[ intval($contact['uid']) ] = null; continue; } $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja une fiche ou qu'on a déja fait une fiche, on quitte if( $existingData['type'] === 'fiche' || isset($contactsDone['existing'][$newId]) ) continue; // On l'ajoute à la liste des contacts 'existing' fait $contactsDone['existing'][$newId] = $newId; /* (3) Si nouveau contact */ }else{ $newId = (int) ($offset+$contact['uid']); $uname = $contact['username']; $finalid[ intval($contact['uid']) ] = $newId; // S'il a déja été saisi, on met l'ancienne référence puis on passe au suivant if( isset($contactsDone['username'][$uname]) ){ $finalid[ intval($contact['uid']) ] = $contactsDone['username'][$uname]; continue; } // On l'ajoute à la liste des contacts 'username' fait $contactsDone['username'][$uname] = $newId; } /* (4) Update du @maxId */ if( $newId > $maxId ) $maxId = (int) $newId; // On remplit les données qui iront dans le fichier pour ce contact $contactdb->insert($newId, [ 'id' => $newId, 'name' => $uname, '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 ajoute le contact dans la liste des contacts du sujet (si pas déja) if( !in_array($newId, $subject_set['contacts']) ) $subject_set['contacts'][] = $newId; // On enregistre la relation avec EGO if( !self::relAlready($subject_set['relations'], $subject_id, $newId, 3) ) $subject_set['relations'][] = [ 'idA' => $subject_id, 'idB' => $newId, 'type' => 3 // relation facebook mineure ]; } /* [6] On enregistre les relations de la MATRICE =========================================================*/ $clen = count($finalid); /* (1) On récupére les ids (initiaux) des contacts de manière unique */ $doneNewId = []; $cIdList = []; foreach($finalid as $lastid=>$newid){ // si id (ou reference) déja fait -> suivant if( array_key_exists($newid, $doneNewId) ) continue; $cIdList[$lastid] = null; $doneNewId[$newid] = false; } ksort($cIdList); /* (2) On remplit les relations */ foreach($cIdList as $x=>$yNull){ foreach($cIdList as $y=>$xNull) if( $x < $y ){ // On affiche que sous la diagonale // Si relation alter-alter $relation_type = isset($matrice[$y]) && in_array($x, $matrice[$y]) || ( isset($matrice[$x]) && in_array($y, $matrice[$x]) ); $relation_type = $relation_type ? 1 : 0; // 0->aucune relation 1->relation alter alter /* (3) Si la relation existe déja, on ne fait rien */ if( self::relAlready($subject_set['relations'], $finalid[$x], $finalid[$y], $relation_type) ) continue; $subject_set['relations'][] = [ 'idA' => $finalid[$x], 'idB' => $finalid[$y], 'type' => $relation_type ]; } } /* [6] On les données du sujet =========================================================*/ $subjectdb->delete($subject_id); $subjectdb->insert($subject_id, $subject_set); /* [7] Ferme les bases de données =========================================================*/ $subjectdb->close(); $contactdb->close(); /* [7] On met à jour le nouvel ID unique =========================================================*/ rewind($funiq); // On revient au début du fichier fwrite($funiq, $maxId); // On écrit la nouvelle valeur (forcément plus grande) flock($funiq, LOCK_UN); // On débloque le verrou fclose($funiq); /* [9] Gestion du retour =========================================================*/ return [ 'ModuleError' => ManagerError::Success, 'subject_id' => $subject_id, 'nb_contacts' => count($subject_set['contacts']), 'nb_relations' => count($subject_set['relations']), 'elapsed_time' => microtime(true) - $START_TIME ]; } } ?>