X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsvc_Tower_Mixin.pm;h=d6776791c5ef79faddf5a21e5cecc6190c60123b;hp=8caef6dc88b5063fd75a9f8ba3bdaa134ddc87ca;hb=ff27c3f36240aee48ed50153dd5d8fe3ac3f2443;hpb=fc2bc78541d1c8c0f1f0570b55e41ac032d03e65 diff --git a/FS/FS/svc_Tower_Mixin.pm b/FS/FS/svc_Tower_Mixin.pm index 8caef6dc8..d6776791c 100644 --- a/FS/FS/svc_Tower_Mixin.pm +++ b/FS/FS/svc_Tower_Mixin.pm @@ -1,17 +1,49 @@ package FS::svc_Tower_Mixin; use strict; -use FS::Record qw(qsearchs); #qsearch; -use FS::tower_sector; =item tower_sector +=item tower_sector_sql HASHREF + +Class method which returns a list of WHERE clause fragments to +search for services with tower/sector given by HASHREF. Can +contain 'towernum' and 'sectornum' keys, either of which can be +an arrayref or a single value. To use this, the search needs to +join to tower_sector. + +towernum or sectornum can also contain 'none' to allow null values. + =cut -sub tower_sector { - my $self = shift; - return '' unless $self->sectornum; - qsearchs('tower_sector', { sectornum => $self->sectornum }); +sub tower_sector_sql { + my( $class, $params ) = @_; + return () unless keys %$params; + + my @where = (); + for my $field (qw(towernum sectornum)) { + my $value = $params->{$field} or next; + if ( ref $value and grep { $_ } @$value ) { + my $in = join(',', map { /^(\d+)$/ ? $1 : () } @$value); + my @orwhere; + push @orwhere, "tower_sector.$field IN ($in)" if $in; + if ( grep /^none$/, @$value ) { + # then allow this field to be null + push @orwhere, "tower_sector.$field IS NULL"; + # and if this field is the sector, also allow the default sector + # on the tower + push @orwhere, "sectorname = '_default'" if $field eq 'sectornum'; + } + push @where, '( '.join(' OR ', @orwhere).' )'; + } + elsif ( $value =~ /^(\d+)$/ ) { + push @where, "tower_sector.$field = $1"; + } + elsif ( $value eq 'none' ) { + push @where, "tower_sector.$field IS NULL"; + } + } + @where; } 1;