Merge branch 'master' of git.freeside.biz:/home/git/freeside
[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, $params ) = @_;
31   return () unless keys %$params;
32
33   my @where;
34   for my $field (qw(towernum sectornum)) {
35     my $value = $params->{$field} or next;
36     if ( ref $value and grep { $_ } @$value ) {
37       my $in = join(',', map { /^(\d+)$/ ? $1 : () } @$value);
38       my @orwhere;
39       push @orwhere, "tower_sector.$field IN ($in)" if $in;
40       push @orwhere, "tower_sector.$field IS NULL" if grep /^none$/, @$value;
41       push @where, '( '.join(' OR ', @orwhere).' )';
42     }
43     elsif ( $value =~ /^(\d+)$/ ) {
44       push @where, "tower_sector.$field = $1";
45     }
46     elsif ( $value eq 'none' ) {
47       push @where, "tower_sector.$field IS NULL";
48     }
49   }
50   @where;
51 }
52
53 1;