From: Ivan Kohler Date: Sun, 18 Aug 2013 05:41:28 +0000 (-0700) Subject: merge X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=d5fa12d1022afb592e80803971e90d18eac414e0;hp=86f99dcdb9a51acc6865dc11b481f51377efecf6 merge --- diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 56cd06500..2e9a10af7 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -1612,6 +1612,7 @@ sub tables_hashref { 'invnum', 'int', 'NULL', '', '', '', 'manual', 'char', 'NULL', 1, '', '', 'discount_term','int', 'NULL', '', '', '', + 'failure_status','varchar','NULL', 16, '', '', ], 'primary_key' => 'paypendingnum', 'unique' => [ [ 'payunique' ] ], @@ -1776,6 +1777,7 @@ sub tables_hashref { 'amount', @money_type, '', '', 'currency', 'char', 'NULL', 3, '', '', 'status', 'varchar', 'NULL', $char_d, '', '', + 'failure_status','varchar', 'NULL', 16, '', '', 'error_message', 'varchar', 'NULL', $char_d, '', '', ], 'primary_key' => 'paybatchnum', diff --git a/FS/FS/cust_main/Billing_Realtime.pm b/FS/FS/cust_main/Billing_Realtime.pm index 6e89f71b8..e5e5291c0 100644 --- a/FS/FS/cust_main/Billing_Realtime.pm +++ b/FS/FS/cust_main/Billing_Realtime.pm @@ -1010,8 +1010,9 @@ sub _realtime_bop_result { } else { - my $perror = $payment_gateway->gateway_module. " error: ". - $transaction->error_message; + my $perror = $transaction->error_message; + #$payment_gateway->gateway_module. " error: ". + # removed for conciseness my $jobnum = $cust_pay_pending->jobnum; if ( $jobnum ) { @@ -1109,7 +1110,11 @@ sub _realtime_bop_result { } $cust_pay_pending->status('done'); - $cust_pay_pending->statustext("declined: $perror"); + $cust_pay_pending->statustext($perror); + #'declined:': no, that's failure_status + if ( $transaction->can('failure_status') ) { + $cust_pay_pending->failure_status( $transaction->failure_status ); + } my $cpp_done_err = $cust_pay_pending->replace; if ( $cpp_done_err ) { my $e = "WARNING: $options{method} declined but pending payment not ". diff --git a/FS/FS/cust_pay_batch.pm b/FS/FS/cust_pay_batch.pm index e1e32d3d4..b93d8166d 100644 --- a/FS/FS/cust_pay_batch.pm +++ b/FS/FS/cust_pay_batch.pm @@ -84,6 +84,9 @@ following fields are currently supported: =item error_message - the error returned by the gateway if any +=item failure_status - the normalized L failure +status, if any + =back =head1 METHODS @@ -340,20 +343,24 @@ sub approve { return; } -=item decline [ REASON ] +=item decline [ REASON [ STATUS ] ] Decline this payment. This will replace the existing record with the same paybatchnum, set its status to 'Declined', and run collection events as appropriate. This should only be called from the batch import process. REASON is a string description of the decline reason, defaulting to -'Returned payment'. +'Returned payment', and will go into the "error_message" field. + +STATUS is a normalized failure status defined by L, +and will go into the "failure_status" field. =cut sub decline { my $new = shift; my $reason = shift || 'Returned payment'; + my $failure_status = shift || ''; #my $conf = new FS::Conf; my $paybatchnum = $new->paybatchnum; @@ -390,6 +397,7 @@ sub decline { } # !$old->status $new->status('Declined'); $new->error_message($reason); + $new->failure_status($failure_status); my $error = $new->replace($old); if ( $error ) { return "error updating status of paybatchnum $paybatchnum: $error\n"; diff --git a/FS/FS/cust_pay_pending.pm b/FS/FS/cust_pay_pending.pm index 8e29f08b6..8c6ef69ae 100644 --- a/FS/FS/cust_pay_pending.pm +++ b/FS/FS/cust_pay_pending.pm @@ -124,6 +124,13 @@ Transaction recorded in database Additional status information. +=item failure_status + +One of the standard failure status strings defined in +L: "expired", "nsf", "stolen", "pickup", +"blacklisted", "declined". If the transaction status is not "declined", +this will be empty. + =item gatewaynum L id. @@ -215,6 +222,7 @@ sub check { || $self->ut_text('status') #|| $self->ut_textn('statustext') || $self->ut_anything('statustext') + || $self->ut_textn('failure_status') #|| $self->ut_money('cust_balance') || $self->ut_hexn('session_id') || $self->ut_foreign_keyn('paynum', 'cust_pay', 'paynum' ) @@ -425,10 +433,11 @@ sub approve { ''; } -=item decline [ STATUSTEXT ] +=item decline [ STATUSTEXT [ STATUS ] ] Sets the status of this pending payment to "done" (with statustext -"declined (manual)" unless otherwise specified). +"declined (manual)" unless otherwise specified). The optional STATUS can be +used to set the failure_status field. Currently only used when resolving pending payments manually. @@ -437,11 +446,15 @@ Currently only used when resolving pending payments manually. sub decline { my $self = shift; my $statustext = shift || "declined (manual)"; + my $failure_status = shift || ''; #could send decline email too? doesn't seem useful in manual resolution + # this is also used for thirdparty payment execution failures, but a decline + # email isn't useful there either, and will just confuse people. $self->status('done'); $self->statustext($statustext); + $self->failure_status($failure_status); $self->replace; } diff --git a/FS/FS/pay_batch.pm b/FS/FS/pay_batch.pm index 3a069149f..8c6c36845 100644 --- a/FS/FS/pay_batch.pm +++ b/FS/FS/pay_batch.pm @@ -735,7 +735,8 @@ sub import_from_gateway { $total += $cust_pay_batch->paid; } else { - $error = $cust_pay_batch->decline($item->error_message); + $error = $cust_pay_batch->decline($item->error_message, + $item->failure_status); } if ( $error ) { diff --git a/FS/FS/payinfo_Mixin.pm b/FS/FS/payinfo_Mixin.pm index 5c4acf718..66c1e590d 100644 --- a/FS/FS/payinfo_Mixin.pm +++ b/FS/FS/payinfo_Mixin.pm @@ -290,6 +290,33 @@ sub payinfo_used { return 0; } +=item display_status + +For transactions that have both 'status' and 'failure_status', shows the +status in a single, display-friendly string. + +=cut + +sub display_status { + my $self = shift; + my %status = ( + 'done' => 'Approved', + 'expired' => 'Card Expired', + 'stolen' => 'Lost/Stolen', + 'pickup' => 'Pick Up Card', + 'nsf' => 'Insufficient Funds', + 'inactive' => 'Inactive Account', + 'blacklisted' => 'Blacklisted', + 'declined' => 'Declined', + 'approved' => 'Approved', + ); + if ( $self->failure_status ) { + return $status{$self->failure_status}; + } else { + return $status{$self->status}; + } +} + =back =head1 BUGS diff --git a/bin/part_pkg-bulk_change b/bin/part_pkg-bulk_change index 21a6c5ac3..cb29b1865 100755 --- a/bin/part_pkg-bulk_change +++ b/bin/part_pkg-bulk_change @@ -1,19 +1,22 @@ #!/usr/bin/perl use strict; -use vars qw( $opt_r $opt_o $opt_v $opt_t ); +use vars qw( $opt_r $opt_p $opt_o $opt_v $opt_t ); use Getopt::Std; use FS::UID qw(adminsuidsetup); use FS::Record qw(qsearch qsearchs); use FS::part_pkg; use FS::part_pkg_option; -getopts('ro:v:t:'); +getopts('rp:o:v:t:'); my $user = shift or &usage; adminsuidsetup $user; -foreach my $part_pkg ( qsearch('part_pkg', {}) ) { +my %plan; +%plan = ( 'plan' => $opt_p ) if $opt_p; + +foreach my $part_pkg ( qsearch('part_pkg',\%plan) ) { next if ! $part_pkg->freq && $opt_r; if ( $opt_o ) { diff --git a/httemplate/edit/bulk-part_pkg.html b/httemplate/edit/bulk-part_pkg.html index a1c6f0c9b..4665c9f95 100644 --- a/httemplate/edit/bulk-part_pkg.html +++ b/httemplate/edit/bulk-part_pkg.html @@ -6,6 +6,7 @@ .row0 { background-color: #eeeeee; } .row1 { background-color: #ffffff; } +<& /elements/error.html &>
@@ -22,15 +23,12 @@ The following packages will be changed:
% foreach my $num (sort keys %report_class) { -% if ( defined $initial_state{$num} ) { - <& /elements/checkbox.html, - field => 'report_option_'.$num, - value => 1, - curr_value => $initial_state{$num} - &> -% } else { +% if ( $initial_state{$num} == -1 ) { % # needs to be a tristate so that you can say "don't change it" <& /elements/checkbox-tristate.html, field => 'report_option_'.$num &> +% } else { +%# for visual consistency + >