X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fagent.pm;h=fc1d1a93e414fcc41f17f7a5cfee3635f9d3e2e9;hp=1afe7064117a21dee75e5b9dbd88dad7ad60712e;hb=b5fbaadb1cb2893660e460a1d4a3cabe02774de7;hpb=9951dac925264910d664b50d2fc33cf3dc1c734e diff --git a/FS/FS/agent.pm b/FS/FS/agent.pm index 1afe70641..fc1d1a93e 100644 --- a/FS/FS/agent.pm +++ b/FS/FS/agent.pm @@ -2,9 +2,11 @@ package FS::agent; use strict; use vars qw( @ISA ); -use FS::Record qw( qsearch qsearchs ); +use FS::Record qw( dbh qsearch qsearchs ); use FS::cust_main; use FS::agent_type; +use FS::reg_code; +#use Crypt::YAPassGen; @ISA = qw( FS::Record ); @@ -40,7 +42,7 @@ from FS::Record. The following fields are currently supported: =over 4 -=item agemtnum - primary key (assigned automatically for new agents) +=item agentnum - primary key (assigned automatically for new agents) =item agent - Text name of this agent @@ -50,6 +52,12 @@ from FS::Record. The following fields are currently supported: =item freq - For future use. +=item disabled - Disabled flag, empty or 'Y' + +=item username - Username for the Agent interface + +=item _password - Password for the Agent interface + =back =head1 METHODS @@ -110,11 +118,28 @@ sub check { ; return $error if $error; + if ( $self->dbdef_table->column('disabled') ) { + $error = $self->ut_enum('disabled', [ '', 'Y' ] ); + return $error if $error; + } + + if ( $self->dbdef_table->column('username') ) { + $error = $self->ut_alphan('username'); + return $error if $error; + if ( length($self->username) ) { + my $conflict = qsearchs('agent', { 'username' => $self->username } ); + return 'duplicate agent username (with '. $conflict->agent. ')' + if $conflict && $conflict->agentnum != $self->agentnum; + $error = $self->ut_text('password'); # ut_text... arbitrary choice + } else { + $self->_password(''); + } + } + return "Unknown typenum!" unless $self->agent_type; - ''; - + $self->SUPER::check; } =item agent_type @@ -141,11 +166,183 @@ sub pkgpart_hashref { $self->agent_type->pkgpart_hashref; } -=back +=item num_prospect_cust_main + +Returns the number of prospects (customers with no packages ever ordered) for +this agent. + +=cut + +sub num_prospect_cust_main { + shift->num_sql(FS::cust_main->prospect_sql); +} + +sub num_sql { + my( $self, $sql ) = @_; + my $sth = dbh->prepare( + "SELECT COUNT(*) FROM cust_main WHERE agentnum = ? AND $sql" + ) or die dbh->errstr; + $sth->execute($self->agentnum) or die $sth->errstr; + $sth->fetchrow_arrayref->[0]; +} + +=item prospect_cust_main + +Returns the prospects (customers with no packages ever ordered) for this agent, +as cust_main objects. + +=cut + +sub prospect_cust_main { + shift->cust_main_sql(FS::cust_main->prospect_sql); +} + +sub cust_main_sql { + my( $self, $sql ) = @_; + qsearch( 'cust_main', + { 'agentnum' => $self->agentnum }, + '', + " AND $sql" + ); +} + +=item num_active_cust_main + +Returns the number of active customers for this agent. + +=cut + +sub num_active_cust_main { + shift->num_sql(FS::cust_main->active_sql); +} + +=item active_cust_main + +Returns the active customers for this agent, as cust_main objects. + +=cut + +sub active_cust_main { + shift->cust_main_sql(FS::cust_main->active_sql); +} + +=item num_susp_cust_main + +Returns the number of suspended customers for this agent. + +=cut + +sub num_susp_cust_main { + shift->num_sql(FS::cust_main->susp_sql); +} + +=item susp_cust_main -=head1 VERSION +Returns the suspended customers for this agent, as cust_main objects. -$Id: agent.pm,v 1.2 2000-12-03 13:45:15 ivan Exp $ +=cut + +sub susp_cust_main { + shift->cust_main_sql(FS::cust_main->susp_sql); +} + +=item num_cancel_cust_main + +Returns the number of cancelled customer for this agent. + +=cut + +sub num_cancel_cust_main { + shift->num_sql(FS::cust_main->cancel_sql); +} + +=item cancel_cust_main + +Returns the cancelled customers for this agent, as cust_main objects. + +=cut + +sub cancel_cust_main { + shift->cust_main_sql(FS::cust_main->cancel_sql); +} + +=item generate_reg_codes NUM PKGPART_ARRAYREF + +Generates the specified number of registration codes, allowing purchase of the +specified package definitions. Returns an array reference of the newly +generated codes, or a scalar error message. + +=cut + +#false laziness w/prepay_credit::generate +sub generate_reg_codes { + my( $self, $num, $pkgparts ) = @_; + + my @codeset = ( 'A'..'Z' ); + + 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 @codes = (); + for ( 1 ... $num ) { + my $reg_code = new FS::reg_code { + 'agentnum' => $self->agentnum, + 'code' => join('', map($codeset[int(rand $#codeset)], (0..7) ) ), + }; + my $error = $reg_code->insert($pkgparts); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + push @codes, $reg_code->code; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + \@codes; + +} + +=item num_reg_code + +Returns the number of unused registration codes for this agent. + +=cut + +sub num_reg_code { + my $self = shift; + my $sth = dbh->prepare( + "SELECT COUNT(*) FROM reg_code WHERE agentnum = ?" + ) or die dbh->errstr; + $sth->execute($self->agentnum) or die $sth->errstr; + $sth->fetchrow_arrayref->[0]; +} + +=item num_prepay_credit + +Returns the number of unused prepaid cards for this agent. + +=cut + +sub num_prepay_credit { + my $self = shift; + my $sth = dbh->prepare( + "SELECT COUNT(*) FROM prepay_credit WHERE agentnum = ?" + ) or die dbh->errstr; + $sth->execute($self->agentnum) or die $sth->errstr; + $sth->fetchrow_arrayref->[0]; +} + + +=back =head1 BUGS