1 package FS::svc_forward;
6 use FS::Record qw( fields qsearch qsearchs dbh );
12 @ISA = qw( FS::svc_Common );
16 FS::svc_forward - Object methods for svc_forward records
22 $record = new FS::svc_forward \%hash;
23 $record = new FS::svc_forward { 'column' => 'value' };
25 $error = $record->insert;
27 $error = $new_record->replace($old_record);
29 $error = $record->delete;
31 $error = $record->check;
33 $error = $record->suspend;
35 $error = $record->unsuspend;
37 $error = $record->cancel;
41 An FS::svc_forward object represents a mail forwarding alias. FS::svc_forward
42 inherits from FS::Record. The following fields are currently supported:
46 =item svcnum - primary key (assigned automatcially for new accounts)
48 =item srcsvc - svcnum of the source of the forward (see L<FS::svc_acct>)
50 =item src - literal source (username or full email address)
52 =item dstsvc - svcnum of the destination of the forward (see L<FS::svc_acct>)
54 =item dst - literal destination (username or full email address)
64 Creates a new mail forwarding alias. To add the mail forwarding alias to the
65 database, see L<"insert">.
73 'name_plural' => 'Mail forwards',
74 'display_weight' => 30,
75 'cancel_weight' => 30,
77 'srcsvc' => 'service from which mail is to be forwarded',
78 'dstsvc' => 'service to which mail is to be forwarded',
79 'dst' => 'someone@another.domain.com to use when dstsvc is 0',
84 sub table { 'svc_forward'; }
86 =item search_sql STRING
88 Class method which returns an SQL fragment to search for the given string.
93 my( $class, $string ) = @_;
94 $class->search_sql_field('src', $string);
97 =item label [ END_TIMESTAMP [ START_TIMESTAMP ] ]
99 Returns a text string representing this forward.
101 END_TIMESTAMP and START_TIMESTAMP can optionally be passed when dealing with
110 if ( $self->srcsvc ) {
111 my $svc_acct = $self->srcsvc_acct(@_);
112 $tag = $svc_acct->email(@_);
119 if ( $self->dstsvc ) {
120 my $svc_acct = $self->dstsvc_acct(@_);
121 $tag .= $svc_acct->email(@_);
130 =item insert [ , OPTION => VALUE ... ]
132 Adds this mail forwarding alias to the database. If there is an error, returns
133 the error, otherwise returns false.
135 The additional fields pkgnum and svcpart (see L<FS::cust_svc>) should be
136 defined. An FS::cust_svc record will be created and inserted.
138 Currently available options are: I<depend_jobnum>
140 If I<depend_jobnum> is set (to a scalar jobnum or an array reference of
141 jobnums), all provisioning jobs will have a dependancy on the supplied
142 jobnum(s) (they will not run until the specific job(s) complete(s)).
146 Deletes this mail forwarding alias from the database. If there is an error,
147 returns the error, otherwise returns false.
149 The corresponding FS::cust_svc record will be deleted as well.
151 =item replace OLD_RECORD
153 Replaces OLD_RECORD with this one in the database. If there is an error,
154 returns the error, otherwise returns false.
159 my ( $new, $old ) = ( shift, shift );
161 if ( $new->srcsvc != $old->srcsvc
162 && ( $new->dstsvc != $old->dstsvc
163 || ! $new->dstsvc && $new->dst ne $old->dst
166 return "Can't change both source and destination of a mail forward!"
169 $new->SUPER::replace($old, @_);
174 Just returns false (no error) for now.
176 Called by the suspend method of FS::cust_pkg (see L<FS::cust_pkg>).
180 Just returns false (no error) for now.
182 Called by the unsuspend method of FS::cust_pkg (see L<FS::cust_pkg>).
186 Just returns false (no error) for now.
188 Called by the cancel method of FS::cust_pkg (see L<FS::cust_pkg>).
192 Checks all fields to make sure this is a valid mail forwarding alias. If there
193 is an error, returns the error, otherwise returns false. Called by the insert
196 Sets any fixed values; see L<FS::part_svc>.
203 my $x = $self->setfixed;
204 return $x unless ref($x);
207 my $error = $self->ut_numbern('svcnum')
208 || $self->ut_numbern('srcsvc')
209 || $self->ut_numbern('dstsvc')
211 return $error if $error;
213 return "Both srcsvc and src were defined; only one can be specified"
214 if $self->srcsvc && $self->src;
216 return "one of srcsvc or src is required"
217 unless $self->srcsvc || $self->src;
219 return "Unknown srcsvc: ". $self->srcsvc
220 unless ! $self->srcsvc || $self->srcsvc_acct;
222 return "Both dstsvc and dst were defined; only one can be specified"
223 if $self->dstsvc && $self->dst;
225 return "one of dstsvc or dst is required"
226 unless $self->dstsvc || $self->dst;
228 return "Unknown dstsvc: ". $self->dstsvc
229 unless ! $self->dstsvc || $self->dstsvc_acct;
230 #return "Unknown dstsvc"
231 # unless qsearchs('svc_acct', { 'svcnum' => $self->dstsvc } )
232 # || ! $self->dstsvc;
235 $self->src =~ /^([\w\.\-\&]*)(\@([\w\-]+\.)+\w+)$/
236 or return "Illegal src: ". $self->src;
243 my $conf = new FS::Conf;
244 if ( $conf->exists('svc_forward-arbitrary_dst') ) {
245 my $error = $self->ut_textn('dst');
246 return $error if $error;
248 $self->dst =~ /^([\w\.\-\&]*)(\@([\w\-]+\.)+\w+)$/
249 or return "Illegal dst: ". $self->dst;
261 Returns the FS::svc_acct object referenced by the srcsvc column, or false for
262 literally specified forwards.
268 qsearchs('svc_acct', { 'svcnum' => $self->srcsvc } );
273 Returns the FS::svc_acct object referenced by the srcsvc column, or false for
274 literally specified forwards.
280 qsearchs('svc_acct', { 'svcnum' => $self->dstsvc } );
285 Returns the email address to be forwarded regardless of weither it is local
293 if ($self->srcsvc eq '0'){
296 my $svc_acct = $self->srcsvc_acct;
297 return $svc_acct->email;
302 Returns the email address which gets forwarded to regardless of weither it is local
310 if ($self->dstsvc eq '0'){
313 my $svc_acct = $self->dstsvc_acct;
314 return $svc_acct->email;
317 =item srcsvc_acct_domain
319 Returns the domain of the srcsvc_acct
323 sub srcsvc_acct_domain {
326 my $svc_acct = $self->srcsvc_acct;
327 return $svc_acct->domain;
337 L<FS::Record>, L<FS::Conf>, L<FS::cust_svc>, L<FS::part_svc>, L<FS::cust_pkg>,
338 L<FS::svc_acct>, L<FS::svc_domain>, schema.html from the base documentation.