fix encryption upgrades when a payment is refunded, then deleted. RT#74270, RT#73085
[freeside.git] / FS / FS / cust_refund.pm
index 15335a4..44d4d97 100644 (file)
@@ -83,6 +83,10 @@ Payment Type (See L<FS::payinfo_Mixin> for valid payby values)
 
 Payment Information (See L<FS::payinfo_Mixin> for data format)
 
+=item paycardtype
+
+Detected credit card type, if appropriate; autodetected.
+
 =item paymask
 
 Masked payinfo (See L<FS::payinfo_Mixin> for how this works)
@@ -145,19 +149,21 @@ sub insert {
   my $dbh = dbh;
 
   unless ($self->reasonnum) {
-    my $result = $self->reason( $self->getfield('reason'),
-                                exists($options{ 'reason_type' })
-                                  ? ('reason_type' => $options{ 'reason_type' })
-                                  : (),
-                              );
-    unless($result) {
-      $dbh->rollback if $oldAutoCommit;
-      return "failed to set reason for $me"; #: ". $dbh->errstr;
+    local $@;
+    if ( $self->get('reason') ) {
+      my $reason = FS::reason->new_or_existing(
+        reason  => $self->get('reason'),
+        class   => 'F',
+        type    => 'Refund reason',
+      );
+      if ($@) {
+        return "failed to add refund reason: $@";
+      }
+      $self->set('reasonnum', $reason->get('reasonnum'));
+      $self->set('reason', '');
     }
   }
 
-  $self->setfield('reason', '');
-
   if ( $self->crednum ) {
     my $cust_credit = qsearchs('cust_credit', { 'crednum' => $self->crednum } )
       or do {
@@ -304,6 +310,7 @@ sub check {
     || $self->ut_numbern('_date')
     || $self->ut_textn('paybatch')
     || $self->ut_enum('closed', [ '', 'Y' ])
+    || $self->ut_foreign_keyn('source_paynum', 'cust_pay', 'paynum')
   ;
   return $error if $error;
 
@@ -508,11 +515,29 @@ sub reason {
   ( $self->addlinfo ? ' '.$self->addlinfo : '' );
 }
 
+sub _upgrade_schema {
+  #my ($class, %opts) = @_;
+
+  my $sql = 'UPDATE cust_refund SET source_paynum = NULL
+               WHERE source_paynum IS NOT NULL
+                 AND NOT EXISTS ( SELECT 1 FROM cust_pay
+                                    WHERE paynum = cust_refund.source_paynum )
+            ';
+  my $sth = dbh->prepare($sql) or die dbh->errstr;
+  $sth->execute or die $sth->errstr;
+  '';
+}
+
 # Used by FS::Upgrade to migrate to a new database.
 sub _upgrade_data {  # class method
   my ($class, %opts) = @_;
   $class->_upgrade_reasonnum(%opts);
   $class->_upgrade_otaker(%opts);
+
+  local $ignore_empty_reasonnum = 1;
+
+  # don't set paycardtype until 4.x
+  #$class->upgrade_set_cardtype;
 }
 
 =back