X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fsvc_Common.pm;h=f7f0b4094bd38950e80da07ec720595831a32971;hb=fed12e8214a8a951377961ccbe7a09171b1e38c2;hp=7aede54a619157fefef4e2f81780a393e5d6085e;hpb=36a1e9c1661fb552d368f2f675dcb0793d733748;p=freeside.git diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm index 7aede54a6..f7f0b4094 100644 --- a/FS/FS/svc_Common.pm +++ b/FS/FS/svc_Common.pm @@ -43,27 +43,6 @@ inherit from, i.e. FS::svc_acct. FS::svc_Common inherits from FS::Record. =over 4 -=item search_sql_field FIELD STRING - -Class method which returns an SQL fragment to search for STRING in FIELD. - -It is now case-insensitive by default. - -=cut - -sub search_sql_field { - my( $class, $field, $string ) = @_; - my $table = $class->table; - my $q_string = dbh->quote($string); - "LOWER($table.$field) = LOWER($q_string)"; -} - -#fallback for services that don't provide a search... -sub search_sql { - #my( $class, $string ) = @_; - '1 = 0'; #false -} - =item new =cut @@ -1082,17 +1061,22 @@ otherwise returns false. =cut -sub export_setstatus { - my( $self, @args ) = @_; - my $error = $self->export('setstatus', @args); +sub export_setstatus { shift->_export_setstatus_X('setstatus', @_) } +sub export_setstatus_listadd { shift->_export_setstatus_X('setstatus_listadd', @_) } +sub export_setstatus_listdel { shift->_export_setstatus_X('setstatus_listdel', @_) } +sub export_setstatus_vacationadd { shift->_export_setstatus_X('setstatus_vacationadd', @_) } +sub export_setstatus_vacationdel { shift->_export_setstatus_X('setstatus_vacationdel', @_) } + +sub _export_setstatus_X { + my( $self, $method, @args ) = @_; + my $error = $self->export($method, @args); if ( $error ) { - warn "error running export_setstatus: $error"; + warn "error running export_$method: $error"; return $error; } ''; } - =item export HOOK [ EXPORT_ARGS ] Runs the provided export hook (i.e. "suspend", "unsuspend") for this service. @@ -1277,6 +1261,195 @@ sub nms_ip_delete { #XXX not yet implemented } +=item search_sql_field FIELD STRING + +Class method which returns an SQL fragment to search for STRING in FIELD. + +It is now case-insensitive by default. + +=cut + +sub search_sql_field { + my( $class, $field, $string ) = @_; + my $table = $class->table; + my $q_string = dbh->quote($string); + "LOWER($table.$field) = LOWER($q_string)"; +} + +#fallback for services that don't provide a search... +sub search_sql { + #my( $class, $string ) = @_; + '1 = 0'; #false +} + +=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 + +# based on FS::svc_acct::search, both that and svc_broadband::search should +# eventually use this instead +sub search { + my ($class, $params) = @_; + + my @from = ( + 'LEFT JOIN cust_svc USING ( svcnum )', + 'LEFT JOIN part_svc USING ( svcpart )', + 'LEFT JOIN cust_pkg USING ( pkgnum )', + FS::UI::Web::join_cust_main('cust_pkg', 'cust_pkg'), + ); + + my @where = (); + +# # domain +# if ( $params->{'domain'} ) { +# my $svc_domain = qsearchs('svc_domain', { 'domain'=>$params->{'domain'} } ); +# #preserve previous behavior & bubble up an error if $svc_domain not found? +# push @where, 'domsvc = '. $svc_domain->svcnum if $svc_domain; +# } +# +# # domsvc +# if ( $params->{'domsvc'} =~ /^(\d+)$/ ) { +# push @where, "domsvc = $1"; +# } + + #unlinked + push @where, 'pkgnum IS NULL' if $params->{'unlinked'}; + + #agentnum + if ( $params->{'agentnum'} =~ /^(\d+)$/ && $1 ) { + push @where, "cust_main.agentnum = $1"; + } + + #custnum + if ( $params->{'custnum'} =~ /^(\d+)$/ && $1 ) { + push @where, "custnum = $1"; + } + + #customer status + if ( $params->{'cust_status'} =~ /^([a-z]+)$/ ) { + push @where, FS::cust_main->cust_status_sql . " = '$1'"; + } + + #customer balance + if ( $params->{'balance'} =~ /^\s*(\-?\d*(\.\d{1,2})?)\s*$/ && length($1) ) { + my $balance = $1; + + my $age = ''; + if ( $params->{'balance_days'} =~ /^\s*(\d*(\.\d{1,3})?)\s*$/ && length($1) ) { + $age = time - 86400 * $1; + } + push @where, FS::cust_main->balance_date_sql($age) . " > $balance"; + } + + #payby + if ( $params->{'payby'} && scalar(@{ $params->{'payby'} }) ) { + my @payby = map "'$_'", grep /^(\w+)$/, @{ $params->{'payby'} }; + push @where, 'payby IN ('. join(',', @payby ). ')'; + } + + #pkgpart + if ( $params->{'pkgpart'} && scalar(@{ $params->{'pkgpart'} }) ) { + my @pkgpart = grep /^(\d+)$/, @{ $params->{'pkgpart'} }; + push @where, 'cust_pkg.pkgpart IN ('. join(',', @pkgpart ). ')'; + } + + # svcpart + if ( $params->{'svcpart'} && scalar(@{ $params->{'svcpart'} }) ) { + my @svcpart = grep /^(\d+)$/, @{ $params->{'svcpart'} }; + push @where, 'svcpart IN ('. join(',', @svcpart ). ')'; + } + + if ( $params->{'exportnum'} =~ /^(\d+)$/ ) { + push @from, ' LEFT JOIN export_svc USING ( svcpart )'; + push @where, "exportnum = $1"; + } + +# # sector and tower +# my @where_sector = $class->tower_sector_sql($params); +# if ( @where_sector ) { +# push @where, @where_sector; +# push @from, ' LEFT JOIN tower_sector USING ( sectornum )'; +# } + + # here is the agent virtualization + #if ($params->{CurrentUser}) { + # my $access_user = + # qsearchs('access_user', { username => $params->{CurrentUser} }); + # + # if ($access_user) { + # push @where, $access_user->agentnums_sql('table'=>'cust_main'); + # }else{ + # push @where, "1=0"; + # } + #} else { + push @where, $FS::CurrentUser::CurrentUser->agentnums_sql( + 'table' => 'cust_main', + 'null_right' => 'View/link unlinked services', + ); + #} + + push @where, @{ $params->{'where'} } if $params->{'where'}; + + my $addl_from = join(' ', @from); + my $extra_sql = scalar(@where) ? ' WHERE '. join(' AND ', @where) : ''; + + my $table = $class->table; + + my $count_query = "SELECT COUNT(*) FROM $table $addl_from $extra_sql"; + #if ( keys %svc_X ) { + # $count_query .= ' WHERE '. + # join(' AND ', map "$_ = ". dbh->quote($svc_X{$_}), + # keys %svc_X + # ); + #} + + { + 'table' => $table, + 'hashref' => {}, + 'select' => join(', ', + "$table.*", + 'part_svc.svc', + 'cust_main.custnum', + @{ $params->{'addl_select'} || [] }, + FS::UI::Web::cust_sql_fields($params->{'cust_fields'}), + ), + 'addl_from' => $addl_from, + 'extra_sql' => $extra_sql, + 'order_by' => $params->{'order_by'}, + 'count_query' => $count_query, + }; + +} + =back =head1 BUGS