Subversion Repositories wimsdev

Rev

Rev 12947 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #!/usr/bin/perl
  2. use strict; use warnings;
  3.  
  4. # latency in second (calcul of worktime is min(latency,timescore-timenew)
  5. my $latency='900';
  6. use Time::Local;
  7. my ($OUT, $SHEET);
  8. my $SH='';my $OPTION='';
  9. my $LIMIT='9';
  10. push (@ARGV,split(' ', $ENV{'wims_exec_parm'})) if ($ENV{'wims_exec_parm'});
  11. while ($_ = shift (@ARGV))
  12. {
  13.   last if (!/^--/);
  14.      if (/^--file=(.*)$/) { $OUT   = $1; } # fichier de sortie
  15.      if (/^--sheet=(.*)$/) {$SHEET = $1; } # nombre de feuilles
  16.      if (/^--option=(.*):(.*)$/) {$OPTION = $1; $SH=$2} # option exobyday
  17.      if (/^--limit=(\d+)$/) {$LIMIT=$1} # limite de notes
  18. };
  19. #fichier à lire
  20. #my $FILE = "/" . $_;
  21. my $FILE = $_;
  22.  
  23. my $SH0=$SH;
  24. $SH =~ s/,/|/g;
  25. my (%lastdate, %score, %duree, $dattime);
  26. my (%exobyday,%scorebyday, %goodbyday,%newbyday)=((),(),());
  27. my (%exobydayex, %scorebydayex, %goodbydayex,%newbydayex)=((),(),(),());
  28. my (%exobydaysh, %scorebydaysh, %goodbydaysh,%newbydaysh)=((),(),(),());
  29. my (%seconds)=();
  30. for my $sh (1..$SHEET) {
  31.    $lastdate{$sh}='';
  32.    $score{$sh} = 0;
  33. }
  34. my ($session,$nbsessions,$nbnew)=(' ',0,0);
  35.   #le fichier est récupéré ordonné par dates croissantes
  36. open(IN, $FILE);
  37. while(<IN>){
  38.  #extraction de l'info de la ligne
  39.  #20070914.23:52:03 6BA720BDC3  1  1 score 10   82.238.218.220
  40.  #next si ligne d'examen
  41.  next if (/^E/);
  42.  @_ = split(/ +/);
  43.  $dattime=$_[0];
  44.  if ($_[4] eq 'score' || $_[4] =~ /new|resume/ || (!$lastdate{$_[2]}) ) {
  45.   if (!($session eq $_[1])){ $nbsessions ++; $session=$_[1]; };
  46.   $dattime=~/([0-9]+)\.([0-9:]+)/;
  47.   my ($date, $time) = ($1,$2);
  48.   $date =~/([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])/;
  49.   $seconds{$date}=timelocal(0,0,0,$3,$2-1,$1);
  50.   if (($_[2]=~ /\b($SH)\b/ || !($SH)) && ($_[4] eq 'score')) {
  51.     $exobyday{$date} ++ ;
  52.     $nbnew --;
  53.     $exobydaysh{$_[2]}->{$date} ++ ;
  54.     if ($_[5] >= $LIMIT){
  55.       $scorebyday{$date} ++ ;
  56.       $goodbyday{$date} .= (($goodbyday{$date})? ',':'') . $exobyday{$date};
  57.       $scorebydaysh{$_[2]}->{$date} ++;
  58.       $goodbydaysh{$_[2]}->{$date} .= (($goodbydaysh{$_[2]}{$date})? ',':'') . $exobydaysh{$_[2]}->{$date};
  59.     }
  60. ## n'a de sens que s'il y a une seule sheet
  61.     if ($_[2]=~ /\b$SH0\b/){
  62.       $exobydayex{$_[3]}->{$date} ++;
  63.       if ($_[5] >= $LIMIT){
  64.         $scorebydayex{$_[3]}->{$date} ++;
  65.         $goodbydayex{$_[3]}->{$date} .= (($goodbydayex{$_[3]}{$date})? ',':'') . $exobydayex{$_[3]}->{$date};
  66.       }
  67.     }
  68.   }
  69.   my ($annee, $mois, $jour)=($1,$2,$3);
  70.   $date=converttime($time,$date);
  71.   if ($_[4] =~ /new|resume/) {
  72.     $nbnew ++;
  73.     $lastdate{$_[2]}=$date;
  74.     if (($_[2]=~ /\b($SH)\b/ || !($SH))) { $newbydaysh{$_[2]}->{$date} ++ ; $newbyday{$date} ++}
  75. ## n'a de sens que s'il y a une seule sheet
  76.     if ($_[2]=~ /\b$SH0\b/){ $newbydayex{$_[3]}->{$date} ++;}
  77.     if ( !$duree{$_[2]} ) {$duree{$_[2]}= 0;};
  78.   next};
  79.  
  80.   if(!$lastdate{$_[2]} && $_[4] eq 'new'){#on initialise s'il n'avait jamais fait cette feuille :
  81. # en fait on passe jamais ici car le cmd=new est detecté avant et il y a une sortie donc à supprimer
  82.       $lastdate{$_[2]}=$date;
  83.       $duree{$_[2]}= 0;
  84.       next;
  85.    } else {
  86. #on juge que s'il y a moins de $latency entre deux dates consecutives, le bonhomme a travaille pendant ce temps
  87.         if ($lastdate{$_[2]} && $date-$lastdate{$_[2]}<$latency){
  88.            $duree{$_[2]} += ($date-$lastdate{$_[2]});
  89.         } else
  90.         {
  91.         $duree{$_[2]} += $latency;
  92.         }
  93.           $lastdate{$_[2]}=$date;
  94. #          
  95.   }
  96.   if ($_[4] eq 'score') {;
  97.     $score{$_[2]} ++;
  98.   };
  99.  };
  100. }
  101.  
  102. my ($text,$score_global,$duree_globale,$nombresessions_globale)= (' ',0,0,0);
  103. for my $sh (1..$SHEET) {
  104.  $text .= $score{$sh} . ',' . converttime2($duree{$sh}) . ',';
  105.  $score_global += $score{$sh}; if ($duree{$sh}) { $duree_globale += $duree{$sh}};
  106. }
  107. #dernière connexion,nb_sessions,nb exos abordés total, nb exos par feuille, temps par feuille,nb exos non aboutis
  108. exit if !($dattime);
  109.  
  110. print $dattime . ',' . $nbsessions  . ',' . $score_global . ','
  111.    . converttime2($duree_globale) . ',' . $text . $nbnew;
  112.  
  113. if ($OPTION eq 'exobyday'){
  114.  for my $date (sort keys %exobyday ) {
  115.    if (!$exobyday{$date}) {$exobyday{$date}=0;}
  116.    if (!$scorebyday{$date}) {$scorebyday{$date}=0;}
  117.    if (!$goodbyday{$date}) {$goodbyday{$date}='';}
  118.    if (!$newbyday{$date}) {$newbyday{$date}=0;} else {$newbyday{$date} -=$exobyday{$date}}
  119.  }
  120.  
  121.  my ($xcoord, $ycoord, $zcoord, $good, $tmp, $day, $init, $t, $wday, $new)=('','','','','','','','','','') ;
  122.  for my $date ( sort keys %exobyday ) {
  123.   if ($xcoord) {$tmp=',' ;} else {
  124.    $init=$seconds{$date} ;
  125.    my @wday = localtime($date); $wday=$wday[6]}
  126.   $xcoord .= $tmp . $date;
  127.   $t = ($seconds{$date}-$init) % 86400; $t=$wday+($seconds{$date}-$init-$t)/ 86400;
  128.   $day .= $tmp . $t;
  129.   $ycoord .= $tmp . $exobyday{$date};
  130.   $zcoord .= $tmp . $scorebyday{$date};
  131.   $good .= $tmp . '[' . $goodbyday{$date} .']';
  132.   $new .= $tmp . $newbyday{$date}
  133. }
  134. ###liste de dates, liste du nombre d'exos faits à cette date, liste des nombres de reussite,
  135. ###liste des listes de positions des reussites
  136.  
  137. print "\n[$xcoord],[$day],[$ycoord],[$zcoord],[$good],[$new]";
  138.  
  139. if (!($SH0=~ /,/)) {
  140.  for my $ex (sort {$a <=> $b} keys %exobydayex){
  141.    my ($xcoord,$ycoord,$zcoord,$good,$tmp,$new)=('','','','','','');
  142.    for my $date ( sort keys %exobyday ) {
  143.       if (!$exobydayex{$ex}->{$date}) { $exobydayex{$ex}->{$date}=0;}
  144.       if (!$scorebydayex{$ex}->{$date}) {$scorebydayex{$ex}->{$date} = 0;}
  145.       if (!$goodbydayex{$ex}->{$date}) { $goodbydayex{$ex}->{$date}='';}
  146.       if (!$newbydayex{$ex}->{$date}) {$newbydayex{$ex}->{$date}=0;} else { $newbydayex{$ex}->{$date} -=$exobydayex{$ex}->{$date} }
  147.       if ($xcoord) {$tmp=',' };
  148.       $xcoord .= $tmp . $date;
  149.       $ycoord .= $tmp . $exobydayex{$ex}->{$date};
  150.       $zcoord .= $tmp . $scorebydayex{$ex}->{$date};
  151.       $good .= $tmp . '[' . $goodbydayex{$ex}->{$date} . ']';
  152.       $new .= $tmp . $newbydayex{$ex}->{$date};
  153.  }
  154. ###pour les exercices d'une feuille
  155. ###numero exo, liste de dates, liste du nombre d'exos faits à cette date, liste des nombres de reussite,
  156. ###liste des listes de positions des reussites
  157.    print "\n$ex,[$xcoord],[$ycoord],[$zcoord],[$good],[$new]";
  158.   }
  159.  }
  160.  else {
  161.   for my $sh (sort {$a <=> $b} keys %exobydaysh){
  162.     my ($xcoord,$ycoord,$zcoord,$good,$tmp,$new)=('','','','','','');
  163.     for my $date ( sort ( keys %exobyday) ) {
  164.       if ($xcoord) {$tmp=',' };
  165.       $xcoord .= $tmp . $date;
  166.       if (!$exobydaysh{$sh}->{$date}) { $exobydaysh{$sh}->{$date}=0;}
  167.       if (!$scorebydaysh{$sh}->{$date}) {$scorebydaysh{$sh}->{$date} = 0;}
  168.       if (!$goodbydaysh{$sh}->{$date}) { $goodbydaysh{$sh}->{$date}='';}
  169.       if (!$newbydaysh{$sh}->{$date}) { $newbydaysh{$sh}->{$date}=0;}
  170.          else { $newbydaysh{$sh}->{$date} -=$exobydaysh{$sh}->{$date} }
  171.       $ycoord .= $tmp . $exobydaysh{$sh}->{$date};
  172.       $zcoord .= $tmp . $scorebydaysh{$sh}->{$date};
  173.       $good .= $tmp . '[' . $goodbydaysh{$sh}->{$date} . ']';
  174.       $new .= $tmp . $newbydaysh{$sh}->{$date};
  175.    }
  176. ###pour les feuilles d'une liste de feuilles
  177. ###numero feuille, liste de dates, liste du nombre d'exos faits à cette date, liste des nombres de reussite,
  178. ###liste des listes de positions des reussites
  179.    print "\n$sh,[$xcoord],[$ycoord],[$zcoord],[$good],[$new]";
  180.   }
  181.  }
  182. }
  183. sub converttime {
  184.     my $heure=shift;
  185.     my $date=shift;
  186.     $heure =~/([0-9]+):([0-9]+):([0-9]+)/;
  187.     $heure= 3600*$1+60*$2+$3;
  188.     $date =~/([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])/;
  189.     my $annee=$1;
  190.     my $mois=$2;
  191.     my $jour=$3;
  192.     return timelocal(0,0,0,$jour,$mois - 1,$annee) + $heure;
  193. }
  194.  
  195. sub converttime2 {
  196.     my $duree=shift;
  197.     return "0:0:0" if !($duree);
  198.     my $secondes = $duree% 60;
  199.     $duree = ($duree-$secondes)/ 60;
  200.     my $minutes = $duree% 60;
  201.     $duree = ($duree-$minutes)/ 60;
  202.     my $heures = $duree;
  203.     "$heures:$minutes:$secondes";
  204. }
  205.