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},
);
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;
}
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;
+}
+