]> git.mjollnir.org Git - tks.git/commitdiff
Added function to round to nearest 1/4 hour
authorPenny Leach <penny@mjollnir.org>
Tue, 15 Dec 2009 14:27:16 +0000 (15:27 +0100)
committerPenny Leach <penny@mjollnir.org>
Tue, 15 Dec 2009 14:27:16 +0000 (15:27 +0100)
tks.pl

diff --git a/tks.pl b/tks.pl
index 4514b301e75f3948e971891e4d3d28fd25736ad3..c17abb5dc520deace4c647cbd307052a2e6042a4 100755 (executable)
--- a/tks.pl
+++ b/tks.pl
@@ -91,18 +91,21 @@ foreach my $date ( sort keys %{$tkdata} ) {
     foreach my $entry ( sort { $a->{wr} <=> $b->{wr} } @{$tkdata->{$date}} ) {
         $date_has_data = 1;
 
-        printf("%s\t%5d\t%.2f\t%s\n", $date, $entry->{wr}, $entry->{time}, ($entry->{review_needed} ? '[review] ' : '') . $entry->{comment});
+        $entry->{newtime} = sprintf("%.2f", int($entry->{time} * 100 + .5) / 100);
+        my ($hours, $mins) = split(/\./, $entry->{newtime});
+        $entry->{newtime} =  $hours . '.' . round($mins, 25); # round to the nearest quarter of an hour
+
+        printf("%s\t%5d\t%.2f\t(%.2f)\t%s\n", $date, $entry->{wr}, $entry->{newtime}, $entry->{time}, ($entry->{review_needed} ? '[review] ' : '') . $entry->{comment});
 
         next unless $args->{'-c'};
 
-        $entry->{time} = int($entry->{time} * 100 + .5) / 100;
 
         # add the time to wrms
         my $win = $wrms->add_time(
             $entry->{wr},
             $date,
             $entry->{comment},
-            $entry->{time},
+            $entry->{newtime},
             $entry->{review_needed},
             $entry->{subwr},
         );
@@ -119,8 +122,9 @@ foreach my $date ( sort keys %{$tkdata} ) {
 
 
     my $day_time_taken = sum map { $_->{time} or 0 } @{$tkdata->{$date}};
-    printf(" " x length($date) . "\t\t%.2f\n\n", $day_time_taken) if $date_has_data;
-    $total_time += $day_time_taken if $day_time_taken;
+    my $day_newtime_taken = sum map { $_->{newtime} or 0 } @{$tkdata->{$date}};
+    printf(" " x length($date) . "\t\t%.2f\t(%.2f)\n\n", $day_newtime_taken, $day_time_taken) if $date_has_data;
+    $total_time += $day_newtime_taken if $day_time_taken;
 }
 
 write_file($args->{'<file>'}, @lines) if $file_needs_write;
@@ -294,3 +298,51 @@ sub convert_to_minutes {
     }
     die("Time in invalid format: $time");
 }
+
+
+
+sub round {
+
+    my ($min, $pos) = @_;
+    my %boundaries = (
+       25 => {
+           0  => [  0 .. 24 ],
+           25 => [ 25 .. 49 ],
+           50 => [ 50 .. 74 ],
+           75 => [ 75 .. 99 ]
+         },
+    );
+
+    # keep track of previous time round
+    my $interval = 0;
+    my $lastrounded = 0;
+    my $lastkey;
+
+    foreach my $v (sort keys %{$boundaries{$pos}}) {
+        return $v if ($v == $min);
+        my $thiskey = grep (/^$min$/, @{$boundaries{$pos}{$v}});
+        if ($thiskey) {
+            $interval = abs($min - $v);
+            $lastrounded = $v;
+        } elsif (!$thiskey && $interval) {
+            my $newinterval = abs($min - $v);
+            return &round_compare($v, $newinterval, $lastrounded, $interval);
+        }
+        $lastkey = $v;
+    }
+    my $newinterval = abs($min - $lastkey);
+    return &round_compare($lastkey, $newinterval, $lastrounded, $interval);
+}
+
+sub round_compare {
+    my ($key1, $interval1, $key2, $interval2) = @_;
+
+    return $key1 if $interval2 == 0;
+    return $key2 if $interval1 == 0;
+
+    return $key1 if $interval1 < $interval2;
+    return $key2 if $interval2 < $interval1;
+
+    return $key1 if $interval1 == $interval2;
+}
+