'credit_weight', 'real', 'NULL', '', '', '',
'agentnum', 'int', 'NULL', '', '', '',
'fcc_ds0s', 'int', 'NULL', '', '', '',
- 'no_auto', 'char', 'NULL', 1, '', '',
+ 'no_auto', 'char', 'NULL', 1, '', '',
+ 'recur_show_zero', 'char', 'NULL', 1, '', '',
],
'primary_key' => 'pkgpart',
'unique' => [],
foreach my $cust_bill_pkg ( @$cust_bill_pkgs )
{
- warn "$me _items_cust_bill_pkg considering cust_bill_pkg $cust_bill_pkg\n"
+ warn "$me _items_cust_bill_pkg considering cust_bill_pkg ".
+ $cust_bill_pkg->billpkgnum. ", pkgnum ". $cust_bill_pkg->pkgnum. "\n"
if $DEBUG > 1;
- $discount_show_always = ($cust_bill_pkg->cust_bill_pkg_discount
- && $conf->exists('discount-show-always'));
-
- foreach ( $s, $r, ($opt{skip_usage} ? () : $u ) ) {
- if ( $_ && !$cust_bill_pkg->hidden ) {
- $_->{amount} = sprintf( "%.2f", $_->{amount} ),
- $_->{amount} =~ s/^\-0\.00$/0.00/;
- $_->{unit_amount} = sprintf( "%.2f", $_->{unit_amount} ),
- push @b, { %$_ }
- unless ( $_->{amount} == 0 && !$discount_show_always );
- $_ = undef;
- }
- }
-
foreach my $display ( grep { defined($section)
? $_->section eq $section
: 1
}
- if ( ( $cust_bill_pkg->recur != 0 || $cust_bill_pkg->setup == 0 ||
- ($discount_show_always && $cust_bill_pkg->recur == 0) ) &&
- ( !$type || $type eq 'R' || $type eq 'U' )
+ if ( ( !$type || $type eq 'R' || $type eq 'U' )
+ && (
+ $cust_bill_pkg->recur != 0
+ || $cust_bill_pkg->setup == 0
+ || $discount_show_always
+ || $cust_bill_pkg->recur_show_zero
+ )
)
{
}
+ $discount_show_always = ($cust_bill_pkg->cust_bill_pkg_discount
+ && $conf->exists('discount-show-always'));
+
+ foreach ( $s, $r, ($opt{skip_usage} ? () : $u ) ) {
+ if ( $_ && !$cust_bill_pkg->hidden ) {
+ $_->{amount} = sprintf( "%.2f", $_->{amount} ),
+ $_->{amount} =~ s/^\-0\.00$/0.00/;
+ $_->{unit_amount} = sprintf( "%.2f", $_->{unit_amount} ),
+ push @b, { %$_ }
+ if $_->{amount} != 0
+ || $discount_show_always
+ || $cust_bill_pkg->recur_show_zero;
+ $_ = undef;
+ }
+ }
+
}
+ #foreach ( $s, $r, ($opt{skip_usage} ? () : $u ) ) {
+ # if ( $_ ) {
+ # $_->{amount} = sprintf( "%.2f", $_->{amount} ),
+ # $_->{amount} =~ s/^\-0\.00$/0.00/;
+ # $_->{unit_amount} = sprintf( "%.2f", $_->{unit_amount} ),
+ # push @b, { %$_ }
+ # if $_->{amount} != 0
+ # || $discount_show_always
+ # }
+ #}
+
warn "$me _items_cust_bill_pkg done considering cust_bill_pkgs\n"
if $DEBUG > 1;
- foreach ( $s, $r, ($opt{skip_usage} ? () : $u ) ) {
- if ( $_ ) {
- $_->{amount} = sprintf( "%.2f", $_->{amount} ),
- $_->{amount} =~ s/^\-0\.00$/0.00/;
- $_->{unit_amount} = sprintf( "%.2f", $_->{unit_amount} ),
- push @b, { %$_ }
- unless ( $_->{amount} == 0 && !$discount_show_always );
- }
- }
-
@b;
}
Returns an array of detail information for the invoice line item.
-Currently available options are: I<format> I<escape_function>
+Currently available options are: I<format>, I<escape_function> and
+I<format_function>.
If I<format> is set to html or latex then the array members are improved
for tabular appearance in those environments if possible.
If I<escape_function> is set then the array members 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:
+
+ 'format_function' => sub { () },
+
=cut
sub details {
my %hash = ( 'billpkgnum' => $self->billpkgnum );
$hash{classnum} = $classnum if $classnum;
- qsearch ( 'cust_bill_pkg_detail', { %hash } ),
+ qsearch( 'cust_bill_pkg_detail', \%hash ),
}
=cut
sub cust_bill_pkg_discount {
- my $self = shift;
- qsearch ( 'cust_bill_pkg_discount', { 'billpkgnum' => $self->billpkgnum } );
+ my $self = shift;
+ qsearch( 'cust_bill_pkg_discount', { 'billpkgnum' => $self->billpkgnum } );
+}
+
+=item recur_show_zero
+
+=cut
+
+sub recur_show_zero {
+ my $self = shift;
+
+ $self->recur == 0
+ && $self->pkgnum
+ && $self->cust_pkg->part_pkg->recur_show_zero;
+
}
=back
#discard bundled packages of 0 value
sub _omit_zero_value_bundles {
+ my @in = @_;
my @cust_bill_pkg = ();
my @cust_bill_pkg_bundle = ();
my $sum = 0;
my $discount_show_always = 0;
- foreach my $cust_bill_pkg ( @_ ) {
+ foreach my $cust_bill_pkg ( @in ) {
+
$discount_show_always = ($cust_bill_pkg->get('discounts')
&& scalar(@{$cust_bill_pkg->get('discounts')})
&& $conf->exists('discount-show-always'));
+
+ warn " pkgnum ". $cust_bill_pkg->pkgnum.
+ " sum $sum, recur_show_zero ". $cust_bill_pkg->recur_show_zero. "\n"
+ if $DEBUG > 0;
+
if (scalar(@cust_bill_pkg_bundle) && !$cust_bill_pkg->pkgpart_override) {
push @cust_bill_pkg, @cust_bill_pkg_bundle
- if ($sum > 0 || ($sum == 0 && $discount_show_always));
+ if $sum > 0
+ || ($sum == 0 && ( $discount_show_always
+ || grep $_->recur_show_zero, @cust_bill_pkg_bundle )
+ );
@cust_bill_pkg_bundle = ();
$sum = 0;
}
+
$sum += $cust_bill_pkg->setup + $cust_bill_pkg->recur;
push @cust_bill_pkg_bundle, $cust_bill_pkg;
+
}
+
push @cust_bill_pkg, @cust_bill_pkg_bundle
- if ($sum > 0 || ($sum == 0 && $discount_show_always));
+ if $sum > 0
+ || ($sum == 0 && ( $discount_show_always
+ || grep $_->recur_show_zero, @cust_bill_pkg_bundle )
+ );
+
+ warn " _omit_zero_value_bundles: ". scalar(@in).
+ '->'. scalar(@cust_bill_pkg). "\n" #. Dumper(@cust_bill_pkg). "\n"
+ if $DEBUG > 2;
(@cust_bill_pkg);
my $discount_show_always = ($recur == 0 && scalar(@discounts)
&& $conf->exists('discount-show-always'));
- if ( $setup != 0 ||
- $recur != 0 ||
- (!$part_pkg->hidden && $options{has_hidden}) || #include some $0 lines
- $discount_show_always )
+ if ( $setup != 0
+ || $recur != 0
+ || (!$part_pkg->hidden && $options{has_hidden}) #include some $0 lines
+ || $discount_show_always
+ || ($recur == 0 && $part_pkg->recur_show_zero)
+ )
{
warn " charges (setup=$setup, recur=$recur); adding line items\n"
|| $self->ut_enum('disabled', [ '', 'Y' ] )
|| $self->ut_enum('custom', [ '', 'Y' ] )
|| $self->ut_enum('no_auto', [ '', 'Y' ])
+ || $self->ut_enum('recur_show_zero', [ '', 'Y' ])
#|| $self->ut_moneyn('setup_cost')
#|| $self->ut_moneyn('recur_cost')
|| $self->ut_floatn('setup_cost')
],
[
{ data=>( $is_recur
- ? $money_char.sprintf('%.2f ', $part_pkg->option('recur_fee') )
+ ? $money_char.sprintf('%.2f ', $part_pkg->option('recur_fee'))
: $part_pkg->freq_pretty
),
align=> ( $is_recur ? 'right' : 'center' ),
: ()
),
],
+ [ { data =>
+ ( $part_pkg->option('recur_fee') == 0 && $part_pkg->recur_show_zero )
+ ? ' (printed on invoices)'
+ : '',
+ align => 'center', #?
+ colspan => 2,
+ },
+ ],
( map {
my $dst_pkg = $_->dst_pkg;
[
'agentnum' => 'Agent',
'setup_fee' => 'Setup fee',
'recur_fee' => 'Recurring fee',
+ 'recur_show_zero' => 'Show zero recurring',
'discountnum' => 'Offer discounts for longer terms',
'bill_dst_pkgpart' => 'Include line item(s) from package',
'svc_dst_pkgpart' => 'Include services of package',
{ field => 'recur_fee',
type => 'money',
disabled => sub { $recur_disabled },
+ onchange => 'recur_changed',
},
-
+
+ { field => 'recur_show_zero',
+ type => 'checkbox',
+ value => 'Y',
+ disabled => sub { $recur_show_zero_disabled },
+ },
+
#price plan
#setup fee
#recurring frequency
my %options = ();
my $recur_disabled = 1;
+my $recur_show_zero_disabled = 1;
my $pkgpart = '';
$opt->{action} = 'Custom' if $cgi->param('pkgnum');
$recur_disabled = $cgi->param('freq') ? 0 : 1;
+ $recur_show_zero_disabled =
+ $cgi->param('freq')
+ ? $cgi->param('recur_fee') ? 0 : 1
+ : 1;
foreach ($cgi->param) {
/^usage_taxproductnum_(\d+)$/ && ($taxproductnums{$1} = 1);
if ( freq == '0' ) {
what.form.recur_fee.disabled = true;
what.form.recur_fee.style.backgroundColor = '#dddddd';
+ what.form.recur_show_zero.disabled = true;
+ //what.form.recur_show_zero.style.backgroundColor= '#dddddd';
} else {
what.form.recur_fee.disabled = false;
what.form.recur_fee.style.backgroundColor = '#ffffff';
+ what.form.recur_show_zero.disabled = false;
+ //what.form.recur_show_zero.style.backgroundColor= '#ffffff';
}
}
+ function recur_changed(what) {
+ var recur = what.value;
+ if ( recur == 0 ) {
+ what.form.recur_show_zero.disabled = false;
+ } else {
+ what.form.recur_show_zero.disabled = true;
+ }
+ }
+
function agent_changed(what) {
- var agentnum = what.options[what.selectedIndex].value;
+ var agentnum;
+ if ( what.type == 'select-one' ) {
+ agentnum = what.options[what.selectedIndex].value;
+ } else {
+ agentnum = what.value;
+ }
if ( agentnum == 0 ) {
what.form.agent_type.disabled = false;
? ' CHECKED'
: ''
%>
+ <% $opt{disabled} %>
<% $onchange %>
><% $opt{'postfix'} %>
<%init>
? 'onChange="'. $opt{'onchange'}. '(this)"'
: '';
+$opt{'disabled'} = &{ $opt{'disabled'} }( \%opt )
+ if ref($opt{'disabled'}) eq 'CODE';
+$opt{'disabled'} = 'DISABLED'
+ if $opt{'disabled'} && $opt{'disabled'} !~ /disabled/i; # uuh... yeah?
+
</%init>
my $value = length($opt{curr_value}) ? $opt{curr_value} : $opt{value};
my $onchange = $opt{'onchange'}
- ? 'onChange="'. $opt{'onchange'}. '(this)"'
+ ? join(' ', map $_.'="'. $opt{'onchange'}. '(this)"',
+ qw( onChange onKeyDown onKeyUp onKeyPress )
+ )
: '';
my $size = $opt{'size'}
</%doc>
% if ( scalar(@agents) == 1 ) {
- <INPUT TYPE="hidden" NAME="<% $opt{'field'} || 'agentnum' %>" VALUE="<% $agents[0]->agentnum %>">
+ <INPUT TYPE = "hidden"
+ NAME = "<% $opt{'field'} || 'agentnum' %>"
+ ID = "<% $opt{'field'} || 'agentnum' %>"
+ VALUE = "<% $agents[0]->agentnum %>"
+ >
%# YUCK. empty row so we don't throw g_row in edit.html off :/
<TR>