rodrigopolo

Validador para docs de la SAT (que son unos idiotas)

Jul 25th, 2013
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. fs = require('fs')
  2. fs.readFile("./doc.txt", 'utf8', function (err,data) {
  3.     if (err) {
  4.         return console.log(err);
  5.     }
  6.  
  7.  
  8.     var header_arr = ["CODIGO_PRODUCTO","UNIDAD_DE_MEDIDA","DESCRIPCION","CANTIDAD","COSTO_UNITARIO","COSTO_TOTAL"];
  9.     var valid_count_arr = ['100','100','100','12.4','12.6','12.2'];
  10.  
  11.  
  12.     var lines_arr = [];
  13.     var curr_line_arr = [];
  14.  
  15.     var col = [];
  16.     var curr_line;
  17.     var doc = [];
  18.  
  19.     lines_arr = data.split("\n");
  20.  
  21.     for (var i=0;i<lines_arr.length;i++){
  22.         curr_line_num = i+1;
  23.         curr_line_arr = lines_arr[i].split("\t");
  24.  
  25.         // chequea fin del doc
  26.         if(lines_arr[i].length<1){
  27.             break;
  28.         }
  29.  
  30.         // chequeo de numero de columnas
  31.         if(curr_line_arr.length!=6){
  32.             console.log("La línea "+curr_line_num+" no tiene exactamente 6 columnas, tiene: "+curr_line_arr.length);
  33.         }
  34.  
  35.  
  36.         for (var j=0;j<curr_line_arr.length;j++){
  37.             curr_col_num = j+1;
  38.             curr_col_data =  remove_lb(curr_line_arr[j]);
  39.  
  40.             // Verifica el nombre de cada columna en el header
  41.             if(i==0){
  42.                 if(curr_col_data!=header_arr[j]){
  43.                     console.log("Encabezado no encaja, "+'"'+curr_col_data+'"'+" debería ser "+'"'+header_arr[j]+'".');                   
  44.                 }
  45.                 // to ignore the first line
  46.                 continue;
  47.             }
  48.            
  49.  
  50.             //
  51.             x = valid_count_arr[j]+0;
  52.            
  53.             // texto - numerico
  54.             if(x % 1 != 0){
  55.  
  56.                 if(!curr_col_data){
  57.                     console.log(curr_col_data);
  58.                     break;
  59.                 }
  60.                 if(!valid_count_arr[j]){
  61.                     console.log(valid_count_arr[j]);
  62.                     break;
  63.                 }
  64.  
  65.                 // test numerico
  66.                 if(!testNum(curr_col_data)){
  67.                     console.log("La linea número \""+curr_line_num+"\" columna \""+header_arr[j]+"\" no es un valor numérico valido.");
  68.  
  69.                 }else{
  70.                     // test decimal y length
  71.                     if(!validate_dec(curr_col_data,valid_count_arr[j])){
  72.                         chperm = valid_count_arr[j].split('.');
  73.                         console.log("La linea número \""+curr_line_num+"\" columna \""+header_arr[j]+"\" tiene más del límite permitido que es de \""+chperm[0]+"\" enteros y \""+chperm[1]+"\" decimales.");
  74.                     }
  75.                 }
  76.  
  77.  
  78.  
  79.             }else{
  80.  
  81.                 // test length strings
  82.                 if(curr_col_data.length > valid_count_arr[j]){
  83.                     console.log("La linea número \""+curr_line_num+"\" columna \""+header_arr[j]+"\" tiene más del límite permitido que es de \""+valid_count_arr[j]+"\".");
  84.                 }
  85.                 if(!alphaTest(curr_col_data)){
  86.                     console.log("La linea número \""+curr_line_num+"\" columna \""+header_arr[j]+"\" tiene caracteres inválidos.");
  87.                     //console.log(curr_col_data);
  88.                 }
  89.             }
  90.  
  91.  
  92.         }
  93.     }
  94.  
  95. });
  96.  
  97.  
  98. // remueve caracteres de retorno
  99. function remove_lb(s){
  100.     return s.replace(/(\r\n|\n|\r)/gm,"");
  101. }
  102.  
  103. // verifica ancho de decimales, los trata como strings porque el documento es texto
  104. function validate_dec(v,test){
  105.     var tv = test.split('.');
  106.     var val = v.split('.');
  107.     var max_len = parseInt(tv[0]);
  108.     if(val[0].length>max_len){
  109.         return false;
  110.     }
  111.     max_len = parseInt(tv[1]);
  112.     if(val[1].length>max_len){
  113.         return false;
  114.     }
  115.     return true;
  116. }
  117.  
  118. // verifica si es un número
  119. function testNum(value){
  120.     return((!isNaN(value) && value.toString().indexOf('.') != -1) || !isNaN(value));
  121. }
  122.  
  123. // verifica si es alphanum
  124. function alphaTest(v){
  125.     return !(/[^a-zA-Z0-9 ]/.test(v));
  126. }
Advertisement
Add Comment
Please, Sign In to add comment