postscript invoice redux
authorivan <ivan>
Sat, 29 Nov 2003 08:08:38 +0000 (08:08 +0000)
committerivan <ivan>
Sat, 29 Nov 2003 08:08:38 +0000 (08:08 +0000)
FS/FS/Conf.pm
FS/FS/cust_bill.pm
conf/invoice_latexnotes
httemplate/misc/print-invoice.cgi

index 836ac3f..e06beaa 100644 (file)
@@ -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
@@ -457,6 +469,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',
index 2efcbd9..9a182fd 100644 (file)
@@ -1176,14 +1176,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. 
@@ -1312,36 +1305,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;
@@ -1363,8 +1351,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'} ) {
@@ -1396,22 +1384,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 {
@@ -1444,7 +1461,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");
@@ -1463,11 +1480,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 ) {
@@ -1482,13 +1511,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 {
@@ -1523,7 +1567,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] }
@@ -1538,7 +1582,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] }
@@ -1585,14 +1629,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,[
@@ -1614,10 +1662,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;
index 29e1731..dfd2fc2 100644 (file)
@@ -3,7 +3,7 @@
 %%
 \section*{\textsc{Notes}}
 \begin{enumerate}
-\item PLEASE NOTE NEW ADDRESS BELOW!
+\item PLEASE NOTE NEW ADDRESS!
 \item Please make your check payable to \textbf{Ivan Kohler}.
 \item If you have any questions please email or telephone.
 \end{enumerate}
index a5500bf..8c1240c 100755 (executable)
@@ -11,7 +11,14 @@ my $cust_bill = qsearchs('cust_bill',{'invnum'=>$invnum});
 die "Can't find invoice!\n" unless $cust_bill;
 
         open(LPR,"|$lpr") or die "Can't open $lpr: $!";
-        print LPR $cust_bill->print_text; #( date )
+
+        if ( $conf->exists('invoice_latex') ) {
+          $cust_bill->print_ps;
+          #print LPR $cust_bill->print_ps; #( date )
+        } else {
+          print LPR $cust_bill->print_text; #( date )
+        }
+
         close LPR
           or die $! ? "Error closing $lpr: $!"
                        : "Exit status $? from $lpr";