Dotfiles, utilities, and other apparatus.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

108 lines
2.0 KiB

#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.0;
use File::HomeDir;
my $rcfile = File::HomeDir->my_home . "/.timelogrc";
# set an unreasonable default, so it's obvious:
our $hourly_rate = 10000;
do $rcfile if -e $rcfile;
my $total_hours = 0;
my $total_expenses = 0;
# while we've got input from a file/stdin, split it into two datestamps
# and feed that to date(1)
while (my $line = <>) {
chomp($line);
if ($line =~ m/
^
\s{2,} # leading whitespace, two or more
expense: # the string "expense"
[ ] # a space
\$ ([\d.]+) # an amount
[ ]
- # a dash with spaces
[ ]
(.*?) # any notes
$ # eol
/ix)
{
my $expense_amount = $1;
$total_expenses += $expense_amount;
my $expense_notes = $2;
say "* $line";
}
# skip things that don't look like a date range - everything else can
# just be commentary.
next unless $line =~ m/
^
\s{2,} # leading whitespace of two or more chars
(
\d{4} - \d{2} - \d{2} # date
)
[ ] # space
(
\d{1,2} : \d{2} # start timestamp
)
[ ] - [ ] # delimiter
(
\d{1,2} : \d{2} # end timestamp
)
$
/ix;
my $start_timestamp = "$1 $2";
my $end_timestamp = "$1 $3";
my ($start, $end) = map { get_seconds($_) } ($start_timestamp, $end_timestamp);
my $interval = $end - $start;
my $hours = $interval / 3600;
$total_hours += $hours;
say sprintf("* $line\t%.3f hours", $hours);
}
my $hourly_total = $total_hours * $hourly_rate;
my $overall_total = $hourly_total + $total_expenses;
print "\n";
say sprintf(
# extra spaces at end for newline in markdown:
'%.3f total hours at $%.2f/hr = $%.2f ',
$total_hours,
$hourly_rate,
$hourly_total
);
say sprintf(
'$%.2f in expenses',
$total_expenses
);
print "\n";
say sprintf('**Total due = $%.2f**', $overall_total);
sub get_seconds {
my ($stamp) = @_;
my $seconds = `date --date="$stamp" +%s`;
chomp($seconds);
return $seconds;
}