package FS::part_export::indosoft_pbx; use base qw( FS::part_export ); use vars qw( %info ); use Tie::IxHash; use Lingua::EN::NameParse; tie my %options, 'Tie::IxHash', 'host' => { label => 'Q-Suite API hostname' }, 'gateway_key' => { label => 'API gateway key' }, ; %info = ( 'svc' => [qw( svc_pbx svc_phone svc_acct )], 'desc' => 'Export PBX tenants and DIDs to Indosoft Q-Suite', 'options' => \%options, 'no_machine' => 1, 'notes' => <<'END' Export PBX tenants and DIDs to Indosoft Q-Suite. Net::Indosoft::QSuite is required. END ); $insert_hack = 0; sub rebless { shift; } sub _export_insert { my($self, $svc_x) = (shift, shift); my $cust_main = $svc_x->cust_svc->cust_pkg->cust_main; if ( $svc_x->isa('FS::svc_pbx') ) { my $uuid = $self->indosoft_runcommand( 'editTenant', 'mode' => 'create', 'name' => $svc_x->title || $cust_main->name, 'shortname' => $svc_x->svcnum, #? #'hostname' => #XXX what goes here? add to svc_pbx? 'callerid_name' => $svc_x->title || $cust_main->name, #separate? add to svc_pbx? #'callerid_number' => #XXX where tf to get this from? svc_pbx again? ); $svc_x->id( $uuid ); # ? #my $unneeded_trunk_uuid = $self->indosoft_command( 'assignTrunkToTenant, # 'tenant_uuid' => $uuid, # 'trunk_id' => $self->option('trunk_id'), #); } elsif ( $svc_x->isa('FS::svc_phone') ) { my $same_number = $self->indosoft_runcommand( 'editDID', 'mode' => 'create', 'tenant_uuid' => $svc_x->svc_pbx->id, 'number' => $svc_x->phonenum, # 'auto_attendant_uuid' =>#XXX where to get this from? svc_phone.newfield? ); #set the auto-attendant name, repeate limit, response limit, extension dialing? #XXX ring group? } elsif ( $svc_x->isa('FS::svc_acct') ) { my($firstname, $lastname); my $NameParse = new Lingua::EN::NameParse; if ( $NameParse->parse( $svc_x->finger ) ) { $firstname = $cust_main->first, $lastname = $cust_main->get('last'), } else { my %name = $NameParse->components; $firstname = $name{given_name_1} || $name{initials_1}; #wtf NameParse, Ed? $lastname = $name{surname_1}; } my $uuid = $self->indosoft_command( 'editEmployee', 'mode' => 'create', 'tenant_uuid' => $svc_x->svc_pbx->id, 'username' => $svc_x->username, 'password' => $svc_x->_password, 'firstname' => $firstname, 'lastname' => $firstname, ); #XXX extensions (pbx_extension export? look at how svc_phone does its device export stuff #XXX devices (links employee to extension (svc_acct to pbx_extension)? how's that? seems like they _go_ with extensions. where to pick user? #XXX voicemail pin? #XXX extension forwarding? } else { die "guru meditation #five five five five: $svc_x is not FS::svc_pbx, FS::svc_phone or FS::svc_acct"; } local($insert_hack) = 1; #my $error = $svc_phone->replace; #return $error if $error; $svc_x->replace; } sub _export_replace { my( $self, $new, $old ) = (shift, shift, shift); return '' if $insert_hack; #change anything? } sub _export_delete { my( $self, $svc_phone ) = (shift, shift); #delete conference ''; } # #these three are optional # # fallback for svc_acct will change and restore password # sub _export_suspend { # my( $self, $svc_phone ) = (shift, shift); # $err_or_queue = $self->indosoft_queue( $svc_phone->svcnum, # 'suspend', $svc_phone->username ); # ref($err_or_queue) ? '' : $err_or_queue; # } # # sub _export_unsuspend { # my( $self, $svc_phone ) = (shift, shift); # $err_or_queue = $self->indosoft_queue( $svc_phone->svcnum, # 'unsuspend', $svc_phone->username ); # ref($err_or_queue) ? '' : $err_or_queue; # } # # sub export_links { # my($self, $svc_phone, $arrayref) = (shift, shift, shift); # #push @$arrayref, qq!!. $svc_phone->username. qq!!; # ''; # } ### sub indosoft_runcommand { my( $self, $method ) = (shift, shift); indosoft_command( $self->option('host'), $self->option('gateway_key'), $method, @_, ); } sub indosoft_command { my( $host, $gateway_key, $method, @args ) = @_; eval 'use Net::Indosoft::Qsuite;'; die $@ if $@; my $qsuite = new Net::Indosoft::Qsuite( 'host' => $host, 'gateway_key' => $gateway_key, ); my $return = $qsuite->$method( @args ); die "Indosoft error: ". $qsuite->errstr if $qsuite->errstr; $return; } # #a good idea to queue anything that could fail or take any time # sub indosoft_queue { # my( $self, $svcnum, $method ) = (shift, shift, shift); # my $queue = new FS::queue { # 'svcnum' => $svcnum, # 'job' => "FS::part_export::indosoft::indosoft_$method", # }; # $queue->insert( @_ ) or $queue; # } # # sub indosoft_insert { #subroutine, not method # my( $username, $password ) = @_; # #do things with $username and $password # } # # sub indosoft_replace { #subroutine, not method # } # # sub indosoft_delete { #subroutine, not method # my( $username ) = @_; # #do things with $username # } # # sub indosoft_suspend { #subroutine, not method # } # # sub indosoft_unsuspend { #subroutine, not method # } 1;