[BACK]Return to report_time CVS log [TXT][DIR] Up to [local] / RT / Invoicing

Diff for /RT/Invoicing/report_time between version 1.2 and 1.6

version 1.2, 2020/08/04 02:22:44 version 1.6, 2020/08/20 03:15:23
Line 1 
Line 1 
 #!/usr/bin/perl  #!/usr/bin/perl
 # $AFresh1: report_time,v 1.1 2020/08/04 01:14:42 afresh1 Exp $  # $AFresh1: report_time,v 1.5 2020/08/04 01:28:24 afresh1 Exp $
 use v5.16;  use v5.16;
 use warnings;  use warnings;
   
 my $dir = "$ENV{HOME}/.time";  my $dir = "$ENV{HOME}/rt_invoicing/time";
   
 my %conversions = (  my %conversions = (
         m  => "Misc",          m  => "Misc",
Line 31 
Line 31 
         map { "$dir/$_" } sort grep { /^\d{4}-\d{2}-\d{2}$/ } readdir $dh;          map { "$dir/$_" } sort grep { /^\d{4}-\d{2}-\d{2}$/ } readdir $dh;
 };  };
   
 my %entries;  my @entries;
 foreach my $file (@files) {  foreach my $file (@files) {
         my $key = 'm';  
   
         open my $fh, '<', $file or die "Unable to open $file: $!";          open my $fh, '<', $file or die "Unable to open $file: $!";
         while (readline $fh) {          while (readline $fh) {
                 my ($dt, $type, $description)                  my ($dt, $type, $description)
Line 43 
Line 41 
                 my %entry = ( dt => $dt, type => $type );                  my %entry = ( dt => $dt, type => $type );
                 $entry{description} = $description if $description;                  $entry{description} = $description if $description;
   
                 $key = descr_to_key($description)                  push @entries, \%entry;
                     if $type eq 'sta' and $description;  
   
                 push @{ $entries{$key} }, \%entry;  
         }          }
         close $fh;          close $fh;
 }  }
   
 my %total;  my %total;
 foreach my $key (sort keys %entries) {  {
         my $start;          my $start;
         foreach my $entry (@{ $entries{$key} }) {          my $key = 'm';
           foreach my $entry (@entries) {
   
                 # Sat Jul 11 11:56:06 PDT 2020                  # Sat Jul 11 11:56:06 PDT 2020
                 $entry->{datetime} = Time::Piece->new->strptime(                  $entry->{datetime} = Time::Piece->new->strptime(
                     $entry->{dt}, "%a %b %e %H:%M:%S %Z %Y");                      $entry->{dt}, "%a %b %e %H:%M:%S %Z %Y");
   
                 $total{ $entry->{datetime}->date }{$key}                  if ($start) {
                     += $entry->{datetime} - $start->{datetime}                          $key = descr_to_key($start->{description})
                     if $start;                              if $start->{description};
                           $total{ $entry->{datetime}->date }{$key}
                               += $entry->{datetime} - $start->{datetime};
                   }
   
                 $start = $entry->{type} eq 'sta' ? $entry : '';                  $start = $entry->{type} eq 'sta' ? $entry : '';
         }          }
   
         # If we have a timer running, pretend it stops now.          # If we have a timer running, pretend it stops now.
         if ($start) {          if ($start) {
                   $key = descr_to_key($start->{description})
                       if $start->{description};
                 my $now = localtime;                  my $now = localtime;
                 $total{ $now->date }{$key} += $now - $start->{datetime}                  $total{ $now->date }{$key} += $now - $start->{datetime}
         }          }
 }  }
   
   my $total = 0;
 foreach my $date ( sort keys %total ) {  foreach my $date ( sort keys %total ) {
           my $subtotal = 0;
         foreach my $key ( sort keys %{ $total{$date} } ) {          foreach my $key ( sort keys %{ $total{$date} } ) {
                   my $hours = $total{$date}{$key}->hours;
   
                 # round to the quarter hour                  # round to the quarter hour
                 my $hours = sprintf "%.2f",                  $hours = sprintf "%.02f",
                     25 * sprintf "%.2f", $total{$date}{$key}->hours / 25;                      25 * sprintf "%.02f", $hours / 25;
                 say "$date $hours $key";# if $hours != 0;  
                   say "$date $hours $key" if $hours != 0;
   
                   $subtotal += $hours;
                   $total    += $hours;
         }          }
           printf "# %s %.02f\n", $date, $subtotal;
 }  }
   printf "# Total %.02f\n", $total;
   
 sub descr_to_key {  sub descr_to_key {
         my ($descr) = @_;          my ($descr) = @_;
   
         my @key = split /\s+/, $descr;          my @key = split /\s+/, $descr;
   
         $key[-1] = $conversions{ $key[-1] }          $key[-1] = $conversions{ lc $key[-1] }
             if @key < 3 and $conversions{ $key[-1] };              if @key < 3 and $conversions{ lc $key[-1] };
   
         return "@key";          return "@key";
 }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.6

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>