fix agent-specific logos migrated from 1.7, RT#4645
[freeside.git] / FS / FS / cust_pay_pending.pm
index c90a208..7469720 100644 (file)
@@ -2,7 +2,7 @@ package FS::cust_pay_pending;
 
 use strict;
 use vars qw( @ISA  @encrypted_fields );
-use FS::Record qw( qsearch qsearchs );
+use FS::Record qw( qsearch qsearchs dbh ); #dbh for _upgrade_data
 use FS::payby;
 use FS::payinfo_Mixin;
 use FS::cust_main;
@@ -40,28 +40,80 @@ following fields are currently supported:
 
 =over 4
 
-=item paypendingnum - primary key
+=item paypendingnum
 
-=item custnum - customer (see L<FS::cust_main>)
+Primary key
 
-=item paid - Amount of this payment
+=item custnum
 
-=item _date - specified as a UNIX timestamp; see L<perlfunc/"time">.  Also see
+Customer (see L<FS::cust_main>)
+
+=item paid
+
+Amount of this payment
+
+=item _date
+
+Specified as a UNIX timestamp; see L<perlfunc/"time">.  Also see
 L<Time::Local> and L<Date::Parse> for conversion functions.
 
-=item payby - Payment Type (See L<FS::payinfo_Mixin> for valid payby values)
+=item payby
+
+Payment Type (See L<FS::payinfo_Mixin> for valid payby values)
+
+=item payinfo
+
+Payment Information (See L<FS::payinfo_Mixin> for data format)
+
+=item paymask
+
+Masked payinfo (See L<FS::payinfo_Mixin> for how this works)
+
+=item paydate
+
+Expiration date
+
+=item payunique
+
+Unique identifer to prevent duplicate transactions.
+
+=item status
+
+Pending transaction status, one of the following:
+
+=over 4
 
-=item payinfo - Payment Information (See L<FS::payinfo_Mixin> for data format)
+=item new
 
-=item paymask - Masked payinfo (See L<FS::payinfo_Mixin> for how this works)
+Aquires basic lock on payunique
 
-=item paydate - Expiration date
+=item pending
 
-=item payunique - Unique identifer to prevent duplicate transactions.
+Transaction is pending with the gateway
 
-=item status - new (acquires basic lock on payunique), pending (transaction is pending with the gateway), authorized (only used for two-stage transactions that require a separate capture step), captured/declined (transaction completed with payment gateway, not yet recorded in the database), done (transaction recorded in database)
+=item authorized
 
-=item statustext - 
+Only used for two-stage transactions that require a separate capture step
+
+=item captured
+
+Transaction completed with payment gateway (sucessfully), not yet recorded in
+the database
+
+=item declined
+
+Transaction completed with payment gateway (declined), not yet recorded in
+the database
+
+=item done
+
+Transaction recorded in database
+
+=back
+
+=item statustext
+
+Additional status information.
 
 =cut
 
@@ -131,14 +183,13 @@ sub check {
 
   my $error = 
     $self->ut_numbern('paypendingnum')
-    || $self->ut_number('pendingnum')
     || $self->ut_foreign_key('custnum', 'cust_main', 'custnum')
     || $self->ut_money('paid')
     || $self->ut_numbern('_date')
     || $self->ut_textn('payunique')
     || $self->ut_text('status')
     #|| $self->ut_textn('statustext')
-    || $self->ut_anythingn('statustext')
+    || $self->ut_anything('statustext')
     #|| $self->ut_money('cust_balance')
     || $self->ut_foreign_keyn('paynum', 'cust_pay', 'paynum' )
     || $self->payinfo_check() #payby/payinfo/paymask/paydate
@@ -150,8 +201,10 @@ sub check {
   # UNIQUE index should catch this too, without race conditions, but this
   # should give a better error message the other 99.9% of the time...
   if ( length($self->payunique) ) {
-    my $cust_pay_pending =
-      qsearchs('cust_pay_pending', { 'payunique' => $self->payunique } );
+    my $cust_pay_pending = qsearchs('cust_pay_pending', {
+      'payunique'     => $self->payunique,
+      'paypendingnum' => { op=>'!=', value=>$self->paypendingnum },
+    });
     if ( $cust_pay_pending ) {
       #well, it *could* be a better error message
       return "duplicate transaction - a payment with unique identifer ".
@@ -162,6 +215,21 @@ sub check {
   $self->SUPER::check;
 }
 
+# _upgrade_data
+#
+# Used by FS::Upgrade to migrate to a new database.
+
+sub _upgrade_data {  #class method
+  my ($class, %opts) = @_;
+
+  my $sql =
+    "DELETE FROM cust_pay_pending WHERE status = 'new' AND _date < ".(time-600);
+
+  my $sth = dbh->prepare($sql) or die dbh->errstr;
+  $sth->execute or die $sth->errstr;
+
+}
+
 =back
 
 =head1 BUGS