+=item payinfo_used [ PAYINFO ]
+
+Returns 1 if there's an existing payment using this payinfo. This can be
+used to set the 'recurring payment' flag required by some processors.
+
+=cut
+
+sub payinfo_used {
+ my $self = shift;
+ my $payinfo = shift || $self->payinfo;
+ my %hash = (
+ 'custnum' => $self->custnum,
+ 'payby' => $self->payby,
+ );
+
+ return 1
+ if qsearch('cust_pay', { %hash, 'payinfo' => $payinfo } )
+ || qsearch('cust_pay', { %hash, 'paymask' => $self->mask_payinfo } )
+ ;
+
+ return 0;
+}
+
+=item upgrade_set_cardtype
+
+Find all records with a credit card payment type and no paycardtype, and
+replace them in order to set their paycardtype.
+
+=cut
+
+sub upgrade_set_cardtype {
+ my $class = shift;
+ # assign cardtypes to CARD/DCRDs that need them; check_payinfo_cardtype
+ # will do this. ignore any problems with the cards.
+ local $ignore_masked_payinfo = 1;
+ my $search = FS::Cursor->new({
+ table => $class->table,
+ extra_sql => q[ WHERE payby IN('CARD','DCRD') AND paycardtype IS NULL ],
+ });
+ while (my $record = $search->fetch) {
+ my $error = $record->replace;
+ die $error if $error;
+ }
+}
+