X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FClientAPI%2FMyAccount.pm;h=587c8276b6357f83c2a1f68c89b5f3d6d974428e;hb=82c1277c1ad43936672c6919c3a186e821b22b70;hp=2d39510065006725aa31712bc0adcd3bdc6d01ba;hpb=c0fdb0884f3e5fb72e83e0b65d52b5a593bd670a;p=freeside.git diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index 2d3951006..587c8276b 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -1,13 +1,14 @@ package FS::ClientAPI::MyAccount; use strict; -use vars qw($cache); -use subs qw(_cache); +use vars qw( $cache $DEBUG ); +use subs qw( _cache _provision ); +use Data::Dumper; use Digest::MD5 qw(md5_hex); use Date::Format; use Business::CreditCard; use Time::Duration; -use FS::CGI qw(small_custview); #doh +use FS::UI::Web::small_custview qw(small_custview); #less doh use FS::UI::Web; use FS::UI::bytecount; use FS::Conf; @@ -17,6 +18,7 @@ use FS::Misc qw(card_types); use FS::ClientAPI_SessionCache; use FS::svc_acct; use FS::svc_domain; +use FS::svc_phone; use FS::svc_external; use FS::part_svc; use FS::cust_main; @@ -27,6 +29,8 @@ use FS::payby; use FS::acct_rt_transaction; use HTML::Entities; +$DEBUG = 0; + #false laziness with FS::cust_main BEGIN { eval "use Time::Local;"; @@ -45,8 +49,6 @@ use vars qw( @cust_main_editable_fields ); ss paytype paystate stateid stateid_state ); -use subs qw(_provision); - sub _cache { $cache ||= new FS::ClientAPI_SessionCache( { 'namespace' => 'FS::ClientAPI::MyAccount', @@ -57,28 +59,57 @@ sub _cache { sub login { my $p = shift; - my $svc_domain = qsearchs('svc_domain', { 'domain' => $p->{'domain'} } ) - or return { error => 'Domain '. $p->{'domain'}. ' not found' }; + my $conf = new FS::Conf; - my $svc_acct = qsearchs( 'svc_acct', { 'username' => $p->{'username'}, - 'domsvc' => $svc_domain->svcnum, } - ); - return { error => 'User not found.' } unless $svc_acct; + my $svc_x = ''; + if ( $p->{'domain'} eq 'svc_phone' + && $conf->exists('selfservice_server-phone_login') ) { - my $conf = new FS::Conf; - my $pkg_svc = $svc_acct->cust_svc->pkg_svc; - return { error => 'Only primary user may log in.' } - if $conf->exists('selfservice_server-primary_only') - && ( ! $pkg_svc || $pkg_svc->primary_svc ne 'Y' ); + my $svc_phone = qsearchs( 'svc_phone', { 'phonenum' => $p->{'username'} } ); + return { error => 'Number not found.' } unless $svc_phone; + + #XXX? + #my $pkg_svc = $svc_acct->cust_svc->pkg_svc; + #return { error => 'Only primary user may log in.' } + # if $conf->exists('selfservice_server-primary_only') + # && ( ! $pkg_svc || $pkg_svc->primary_svc ne 'Y' ); + + return { error => 'Incorrect PIN.' } + unless $svc_phone->check_pin($p->{'password'}); + + $svc_x = $svc_phone; + + } else { + + my $svc_domain = qsearchs('svc_domain', { 'domain' => $p->{'domain'} } ) + or return { error => 'Domain '. $p->{'domain'}. ' not found' }; + + my $svc_acct = qsearchs( 'svc_acct', { 'username' => $p->{'username'}, + 'domsvc' => $svc_domain->svcnum, } + ); + return { error => 'User not found.' } unless $svc_acct; + + #my $pkg_svc = $svc_acct->cust_svc->pkg_svc; + #return { error => 'Only primary user may log in.' } + # if $conf->exists('selfservice_server-primary_only') + # && ( ! $pkg_svc || $pkg_svc->primary_svc ne 'Y' ); + my $cust_svc = $svc_acct->cust_svc; + return { error => 'Only primary user may log in.' } + if $conf->exists('selfservice_server-primary_only') + && $cust_svc->svcpart != $cust_svc->cust_pkg->svcpart('svc_acct'); + + return { error => 'Incorrect password.' } + unless $svc_acct->check_password($p->{'password'}); - return { error => 'Incorrect password.' } - unless $svc_acct->check_password($p->{'password'}); + $svc_x = $svc_acct; + + } my $session = { - 'svcnum' => $svc_acct->svcnum, + 'svcnum' => $svc_x->svcnum, }; - my $cust_pkg = $svc_acct->cust_svc->cust_pkg; + my $cust_pkg = $svc_x->cust_svc->cust_pkg; if ( $cust_pkg ) { my $cust_main = $cust_pkg->cust_main; $session->{'custnum'} = $cust_main->custnum; @@ -394,6 +425,7 @@ sub process_payment { or return { 'error' => "illegal_payby " . $p->{'payby'} }; my $payby = $1; + #false laziness w/process/payment.cgi my $payinfo; my $paycvv = ''; if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) { @@ -412,14 +444,15 @@ sub process_payment { } elsif ( $payby eq 'CARD' || $payby eq 'DCRD' ) { $payinfo = $p->{'payinfo'}; - $payinfo =~ s/[^\dx]//g; - $payinfo =~ /^(\d{13,16})$/ - or return { 'error' => gettext('invalid_card') }; # . ": ". $self->payinfo - $payinfo = $1; $payinfo = $cust_main->payinfo if $cust_main->paymask eq $payinfo; + $payinfo =~ s/\D//g; + $payinfo =~ /^(\d{13,16})$/ + or return { 'error' => gettext('invalid_card') }; # . ": ". $self->payinfo + $payinfo = $1; + validate($payinfo) or return { 'error' => gettext('invalid_card') }; # . ": ". $self->payinfo return { 'error' => gettext('unknown_card_type') } @@ -549,7 +582,7 @@ sub invoice { return { 'error' => '', 'invnum' => $invnum, 'invoice_text' => join('', $cust_bill->print_text ), - 'invoice_html' => $cust_bill->print_html, + 'invoice_html' => $cust_bill->print_html( { unsquelch_cdr => 1 } ), }; } @@ -1071,6 +1104,8 @@ sub cancel_pkg { sub provision_acct { my $p = shift; + warn "provision_acct called\n" + if $DEBUG; return { 'error' => gettext('passwords_dont_match') } if $p->{'_password'} ne $p->{'_password2'}; @@ -1084,6 +1119,8 @@ sub provision_acct { unless ($domains{$p->{'domsvc'}}); } + warn "provision_acct calling _provision\n" + if $DEBUG; _provision( 'FS::svc_acct', [qw(username _password domsvc)], [qw(username _password domsvc)], @@ -1105,6 +1142,8 @@ sub provision_external { sub _provision { my( $class, $fields, $return_fields, $p ) = splice(@_, 0, 4); + warn "_provision called for $class\n" + if $DEBUG; my($context, $session, $custnum) = _custoragent_session_custnum($p); return { 'error' => $session } if $context eq 'error'; @@ -1116,27 +1155,42 @@ sub _provision { my $pkgnum = $p->{'pkgnum'}; + warn "searching for custnum $custnum pkgnum $pkgnum\n" + if $DEBUG; my $cust_pkg = qsearchs('cust_pkg', { 'custnum' => $custnum, 'pkgnum' => $pkgnum, } ) or return { 'error' => "unknown pkgnum $pkgnum" }; + warn "searching for svcpart ". $p->{'svcpart'}. "\n" + if $DEBUG; my $part_svc = qsearchs('part_svc', { 'svcpart' => $p->{'svcpart'} } ) or return { 'error' => "unknown svcpart $p->{'svcpart'}" }; + warn "creating $class record\n" + if $DEBUG; my $svc_x = $class->new( { 'pkgnum' => $p->{'pkgnum'}, 'svcpart' => $p->{'svcpart'}, map { $_ => $p->{$_} } @$fields } ); + warn "inserting $class record\n" + if $DEBUG; 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 - }; + unless ( $error ) { + warn "finding inserted record for svcnum ". $svc_x->svcnum. "\n" + if $DEBUG; + $svc_x = qsearchs($svc_x->table, { 'svcnum' => $svc_x->svcnum }) + } + + my $return = { 'svc' => $part_svc->svc, + 'error' => $error, + map { $_ => $svc_x->get($_) } @$return_fields + }; + warn "_provision returning ". Dumper($return). "\n" + if $DEBUG; + return $return; }