X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FClientAPI%2FMyAccount.pm;h=fe2e1c2281098cbf80e229e40141986eb33f67d0;hp=f51174e5d60e5af3bfe697ff185496f8e1ba5d53;hb=dda265d579b6f754feea0deacd12ae358d552f11;hpb=4c4b99f655084122e9b55222dae3e94757b78cae diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index f51174e5d..fe2e1c228 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -21,18 +21,23 @@ use FS::cust_pkg; use FS::ClientAPI; #hmm FS::ClientAPI->register_handlers( - 'MyAccount/login' => \&login, - 'MyAccount/customer_info' => \&customer_info, - 'MyAccount/edit_info' => \&edit_info, - 'MyAccount/invoice' => \&invoice, - 'MyAccount/list_invoices' => \&list_invoices, - 'MyAccount/cancel' => \&cancel, - 'MyAccount/payment_info' => \&payment_info, - 'MyAccount/process_payment' => \&process_payment, - 'MyAccount/list_pkgs' => \&list_pkgs, - 'MyAccount/order_pkg' => \&order_pkg, - 'MyAccount/cancel_pkg' => \&cancel_pkg, - 'MyAccount/charge' => \&charge, + 'MyAccount/login' => \&login, + 'MyAccount/logout' => \&logout, + 'MyAccount/customer_info' => \&customer_info, + 'MyAccount/edit_info' => \&edit_info, + 'MyAccount/invoice' => \&invoice, + 'MyAccount/list_invoices' => \&list_invoices, + 'MyAccount/cancel' => \&cancel, + 'MyAccount/payment_info' => \&payment_info, + 'MyAccount/process_payment' => \&process_payment, + 'MyAccount/list_pkgs' => \&list_pkgs, + 'MyAccount/order_pkg' => \&order_pkg, + 'MyAccount/cancel_pkg' => \&cancel_pkg, + 'MyAccount/charge' => \&charge, + 'MyAccount/part_svc_info' => \&part_svc_info, + 'MyAccount/provision_acct' => \&provision_acct, + 'MyAccount/provision_external' => \&provision_external, + 'MyAccount/unprovision_svc' => \&unprovision_svc, ); use vars qw( @cust_main_editable_fields ); @@ -44,6 +49,8 @@ use vars qw( @cust_main_editable_fields ); payby payinfo payname ); +use subs qw(_provision); + #store in db? my $cache = new Cache::SharedMemoryCache( { 'namespace' => 'FS::ClientAPI::MyAccount', @@ -92,26 +99,21 @@ sub login { }; } -sub customer_info { +sub logout { my $p = shift; - - my($session, $custnum, $context); if ( $p->{'session_id'} ) { - $context = 'customer'; - $session = $cache->get($p->{'session_id'}) - or return { 'error' => "Can't resume session" }; #better error message - $custnum = $session->{'custnum'}; - } elsif ( $p->{'agent_session_id'} ) { - $context = 'agent'; - my $agent_cache = new Cache::SharedMemoryCache( { - 'namespace' => 'FS::ClientAPI::Agent', - } ); - $session = $agent_cache->get($p->{'agent_session_id'}) - or return { 'error' => "Can't resume session" }; #better error message - $custnum = $p->{'custnum'}; + $cache->remove($p->{'session_id'}); + return { 'error' => '' }; } else { return { 'error' => "Can't resume session" }; #better error message } +} + +sub customer_info { + my $p = shift; + + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; my %return; if ( $custnum ) { #customer record @@ -437,43 +439,54 @@ sub cancel { sub list_pkgs { my $p = shift; - my $session = $cache->get($p->{'session_id'}) - or return { 'error' => "Can't resume session" }; #better error message - my $custnum = $session->{'custnum'}; + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; - my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } ) + my $search = { 'custnum' => $custnum }; + $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent'; + my $cust_main = qsearchs('cust_main', $search ) or return { 'error' => "unknown custnum $custnum" }; - return { 'cust_pkg' => [ map { $_->hashref } $cust_main->ncancelled_pkgs ] }; + #return { 'cust_pkg' => [ map { $_->hashref } $cust_main->ncancelled_pkgs ] }; + + my $conf = new FS::Conf; + + { 'svcnum' => $session->{'svcnum'}, + 'custnum' => $custnum, + 'cust_pkg' => [ map { + { $_->hash, + $_->part_pkg->hash, + part_svc => + [ map $_->hashref, $_->available_part_svc ], + cust_svc => + [ map { my $ref = { $_->hash, + label => [ $_->label ], + }; + $ref->{_password} = $_->svc_x->_password + if $context eq 'agent' + && $conf->exists('agent-showpasswords') + && $_->part_svc->svcdb eq 'svc_acct'; + $ref; + } $_->cust_svc + ], + }; + } $cust_main->ncancelled_pkgs + ], + 'small_custview' => + small_custview( $cust_main, $conf->config('defaultcountry') ), + }; } sub order_pkg { my $p = shift; - my($session, $custnum, $context); - - if ( $p->{'session_id'} ) { - $context = 'customer'; - $session = $cache->get($p->{'session_id'}) - or return { 'error' => "Can't resume session" }; #better error message - $custnum = $session->{'custnum'}; - } elsif ( $p->{'agent_session_id'} ) { - $context = 'agent'; - my $agent_cache = new Cache::SharedMemoryCache( { - 'namespace' => 'FS::ClientAPI::Agent', - } ); - $session = $agent_cache->get($p->{'agent_session_id'}) - or return { 'error' => "Can't resume session" }; #better error message - $custnum = $p->{'custnum'}; - } else { - return { 'error' => "Can't resume session" }; #better error message - } + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; my $search = { 'custnum' => $custnum }; $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent'; - my $cust_main = qsearchs('cust_main', $search ) or return { 'error' => "unknown custnum $custnum" }; @@ -598,5 +611,178 @@ sub cancel_pkg { } +sub provision_acct { + my $p = shift; + + return { 'error' => gettext('passwords_dont_match') } + if $p->{'_password'} ne $p->{'_password2'}; + return { 'error' => gettext('empty_password') } + unless length($p->{'_password'}); + + _provision( 'FS::svc_acct', + [qw(username _password)], + [qw(username _password)], + $p, + @_ + ); +} + +sub provision_external { + my $p = shift; + #_provision( 'FS::svc_external', [qw(id title)], [qw(id title)], $p, @_ ); + _provision( 'FS::svc_external', + [], + [qw(id title)], + $p, + @_ + ); +} + +sub _provision { + my( $class, $fields, $return_fields, $p ) = splice(@_, 0, 4); + + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; + + my $search = { 'custnum' => $custnum }; + $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent'; + my $cust_main = qsearchs('cust_main', $search ) + or return { 'error' => "unknown custnum $custnum" }; + + my $pkgnum = $p->{'pkgnum'}; + + my $cust_pkg = qsearchs('cust_pkg', { 'custnum' => $custnum, + 'pkgnum' => $pkgnum, + } ) + or return { 'error' => "unknown pkgnum $pkgnum" }; + + my $part_svc = qsearchs('part_svc', { 'svcpart' => $p->{'svcpart'} } ) + or return { 'error' => "unknown svcpart $p->{'svcpart'}" }; + + my $svc_x = $class->new( { + 'pkgnum' => $p->{'pkgnum'}, + 'svcpart' => $p->{'svcpart'}, + map { $_ => $p->{$_} } @$fields + } ); + my $error = $svc_x->insert; + $svc_x = qsearchs($svc_x->table, { 'svcnum' => $svc_x->svcnum }) + unless $error; + + return { 'svc' => $part_svc->svc, + 'error' => $error, + map { $_ => $svc_x->get($_) } @$return_fields + }; + +} + +sub part_svc_info { + my $p = shift; + + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; + + my $search = { 'custnum' => $custnum }; + $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent'; + my $cust_main = qsearchs('cust_main', $search ) + or return { 'error' => "unknown custnum $custnum" }; + + my $pkgnum = $p->{'pkgnum'}; + + my $cust_pkg = qsearchs('cust_pkg', { 'custnum' => $custnum, + 'pkgnum' => $pkgnum, + } ) + or return { 'error' => "unknown pkgnum $pkgnum" }; + + my $svcpart = $p->{'svcpart'}; + + my $pkg_svc = qsearchs('pkg_svc', { 'pkgpart' => $cust_pkg->pkgpart, + 'svcpart' => $svcpart, } ) + or return { 'error' => "unknown svcpart $svcpart for pkgnum $pkgnum" }; + my $part_svc = $pkg_svc->part_svc; + + my $conf = new FS::Conf; + + return { + 'svc' => $part_svc->svc, + 'svcdb' => $part_svc->svcdb, + 'pkgnum' => $pkgnum, + 'svcpart' => $svcpart, + 'custnum' => $custnum, + + 'security_phrase' => 0, #XXX ! + 'svc_acct_pop' => [], #XXX ! + 'popnum' => '', + 'init_popstate' => '', + 'popac' => '', + 'acstate' => '', + + 'small_custview' => + small_custview( $cust_main, $conf->config('defaultcountry') ), + + }; + +} + +sub unprovision_svc { + my $p = shift; + + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; + + my $search = { 'custnum' => $custnum }; + $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent'; + my $cust_main = qsearchs('cust_main', $search ) + or return { 'error' => "unknown custnum $custnum" }; + + my $svcnum = $p->{'svcnum'}; + + my $cust_svc = qsearchs('cust_svc', { 'svcnum' => $svcnum, } ) + or return { 'error' => "unknown svcnum $svcnum" }; + + return { 'error' => "Service $svcnum does not belong to customer $custnum" } + unless $cust_svc->cust_pkg->custnum == $custnum; + + my $conf = new FS::Conf; + + return { 'svc' => $cust_svc->part_svc->svc, + 'error' => $cust_svc->cancel, + 'small_custview' => + small_custview( $cust_main, $conf->config('defaultcountry') ), + }; + +} + +#-- + +sub _custoragent_session_custnum { + my $p = shift; + + my($context, $session, $custnum); + if ( $p->{'session_id'} ) { + + $context = 'customer'; + $session = $cache->get($p->{'session_id'}) + or return { 'error' => "Can't resume session" }; #better error message + $custnum = $session->{'custnum'}; + + } elsif ( $p->{'agent_session_id'} ) { + + $context = 'agent'; + my $agent_cache = new Cache::SharedMemoryCache( { + 'namespace' => 'FS::ClientAPI::Agent', + } ); + $session = $agent_cache->get($p->{'agent_session_id'}) + or return { 'error' => "Can't resume session" }; #better error message + $custnum = $p->{'custnum'}; + + } else { + return { 'error' => "Can't resume session" }; #better error message + } + + ($context, $session, $custnum); + +} + + 1;