From: Mark Wells Date: Wed, 23 Apr 2014 18:16:55 +0000 (-0700) Subject: fix foreign keys to voided payments in advance of 4.x upgrade, #13971 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=8b8ebd929229c8376bb81076071c5e76d2baa0ee fix foreign keys to voided payments in advance of 4.x upgrade, #13971 --- diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index f2256587a..f97495d89 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -1645,6 +1645,7 @@ sub tables_hashref { 'gatewaynum', 'int', 'NULL', '', '', '', #'cust_balance', @money_type, '', '', 'paynum', 'int', 'NULL', '', '', '', + 'void_paynum', 'int', 'NULL', '', '', '', 'jobnum', 'bigint', 'NULL', '', '', '', 'invnum', 'int', 'NULL', '', '', '', 'manual', 'char', 'NULL', 1, '', '', diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index d36bae6c2..3cdbdb33e 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -416,12 +416,17 @@ sub void { } ); $cust_pay_void->reason(shift) if scalar(@_); my $error = $cust_pay_void->insert; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return $error; + + my $cust_pay_pending = + qsearchs('cust_pay_pending', { paynum => $self->paynum }); + if ( $cust_pay_pending ) { + $cust_pay_pending->set('void_paynum', $self->paynum); + $cust_pay_pending->set('paynum', ''); + $error ||= $cust_pay_pending->replace; } - $error = $self->delete; + $error ||= $self->delete; + if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error; diff --git a/FS/FS/cust_pay_pending.pm b/FS/FS/cust_pay_pending.pm index 22c929345..b61635d2f 100644 --- a/FS/FS/cust_pay_pending.pm +++ b/FS/FS/cust_pay_pending.pm @@ -133,6 +133,10 @@ L id. Payment number (L) of the completed payment. +=item void_paynum + +Payment number of the payment if it's been voided. + =item invnum Invoice number (L) to try to apply this payment to. @@ -221,6 +225,7 @@ sub check { || $self->ut_foreign_keyn('paynum', 'cust_pay', 'paynum' ) || $self->ut_foreign_keyn('pkgnum', 'cust_pkg', 'pkgnum') || $self->ut_foreign_keyn('invnum', 'cust_bill', 'invnum') + || $self->ut_foreign_keyn('void_paynum', 'cust_pay_void', 'paynum' ) || $self->ut_flag('manual') || $self->ut_numbern('discount_term') || $self->payinfo_check() #payby/payinfo/paymask/paydate @@ -459,6 +464,20 @@ sub _upgrade_data { #class method my $sth = dbh->prepare($sql) or die dbh->errstr; $sth->execute or die $sth->errstr; + # For cust_pay_pending records linked to voided payments, move the paynum + # to void_paynum. + $sql = + "UPDATE cust_pay_pending SET void_paynum = paynum, paynum = NULL + WHERE paynum IS NOT NULL AND void_paynum IS NULL AND EXISTS( + SELECT 1 FROM cust_pay_void + WHERE cust_pay_void.paynum = cust_pay_pending.paynum + ) AND NOT EXISTS( + SELECT 1 FROM cust_pay + WHERE cust_pay.paynum = cust_pay_pending.paynum + )"; + $sth = dbh->prepare($sql) or die dbh->errstr; + $sth->execute or die $sth->errstr; + } =back diff --git a/FS/FS/cust_pay_void.pm b/FS/FS/cust_pay_void.pm index e6e2159a7..fdb7c7f79 100644 --- a/FS/FS/cust_pay_void.pm +++ b/FS/FS/cust_pay_void.pm @@ -135,12 +135,16 @@ sub unvoid { map { $_ => $self->get($_) } fields('cust_pay') } ); my $error = $cust_pay->insert; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return $error; + + my $cust_pay_pending = + qsearchs('cust_pay_pending', { void_paynum => $self->paynum }); + if ( $cust_pay_pending ) { + $cust_pay_pending->set('paynum', $cust_pay->paynum); + $cust_pay_pending->set('void_paynum', ''); + $error ||= $cust_pay_pending->replace; } - $error = $self->delete; + $error ||= $self->delete; if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error;