#!/usr/bin/perl # $AFresh1: test.pl,v 1.6 2020/08/02 01:05:31 afresh1 Exp $ use strict; use warnings; use Template; use DateTime; use Cwd qw< abs_path >; my %invoice = ( id => 1234, invdate => DateTime->new( year => 2011, month => 3, day => 1 ), start => DateTime->new( year => 2011, month => 1, day => 1 ), end => DateTime->new( year => 2011, month => 3, day => 19 ), logo => abs_path( 'logo.pdf' ), info => [ 'Visit me online at http://example.com', 'Create a new ticket rt@example.com', ], from => 'Example Company 22115 Central Way Suite C Anytown, America 11111 (800) 555-1212 \texttt{}', to => 'John Doe 123 W Main St Anytown, America 11111', projects => [ { title => 'Weekly Retainer', fees => [ { contents => '2011-03-06 through 2011-03-12', count => 1, rate => 300, }, { contents => '2011-03-13 through 2011-03-19', count => 1, rate => 300, }, ], }, { id => 60, title => '60: A Special Project', detail => 'Requestors jdoe@example.net', fees => [ { contents => '2011-01-01: Talk a lot (727)', detail => 'This is detail about 727', count => 0.33, rate => 75, }, { contents => '2011-01-15: Write Stuff (730)', detail => 'This is detail about 730', count => 1.5, rate => 100, }, { contents => 'Rounding FAIL', detail => 'Should be $8.30', count => .083, rate => 100, }, ], }, { id => 65, title => '65: More work!', detail => 'Requestors jdoe@example.net', fees => [ { contents => '2011-01-06: Define Project (751)', count => 0.33, rate => 75, }, { contents => '2011-01-11: Code it up! (823)', count => 5, rate => 100, }, { contents => '2011-01-12: Redefine Project (903)', count => 0.25, rate => 75, }, { contents => '2011-01-13: Change everything: 933', count => 3, rate => 125, }, ], }, { id => 85, title => '85: Replace stuff', detail => 'Requestors maintenance@example.net', fees => [ { contents => '2011-01-13: Go unplug, replace, replug (834)', count => 2, rate => 125, }, ], expenses => [ { contents => '2x unbroken thingys', amount => 25, } ], }, { id => 90, title => '90: Make a two page invoice', fees => [ { contents => '2011-01-13: Add some stuff (834)', count => 2, rate => 125, }, ], }, ], discount => { contents => 'Discount', amount => '8.498', }, ); foreach my $project (@{ $invoice{projects} || [] }) { foreach my $fee (@{ $project->{fees} || [] }) { $invoice{total} += $fee->{count} * $fee->{rate}; } foreach my $expense (@{ $project->{expenses} || [] }) { $invoice{total} += $expense->{amount}; } } $invoice{total} -= $invoice{discount}{amount} if $invoice{discount}; my $tt = Template->new; $tt->process( 'invoice.tex.tt', \%invoice, 'invoice.pdf' ) || die $tt->error . "\n";