bundled package presentation improvements
[freeside.git] / FS / FS / cust_bill.pm
index e758a0e..96c1db7 100644 (file)
@@ -226,7 +226,12 @@ Returns the line items (see L<FS::cust_bill_pkg>) for this invoice.
 
 sub cust_bill_pkg {
   my $self = shift;
-  qsearch( 'cust_bill_pkg', { 'invnum' => $self->invnum } );
+  qsearch(
+    { 'table'    => 'cust_bill_pkg',
+      'hashref'  => { 'invnum' => $self->invnum },
+      'order_by' => 'ORDER BY billpkgnum',
+    }
+  );
 }
 
 =item cust_pkg
@@ -557,19 +562,27 @@ sub apply_payments_and_credits {
 
 }
 
-=item generate_email PARAMHASH
+=item generate_email OPTION => VALUE ...
 
-PARAMHASH can contain the following:
+Options:
 
 =over 4
 
-=item from       => sender address, required
+=item from
+
+sender address, required
+
+=item tempate
 
-=item tempate    => alternate template name, optional
+alternate template name, optional
 
-=item print_text => text attachment arrayref, optional
+=item print_text
 
-=item subject    => email subject, optional
+text attachment arrayref, optional
+
+=item subject
+
+email subject, optional
 
 =back
 
@@ -1618,6 +1631,8 @@ L<Time::Local> and L<Date::Parse> for conversion functions.
 
 cid - 
 
+unsquelch_cdr - overrides any per customer cdr squelching when true
+
 =cut
 
 sub print_generic {
@@ -1830,7 +1845,7 @@ sub print_generic {
     'date'            => time2str($date_format, $self->_date),
     'today'           => time2str('%b %o, %Y', $today),
     'agent'           => &$escape_function($cust_main->agent->agent),
-    'agent_custid     => &$escape_function($cust_main->agent_custid),
+    'agent_custid'    => &$escape_function($cust_main->agent_custid),
     'payname'         => &$escape_function($cust_main->payname),
     'company'         => &$escape_function($cust_main->company),
     'address1'        => &$escape_function($cust_main->address1),
@@ -1847,20 +1862,24 @@ sub print_generic {
     'conf_dir'        => "$FS::UID::conf_dir/conf.$FS::UID::datasrc",
     'page'            => 1,
     'total_pages'     => 1,
+    'current_charges' => sprintf("%.2f", $self->charged),
+    'duedate'         => $self->due_date2str('%m/%d/%Y'), #date_format?
     'ship_enable'     => $conf->exists('invoice-ship_address'),
     'unitprices'      => $conf->exists('invoice-unitprice'),
   );
 
+  my $countrydefault = $conf->config('countrydefault') || 'US';
   my $prefix = $cust_main->has_ship_address ? 'ship_' : '';
   foreach ( qw( contact company address1 address2 city state zip country fax) ){
     my $method = $prefix.$_;
     $invoice_data{"ship_$_"} = _latex_escape($cust_main->$method);
   }
+  $invoice_data{'ship_country'} = ''
+    if ( $invoice_data{'ship_country'} eq $countrydefault );
   
   $invoice_data{'cid'} = $params{'cid'}
     if $params{'cid'};
 
-  my $countrydefault = $conf->config('countrydefault') || 'US';
   if ( $cust_main->country eq $countrydefault ) {
     $invoice_data{'country'} = '';
   } else {
@@ -1895,7 +1914,8 @@ sub print_generic {
 #  my( $cr_total, @cr_cust_credit ) = $self->cust_credit; #credits
   #my $balance_due = $self->owed + $pr_total - $cr_total;
   my $balance_due = $self->owed + $pr_total;
-  $invoice_data{'balance'} = $balance_due;
+  $invoice_data{'previous_balance'} = sprintf("%.2f", $pr_total);
+  $invoice_data{'balance'} = sprintf("%.2f", $balance_due);
 
   #do variable substitution in notes, footer, smallfooter
   foreach my $include (qw( notes footer smallfooter coupon )) {
@@ -2036,6 +2056,8 @@ sub print_generic {
     $options{'section'} = $section if $multisection;
     $options{'format'} = $format;
     $options{'escape_function'} = $escape_function;
+    $options{'format_function'} = sub { () }
+      unless $params{unsquelch_cdr} || $cust_main->squelch_cdr ne 'Y';
 
     foreach my $line_item ( $self->_items_pkg(%options) ) {
       my $detail = {
@@ -2119,6 +2141,7 @@ sub print_generic {
       unshift @total_items, $total;
     }
   }
+  $invoice_data{'taxtotal'} = sprintf('%.2f', $taxtotal);
   
   push @buf,['','-----------'];
   push @buf,[( $conf->exists('disable_previous_balance') 
@@ -2142,8 +2165,8 @@ sub print_generic {
                )
       );
     if ( $multisection ) {
-      $adjust_section->{'pretotal'} = 'New charges total '.
-                                      $total->{'total_amount'};
+      $adjust_section->{'pretotal'} = 'New charges total '. $other_money_char.
+                                      sprintf('%.2f', $self->charged );
     }else{
       push @total_items, $total;
     }
@@ -2164,10 +2187,11 @@ sub print_generic {
     #foreach my $thing ( sort { $a->_date <=> $b->_date } $self->_items_credits, $self->_items_payments
   
     # credits
+    my $credittotal = 0;
     foreach my $credit ( $self->_items_credits ) {
       my $total;
       $total->{'total_item'} = &$escape_function($credit->{'description'});
-      #$credittotal
+      $credittotal += $credit->{'amount'};
       $total->{'total_amount'} = '-'. $other_money_char. $credit->{'amount'};
       $adjusttotal += $credit->{'amount'};
       if ( $multisection ) {
@@ -2185,6 +2209,7 @@ sub print_generic {
         push @total_items, $total;
       }
     }
+    $invoice_data{'credittotal'} = sprintf('%.2f', $credittotal);
   
     # credits (again)
     foreach ( $self->cust_credited ) {
@@ -2201,10 +2226,11 @@ sub print_generic {
     }
 
     # payments
+    my $paymenttotal = 0;
     foreach my $payment ( $self->_items_payments ) {
       my $total = {};
       $total->{'total_item'} = &$escape_function($payment->{'description'});
-      #$paymenttotal
+      $paymenttotal += $payment->{'amount'};
       $total->{'total_amount'} = '-'. $other_money_char. $payment->{'amount'};
       $adjusttotal += $payment->{'amount'};
       if ( $multisection ) {
@@ -2225,6 +2251,7 @@ sub print_generic {
                    $money_char. sprintf("%10.2f", $payment->{'amount'}),
                  ];
     }
+    $invoice_data{'paymenttotal'} = sprintf('%.2f', $paymenttotal);
   
     if ( $multisection ) {
       $adjust_section->{'subtotal'} = $other_money_char.
@@ -2486,6 +2513,16 @@ sub balance_due_msg {
   $msg;
 }
 
+sub balance_due_date {
+  my $self = shift;
+  my $duedate = '';
+  if (    $conf->exists('invoice_default_terms') 
+       && $conf->config('invoice_default_terms')=~ /^\s*Net\s*(\d+)\s*$/ ) {
+    $duedate = time2str("%m/%d/%Y", $self->_date + ($1*86400) );
+  }
+  $duedate;
+}
+
 =item invnum_date_pretty
 
 Returns a string with the invoice number and date, for example:
@@ -2506,7 +2543,7 @@ sub _items_sections {
 
     if ( $cust_bill_pkg->pkgnum > 0 ) {
 
-      my $desc = $cust_bill_pkg->part_pkg->classname;
+      my $desc = $cust_bill_pkg->part_pkg->categoryname;
 
       $s{$desc} += $cust_bill_pkg->setup
         if ( $cust_bill_pkg->setup != 0 );
@@ -2576,7 +2613,7 @@ sub _items_pkg {
   my @cust_bill_pkg =
     grep { $_->pkgnum &&
            ( defined($section)
-               ? $_->part_pkg->classname eq $section->{'description'}
+               ? $_->part_pkg->categoryname eq $section->{'description'}
                : 1
            )
          } $self->cust_bill_pkg;
@@ -2605,6 +2642,7 @@ sub _items_cust_bill_pkg {
 
   my $format = $opt{format} || '';
   my $escape_function = $opt{escape_function} || sub { shift };
+  my $format_function = $opt{format_function} || '';
 
   my @b = ();
   foreach my $cust_bill_pkg ( @$cust_bill_pkg ) {
@@ -2615,6 +2653,7 @@ sub _items_cust_bill_pkg {
 
     my %details_opt = ( 'format'          => $format,
                         'escape_function' => $escape_function,
+                        'format_function' => $format_function,
                       );
 
     if ( $cust_bill_pkg->pkgnum > 0 ) {
@@ -2644,8 +2683,8 @@ sub _items_cust_bill_pkg {
 
         my $description = $desc;
         unless ( $conf->exists('disable_line_item_date_ranges') ) {
-          $desc .= " (" . time2str("%x", $cust_bill_pkg->sdate).
-                   " - ". time2str("%x", $cust_bill_pkg->edate). ")";
+          $description .= " (" . time2str("%x", $cust_bill_pkg->sdate).
+                          " - ". time2str("%x", $cust_bill_pkg->edate). ")";
         }
 
         #at least until cust_bill_pkg has "past" ranges in addition to
@@ -2654,6 +2693,7 @@ sub _items_cust_bill_pkg {
                     $cust_pkg->h_labels_short($self->_date);
                                               #$cust_bill_pkg->edate,
                                               #$cust_bill_pkg->sdate),
+        @d = () if $cust_bill_pkg->itemdesc;
         push @d, $cust_bill_pkg->details(%details_opt);
 
         push @b, {