Merge branch 'master' of https://github.com/jgoodman/Freeside
[freeside.git] / FS / FS / TemplateItem_Mixin.pm
index 8b0e16a..fa20c24 100644 (file)
@@ -1,15 +1,21 @@
 package FS::TemplateItem_Mixin;
 
 use strict;
-use vars qw( $DEBUG $me ); # but NOT $conf
+use vars qw( $DEBUG $me $conf $date_format );
 use Carp;
+use Date::Format;
 use FS::UID;
 use FS::Record qw( qsearch qsearchs dbh );
+use FS::Conf;
 use FS::part_pkg;
 use FS::cust_pkg;
 
 $DEBUG = 0;
 $me = '[FS::TemplateItem_Mixin]';
+FS::UID->install_callback( sub { 
+  $conf = new FS::Conf;
+  $date_format      = $conf->config('date_format')      || '%x'; #/YY
+} );
 
 =item cust_pkg
 
@@ -42,7 +48,7 @@ sub part_pkg {
 
 }
 
-=item desc
+=item desc LOCALE
 
 Returns a description for this line item.  For typical line items, this is the
 I<pkg> field of the corresponding B<FS::part_pkg> object (see L<FS::part_pkg>).
@@ -55,12 +61,67 @@ sub desc {
   my( $self, $locale ) = @_;
 
   if ( $self->pkgnum > 0 ) {
-    $self->itemdesc || $self->part_pkg->pkg_locale($locale);
-  } else {
+    return $self->itemdesc if $self->itemdesc;
+    my $part_pkg = $self->part_pkg or return 'UNKNOWN';
+    return $part_pkg->pkg_locale($locale);
+
+  } elsif ( $self->feepart ) {
+    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
+
+Returns a formatted time period for this line item.
+
+=cut
+
+sub time_period_pretty {
+  my( $self, $part_pkg, $agentnum ) = @_;
+
+  #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)
+            || ! $self->sdate
+            || ! $self->edate;
+
+  my $date_style = '';
+  $date_style = $conf->config( 'cust_bill-line_item-date_style-non_monhtly',
+                               $agentnum
+                             )
+    if $part_pkg && $part_pkg->freq !~ /^1m?$/;
+  $date_style ||= $conf->config( 'cust_bill-line_item-date_style',
+                                  $agentnum
+                               );
+
+  my $time_period;
+  if ( defined($date_style) && $date_style eq 'month_of' ) {
+    # (now watch, someone's going to make us do Chinese)
+    $time_period = $self->mt('The month of [_1]',
+                      $self->time2str_local('%B', $self->sdate)
+                   );
+  } elsif ( defined($date_style) && $date_style eq 'X_month' ) {
+    my $desc = $conf->config( 'cust_bill-line_item-date_description',
+                               $agentnum
+                            );
+    $desc .= ' ' unless $desc =~ /\s$/;
+    $time_period = $desc. $self->time2str_local('%B', $self->sdate);
+  } else {
+    $time_period =      $self->time2str_local($date_format, $self->sdate).
+                 " - ". $self->time2str_local($date_format, $self->edate);
   }
+
+  " ($time_period)";
+
 }
 
 =item details [ OPTION => VALUE ... ]