From: ivan Date: Thu, 5 Jun 2008 05:06:36 +0000 (+0000) Subject: payment and credit applications have separate "apply to refund" choices now, and... X-Git-Tag: root_of_webpay_support~595 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=d7977d0a346e3e5975c44a75b915bb437be66f4f payment and credit applications have separate "apply to refund" choices now, and no auto-refund choice in the invoice dropdown. RT#3545 --- diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index 156887097..08699acd1 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -21,7 +21,7 @@ use FS::cust_pay_void; @ISA = qw( FS::payinfo_transaction_Mixin FS::cust_main_Mixin FS::Record ); -$DEBUG = 0; +$DEBUG = 1; $me = '[FS::cust_pay]'; @@ -550,6 +550,17 @@ sub unrefunded { sprintf("%.2f", $amount ); } +=item amount + +Returns the "paid" field. + +=cut + +sub amount { + my $self = shift; + $self->paid(); +} + =back =head1 CLASS METHODS @@ -602,7 +613,8 @@ sub _upgrade_data { #class method my $sth = dbh->prepare($count_sql) or die dbh->errstr; $sth->execute or die $sth->errstr; my $total = $sth->fetchrow_arrayref->[0]; - + #warn "$total cust_pay records to update\n" + # if $DEBUG; local($DEBUG) = 2 if $total > 1000; #could be a while, force progress info my $count = 0; @@ -629,7 +641,7 @@ sub _upgrade_data { #class method my $error = $cust_pay->replace; if ( $error ) { - warn " *** WARNING: Error updaating order taker for payment paynum". + warn " *** WARNING: Error updating order taker for payment paynum ". $cust_pay->paynun. ": $error\n"; next; } diff --git a/httemplate/edit/cust_bill_pay.cgi b/httemplate/edit/cust_bill_pay.cgi index b6a064768..532db6a6e 100755 --- a/httemplate/edit/cust_bill_pay.cgi +++ b/httemplate/edit/cust_bill_pay.cgi @@ -1,86 +1,14 @@ -<% include('/elements/header-popup.html', 'Apply Payment') %> - -<% include('/elements/error.html') %> - -
- -Payment #<% $paynum %> - - -
Date: <% time2str("%D", $cust_pay->_date) %> - -
Amount: $<% $cust_pay->paid %> - -
Unapplied amount: $<% $unapplied %> - - - -
Invoice # - -
Amount $ - -
-
- -
- -<% include('/elements/footer.html') %> - +<% include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_bill_pay.cgi', + 'src_table' => 'cust_pay', + 'src_thing' => 'payment', + 'dst_table' => 'cust_bill', + 'dst_thing' => 'invoice', + ) +%> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Apply payment'); -my($paynum, $amount, $invnum); -if ( $cgi->param('error') ) { - $paynum = $cgi->param('paynum'); - $amount = $cgi->param('amount'); - $invnum = $cgi->param('invnum'); -} else { - my($query) = $cgi->keywords; - $query =~ /^(\d+)$/; - $paynum = $1; - $amount = ''; - $invnum = ''; -} - -my $otaker = getotaker; - -my $p1 = popurl(1); - -my $cust_pay = qsearchs('cust_pay', { 'paynum' => $paynum } ); -die "payment $paynum not found!" unless $cust_pay; - -my $unapplied = $cust_pay->unapplied; - -my @cust_bill = sort { $a->_date <=> $b->_date - or $a->invnum <=> $b->invnum - } - grep { $_->owed != 0 } - qsearch('cust_bill', { 'custnum' => $cust_pay->custnum } ); - diff --git a/httemplate/edit/cust_credit_bill.cgi b/httemplate/edit/cust_credit_bill.cgi index 59a74b279..e3627ff37 100755 --- a/httemplate/edit/cust_credit_bill.cgi +++ b/httemplate/edit/cust_credit_bill.cgi @@ -1,93 +1,14 @@ -<% include('/elements/header-popup.html', 'Apply Credit') %> - -<% include('/elements/error.html') %> - -
- -Credit #<% $crednum %> - - -
Date: <% time2str("%D", $cust_credit->_date) %> - -
Amount: $<% $cust_credit->amount %> - -
Unapplied amount: $<% $credited %> - -
Reason: <% $cust_credit->reason %> - - - -
Invoice # - -
Amount $ - -
-
- -
- - - +<% include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_credit_bill.cgi', + 'src_table' => 'cust_credit', + 'src_thing' => 'credit', + 'dst_table' => 'cust_bill', + 'dst_thing' => 'invoice', + ) +%> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Apply credit'); -my($crednum, $amount, $invnum); -if ( $cgi->param('error') ) { - #$cust_credit_bill = new FS::cust_credit_bill ( { - # map { $_, scalar($cgi->param($_)) } fields('cust_credit_bill') - #} ); - $crednum = $cgi->param('crednum'); - $amount = $cgi->param('amount'); - #$refund = $cgi->param('refund'); - $invnum = $cgi->param('invnum'); -} else { - my($query) = $cgi->keywords; - $query =~ /^(\d+)$/; - $crednum = $1; - $amount = ''; - #$refund = 'yes'; - $invnum = ''; -} - -my $otaker = getotaker; - -my $p1 = popurl(1); - -my $cust_credit = qsearchs('cust_credit', { 'crednum' => $crednum } ); -die "credit $crednum not found!" unless $cust_credit; - -my $credited = $cust_credit->credited; - -my @cust_bill = sort { $a->_date <=> $b->_date - or $a->invnum <=> $b->invnum - } - grep { $_->owed != 0 } - qsearch('cust_bill', { 'custnum' => $cust_credit->custnum } ); - diff --git a/httemplate/edit/cust_credit_refund.cgi b/httemplate/edit/cust_credit_refund.cgi new file mode 100755 index 000000000..f5bbb5633 --- /dev/null +++ b/httemplate/edit/cust_credit_refund.cgi @@ -0,0 +1,14 @@ +<% include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_credit_refund.cgi', + 'src_table' => 'cust_credit', + 'src_thing' => 'credit', + 'dst_table' => 'cust_refund', + 'dst_thing' => 'refund', + ) +%> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Apply credit'); + + diff --git a/httemplate/edit/cust_pay_refund.cgi b/httemplate/edit/cust_pay_refund.cgi new file mode 100755 index 000000000..f82fe36fe --- /dev/null +++ b/httemplate/edit/cust_pay_refund.cgi @@ -0,0 +1,14 @@ +<% include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_pay_refund.cgi', + 'src_table' => 'cust_pay', + 'src_thing' => 'payment', + 'dst_table' => 'cust_refund', + 'dst_thing' => 'refund', + ) +%> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Apply payment'); + + diff --git a/httemplate/edit/elements/ApplicationCommon.html b/httemplate/edit/elements/ApplicationCommon.html new file mode 100644 index 000000000..0e6c49975 --- /dev/null +++ b/httemplate/edit/elements/ApplicationCommon.html @@ -0,0 +1,170 @@ +<%doc> + +Examples: + + #cust_bill_pay + include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_bill_pay.cgi', + 'src_table' => 'cust_pay', + 'src_thing' => 'payment', + 'dst_table' => 'cust_bill', + 'dst_thing' => 'invoice', + ) + + #cust_credit_bill + include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_credit_bill.cgi', + 'src_table' => 'cust_credit', + 'src_thing' => 'credit', + 'dst_table' => 'cust_bill', + 'dst_thing' => 'invoice', + ) + + #cust_pay_refund + include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_pay_refund.cgi', + 'src_table' => 'cust_pay', + 'src_thing' => 'payment', + 'dst_table' => 'cust_refund', + 'dst_thing' => 'refund', + ) + + #cust_credit_refund + include('elements/ApplicationCommon.html', + 'form_action' => 'process/cust_credit_refund.cgi', + 'src_table' => 'cust_credit', + 'src_thing' => 'credit', + 'dst_table' => 'cust_refund', + 'dst_thing' => 'refund', + ) + + +<% include('/elements/header-popup.html', "Apply $src_thing$to" ) %> + +<% include('/elements/error.html') %> + +
+ +<% $src_thing %> #<% $src_pkeyvalue %>
+ + + + + + + + + + + + + + + + + + + +% if ( $src_table eq 'cust_credit' ) { + + + + +% } + +
Date: <% time2str("%D", $src->_date) %>
Amount: <% $money_char %><% $src->amount %>
Unapplied amount: <% $money_char %><% $unapplied %>
Reason: <% $src->reason %>
+
+ + + +Apply to: + + + + + + + + + + + + + +
<% $dst_thing %>: +
Amount: <% $money_char %>
+ +
+
+ +
+ +<% include('/elements/footer.html') %> + +<%init> + +my %opt = @_; + +my $conf = new FS::Conf; +my $money_char = $conf->config('money_char') || '$'; + +my $src_thing = ucfirst($opt{'src_thing'}); +my $src_table = $opt{'src_table'}; +my $src_pkey = dbdef->table($src_table)->primary_key; + +my $dst_thing = ucfirst($opt{'dst_thing'}); +my $dst_table = $opt{'dst_table'}; +my $dst_pkey = dbdef->table($dst_table)->primary_key; +my $dst_unapplied = $dst_table eq 'cust_bill' ? 'owed' : 'unapplied'; + +my $to = $dst_table eq 'cust_refund' ? ' to Refund' : ''; + +my($src_pkeyvalue, $amount, $dst_pkeyvalue); +if ( $cgi->param('error') ) { + $src_pkeyvalue = $cgi->param($src_pkey); + $amount = $cgi->param('amount'); + $dst_pkeyvalue = $cgi->param($dst_pkey); +} else { + my($query) = $cgi->keywords; + $query =~ /^(\d+)$/; + $src_pkeyvalue = $1; + $amount = ''; + $dst_pkeyvalue = ''; +} + +my $otaker = getotaker; + +my $p1 = popurl(1); + +my $src = qsearchs($src_table, { $src_pkey => $src_pkeyvalue } ); +die "$src_thing $src_pkeyvalue not found!" unless $src; + +my $unapplied = $src->unapplied; + +my @dst = sort { $a->_date <=> $b->_date + or $a->$dst_pkey <=> $b->$dst_pkey + } + grep { $_->$dst_unapplied != 0 } + qsearch($dst_table, { 'custnum' => $src->custnum } ); + + diff --git a/httemplate/edit/process/cust_bill_pay.cgi b/httemplate/edit/process/cust_bill_pay.cgi index e2f89f197..2845d3233 100755 --- a/httemplate/edit/process/cust_bill_pay.cgi +++ b/httemplate/edit/process/cust_bill_pay.cgi @@ -1,49 +1,13 @@ -%if ( $error ) { -% $cgi->param('error', $error); -<% $cgi->redirect(popurl(2). "cust_bill_pay.cgi?". $cgi->query_string ) %> -%} else { -<% header('Payment application sucessful') %> - - - -% } +<% include('elements/ApplicationCommon.html', + 'error_redirect' => 'cust_bill_pay.cgi', + 'src_table' => 'cust_pay', + 'src_thing' => 'payment', + 'link_table' => 'cust_bill_pay', + ) +%> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Apply payment'); -$cgi->param('paynum') =~ /^(\d*)$/ or die "Illegal paynum!"; -my $paynum = $1; - -my $cust_pay = qsearchs('cust_pay', { 'paynum' => $paynum } ) - or die "No such paynum"; - -my $cust_main = qsearchs('cust_main', { 'custnum' => $cust_pay->custnum } ) - or die "Bogus credit: not attached to customer"; - -my $custnum = $cust_main->custnum; - -my $new; -if ($cgi->param('invnum') =~ /^Refund$/) { - $new = new FS::cust_refund ( { - 'reason' => 'Refunding payment', #enter reason in UI - 'refund' => $cgi->param('amount'), - 'payby' => 'BILL', - #'_date' => $cgi->param('_date'), - 'payinfo' => 'Cash', #enter payinfo in UI - 'paynum' => $paynum, - } ); -} else { - $new = new FS::cust_bill_pay ( { - map { - $_, scalar($cgi->param($_)); - #} qw(custnum _date amount invnum) - } fields('cust_bill_pay') - } ); -} - -my $error = $new->insert; - diff --git a/httemplate/edit/process/cust_credit_bill.cgi b/httemplate/edit/process/cust_credit_bill.cgi index 17f9fcb35..c0f34ae5b 100755 --- a/httemplate/edit/process/cust_credit_bill.cgi +++ b/httemplate/edit/process/cust_credit_bill.cgi @@ -1,50 +1,13 @@ -%if ( $error ) { -% $cgi->param('error', $error); -<% $cgi->redirect(popurl(2). "cust_credit_bill.cgi?". $cgi->query_string ) %> -%} else { -<% header('Credit application sucessful') %> - - - -% } +<% include('elements/ApplicationCommon.html', + 'error_redirect' => 'cust_credit_bill.cgi', + 'src_table' => 'cust_credit', + 'src_thing' => 'credit', + 'link_table' => 'cust_credit_bill', + ) +%> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Apply credit'); -$cgi->param('crednum') =~ /^(\d*)$/ or die "Illegal crednum!"; -my $crednum = $1; - -my $cust_credit = qsearchs('cust_credit', { 'crednum' => $crednum } ) - or die "No such crednum"; - -my $cust_main = qsearchs('cust_main', { 'custnum' => $cust_credit->custnum } ) - or die "Bogus credit: not attached to customer"; - -my $custnum = $cust_main->custnum; - -my $new; -if ($cgi->param('invnum') =~ /^Refund$/) { - $new = new FS::cust_refund ( { - 'reason' => ( $cust_credit->reason || 'refund from credit' ), - 'refund' => $cgi->param('amount'), - 'payby' => 'BILL', - #'_date' => $cgi->param('_date'), - #'payinfo' => 'Cash', - 'payinfo' => 'Refund', - 'crednum' => $crednum, - } ); -} else { - $new = new FS::cust_credit_bill ( { - map { - $_, scalar($cgi->param($_)); - #} qw(custnum _date amount invnum) - } fields('cust_credit_bill') - } ); -} - -my $error = $new->insert; - diff --git a/httemplate/edit/process/cust_credit_refund.cgi b/httemplate/edit/process/cust_credit_refund.cgi new file mode 100755 index 000000000..d4fd9ff9e --- /dev/null +++ b/httemplate/edit/process/cust_credit_refund.cgi @@ -0,0 +1,13 @@ +<% include('elements/ApplicationCommon.html', + 'error_redirect' => 'cust_credit_bill.cgi', + 'src_table' => 'cust_credit', + 'src_thing' => 'credit', + 'link_table' => 'cust_credit_refund', + ) +%> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Apply credit'); + + diff --git a/httemplate/edit/process/cust_pay_refund.cgi b/httemplate/edit/process/cust_pay_refund.cgi new file mode 100755 index 000000000..ffe89ec64 --- /dev/null +++ b/httemplate/edit/process/cust_pay_refund.cgi @@ -0,0 +1,13 @@ +<% include('elements/ApplicationCommon.html', + 'error_redirect' => 'cust_bill_pay.cgi', + 'src_table' => 'cust_pay', + 'src_thing' => 'payment', + 'link_table' => 'cust_pay_refund', + ) +%> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Apply payment'); + + diff --git a/httemplate/edit/process/elements/ApplicationCommon.html b/httemplate/edit/process/elements/ApplicationCommon.html new file mode 100644 index 000000000..2782dc231 --- /dev/null +++ b/httemplate/edit/process/elements/ApplicationCommon.html @@ -0,0 +1,77 @@ +<%doc> + +Examples: + + #cust_bill_pay + include('elements/ApplicationCommon.html', + 'error_redirect' => 'cust_bill_pay.cgi', + 'src_table' => 'cust_pay', + 'src_thing' => 'payment', + 'link_table' => 'cust_bill_pay', + ) + + #cust_credit_bill + include('elements/ApplicationCommon.html', + 'error_redirect' => 'cust_credit_bill.cgi', + 'src_table' => 'cust_credit', + 'src_thing' => 'credit', + 'link_table' => 'cust_credit_bill', + ) + + +%if ( $error ) { +% $cgi->param('error', $error); +<% $cgi->redirect(popurl(2). $opt{error_redirect}. '?'. $cgi->query_string ) %> +%} else { +<% header("$src_thing application$to sucessful") %> + + + +% } +<%init> + +my %opt = @_; + +my $src_thing = ucfirst($opt{'src_thing'}); +my $src_table = $opt{'src_table'}; +my $src_pkey = dbdef->table($src_table)->primary_key; + +my $to = $opt{'link_table'} =~ /refund/ ? ' to Refund' : ''; + +$cgi->param($src_pkey) =~ /^(\d+)$/ or die "Illegal $src_pkey!"; +my $src_pkeyvalue = $1; + +my $src = qsearchs($src_table, { $src_pkey => $src_pkeyvalue } ) + or die "No such $src_pkey: $src_pkeyvalue"; + +my $cust_main = qsearchs('cust_main', { 'custnum' => $src->custnum } ) + or die "Bogus $src_thing: not attached to customer"; + +my $custnum = $cust_main->custnum; + +my $new; +# $new = new FS::cust_refund ( { +# 'reason' => 'Refunding payment', #enter reason in UI +# 'refund' => $cgi->param('amount'), +# 'payby' => 'BILL', +# #'_date' => $cgi->param('_date'), +# 'payinfo' => 'Cash', #enter payinfo in UI +# 'paynum' => $paynum, +# } ); +#} else { + + my $class = 'FS::'. $opt{link_table}; + + $new = $class->new( { + map { + $_ => scalar($cgi->param($_)); + } fields($opt{link_table}) + } ); + +#} + +my $error = $new->insert; + + diff --git a/httemplate/view/cust_main/payment_history/credit.html b/httemplate/view/cust_main/payment_history/credit.html index bf769455b..fd43c1ac8 100644 --- a/httemplate/view/cust_main/payment_history/credit.html +++ b/httemplate/view/cust_main/payment_history/credit.html @@ -25,6 +25,16 @@ if ( scalar(@cust_credit_bill) == 0 #default# 'height' => 336, ). ')'; + #XXX if there are any open refunds + $apply.= ' ('. include( '/elements/popup_link.html', + 'label' => 'apply to refund', + 'action' => "${p}edit/cust_credit_refund.cgi?". + $cust_credit->crednum, + 'actionlabel' => 'Apply credit to refund', + 'width' => 392, + #default# 'height' => 336, + ). + ')'; } } elsif ( scalar(@cust_credit_bill) == 1 && scalar(@cust_credit_refund) == 0 @@ -60,15 +70,25 @@ if ( scalar(@cust_credit_bill) == 0 $desc .= '  $'. $cust_credit->credited. ' unapplied'; if ( $curuser->access_right('Apply credit') ) { - $desc = ' ('. include( '/elements/popup_link.html', - 'label' => 'apply', - 'action' => "${p}edit/cust_credit_bill.cgi?". - $cust_credit->crednum, - 'actionlabel' => 'Apply credit', - 'width' => 392, - #default# 'height' => 336, - ). - ')'; + $apply = ' ('. include( '/elements/popup_link.html', + 'label' => 'apply', + 'action' => "${p}edit/cust_credit_bill.cgi?". + $cust_credit->crednum, + 'actionlabel' => 'Apply credit', + 'width' => 392, + #default# 'height' => 336, + ). + ')'; + #XXX if there are any open refunds + $apply.= ' ('. include( '/elements/popup_link.html', + 'label' => 'apply to refund', + 'action' => "${p}edit/cust_credit_refund.cgi?". + $cust_credit->crednum, + 'actionlabel' => 'Apply credit to refund', + 'width' => 392, + #default# 'height' => 336, + ). + ')'; } $desc .= '
'; } diff --git a/httemplate/view/cust_main/payment_history/payment.html b/httemplate/view/cust_main/payment_history/payment.html index 96fca7f49..b9a06946d 100644 --- a/httemplate/view/cust_main/payment_history/payment.html +++ b/httemplate/view/cust_main/payment_history/payment.html @@ -49,6 +49,16 @@ if ( scalar(@cust_bill_pay) == 0 #default# 'height' => 336, ). ')'; + #XXX if there are any open refunds + $apply.= ' ('. include( '/elements/popup_link.html', + 'label' => 'apply to refund', + 'action' => "${p}edit/cust_pay_refund.cgi?". + $cust_pay->paynum, + 'actionlabel' => 'Apply payment to refund', + 'width' => 392, + #default# 'height' => 336, + ). + ')'; } } elsif ( scalar(@cust_bill_pay) == 1 && scalar(@cust_pay_refund) == 0 @@ -85,15 +95,25 @@ if ( scalar(@cust_bill_pay) == 0 '$'. $cust_pay->unapplied. ' unapplied'; if ( $curuser->access_right('Apply payment') ) { - $desc = ' ('. include( '/elements/popup_link.html', - 'label' => 'apply', - 'action' => "${p}edit/cust_bill_pay.cgi?". - $cust_pay->paynum, - 'actionlabel' => 'Apply payment', - 'width' => 392, - #default# 'height' => 336, - ). - ')'; + $apply = ' ('. include( '/elements/popup_link.html', + 'label' => 'apply', + 'action' => "${p}edit/cust_bill_pay.cgi?". + $cust_pay->paynum, + 'actionlabel' => 'Apply payment', + 'width' => 392, + #default# 'height' => 336, + ). + ')'; + #XXX if there are any open refunds + $apply.= ' ('. include( '/elements/popup_link.html', + 'label' => 'apply to refund', + 'action' => "${p}edit/cust_pay_refund.cgi?". + $cust_pay->paynum, + 'actionlabel' => 'Apply payment to refund', + 'width' => 392, + #default# 'height' => 336, + ). + ')'; } $desc .= '
'; }