diff options
| author | ivan <ivan> | 2003-11-29 08:08:36 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2003-11-29 08:08:36 +0000 | 
| commit | 23ec9b00410224868d6be1e47a0d72a6c8b3f6f5 (patch) | |
| tree | 33839091532e09ff4efc376ab6e8553db42e45dc /FS/FS | |
| parent | e6c8cca8d3daec590f248e9ca16384dc8c94e21e (diff) | |
postscript invoice redux
Diffstat (limited to 'FS/FS')
| -rw-r--r-- | FS/FS/Conf.pm | 37 | ||||
| -rw-r--r-- | FS/FS/cust_bill.pm | 165 | 
2 files changed, 142 insertions, 60 deletions
| diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index c69817d49..b30beafaf 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -174,7 +174,7 @@ sub config_items {    my $self = shift;     #quelle kludge    @config_items, -  map {  +  ( map {           my $basename = basename($_);          $basename =~ /^(.*)$/;          $basename = $1; @@ -185,7 +185,19 @@ sub config_items {                             'type'        => 'textarea',                           }        } glob($self->dir. '/invoice_template_*') -  ; +  ), +  ( map {  +        my $basename = basename($_); +        $basename =~ /^(.*)$/; +        $basename = $1; +        new FS::ConfItem { +                           'key'         => $basename, +                           'section'     => 'billing', +                           'description' => 'Alternate LaTeX template for invoices.  See the <a href="../docs/billing.html">billing documentation</a> for details.', +                           'type'        => 'textarea', +                         } +      } glob($self->dir. '/invoice_latex_*') +  );  }  =back @@ -450,6 +462,27 @@ httemplate/docs/config.html      'type'        => 'textarea',    }, +  { +    'key'         => 'invoice_latex', +    'section'     => 'billing', +    'description' => 'Optional LaTeX template for typeset PostScript invoices.', +    'type'        => 'textarea', +  }, + +  { +    'key'         => 'invoice_latexnotes', +    'section'     => 'billing', +    'description' => 'Notes section for LaTeX typeset PostScript invoices.', +    'type'        => 'textarea', +  }, + +  { +    'key'         => 'invoice_latexfooter', +    'section'     => 'billing', +    'description' => 'Footer for LaTeX typeset PostScript invoices.', +    'type'        => 'textarea', +  }, +    {       'key'         => 'invoice_default_terms',      'section'     => 'billing', diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index aacb50425..9409bc5f6 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -784,14 +784,7 @@ sub print_text {    }    #balance due -  my $balance_due_msg = 'Balance Due'; - -  if ( $conf->config('invoice_default_terms') =~ /^\s*Net\s*(\d+)\s*$/ ) { -    $balance_due_msg .= -      ' - Please pay by '. time2str("%x", $self->_date + ($1*86400) ); -  } elsif ( $conf->config('invoice_default_terms') ) { -    $balance_due_msg .= ' - '. $conf->config('invoice_default_terms'); -  } +  my $balance_due_msg = $self->balance_due_msg;    push @buf,['','-----------'];    push @buf,[$balance_due_msg, $money_char.  @@ -920,36 +913,31 @@ sub print_ps {    @buf = ();    #create the template -  my $templatefile = 'invoice_template_latex'; +  my $templatefile = 'invoice_latex';    $templatefile .= "_$template" if $template;    my @invoice_template = $conf->config($templatefile)      or die "cannot load config file $templatefile";    my %invoice_data = ( -    'invnum'   => $self->invnum, -    'date'     => time2str('%b %o, %Y', $self->_date), -    'agent'    => $cust_main->agent->agent, -    'payname'  => $cust_main->payname, -    'company'  => $cust_main->company, -    'address1' => $cust_main->address1, -    'address2' => $cust_main->address2, -    'city'     => $cust_main->city, -    'state'    => $cust_main->state, -    'zip'      => $cust_main->zip, -    'country'  => $cust_main->country, -    'footer'   => <<'END', #should come from config value -Ivan Kohler\\ -1339 Hayes St.\\ -San Francisco, CA~~94117\\ -ivan@sisd.com~~~~+1 415 462 1624\\ -Freeside - open-source billing - http://www.sisd.com/freeside\\ -END - +    'invnum'       => $self->invnum, +    'date'         => time2str('%b %o, %Y', $self->_date), +    'agent'        => $cust_main->agent->agent, +    'payname'      => $cust_main->payname, +    'company'      => $cust_main->company, +    'address1'     => $cust_main->address1, +    'address2'     => $cust_main->address2, +    'city'         => $cust_main->city, +    'state'        => $cust_main->state, +    'zip'          => $cust_main->zip, +    'country'      => $cust_main->country, +    'footer'       => join("\n", $conf->config('invoice_latexfooter') ),      'quantity'     => 1, - +    'terms'        => $conf->config('invoice_default_terms') || 'Payable upon receipt', +    'notes'        => join("\n", $conf->config('invoice_latexnotes') ),    ); -  #$invoice_data{'footer'} =~ s/\n+$//; +  $invoice_data{'footer'} =~ s/\n+$//; +  $invoice_data{'notes'} =~ s/\n+$//;    my $countrydefault = $conf->config('countrydefault') || 'US';    $invoice_data{'country'} = '' if $invoice_data{'country'} eq $countrydefault; @@ -971,8 +959,8 @@ END                !~ /^%%EndDetail\s*$/                            ) {          push @line_item, $line_item_line;        } -      #foreach my $line_item ( $self->_items ) { -      foreach my $line_item ( $self->_items_pkg ) { +      foreach my $line_item ( $self->_items ) { +      #foreach my $line_item ( $self->_items_pkg ) {          $invoice_data{'ref'} = $line_item->{'pkgnum'};          $invoice_data{'description'} = $line_item->{'description'};          if ( exists $line_item->{'ext_description'} ) { @@ -1004,22 +992,51 @@ END                @total_item;        } +      if ( $taxtotal ) { +        $invoice_data{'total_item'} = 'Sub-total'; +        $invoice_data{'total_amount'} = +          '\dollar '. sprintf('%.2f', $self->charged - $taxtotal ); +        unshift @total_fill, +          map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b } +              @total_item; +      } +        $invoice_data{'total_item'} = '\textbf{Total}';        $invoice_data{'total_amount'} = -        '\textbf{\dollar '. sprintf('%.2f', $self->owed ). '}'; +        '\textbf{\dollar '. sprintf('%.2f', $self->charged + $pr_total ). '}';        push @total_fill,          map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b }              @total_item; -      if ( $taxtotal ) { -        $invoice_data{'total_item'} = 'Sub-total'; -        $invoice_data{'total_amount'} = -          '\dollar '. sprintf('%.2f', $self->owed - $taxtotal ); -        unshift @total_fill, +      #foreach my $thing ( sort { $a->_date <=> $b->_date } $self->_items_credits, $self->_items_payments + +      # credits +      foreach my $credit ( $self->_items_credits ) { +        $invoice_data{'total_item'} = $credit->{'description'}; +        #$credittotal +        $invoice_data{'total_amount'} = '-\dollar '. $credit->{'amount'}; +        push @total_fill,  +          map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b } +              @total_item; +      } + +      # payments +      foreach my $payment ( $self->_items_payments ) { +        $invoice_data{'total_item'} = $payment->{'description'}; +        #$paymenttotal +        $invoice_data{'total_amount'} = '-\dollar '. $payment->{'amount'}; +        push @total_fill,             map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b }                @total_item;        } +      $invoice_data{'total_item'} = '\textbf{'. $self->balance_due_msg. '}'; +      $invoice_data{'total_amount'} = +        '\textbf{\dollar '. sprintf('%.2f', $self->owed + $pr_total ). '}'; +      push @total_fill, +        map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b } +            @total_item; +        push @filled_in, @total_fill;      } else { @@ -1052,7 +1069,7 @@ END    #system('dvips', '-t', 'letter', "$file.dvi", "$file.ps");    system('dvips', '-t', 'letter', "$file.dvi" ); -  open(POSTSCRIPT, "<$file.ps") or die "can't open $file.ps: $!\n"; +  open(POSTSCRIPT, "<$file.ps") or die "can't open $file.ps (probable error in LaTeX template): $!\n";    #rm $file.dvi $file.log $file.aux    #unlink("$file.dvi", "$file.log", "$file.aux", "$file.ps"); @@ -1071,11 +1088,23 @@ END  #utility methods for print_* +sub balance_due_msg { +  my $self = shift; +  my $msg = 'Balance Due'; +  if ( $conf->config('invoice_default_terms') =~ /^\s*Net\s*(\d+)\s*$/ ) { +    $msg .= ' - Please pay by '. time2str("%x", $self->_date + ($1*86400) ); +  } elsif ( $conf->config('invoice_default_terms') ) { +    $msg .= ' - '. $conf->config('invoice_default_terms'); +  } +  $msg; +} +  sub _items {    my $self = shift;    my @display = scalar(@_)                  ? @_ -                : qw( _items_pkg ); +                : qw( _items_previous _items_pkg ); +                #: qw( _items_pkg );                  #: qw( _items_previous _items_pkg _items_tax _items_credits _items_payments );    my @b = ();    foreach my $display ( @display ) { @@ -1090,13 +1119,28 @@ sub _items_previous {    my( $pr_total, @pr_cust_bill ) = $self->previous; #previous balance    my @b = ();    foreach ( @pr_cust_bill ) { -    push @b, [ -      "Previous Balance, Invoice #". $_->invnum.  -                 " (". time2str("%x",$_->_date). ")", -      $money_char. sprintf("%10.2f",$_->owed) -    ]; +    push @b, { +      'description' => 'Previous Balance, Invoice \#'. $_->invnum.  +                       ' ('. time2str('%x',$_->_date). ')', +      #'pkgpart'     => 'N/A', +      'pkgnum'      => 'N/A', +      'amount'      => sprintf("%10.2f", $_->owed), +    };    }    @b; + +  #{ +  #    'description'     => 'Previous Balance', +  #    #'pkgpart'         => 'N/A', +  #    'pkgnum'          => 'N/A', +  #    'amount'          => sprintf("%10.2f", $pr_total ), +  #    'ext_description' => [ map { +  #                                 "Invoice ". $_->invnum. +  #                                 " (". time2str("%x",$_->_date). ") ". +  #                                 sprintf("%10.2f", $_->owed) +  #                         } @pr_cust_bill ], + +  #};  }  sub _items_pkg { @@ -1131,7 +1175,7 @@ sub _items_cust_bill_pkg {          @d = $cust_bill_pkg->details if $cust_bill_pkg->recur == 0;          push @b, {            'description'     => $description, -          'pkgpart'         => $part_pkg->pkgpart, +          #'pkgpart'         => $part_pkg->pkgpart,            'pkgnum'          => $cust_pkg->pkgnum,            'amount'          => sprintf("%10.2f", $cust_bill_pkg->setup),            'ext_description' => [ ( map { $_->[0]. ": ". $_->[1] } @@ -1146,7 +1190,7 @@ sub _items_cust_bill_pkg {            'description'     => "$pkg (" .                                 time2str('%x', $cust_bill_pkg->sdate). ' - '.                                 time2str('%x', $cust_bill_pkg->edate). ')', -          'pkgpart'         => $part_pkg->pkgpart, +          #'pkgpart'         => $part_pkg->pkgpart,            'pkgnum'          => $cust_pkg->pkgnum,            'amount'          => sprintf("%10.2f", $cust_bill_pkg->recur),            'ext_description' => [ ( map { $_->[0]. ": ". $_->[1] } @@ -1193,14 +1237,18 @@ sub _items_credits {      #something more elaborate if $_->amount ne $_->cust_credit->credited ? -    my $reason = substr($_->cust_credit->reason,0,32); -    $reason .= '...' if length($reason) < length($_->cust_credit->reason); +    my $reason = $_->cust_credit->reason; +    #my $reason = substr($_->cust_credit->reason,0,32); +    #$reason .= '...' if length($reason) < length($_->cust_credit->reason);      $reason = " ($reason) " if $reason; -    push @b,[ -      "Credit #". $_->crednum. " (". time2str("%x",$_->cust_credit->_date) .")". -        $reason, -      $money_char. sprintf("%10.2f",$_->amount) -    ]; +    push @b, { +      #'description' => 'Credit ref\#'. $_->crednum. +      #                 " (". time2str("%x",$_->cust_credit->_date) .")". +      #                 $reason, +      'description' => 'Credit applied'. +                       time2str("%x",$_->cust_credit->_date). $reason, +      'amount'      => sprintf("%10.2f",$_->amount), +    };    }    #foreach ( @cr_cust_credit ) {    #  push @buf,[ @@ -1222,10 +1270,11 @@ sub _items_payments {      #something more elaborate if $_->amount ne ->cust_pay->paid ? -    push @b,[ -      "Payment received ". time2str("%x",$_->cust_pay->_date ), -      $money_char. sprintf("%10.2f",$_->amount ) -    ]; +    push @b, { +      'description' => "Payment received ". +                       time2str("%x",$_->cust_pay->_date ), +      'amount'      => sprintf("%10.2f", $_->amount ) +    };    }    @b; | 
