search services by tower/sector, #15950
[freeside.git] / FS / FS / svc_Tower_Mixin.pm
1 package FS::svc_Tower_Mixin;
2
3 use strict;
4 use FS::Record qw(qsearchs); #qsearch;
5 use FS::tower_sector;
6
7 =item tower_sector
8
9 =cut
10
11 sub tower_sector {
12   my $self = shift;
13   return '' unless $self->sectornum;
14   qsearchs('tower_sector', { sectornum => $self->sectornum });
15 }
16
17 =item tower_sector_sql HASHREF
18
19 Class method which returns a list of WHERE clause fragments to 
20 search for services with tower/sector given by HASHREF.  Can 
21 contain 'towernum' and 'sectornum' keys, either of which can be 
22 an arrayref or a single value.  To use this, the search needs to
23 join to tower_sector.
24
25 towernum or sectornum can also contain 'none' to allow null values.
26
27 =cut
28
29 sub tower_sector_sql {
30   my $class = shift;
31   my $params = shift;
32   return '' unless keys %$params;
33   my $where = '';
34
35   my @where;
36   for my $field (qw(towernum sectornum)) {
37     my $value = $params->{$field} or next;
38     if ( ref $value and grep { $_ } @$value ) {
39       my $in = join(',', map { /^(\d+)$/ ? $1 : () } @$value);
40       my @orwhere;
41       push @orwhere, "tower_sector.$field IN ($in)" if $in;
42       push @orwhere, "tower_sector.$field IS NULL" if grep /^none$/, @$value;
43       push @where, '( '.join(' OR ', @orwhere).' )';
44     }
45     elsif ( $value =~ /^(\d+)$/ ) {
46       push @where, "tower_sector.$field = $1";
47     }
48     elsif ( $value eq 'none' ) {
49       push @where, "tower_sector.$field IS NULL";
50     }
51   }
52   @where;
53 }
54
55
56 1;