diff options
author | ivan <ivan> | 2010-01-25 22:17:14 +0000 |
---|---|---|
committer | ivan <ivan> | 2010-01-25 22:17:14 +0000 |
commit | 9ad4f8407cc106ef5815e65bce2ee873cd0896c2 (patch) | |
tree | d4b8c2ab3df5369cb3aa5b64dc8774ec71c7933c /FS/FS | |
parent | 667cee1c0b352573f80663eae5be2de8ad8a93de (diff) |
linking DIDs and users to PBXes, RT#7051
Diffstat (limited to 'FS/FS')
-rw-r--r-- | FS/FS/Schema.pm | 8 | ||||
-rw-r--r-- | FS/FS/svc_Common.pm | 99 | ||||
-rw-r--r-- | FS/FS/svc_acct.pm | 76 | ||||
-rw-r--r-- | FS/FS/svc_pbx.pm | 16 | ||||
-rw-r--r-- | FS/FS/svc_phone.pm | 11 |
5 files changed, 189 insertions, 21 deletions
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 0ffc5bd..8d35c68 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -1586,14 +1586,15 @@ sub tables_hashref { 'downbytes_threshold', 'bigint', 'NULL', '', '', '', 'totalbytes','bigint', 'NULL', '', '', '', 'totalbytes_threshold', 'bigint', 'NULL', '', '', '', - 'domsvc', 'int', '', '', '', '', + 'domsvc', 'int', '', '', '', '', + 'pbxsvc', 'int', 'NULL', '', '', '', 'last_login', @date_type, '', '', 'last_logout', @date_type, '', '', ], 'primary_key' => 'svcnum', #'unique' => [ [ 'username', 'domsvc' ] ], 'unique' => [], - 'index' => [ ['username'], ['domsvc'] ], + 'index' => [ ['username'], ['domsvc'], ['pbxsvc'] ], }, 'acct_rt_transaction' => { @@ -2514,10 +2515,11 @@ sub tables_hashref { 'pin', 'varchar', 'NULL', $char_d, '', '', 'sip_password', 'varchar', 'NULL', $char_d, '', '', 'phone_name', 'varchar', 'NULL', $char_d, '', '', + 'pbxsvc', 'int', 'NULL', '', '', '', ], 'primary_key' => 'svcnum', 'unique' => [], - 'index' => [ [ 'countrycode', 'phonenum' ] ], + 'index' => [ [ 'countrycode', 'phonenum' ], ['pbxsvc'] ], }, 'phone_device' => { diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm index a67504a..9b2cf7b 100644 --- a/FS/FS/svc_Common.pm +++ b/FS/FS/svc_Common.pm @@ -586,6 +586,105 @@ sub part_svc { } +=item svc_pbx + +Returns the FS::svc_pbx record for this service, if any (see L<FS::svc_pbx>). + +Only makes sense if the service has a pbxsvc field (currently, svc_phone and +svc_acct). + +=cut + +# XXX FS::h_svc_{acct,phone} could have a history-aware svc_pbx override + +sub svc_pbx { + my $self = shift; + return '' unless $self->pbxsvc; + qsearchs( 'svc_pbx', { 'svcnum' => $self->pbxsvc } ); +} + +=item pbx_title + +Returns the title of the FS::svc_pbx record associated with this service, if +any. + +Only makes sense if the service has a pbxsvc field (currently, svc_phone and +svc_acct). + +=cut + +sub pbx_title { + my $self = shift; + my $svc_pbx = $self->svc_pbx or return ''; + $svc_pbx->title; +} + +=item pbx_select_hash %OPTIONS + +Can be called as an object method or a class method. + +Returns a hash SVCNUM => TITLE ... representing the PBXes this customer +that may be associated with this service. + +Currently available options are: I<pkgnum> I<svcpart> + +Only makes sense if the service has a pbxsvc field (currently, svc_phone and +svc_acct). + +=cut + +#false laziness w/svc_acct::domain_select_hash +sub pbx_select_hash { + my ($self, %options) = @_; + my %pbxes = (); + my $part_svc; + my $cust_pkg; + + if (ref($self)) { + $part_svc = $self->part_svc; + $cust_pkg = $self->cust_svc->cust_pkg + if $self->cust_svc; + } + + $part_svc = qsearchs('part_svc', { 'svcpart' => $options{svcpart} }) + if $options{'svcpart'}; + + $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $options{pkgnum} }) + if $options{'pkgnum'}; + + if ($part_svc && ( $part_svc->part_svc_column('pbxsvc')->columnflag eq 'S' + || $part_svc->part_svc_column('pbxsvc')->columnflag eq 'F')) { + %pbxes = map { $_->svcnum => $_->title } + map { qsearchs('svc_pbx', { 'svcnum' => $_ }) } + split(',', $part_svc->part_svc_column('pbxsvc')->columnvalue); + } elsif ($cust_pkg) { # && !$conf->exists('svc_acct-alldomains') ) { + %pbxes = map { $_->svcnum => $_->title } + map { qsearchs('svc_pbx', { 'svcnum' => $_->svcnum }) } + map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) } + qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum }); + } else { + #XXX agent-virt + warn "hi"; + %pbxes = map { $_->svcnum => $_->title } qsearch('svc_pbx', {} ); + warn %pbxes; + } + + if ($part_svc && $part_svc->part_svc_column('pbxsvc')->columnflag eq 'D') { + my $svc_pbx = qsearchs('svc_pbx', + { 'svcnum' => $part_svc->part_svc_column('pbxsvc')->columnvalue } ); + if ( $svc_pbx ) { + $pbxes{$svc_pbx->svcnum} = $svc_pbx->title; + } else { + warn "unknown svc_pbx.svcnum for part_svc_column pbxsvc: ". + $part_svc->part_svc_column('pbxsvc')->columnvalue; + + } + } + + (%pbxes); + +} + =item set_auto_inventory Sets any fields which auto-populate from inventory (see L<FS::part_svc>). diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index e5fd582..ca33aa8 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -38,6 +38,7 @@ use FS::part_svc; use FS::svc_acct_pop; use FS::cust_main_invoice; use FS::svc_domain; +use FS::svc_pbx; use FS::raddb; use FS::queue; use FS::radius_usergroup; @@ -161,45 +162,71 @@ FS::svc_Common. The following fields are currently supported: =over 4 -=item svcnum - primary key (assigned automatcially for new accounts) +=item svcnum + +Primary key (assigned automatcially for new accounts) =item username -=item _password - generated if blank +=item _password + +generated if blank + +=item _password_encoding + +plain, crypt, ldap (or empty for autodetection) -=item _password_encoding - plain, crypt, ldap (or empty for autodetection) +=item sec_phrase -=item sec_phrase - security phrase +security phrase -=item popnum - Point of presence (see L<FS::svc_acct_pop>) +=item popnum + +Point of presence (see L<FS::svc_acct_pop>) =item uid =item gid -=item finger - GECOS +=item finger + +GECOS + +=item dir -=item dir - set automatically if blank (and uid is not) +set automatically if blank (and uid is not) =item shell -=item quota - (unimplementd) +=item quota -=item slipip - IP address +=item slipip -=item seconds - +IP address + +=item seconds + +=item upbytes + +=item downbyte + +=item totalbytes + +=item domsvc -=item upbytes - +svcnum from svc_domain -=item downbytes - +=item pbxsvc -=item totalbytes - +Optional svcnum from svc_pbx -=item domsvc - svcnum from svc_domain +=item radius_I<Radius_Attribute> -=item radius_I<Radius_Attribute> - I<Radius-Attribute> (reply) +I<Radius-Attribute> (reply) -=item rc_I<Radius_Attribute> - I<Radius-Attribute> (check) +=item rc_I<Radius_Attribute> + +I<Radius-Attribute> (check) =back @@ -275,6 +302,20 @@ sub table_info { disable_inventory => 1, }, + 'domsvc' => { + label => 'Domain', + type => 'select', + select_table => 'svc_domain', + select_key => 'svcnum', + select_label => 'domain', + disable_inventory => 1, + + }, + 'pbxsvc' => { label => 'PBX', + type => 'select-svc_pbx.html', + disable_inventory => 1, + disable_select => 1, #UI wonky, pry works otherwise + }, 'usergroup' => { label => 'RADIUS groups', type => 'radius_usergroup_selector', @@ -1011,7 +1052,8 @@ sub check { my $error = $self->ut_numbern('svcnum') #|| $self->ut_number('domsvc') - || $self->ut_foreign_key('domsvc', 'svc_domain', 'svcnum' ) + || $self->ut_foreign_key( 'domsvc', 'svc_domain', 'svcnum' ) + || $self->ut_foreign_keyn('pbxsvc', 'svc_pbx', 'svcnum' ) || $self->ut_textn('sec_phrase') || $self->ut_snumbern('seconds') || $self->ut_snumbern('upbytes') diff --git a/FS/FS/svc_pbx.pm b/FS/FS/svc_pbx.pm index f4ecc04..49509b5 100644 --- a/FS/FS/svc_pbx.pm +++ b/FS/FS/svc_pbx.pm @@ -37,7 +37,21 @@ FS::svc_Common. The following fields are currently supported: =over 4 -=item field - description +=item svcnum + +Primary key (assigned automatcially for new accounts) + +=item id + +(Unique?) number of external record + +=item title + +PBX name + +=item max_extensions + +Maximum number of extensions =back diff --git a/FS/FS/svc_phone.pm b/FS/FS/svc_phone.pm index 88582d3..071b807 100644 --- a/FS/FS/svc_phone.pm +++ b/FS/FS/svc_phone.pm @@ -8,6 +8,7 @@ use FS::Msgcat qw(gettext); use FS::svc_Common; use FS::part_svc; use FS::phone_device; +use FS::svc_pbx; @ISA = qw( FS::svc_Common ); @@ -67,6 +68,10 @@ Voicemail PIN =item phone_name +=item pbxsvc + +Optional svcnum from svc_pbx + =back =head1 METHODS @@ -104,6 +109,11 @@ sub table_info { }, 'sip_password' => 'SIP password', 'phone_name' => 'Name', + 'pbxsvc' => { label => 'PBX', + type => 'select-svc_pbx.html', + disable_inventory => 1, + disable_select => 1, #UI wonky, pry works otherwise + }, }, }; } @@ -258,6 +268,7 @@ sub check { || $self->ut_anything('sip_password') || $self->ut_numbern('pin') || $self->ut_textn('phone_name') + || $self->ut_foreign_keyn('pbxsvc', 'svc_pbx', 'svcnum' ) ; return $error if $error; |