X-Git-Url: https://git.donarmstrong.com/?p=bin.git;a=blobdiff_plain;f=make_invoice;h=0047d45079b0544e92a4c1121489629ad1c55a02;hp=dc0a2b986f5c0299f1ba334a7537c61295fe1148;hb=HEAD;hpb=8bb2301355a483d2e9c355de96d0321be3242353 diff --git a/make_invoice b/make_invoice index dc0a2b9..0047d45 100755 --- a/make_invoice +++ b/make_invoice @@ -65,6 +65,14 @@ Time granularity, defaults to 0. Hourly fee, defaults to 50.00 +=item B<--tex-only> + +Only output the LaTeX file + +=item B<--log-only> + +Only output the log file + =item B<--debug, -d> Debug verbosity. (Default 0) @@ -104,6 +112,8 @@ my %options = (log => undef, debug => 0, help => 0, man => 0, + log_only => 0, + tex_only => 0, ); GetOptions(\%options, @@ -111,6 +121,8 @@ GetOptions(\%options, 'time_granularity|time-granularity|g=s', 'time_interval|min-time-interval|T=s', 'hourly_fee|hourly-fee|f=s', + 'log_only|log-only', + 'tex_only|tex-only', 'debug|d+','help|h|?','man|m'); pod2usage() if $options{help}; @@ -162,7 +174,9 @@ my @events; while (<$log_fh>) { chomp; + next if /^Total: \d+\.\d{2}$/; if (/^\s*\* /) { + print STDERR $_."\n"; if (defined $time) { $tex_log .= format_events(date => $date, date2 => $date2, @@ -173,27 +187,41 @@ while (<$log_fh>) { $date = undef; $time = undef; } - my $string = $_; - my ($d1,$d2) = map {s/^\s*\*\s*//; - ParseDate($_) - } split /\s*-\s*/; + s/\s*\[[\.\d]+\]\s*\[[\.\d]+\]\s*$//; + my ($d1,$d2); + if (/\s*\*\s*CLOCK:\s+\[([^\]]+)\]--\[([^\]]+)\]/ or + /^\s*\*\s*(.+)?\s* - \s*(.+)?\s*$/ + ) { + $d1 = UnixDate(ParseDate($1),'%s'); + $d2 = UnixDate(ParseDate($2),'%s'); + if (not defined $d1) { + die "Invalid date: $1"; + } + if (not defined $d2) { + die "Invalid date: $2"; + } + } else { + die "malformed line $_"; + } + my $string = '* '.strftime('%A, %B %e, %H:%M:%S',localtime($d1)).' - '. + strftime('%A, %B %e, %H:%M:%S',localtime($d2)); if (not defined $first_date) { $first_date = $d1; } $last_date = $d2; - my $delta = DateCalc($d1,$d2); - my $hours = Delta_Format($delta,0,'%ht'); + my $delta = $d2-$d1; + $date = $d1; + $date2 = $d2; + my $hours = $delta / (60*60); if ($hours < $options{time_interval}) { $hours = $options{time_interval} } - if ($options{time_granularity}) { + if ($options{time_granularity} > 0) { $hours = ceil($hours / $options{time_granularity})*$options{time_granularity}; } - $delta = ParseDateDelta($hours * 60 * 60 . ' sec'); - ($date,$date2) = ($d1,$d2); $time = $hours; - $totaldelta = defined($totaldelta)?DateCalc($delta,$totaldelta):$delta; - $calc_log .= qq($string [).Delta_Format($delta,2,q(%ht)).qq(] [).Delta_Format($totaldelta,2,q(%ht)).qq(]\n); + $totaldelta += $delta; + $calc_log .= $string.q( [).sprintf('%.2f',$hours).qq(] [).sprintf('%.2f',$totaldelta/(60*60)).qq(]\n); } elsif (/^\s+-\s*(.+)/) { my $event = $1; @@ -205,7 +233,7 @@ while (<$log_fh>) { $calc_log .= $_.qq(\n); } } -$calc_log .= "\nTotal: ".Delta_Format($totaldelta,2,q(%ht)).qq(\n); +$calc_log .= "\nTotal: ".sprintf('%.2f',$totaldelta/(60*60)).qq(\n); if (defined $time) { $tex_log .= format_events(date => $date, date2 => $date2, @@ -237,8 +265,8 @@ my $template; $template = <$template_fh>; } -my $invoice_start = UnixDate($first_date,'%B %e, %Y'); -my $invoice_stop = UnixDate($last_date,'%B %e, %Y'); +my $invoice_start = strftime('%c',localtime($first_date)); +my $invoice_stop = strftime('%c',localtime($last_date)); my $tt = Text::Template->new(TYPE=>'string', SOURCE => $template, @@ -247,13 +275,25 @@ my $tt = Text::Template->new(TYPE=>'string', my $tex_invoice = $tt->fill_in(HASH=>{start => $invoice_start, stop => $invoice_stop, log => $tex_log, + total => sprintf('%0.2f',$total), } ); if (not defined $tex_invoice) { die $Text::Template::ERROR; } -my $invoice_date = UnixDate($last_date,'%m_%d_%Y'); +if ($options{log_only}) { + print $calc_log; + exit 0; +} + +if ($options{tex_only}) { + print $tex_invoice; + exit 0; +} + + +my $invoice_date = strftime('%Y_%m_%d',localtime($last_date)); my $invoice_dir = "invoice_$invoice_date"; if (not -d $invoice_dir) { @@ -320,8 +360,8 @@ sub format_events{ ${$param{total}} += $param{time} * $options{hourly_fee}; # $param{date} =~ s/\s+\d+\:\d+\:\d+\s+[A-Z]{0,3}\s*//; - my $output = '\hline'."\n".' \mbox{'.strftime('%A, %B %e, %H:%M',localtime(UnixDate($param{date},'%s'))). - ' to '.strftime('%H:%M %Z',localtime(UnixDate($param{date2},'%s')))."}\n\n". + my $output = '\hline'."\n".' \mbox{'.strftime('%A, %B %e, %H:%M',localtime($param{date})). + ' to '.strftime('%H:%M %Z',localtime($param{date2}))."}\n\n". ' \begin{itemize*}'."\n"; $output .= join('',map { s/_/\\_/g; " \\item $_\n";} @{$param{events}}); $output .= ' \end{itemize*} & \$'.sprintf('%.2f',$options{hourly_fee}).' & '.sprintf('%.2f',$param{time}).