5 use FS::Record qw( dbh qsearch qsearchs );
9 @ISA = qw( FS::Record );
13 FS::agent - Object methods for agent records
19 $record = new FS::agent \%hash;
20 $record = new FS::agent { 'column' => 'value' };
22 $error = $record->insert;
24 $error = $new_record->replace($old_record);
26 $error = $record->delete;
28 $error = $record->check;
30 $agent_type = $record->agent_type;
32 $hashref = $record->pkgpart_hashref;
33 #may purchase $pkgpart if $hashref->{$pkgpart};
37 An FS::agent object represents an agent. Every customer has an agent. Agents
38 can be used to track things like resellers or salespeople. FS::agent inherits
39 from FS::Record. The following fields are currently supported:
43 =item agentnum - primary key (assigned automatically for new agents)
45 =item agent - Text name of this agent
47 =item typenum - Agent type. See L<FS::agent_type>
49 =item prog - For future use.
51 =item freq - For future use.
53 =item disabled - Disabled flag, empty or 'Y'
55 =item username - Username for the Agent interface
57 =item _password - Password for the Agent interface
67 Creates a new agent. To add the agent to the database, see L<"insert">.
71 sub table { 'agent'; }
75 Adds this agent to the database. If there is an error, returns the error,
76 otherwise returns false.
80 Deletes this agent from the database. Only agents with no customers can be
81 deleted. If there is an error, returns the error, otherwise returns false.
88 return "Can't delete an agent with customers!"
89 if qsearch( 'cust_main', { 'agentnum' => $self->agentnum } );
94 =item replace OLD_RECORD
96 Replaces OLD_RECORD with this one in the database. If there is an error,
97 returns the error, otherwise returns false.
101 Checks all fields to make sure this is a valid agent. If there is an error,
102 returns the error, otherwise returns false. Called by the insert and replace
111 $self->ut_numbern('agentnum')
112 || $self->ut_text('agent')
113 || $self->ut_number('typenum')
114 || $self->ut_numbern('freq')
115 || $self->ut_textn('prog')
117 return $error if $error;
119 if ( $self->dbdef_table->column('disabled') ) {
120 $error = $self->ut_enum('disabled', [ '', 'Y' ] );
121 return $error if $error;
124 if ( $self->dbdef_table->column('username') ) {
125 $error = $self->ut_alphan('username');
126 return $error if $error;
127 if ( length($self->username) ) {
128 my $conflict = qsearchs('agent', { 'username' => $self->username } );
129 return 'duplicate agent username (with '. $conflict->agent. ')'
130 if $conflict && $conflict->agentnum != $self->agentnum;
131 $error = $self->ut_text('password'); # ut_text... arbitrary choice
133 $self->_password('');
137 return "Unknown typenum!"
138 unless $self->agent_type;
145 Returns the FS::agent_type object (see L<FS::agent_type>) for this agent.
151 qsearchs( 'agent_type', { 'typenum' => $self->typenum } );
154 =item pkgpart_hashref
156 Returns a hash reference. The keys of the hash are pkgparts. The value is
157 true if this agent may purchase the specified package definition. See
162 sub pkgpart_hashref {
164 $self->agent_type->pkgpart_hashref;
167 =item num_prospect_cust_main
169 Returns the number of prospects (customers with no packages ever ordered) for
174 sub num_prospect_cust_main {
175 shift->num_sql(FS::cust_main->prospect_sql);
179 my( $self, $sql ) = @_;
180 my $sth = dbh->prepare(
181 "SELECT COUNT(*) FROM cust_main WHERE agentnum = ? AND $sql"
182 ) or die dbh->errstr;
183 $sth->execute($self->agentnum) or die $sth->errstr;
184 $sth->fetchrow_arrayref->[0];
187 =item prospect_cust_main
189 Returns the prospects (customers with no packages ever ordered) for this agent,
190 as cust_main objects.
194 sub prospect_cust_main {
195 shift->cust_main_sql(FS::cust_main->prospect_sql);
199 my( $self, $sql ) = @_;
200 qsearch( 'cust_main',
201 { 'agentnum' => $self->agentnum },
207 =item num_active_cust_main
209 Returns the number of active customers for this agent.
213 sub num_active_cust_main {
214 shift->num_sql(FS::cust_main->active_sql);
217 =item active_cust_main
219 Returns the active customers for this agent, as cust_main objects.
223 sub active_cust_main {
224 shift->cust_main_sql(FS::cust_main->active_sql);
227 =item num_susp_cust_main
229 Returns the number of suspended customers for this agent.
233 sub num_susp_cust_main {
234 shift->num_sql(FS::cust_main->susp_sql);
239 Returns the suspended customers for this agent, as cust_main objects.
244 shift->cust_main_sql(FS::cust_main->susp_sql);
247 =item num_cancel_cust_main
249 Returns the number of cancelled customer for this agent.
253 sub num_cancel_cust_main {
254 shift->num_sql(FS::cust_main->cancel_sql);
257 =item cancel_cust_main
259 Returns the cancelled customers for this agent, as cust_main objects.
263 sub cancel_cust_main {
264 shift->cust_main_sql(FS::cust_main->cancel_sql);
273 L<FS::Record>, L<FS::agent_type>, L<FS::cust_main>, L<FS::part_pkg>,
274 schema.html from the base documentation.