From bdf4497fd8d3778e9cc0f8b90dd8a742f3a84158 Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 10 Oct 2009 00:00:32 +0000 Subject: [PATCH] change invoice terms for one-time charges (& bill them immediately), RT#5891 --- FS/FS/Schema.pm | 10 ++++- FS/FS/cust_bill.pm | 23 +++++++++--- FS/FS/cust_main.pm | 25 ++++++++++++- httemplate/edit/cust_main/billing.html | 12 ++---- httemplate/edit/process/quick-charge.cgi | 2 + httemplate/edit/quick-charge.html | 63 +++++++++++++++++++++++++++++--- httemplate/elements/select-terms.html | 26 +++++++++++++ 7 files changed, 140 insertions(+), 21 deletions(-) create mode 100644 httemplate/elements/select-terms.html diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 70f32502b..6f53b2aa7 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -390,15 +390,23 @@ sub tables_hashref { 'cust_bill' => { 'columns' => [ + #regular fields 'invnum', 'serial', '', '', '', '', 'custnum', 'int', '', '', '', '', '_date', @date_type, '', '', 'charged', @money_type, '', '', + 'invoice_terms', 'varchar', 'NULL', $char_d, '', '', + + #customer balance info at invoice generation time 'previous_balance', @money_typen, '', '', #eventually not nullable 'billing_balance', @money_typen, '', '', #eventually not nullable + + #deprecated (unused by now, right?) 'printed', 'int', '', '', '', '', + + #specific use cases 'closed', 'char', 'NULL', 1, '', '', - 'statementnum', 'int', 'NULL', '', '', '', + 'statementnum', 'int', 'NULL', '', '', '', #invoice aggregate statements ], 'primary_key' => 'invnum', 'unique' => [], diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index ac1e450d8..493bc097b 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -96,6 +96,18 @@ L and L for conversion functions. =item charged - amount of this invoice +=item invoice_terms - optional terms override for this specific invoice + +=back + +Customer info at invoice generation time + +=over 4 + +=item previous_balance + +=item billing_balance + =back Deprecated @@ -2989,10 +3001,10 @@ sub _translate_old_latex_format { $line_item_line =~ s/\$(\w+)/'. \$_tr_line->{$1}. '/g; push @template, " \$OUT .= '$line_item_line';"; } - + push @template, '}', '--@]'; - + #' doh, gvim } elsif ( $line =~ /^%%TotalDetails\s*$/ ) { push @template, '[@--', @@ -3026,11 +3038,12 @@ sub _translate_old_latex_format { sub terms { my $self = shift; - #check for an invoice- specific override (eventually) + #check for an invoice-specific override + return $self->invoice_terms if $self->invoice_terms; #check for a customer- specific override - return $self->cust_main->invoice_terms - if $self->cust_main->invoice_terms; + my $cust_main = $self->cust_main; + return $cust_main->invoice_terms if $cust_main->invoice_terms; #use configured default $conf->config('invoice_default_terms') || ''; diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 9d40e7306..c83acc65e 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -2475,6 +2475,11 @@ typically might mean not charging the normal recurring fee but only usage fees since the last billing. Setup charges may be charged. Not all package plans support this feature (they tend to charge 0). +=item invoice_terms + +Options terms to be printed on this invocice. Otherwise, customer-specific +terms or the default terms are used. + =back =cut @@ -2801,6 +2806,7 @@ sub bill { 'charged' => $charged, 'billing_balance' => $balance, 'previous_balance' => $previous_balance, + 'invoice_terms' => $options{'invoice_terms'}, } ); $error = $cust_bill->insert; if ( $error ) { @@ -7172,6 +7178,10 @@ New-style, with a hashref of options: #will be filled in with the new object 'cust_pkg_ref' => \$cust_pkg, + + #generate an invoice immediately + 'bill_now' => 0, + 'invoice_terms' => '', #with these terms } ); @@ -7188,6 +7198,7 @@ sub charge { my ( $setuptax, $taxclass ); #internal taxes my ( $taxproduct, $override ); #vendor (CCH) taxes my $cust_pkg_ref = ''; + my ( $bill_now, $invoice_terms ) = ( 0, '' ); if ( ref( $_[0] ) ) { $amount = $_[0]->{amount}; $quantity = exists($_[0]->{quantity}) ? $_[0]->{quantity} : 1; @@ -7202,6 +7213,8 @@ sub charge { $taxproduct = $_[0]->{taxproductnum}; $override = { '' => $_[0]->{tax_override} }; $cust_pkg_ref = exists($_[0]->{cust_pkg_ref}) ? $_[0]->{cust_pkg_ref} : ''; + $bill_now = exists($_[0]->{bill_now}) ? $_[0]->{bill_now} : ''; + $invoice_terms = exists($_[0]->{invoice_terms}) ? $_[0]->{invoice_terms} : ''; } else { $amount = shift; $quantity = 1; @@ -7277,8 +7290,18 @@ sub charge { ${$cust_pkg_ref} = $cust_pkg; } + if ( $bill_now ) { + my $error = $self->bill( 'invoice_terms' => $invoice_terms, + 'pkg_list' => [ $cust_pkg ], + ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + $dbh->commit or die $dbh->errstr if $oldAutoCommit; - ''; + return ''; } diff --git a/httemplate/edit/cust_main/billing.html b/httemplate/edit/cust_main/billing.html index 363dd0419..ad83778ca 100644 --- a/httemplate/edit/cust_main/billing.html +++ b/httemplate/edit/cust_main/billing.html @@ -411,14 +411,10 @@ Invoice terms - + <% include('/elements/select-terms.html', + 'curr_value' => $cust_main->invoice_terms, + ) + %> diff --git a/httemplate/edit/process/quick-charge.cgi b/httemplate/edit/process/quick-charge.cgi index 8f0e42471..827530e50 100644 --- a/httemplate/edit/process/quick-charge.cgi +++ b/httemplate/edit/process/quick-charge.cgi @@ -55,6 +55,8 @@ unless ( $error ) { $error ||= $cust_main->charge( { 'amount' => $amount, 'quantity' => $quantity, + 'bill_now' => scalar($cgi->param('bill_now')), + 'invoice_terms' => scalar($cgi->param('invoice_terms')), 'start_date' => ( scalar($cgi->param('start_date')) ? str2time($cgi->param('start_date')) : '' diff --git a/httemplate/edit/quick-charge.html b/httemplate/edit/quick-charge.html index 75e3fee14..c96fa6c81 100644 --- a/httemplate/edit/quick-charge.html +++ b/httemplate/edit/quick-charge.html @@ -3,10 +3,10 @@ ) %> - - - - + + + + <% include('/elements/error.html') %> @@ -58,6 +58,23 @@ function validate_quick_charge () { return false; } +function bill_now_changed (what) { + var form = what.form; + if ( what.checked ) { + form.start_date_text.disabled = true; + form.start_date.style.backgroundColor = '#dddddd'; + form.start_date_button.style.display = 'none'; + form.start_date_button_disabled.style.display = ''; + form.invoice_terms.disabled = false; + } else { + form.start_date_text.disabled = false; + form.start_date.style.backgroundColor = '#ffffff'; + form.start_date_button.style.display = ''; + form.start_date_button_disabled.style.display = 'none'; + form.invoice_terms.disabled = true; + } +} +
@@ -84,6 +101,25 @@ function validate_quick_charge () { <% include('/elements/tr-select-pkg_class.html', 'curr_value' => $cgi->param('classnum') ) %> + + Invoice now + + param('bill_now') ? 'CHECKED' : '' %> + onChange = "bill_now_changed(this);" + > + with terms + <% include('/elements/select-terms.html', + 'curr_value' => scalar($cgi->param('invoice_terms')), + 'empty_value' => $default_terms, + 'disabled' => ( $cgi->param('bill_now') ? 0 : 1 ), + ) + %> + + + %# false laziness w/misc/order_pkg.html Charge date @@ -93,11 +129,16 @@ function validate_quick_charge () { SIZE = 32 ID = "start_date_text" VALUE = "<% $start_date %>" + <% $cgi->param('bill_now') ? 'STYLE = "background-color:#dddddd" DISABLED' : '' %> > - + param('bill_now') ? '' : 'STYLE="display:none"' %> > (leave blank to charge immediately) @@ -232,4 +273,14 @@ $cgi->param('pkg') =~ /^([\w \!\@\#\$\%\&\(\)\-\+\;\:\'\"\,\.\?\/\=\[\]]*)$/ or die 'illegal description'; my $pkg = $1; +my $default_terms; +if ( $cust_main->invoice_terms ) { + $default_terms = 'Customer default ('. $cust_main->invoice_terms. ')'; +} else { + $default_terms = + 'Default ('. + ($conf->config('invoice_default_terms') || 'Payable upon receipt'). + ')'; +} + diff --git a/httemplate/elements/select-terms.html b/httemplate/elements/select-terms.html new file mode 100644 index 000000000..629d1e464 --- /dev/null +++ b/httemplate/elements/select-terms.html @@ -0,0 +1,26 @@ + +<%init> + +my %opt = @_; +my $curr_value = $opt{'curr_value'}; +my $conf = new FS::Conf; + +my $empty_label = + $opt{'empty_label'} + || 'Default ('. + ($conf->config('invoice_default_terms') || 'Payable upon receipt'). + ')'; + +my @terms = ( 'Payable upon receipt', + ( map "Net $_", 0, 10, 15, 20, 30, 45, 60 ), + ); + + -- 2.11.0