diff --git a/config/modules.json b/config/modules.json index 91b0dc2..d8fa239 100755 --- a/config/modules.json +++ b/config/modules.json @@ -262,6 +262,15 @@ }, + "iexplorer_convert": { + "description": "Convertisseur .txt (iExplorer) vers .xml (Call Log)", + "permissions": ["admin"], + "parameters": { + "file": { "description": "Fichier exporté de iExplorer", "type": "FILE" } + } + }, + + "local_data": { "description": "Upload d'une sauvegarde de formulaire local au format .json.", "permissions": ["admin"], diff --git a/config/upload-auth.json b/config/upload-auth.json index 76a23c2..552dcce 100644 --- a/config/upload-auth.json +++ b/config/upload-auth.json @@ -2,6 +2,7 @@ "root": "/src/upload", "directories": [ "call_log", - "local_data" + "local_data", + "convert_iexplorer" ] } diff --git a/js/includes/input-phone-matrice-min.js b/js/includes/input-phone-matrice-min.js index 9a2505c..31153be 100644 --- a/js/includes/input-phone-matrice-min.js +++ b/js/includes/input-phone-matrice-min.js @@ -2,4 +2,4 @@ function inputPhoneMatrice(a){this.container=a}inputPhoneMatrice.prototype={cont inputPhoneMatrice.prototype.fieldsToStorage=function(){console.log("MATRICE: FIELDS TO STORAGE");var a=(new FormDeflater(this.container,["input"],["data-name"])).deflate();crc32(JSON.stringify(a));var d={},b;for(b in a)if(a[b]instanceof Array)for(var e in a[b])null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b][e]));else null!==a[b]&&(null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b])));lsi.set("p_matrice",0,d)}; inputPhoneMatrice.prototype.storageToFields=function(){console.log("MATRICE: STORAGE TO FIELDS");var a=lsi["export"]("p_fiches"),d=lsi.get("p_matrice",0),b=lsi["export"]("p_contacts"),e=[],c;for(c in a)-1==e.indexOf(a[c].contact)&&e.push(a[c].contact);a="";for(c=0;c";0',a+=g.username,a+=""):a+="";for(var f=0;f",a+='', a+=h.username,a+=""):f",a+=""):a+=""}a+=""}this.container.innerHTML=a+"
"}; -inputPhoneMatrice.prototype.attach=function(){console.log("MATRICE: ATTACH");lsi.createDataset("p_matrice");this.storageToFields();var a=this;this.container.addEventListener("click",function(d){a.fieldsToStorage();a.storageToFields()},!1)}; +inputPhoneMatrice.prototype.attach=function(){console.log("MATRICE: ATTACH");lsi.createDataset("p_matrice");this.storageToFields();var a=this;this.container.addEventListener("click",function(d){a.fieldsToStorage();a.storageToFields()},!1);this.snake()};inputPhoneMatrice.prototype.snake=function(){this.sVelocity=[0,0];this.sLength=0;this.sStack=[]}; diff --git a/js/includes/input-phone-matrice.js b/js/includes/input-phone-matrice.js index a797aaf..6352ee0 100644 --- a/js/includes/input-phone-matrice.js +++ b/js/includes/input-phone-matrice.js @@ -170,4 +170,26 @@ inputPhoneMatrice.prototype.attach = function(){ ptr.fieldsToStorage(); ptr.storageToFields(); }, false); + + this.snake(); +}; + + + + + + + + + + +inputPhoneMatrice.prototype.snake = function(){ + + /* [0] On écrit les fonctions principales + =========================================================*/ + this.sVelocity = [0, 0]; + this.sLength = 0; + this.sStack = []; + + }; diff --git a/manager/module/upload.php b/manager/module/upload.php index 6c36338..7f4060e 100644 --- a/manager/module/upload.php +++ b/manager/module/upload.php @@ -364,6 +364,127 @@ } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /* CONVERTISSEUR .txt de iExplorer vers .xml de Call Log + * + * @file Pointeur vers $_FILES[''] + * + */ + public static function iexplorer_convert($params){ + extract($params); + + /* [1] Gestion de l'upload du fichier et de la vžérification du format + =========================================================*/ + $uploadError = self::simpleFile( + 'convert_iexplorer',// nom du dossier d'upload + 'txt', // format du fichier + $file, // Fichier lui-même + function($content){ + $lines = explode("\n", $content); + + foreach($lines as $l=>$line) + if( strlen($line) > 0 && !preg_match('/^([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) *$/u', $line) ) + return false; + + return true; + } + ); + + /* (1) Si erreur d'upload, on la renvoie */ + if( $uploadError != ManagerError::Success ) + return array( 'ModuleError' => $uploadError ); + + + + /* [2] On récupère les colonnes avec la premiére ligne + =========================================================*/ + /* (1) On met un handler sur le fichier pour le lire */ + $path = __ROOT__."/src/upload/convert_iexplorer/".$_SESSION['username'].".txt"; + + $handler = new \SplFileObject($path, 'r'); + + /* (2) On récupère pour chaque colonne, la position dans le chaine, et la valeur */ + $data = array(); + $lineCount = 0; + while( !$handler->eof() ){ + $line = $handler->fgets(); + + /* (1) Si première ligne, c'est les intitulés */ + if( $lineCount == 0 ){ + // Si erreur dans les intitulés, on retourne une erreur + if( !preg_match('/^([\w\(\):\.@-]+(?: [\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: [\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: [\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: [\w\(\):\.@-]+)*) *$/u', $line, $matches) ) + return array( 'ModuleError' => ManagerError::FormatError ); + + // On récupère les colonnes + $columns = array_slice($matches, 1); + + // On récupére les positions des colonnes + $colpos = array(); + foreach($columns as $column) + array_push($colpos, strpos($line, $column)); + + } + + + + /* (2) S'il reconnait pas la ligne, on passe à la suivante */ + if( !preg_match('/^([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) +([\w\(\):\.@-]+(?: {1,3}[\w\(\):\.@-]+)*) *$/u', $line, $matches) ) + continue; + + /* (3) On enregistre les données sinon */ + $cur = array(); + foreach($columns as $c=>$column) + $cur[$column] = $matches[$c+1]; + + array_push($data, $cur); + + + $lineCount++; + } + + + $handler = null; + + /* (3) Restitution du retour de `unserialize` */ + return array( + 'ModuleError' => ManagerError::Success, + 'data' => $data + ); + } + + } diff --git a/view/iexplorer-to-call-log.php b/view/iexplorer-to-call-log.php new file mode 100644 index 0000000..297f9d0 --- /dev/null +++ b/view/iexplorer-to-call-log.php @@ -0,0 +1,111 @@ +dispatch(); + + // Si erreur, on l'affiche + if( $response->error != ManagerError::Success ) + var_dump( ManagerError::explicit($response->error) ); + + // On récupère les données + $logs = $response->get('data'); + + /* [1] On associe un faux numéro à chaque utilisateur + =========================================================*/ + $falseNumbers = array(0); // Contiendra les numéros attribués + $alreadyNumbered = array(); // Contiendra aux mêmes indices que les numéros, les noms des personnes les ayant utilisé + + // Pour chaque utilisateur + foreach($logs as $i=>$log){ + + // On évite la première ligne + if( $i == 0 ){ + unset($logs[$i]); + continue; + } + + $numberIndex = array_search($log['Number'], $alreadyNumbered); + + /* (1) Si pas encore de numéro, on en attribue un */ + if( $numberIndex === false ){ + $lastnumIndex = count($falseNumbers) - 1; + $newNumber = ++$falseNumbers[$lastnumIndex]; + $numberIndex = array_push($falseNumbers, $newNumber ) - 1; + $alreadyNumbered[$numberIndex] = $log['Number']; + } + + $logs[$i]['Name'] = $logs[$i]['Number']; + $logs[$i]['Number'] = $falseNumbers[$numberIndex]; + } + + /* (2) On convertit les numéros en string */ + foreach($falseNumbers as $n=>$number){ + $stringNumber = "0600000000"; $snlen = strlen($stringNumber); + $stringValue = strval($number); $svlen = strlen($stringValue); + + $stringNumber = substr($stringNumber, 0, $snlen-$svlen); + $stringNumber .= $stringValue; + + $falseNumbers[$n] = $stringNumber; + $logs[$i]['Number'] = $falseNumbers[$numberIndex]; + } + + foreach($logs as $i=>$log){ + $numberIndex = array_search($log['Name'], $alreadyNumbered); + $logs[$i]['Number'] = $falseNumbers[$numberIndex]; + } + + /* [2] On rédige les headers + =========================================================*/ + header('Content-type: text/xml'); + header('Content-Disposition: attachment; filename=call-log.xml'); + + + /* [3] On rédige le contenu du fichier XML + =========================================================*/ + echo "\n"; + echo "\n"; + + // Pour chaque utilisateur + foreach($logs as $i=>$log) + echo "\n"; + + echo "\n"; + + // Si aucun fichier + }else{ ?> +
+ + +
+