backup the schema for tables we don't need the data from. RT#85959
[freeside.git] / FS / FS / TemplateItem_Mixin.pm
index bf857a9..28ef845 100644 (file)
@@ -45,7 +45,31 @@ sub part_pkg {
     $part_pkg = $cust_pkg->part_pkg if $cust_pkg;
     $part_pkg;
   }
+}
+
+=item part_fee
+
+Returns the fee definition for this line item, if there is one.
+
+=cut
+
+sub part_fee {
+  my $self = shift;
+  $self->feepart
+    ? FS::part_fee->by_key($self->feepart)
+    : '';
+}
+
+=item part_X
 
+Returns L</part_pkg> or L</part_fee>, whichever is applicable (or nothing,
+if called on a tax line item).
+
+=cut
+
+sub part_X {
+  my $self = shift;
+  $self->part_pkg || $self->part_fee;
 }
 
 =item desc LOCALE
@@ -61,14 +85,19 @@ sub desc {
   my( $self, $locale ) = @_;
 
   if ( $self->pkgnum > 0 ) {
-    $self->itemdesc || $self->part_pkg->pkg_locale($locale);
+    return $self->itemdesc if $self->itemdesc;
+    my $part_pkg = $self->part_pkg or return 'UNKNOWN';
+    return $part_pkg->pkg_locale($locale);
+
   } elsif ( $self->feepart ) {
-    $self->part_fee->itemdesc_locale($locale);
+    return $self->part_fee->itemdesc_locale($locale);
+
   } else { # by the process of elimination it must be a tax
     my $desc = $self->itemdesc || 'Tax';
     $desc .= ' '. $self->itemcomment if $self->itemcomment =~ /\S/;
-    $desc;
+    return $desc;
   }
+
 }
 
 =item time_period_pretty PART_PKG, AGENTNUM
@@ -78,14 +107,13 @@ Returns a formatted time period for this line item.
 =cut
 
 sub time_period_pretty {
-  my( $self, $part_pkg, $agentnum ) = @_;
+  my( $self, $part_pkg, $agentnum, %opt ) = @_;
 
   #more efficient to look some of this conf stuff up outside the
   # invoice/template display loop we're called from
   # (Template_Mixin::_invoice_cust_bill_pkg) and pass them in as options
 
-  return '' if $conf->exists('disable_line_item_date_ranges')
-            || $part_pkg->option('disable_line_item_date_ranges',1)
+  return '' if $opt{'disable_line_item_date_ranges'}
             || ! $self->sdate
             || ! $self->edate;
 
@@ -123,20 +151,21 @@ sub time_period_pretty {
 
 Returns an array of detail information for the invoice line item.
 
-Currently available options are: I<format>, I<escape_function> and
-I<format_function>.
+Options may include:
 
-If I<format> is set to html or latex then the array members are improved
-for tabular appearance in those environments if possible.
+I<format>: set to 'html' or 'latex' to have the detail lines formatted for 
+inclusion in an HTML table (wrapped in <tr> and <td> elements) or LaTeX table
+(delimited with & and \\ operators).
 
-If I<escape_function> is set then the array members are processed by this
+I<escape_function>: if present, then the array elements are processed by this
 function before being returned.
 
-I<format_function> overrides the normal HTML or LaTeX function for returning
-formatted CDRs.  It can be set to a subroutine which returns an empty list
-to skip usage detail:
+I<format_function>: overrides the normal HTML or LaTeX function for returning
+formatted CDRs.
 
-  'format_function' => sub { () },
+I<no_usage>: excludes call detail records.  The method will still return
+some special-case records like prorate details, and manually created package 
+details.
 
 =cut
 
@@ -145,6 +174,7 @@ sub details {
   my $escape_function = $opt{escape_function} || sub { shift };
 
   my $csv = new Text::CSV_XS;
+  my $key = $self->primary_key;
 
   if ( $opt{format_function} ) {
 
@@ -159,14 +189,14 @@ sub details {
           )
         }
       qsearch ({ 'table'    => $self->detail_table,
-                 'hashref'  => { 'billpkgnum' => $self->billpkgnum },
+                 'hashref'  => { $key => $self->get($key) },
                  'order_by' => 'ORDER BY detailnum',
               });
 
   } elsif ( $opt{'no_usage'} ) {
 
     my $sql = "SELECT detail FROM ". $self->detail_table.
-              "  WHERE billpkgnum = ". $self->billpkgnum.
+              "  WHERE " . $key . " = ". $self->get($key).
               "    AND ( format IS NULL OR format != 'C' ) ".
               "  ORDER BY detailnum";
     my $sth = dbh->prepare($sql) or die dbh->errstr;
@@ -221,20 +251,31 @@ sub details {
     }
 
     my $sql = "SELECT format, detail FROM ". $self->detail_table.
-              "  WHERE billpkgnum = ". $self->billpkgnum.
+              "  WHERE " . $key . " = ". $self->get($key).
               "  ORDER BY detailnum";
     my $sth = dbh->prepare($sql) or die dbh->errstr;
     $sth->execute or die $sth->errstr;
 
     #avoid the fetchall_arrayref and loop for less memory usage?
-
-    map { (defined($_->[0]) && $_->[0] eq 'C')
-            ? &{$format_sub}(      $_->[1] )
-            : &{$escape_function}( $_->[1] );
+    # probably should use a cursor...
+
+    my @return;
+    my $head = 1;
+    map {
+      my $row = $_;
+      if (defined($row->[0]) and $row->[0] eq 'C') {
+        if ($head) {
+          # first CSV row = the format header; localize it but not the others
+          $row->[1] = $self->mt($row->[1]);
+          $head = 0;
         }
-      @{ $sth->fetchall_arrayref };
+        &{$format_sub}($row->[1]);
+      } else {
+        &{$escape_function}($row->[1]);
+      }
+    } @{ $sth->fetchall_arrayref };
 
-  }
+  } #!$opt{format_function}
 
 }
 
@@ -361,15 +402,17 @@ sub cust_bill_pkg_detail {
 
 }
 
-=item cust_bill_pkg_discount 
+=item pkg_discount 
 
-Returns the list of associated cust_bill_pkg_discount objects.
+Returns the list of associated cust_bill_pkg_discount or 
+quotation_pkg_discount objects.
 
 =cut
 
-sub cust_bill_pkg_discount {
+sub pkg_discount {
   my $self = shift;
-  qsearch( $self->discount_table, { 'billpkgnum' => $self->billpkgnum } );
+  my $pkey = $self->primary_key;
+  qsearch( $self->discount_table, { $pkey => $self->get($pkey) } );
 }
 
 1;