diff options
author | Mark Wells <mark@freeside.biz> | 2014-02-25 17:57:20 -0800 |
---|---|---|
committer | Mark Wells <mark@freeside.biz> | 2014-02-25 23:08:30 -0800 |
commit | fbb18001e331de0a4826076dc25710cbe3664b26 (patch) | |
tree | d1219481d20b56734bc6ae137a24b022aedc6eb5 | |
parent | 0393defb3dee145a4bedee761de25cfd1ac503e0 (diff) |
non-package fees, "hold until next bill" option, #25899
-rw-r--r-- | FS/FS/Schema.pm | 1 | ||||
-rw-r--r-- | FS/FS/cust_main/Billing.pm | 17 | ||||
-rw-r--r-- | FS/FS/part_fee.pm | 9 | ||||
-rw-r--r-- | httemplate/edit/part_fee.html | 6 |
4 files changed, 28 insertions, 5 deletions
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index bf516b2..69681d0 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -3148,6 +3148,7 @@ sub tables_hashref { 'limit_credit', 'char', 'NULL', 1, '', '', 'setuprecur', 'char', '', 5, '', '', 'taxable', 'char', 'NULL', 1, '', '', + 'nextbill', 'char', 'NULL', 1, '', '', ], 'primary_key' => 'feepart', 'unique' => [], diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm index f4c30ce..1703aec 100644 --- a/FS/FS/cust_main/Billing.pm +++ b/FS/FS/cust_main/Billing.pm @@ -533,8 +533,6 @@ sub bill { my @cust_bill_pkg = _omit_zero_value_bundles(@{ $cust_bill_pkg{$pass} }); - next unless @cust_bill_pkg; #don't create an invoice w/o line items - warn "$me billing pass $pass\n" #.Dumper(\@cust_bill_pkg)."\n" if $DEBUG > 2; @@ -549,9 +547,15 @@ sub bill { warn "$me found pending fee events:\n".Dumper(\@pending_event_fees)."\n" if @pending_event_fees; + # whether to generate an invoice + my $generate_bill = scalar(@cust_bill_pkg) > 0; + + # calculate fees... my @fee_items; foreach my $event_fee (@pending_event_fees) { my $object = $event_fee->cust_event->cust_X; + my $part_fee = $event_fee->part_fee; + my $cust_bill; if ( $object->isa('FS::cust_main') ) { # Not the real cust_bill object that will be inserted--in particular @@ -569,7 +573,6 @@ sub bill { # etc.) $cust_bill = $object; } - my $part_fee = $event_fee->part_fee; # if the fee def belongs to a different agent, don't charge the fee. # event conditions should prevent this, but just in case they don't, # skip the fee. @@ -585,7 +588,15 @@ sub bill { # link this so that we can clear the marker on inserting the line item $fee_item->set('cust_event_fee', $event_fee); push @fee_items, $fee_item; + + $generate_bill = 1 unless $part_fee->nextbill; } + + # don't create an invoice with no line items, or where the only line + # items are fees that are supposed to be held until the next invoice + next if !$generate_bill; + + # add fees to the invoice foreach my $fee_item (@fee_items) { push @cust_bill_pkg, $fee_item; diff --git a/FS/FS/part_fee.pm b/FS/FS/part_fee.pm index 9605d61..d1e6477 100644 --- a/FS/FS/part_fee.pm +++ b/FS/FS/part_fee.pm @@ -54,6 +54,9 @@ the invoice Currently, taxable fees will be treated like they exist at the customer's default service location. +=item nextbill - 'Y' if this fee should be delayed until the customer is +billed for a package. + =item taxclass - the tax class the fee belongs to, as a string, for the internal tax system @@ -127,6 +130,7 @@ sub check { my $self = shift; $self->set('amount', 0) unless $self->amount; + $self->set('percent', 0) unless $self->percent; my $error = $self->ut_numbern('feepart') @@ -134,14 +138,15 @@ sub check { || $self->ut_flag('disabled') || $self->ut_foreign_keyn('classnum', 'pkg_class', 'classnum') || $self->ut_flag('taxable') + || $self->ut_flag('nextbill') || $self->ut_textn('taxclass') || $self->ut_numbern('taxproductnum') || $self->ut_floatn('pay_weight') || $self->ut_floatn('credit_weight') || $self->ut_agentnum_acl('agentnum', [ 'Edit global package definitions' ]) - || $self->ut_moneyn('amount') - || $self->ut_floatn('percent') + || $self->ut_money('amount') + || $self->ut_float('percent') || $self->ut_moneyn('minimum') || $self->ut_moneyn('maximum') || $self->ut_flag('limit_credit') diff --git a/httemplate/edit/part_fee.html b/httemplate/edit/part_fee.html index dada233..b1044c9 100644 --- a/httemplate/edit/part_fee.html +++ b/httemplate/edit/part_fee.html @@ -20,6 +20,7 @@ 'minimum' => 'Minimum fee', 'maximum' => 'Maximum fee', 'limit_credit' => 'Limit to customer credit balance', + 'nextbill' => 'Hold until the customer\'s next invoice', %locale_labels }, 'fields' => \@fields, @@ -86,6 +87,11 @@ my @fields = ( value => 'Y', }, + { field => 'nextbill', + type => 'checkbox', + value => 'Y', + }, + { field => 'setuprecur', type => 'select', options => [ 'setup', 'recur' ], |