X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FTemplateItem_Mixin.pm;h=28ef845c9a89e91529a31f6f12cb39d385310ec7;hp=66ccfb55ded24f0ea6270369106e6052dedbfc26;hb=57bb423fe457ba4e13726877f53bcdf944f828f8;hpb=e874d70f65b32178c4f2e7abac1bf9d05f5a1d58 diff --git a/FS/FS/TemplateItem_Mixin.pm b/FS/FS/TemplateItem_Mixin.pm index 66ccfb55d..28ef845c9 100644 --- a/FS/FS/TemplateItem_Mixin.pm +++ b/FS/FS/TemplateItem_Mixin.pm @@ -45,10 +45,34 @@ 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 desc +=item part_X + +Returns L or L, 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 Returns a description for this line item. For typical line items, this is the I field of the corresponding B object (see L). @@ -61,12 +85,19 @@ 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 @@ -76,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; @@ -121,20 +151,21 @@ sub time_period_pretty { Returns an array of detail information for the invoice line item. -Currently available options are: I, I and -I. +Options may include: -If I is set to html or latex then the array members are improved -for tabular appearance in those environments if possible. +I: set to 'html' or 'latex' to have the detail lines formatted for +inclusion in an HTML table (wrapped in and elements) or LaTeX table +(delimited with & and \\ operators). -If I is set then the array members are processed by this +I: if present, then the array elements are processed by this function before being returned. -I 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: overrides the normal HTML or LaTeX function for returning +formatted CDRs. - 'format_function' => sub { () }, +I: excludes call detail records. The method will still return +some special-case records like prorate details, and manually created package +details. =cut @@ -143,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} ) { @@ -157,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; @@ -219,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} } @@ -359,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;