X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fprepay_credit.pm;h=a0fd7f9a3a34d986826898ac566b8a5837128880;hp=7ed9b8344883f9d35fef0111f45692ce62163180;hb=f822e27a1e00594332ffa487a1c284234c5580a6;hpb=0ebeec96313dd7edfca340f01f8fbbbac1f4aa1d diff --git a/FS/FS/prepay_credit.pm b/FS/FS/prepay_credit.pm index 7ed9b8344..a0fd7f9a3 100644 --- a/FS/FS/prepay_credit.pm +++ b/FS/FS/prepay_credit.pm @@ -1,11 +1,12 @@ package FS::prepay_credit; +use base qw(FS::Record); use strict; -use vars qw( @ISA ); -#use FS::Record qw( qsearch qsearchs ); -use FS::Record qw(); +use vars qw( $DEBUG $me ); +use FS::Record qw(qsearchs dbh); -@ISA = qw(FS::Record); +$DEBUG = 0; +$me = '[FS::prepay_credit]'; =head1 NAME @@ -37,8 +38,8 @@ FS::prepay_credit - Object methods for prepay_credit records =head1 DESCRIPTION -An FS::table_name object represents an pre--paid credit, such as a pre-paid -"calling card". FS::prepay_credit inherits from FS::Record. The following +An FS::prepay_credit object represents a pre-paid card. FS::prepay_credit +inherits from FS::Record. The following fields are currently supported: =over 4 @@ -51,6 +52,8 @@ fields are currently supported: =item seconds - time amount of credit (see L) +=item agentnum - optional agent (see L) for this prepaid card + =back =head1 METHODS @@ -59,7 +62,7 @@ fields are currently supported: =item new HASHREF -Creates a new pre-paid credit. To add the example to the database, see +Creates a new pre-paid credit. To add the pre-paid credit to the database, see L<"insert">. Note that this stores the hash reference, not a distinct copy of the hash it @@ -107,13 +110,90 @@ sub check { $self->ut_numbern('prepaynum') || $self->ut_alpha('identifier') || $self->ut_money('amount') - || $self->utnumbern('seconds') + || $self->ut_numbern('seconds') + || $self->ut_numbern('upbytes') + || $self->ut_numbern('downbytes') + || $self->ut_numbern('totalbytes') + || $self->ut_foreign_keyn('agentnum', 'agent', 'agentnum') + || $self->SUPER::check ; } +=item agent + +Returns the agent (see L) for this prepaid card, if any. + =back +=head1 SUBROUTINES + +=over 4 + +=item generate NUM TYPE LENGTH HASHREF + +Generates the specified number of prepaid cards. Returns an array reference of +the newly generated card identifiers, or a scalar error message. + +=cut + +#false laziness w/agent::generate_reg_codes +sub generate { + my( $num, $type, $length, $hashref ) = @_; + + my @codeset = (); + push @codeset, ( 'A'..'Z' ) if $type =~ /alpha/; + push @codeset, ( '1'..'9' ) if $type =~ /numeric/; + $length ||= 8; + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $condup = 0; #don't retry forever + + my @cards = (); + for ( 1 ... $num ) { + + my $identifier = join('', map($codeset[int(rand $#codeset)], (1..$length) ) ); + + if ( qsearchs('prepay_credit',{identifier=>$identifier}) ) { + if ( $condup++ < 54 ) { + warn "$me generate: duplicate identifier $identifier; retrying\n" + if $DEBUG; + redo; + } else { + warn "$me generate: giving up after 54 tries" + if $DEBUG; + } + } + $condup = 0; + + my $prepay_credit = new FS::prepay_credit { + 'identifier' => $identifier, + %$hashref, + }; + my $error = $prepay_credit->check || $prepay_credit->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "(inserting prepay_credit) $error"; + } + push @cards, $prepay_credit->identifier; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + \@cards; + +} + =head1 BUGS =head1 SEE ALSO