X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsvc_pbx.pm;h=a5e181d9d321442349126cbe2bdcbdaf337e3e2e;hp=f8b96050d8c6e113209f8177a4eebc15e68a2d4a;hb=8f1500df332a86f1abe55a046778e42b21459430;hpb=a5fba19707ec1a01db18fa55862e742170feccdf diff --git a/FS/FS/svc_pbx.pm b/FS/FS/svc_pbx.pm index f8b96050d..a5e181d9d 100644 --- a/FS/FS/svc_pbx.pm +++ b/FS/FS/svc_pbx.pm @@ -1,8 +1,10 @@ package FS::svc_pbx; +use base qw( FS::o2m_Common FS::device_Common FS::svc_External_Common ); use strict; -use base qw( FS::svc_External_Common ); +use Tie::IxHash; use FS::Record qw( qsearch qsearchs dbh ); +use FS::PagedSearch qw( psearch ); use FS::Conf; use FS::cust_svc; use FS::svc_phone; @@ -60,6 +62,11 @@ Maximum number of extensions Maximum number of simultaneous users +=item ip_addr + +The IP address of this PBX, if that's relevant. This must be a valid IP +address (or blank), but it's not checked for block assignment or uniqueness. + =back =head1 METHODS @@ -79,6 +86,17 @@ points to. You can ask the object for a copy with the I method. sub table { 'svc_pbx'; } sub table_info { + + tie my %fields, 'Tie::IxHash', + 'svcnum' => 'PBX', + 'id' => 'PBX/Tenant ID', + 'uuid' => 'External UUID', + 'title' => 'Name', + 'max_extensions' => 'Maximum number of User Extensions', + 'max_simultaneous' => 'Maximum number of simultaneous users', + 'ip_addr' => 'IP address', + ; + { 'name' => 'PBX', 'name_plural' => 'PBXs', @@ -87,12 +105,7 @@ sub table_info { 'sorts' => 'svcnum', # optional sort field (or arrayref of sort fields, main first) 'display_weight' => 70, 'cancel_weight' => 90, - 'fields' => { - 'id' => 'ID', - 'title' => 'Name', - 'max_extensions' => 'Maximum number of User Extensions', - 'max_simultaneous' => 'Maximum number of simultaneous users', - }, + 'fields' => \%fields, }; } @@ -128,18 +141,6 @@ otherwise returns false. The additional fields pkgnum and svcpart (see L) should be defined. An FS::cust_svc record will be created and inserted. -=cut - -sub insert { - my $self = shift; - my $error; - - $error = $self->SUPER::insert; - return $error if $error; - - ''; -} - =item delete Delete this record from the database. @@ -193,18 +194,6 @@ sub delete { Replaces the OLD_RECORD with this one in the database. If there is an error, returns the error, otherwise returns false. -=cut - -#sub replace { -# my ( $new, $old ) = ( shift, shift ); -# my $error; -# -# $error = $new->SUPER::replace($old); -# return $error if $error; -# -# ''; -#} - =item suspend Called by the suspend method of FS::cust_pkg (see L). @@ -231,9 +220,10 @@ sub check { my $x = $self->setfixed; return $x unless ref($x); my $part_svc = $x; - - - $self->SUPER::check; + + return + $self->ut_ipn('ip_addr') + || $self->SUPER::check; } sub _check_duplicate { @@ -259,11 +249,13 @@ sub _check_duplicate { return ''; } -=item get_cdrs +=item psearch_cdrs OPTIONS -Returns a set of Call Detail Records (see L) associated with this -service. By default, "associated with" means that the "charged_party" field of -the CDR matches the "title" field of the service. +Returns a paged search (L) for Call Detail Records +associated with this service. By default, "associated with" means that +the "charged_party" field of the CDR matches the "title" field of the +service. To access the CDRs themselves, call "->fetch" on the resulting +object. =over 2 @@ -289,13 +281,15 @@ to allow title to indicate a range of IP addresses. =item begin, end: Start and end of date range, as unix timestamp. -=item cdrtypenum: Only return CDRs with this type number. +=item cdrtypenum: Only return CDRs with this type. + +=item calltypenum: Only return CDRs with this call type. =back =cut -sub get_cdrs { +sub psearch_cdrs { my($self, %options) = @_; my %hash = (); my @where = (); @@ -307,6 +301,9 @@ sub get_cdrs { if ($options{'cdrtypenum'}) { $hash{'cdrtypenum'} = $options{'cdrtypenum'}; } + if ($options{'calltypenum'}) { + $hash{'calltypenum'} = $options{'calltypenum'}; + } my $for_update = $options{'for_update'} ? 'FOR UPDATE' : ''; @@ -343,15 +340,51 @@ sub get_cdrs { my $extra_sql = ( keys(%hash) ? ' AND ' : ' WHERE ' ). join(' AND ', @where ) if @where; - my @cdrs = - qsearch( { + psearch( { 'table' => 'cdr', 'hashref' => \%hash, 'extra_sql' => $extra_sql, 'order_by' => "ORDER BY startdate $for_update", - } ); + } ); +} + +=item get_cdrs (DEPRECATED) + +Like psearch_cdrs, but returns all the L objects at once, in a +single list. Arguments are the same as for psearch_cdrs. This can take +an unreasonably large amount of memory and is best avoided. + +=cut + +sub get_cdrs { + my $self = shift; + my $psearch = $self->psearch_cdrs($_); + qsearch ( $psearch->{query} ) +} + +=item sum_cdrs + +Takes the same options as psearch_cdrs, but returns a single row containing +"count" (the number of CDRs) and the sums of the following fields: duration, +billsec, rated_price, rated_seconds, rated_minutes. - @cdrs; +Note that if any calls are not rated, their rated_* fields will be null. +If you want to use those fields, pass the 'status' option to limit to +calls that have been rated. This is intentional; please don't "fix" it. + +=cut + +sub sum_cdrs { + my $self = shift; + my $psearch = $self->psearch_cdrs(@_); + $psearch->{query}->{'select'} = join(',', + 'COUNT(*) AS count', + map { "SUM($_) AS $_" } + qw(duration billsec rated_price rated_seconds rated_minutes) + ); + # hack + $psearch->{query}->{'extra_sql'} =~ s/ ORDER BY.*$//; + qsearchs ( $psearch->{query} ); } =back