+sub table_dupcheck_fields { ( 'ip_addr', 'mac_addr' ); }
+
+=item search HASHREF
+
+Class method which returns a qsearch hash expression to search for parameters
+specified in HASHREF.
+
+Parameters:
+
+=over 4
+
+=item unlinked - set to search for all unlinked services. Overrides all other options.
+
+=item agentnum
+
+=item custnum
+
+=item svcpart
+
+=item ip_addr
+
+=item pkgpart - arrayref
+
+=item routernum - arrayref
+
+=item sectornum - arrayref
+
+=item towernum - arrayref
+
+=item order_by
+
+=back
+
+=cut
+
+sub _search_svc {
+ my( $class, $params, $from, $where ) = @_;
+
+ #routernum, can be arrayref
+ for my $routernum ( $params->{'routernum'} ) {
+ # this no longer uses addr_block
+ if ( ref $routernum and grep { $_ } @$routernum ) {
+ my $in = join(',', map { /^(\d+)$/ ? $1 : () } @$routernum );
+ my @orwhere = ();
+ push @orwhere, "svc_broadband.routernum IN ($in)" if $in;
+ push @orwhere, "svc_broadband.routernum IS NULL"
+ if grep /^none$/, @$routernum;
+ push @$where, '( '.join(' OR ', @orwhere).' )';
+ }
+ elsif ( $routernum =~ /^(\d+)$/ ) {
+ push @$where, "svc_broadband.routernum = $1";
+ }
+ elsif ( $routernum eq 'none' ) {
+ push @$where, "svc_broadband.routernum IS NULL";
+ }
+ }
+
+ #this should probably move to svc_Tower_Mixin, or maybe we never should have
+ # done svc_acct # towers (or, as mark thought, never should have done
+ # svc_broadband)
+
+ #sector and tower, as above
+ my @where_sector = $class->tower_sector_sql($params);
+ if ( @where_sector ) {
+ push @$where, @where_sector;
+ push @$from, 'LEFT JOIN tower_sector USING ( sectornum )';
+ }
+
+ #ip_addr
+ if ( $params->{'ip_addr'} =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ ) {
+ push @$where, "ip_addr = '$1'";
+ }
+
+}
+
+=item search_sql STRING
+
+Class method which returns an SQL fragment to search for the given string.
+
+=cut
+
+sub search_sql {
+ my( $class, $string ) = @_;
+ if ( $string =~ /^(\d{1,3}\.){3}\d{1,3}$/ ) {
+ $class->search_sql_field('ip_addr', $string );
+ } elsif ( $string =~ /^([A-F0-9]{12})$/i ) {
+ $class->search_sql_field('mac_addr', uc($string));
+ } elsif ( $string =~ /^(([A-F0-9]{2}:){5}([A-F0-9]{2}))$/i ) {
+ $string =~ s/://g;
+ $class->search_sql_field('mac_addr', uc($string) );
+ } elsif ( $string =~ /^(\d+)$/ ) {
+ my $table = $class->table;
+ "$table.svcnum = $1";
+ } else {
+ '1 = 0'; #false
+ }
+}
+
+=item smart_search STRING
+
+=cut
+
+sub smart_search {
+ my( $class, $string ) = @_;
+ qsearch({
+ 'table' => $class->table, #'svc_broadband',
+ 'hashref' => {},
+ 'extra_sql' => 'WHERE '. $class->search_sql($string),
+ });
+}
+
+=item label
+
+Returns the IP address, MAC address and description.
+
+=cut
+
+sub label {
+ my $self = shift;
+ my $label = 'IP:'. ($self->ip_addr || 'Unknown');
+ $label .= ', MAC:'. $self->mac_addr
+ if $self->mac_addr;
+ $label .= ' ('. $self->description. ')'
+ if $self->description;
+ return $label;
+}
+
+=item insert [ , OPTION => VALUE ... ]