X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FClientAPI%2FMyAccount.pm;h=e5078f960118eca8123a78d2e610a3162d65150f;hb=7ad62cea1758b8f2e4f0e0d4d8bab36a864b5938;hp=37d21ea7ebe1e088b241224fa19db0ad27bb5d0e;hpb=cb6cca67db487271ce96b49289ada58691a2067d;p=freeside.git diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index 37d21ea7e..e5078f960 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -96,6 +96,7 @@ sub skin_info { } elsif ( defined($p->{'agentnum'}) and $p->{'agentnum'} =~ /^(\d+)$/ ) { $agentnum = $1; } + $p->{'agentnum'} = $agentnum; my $conf = new FS::Conf; @@ -233,7 +234,7 @@ sub login { && (my $contact = FS::contact->by_selfservice_email($p->{email})) ) { - return { error => 'Incorrect password.' } + return { error => 'Incorrect contact password.' } unless $contact->authenticate_password($p->{'password'}); $session->{'custnum'} = $contact->custnum; @@ -554,7 +555,9 @@ sub customer_info_short { 1, ##nobalance ); - $return{name} = $cust_main->first. ' '. $cust_main->get('last'); + $return{first} = $cust_main->first; + $return{'last'} = $cust_main->get('last'); + $return{name} = $cust_main->first. ' '. $cust_main->get('last'); $return{payby} = $cust_main->payby; @@ -564,8 +567,10 @@ sub customer_info_short { } #maybe a little more expensive, but it should be cached by now for (@location_editable_fields) { - $return{$_} = $cust_main->bill_location->get($_); - $return{'ship_'.$_} = $cust_main->ship_location->get($_); + $return{$_} = $cust_main->bill_location->get($_) + if $cust_main->bill_locationnum; + $return{'ship_'.$_} = $cust_main->ship_location->get($_) + if $cust_main->ship_locationnum; } if ( $cust_main->payby =~ /^(CARD|DCRD)$/ ) { @@ -834,6 +839,9 @@ sub payment_info { 'card_types' => card_types(), + 'withcvv' => $conf->exists('selfservice-require_cvv'), #or enable optional cvv? + 'require_cvv' => $conf->exists('selfservice-require_cvv'), + 'paytypes' => [ @FS::cust_main::paytypes ], 'paybys' => [ $conf->config('signup_server-payby') ], @@ -985,10 +993,14 @@ sub validate_payment { $payinfo = $p->{'payinfo'}; + my $onfile = 0; + #more intelligent matching will be needed here if you change #card_masking_method and don't remove existing paymasks - $payinfo = $cust_main->payinfo - if $cust_main->paymask eq $payinfo; + if ( $cust_main->paymask eq $payinfo ) { + $payinfo = $cust_main->payinfo; + $onfile = 1; + } $payinfo =~ s/\D//g; $payinfo =~ /^(\d{13,16}|\d{8,9})$/ @@ -1010,6 +1022,8 @@ sub validate_payment { or return { 'error' => "CVV2 (CVC2/CID) is three digits." }; $paycvv = $1; } + } elsif ( !$onfile && $conf->exists('selfservice-require_cvv') ) { + return { 'error' => 'CVV2 is required' }; } } else { @@ -1806,6 +1820,7 @@ sub list_svcs { 'inbound' => ( $_ eq 'inbound' ? 1 : 0 ), 'begin' => ($cust_pkg->last_bill || 0), 'nonzero' => 1, + 'disable_charged_party' => 1, ); $hash{$_} = $sum_cdr->hashref; } @@ -2089,7 +2104,12 @@ sub _list_cdr_usage { # we have to return the results all at once... my($svc_phone, $begin, $end, %opt) = @_; map [ $_->downstream_csv(%opt, 'keeparray' => 1) ], - $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, %opt ); + $svc_phone->get_cdrs( + 'begin'=>$begin, + 'end'=>$end, + 'disable_charged_party' => 1, + %opt + ); } sub list_cdr_usage { @@ -2101,6 +2121,7 @@ sub list_cdr_usage { sub _usage_details { my($callback, $p, %opt) = @_; + my $conf = FS::Conf->new; my($context, $session, $custnum) = _custoragent_session_custnum($p); return { 'error' => $session } if $context eq 'error'; @@ -2119,7 +2140,6 @@ sub _usage_details { my %callback_opt; my $header = []; if ( $svcdb eq 'svc_phone' ) { - my $conf = FS::Conf->new; my $format = ''; if ( $p->{inbound} ) { $format = $cust_pkg->part_pkg->option('selfservice_inbound_format') @@ -2153,6 +2173,14 @@ sub _usage_details { %callback_opt ); + if ( $conf->exists('selfservice-hide_cdr_price') ) { + # ugly kludge, I know + my ($delete_col) = grep { $header->[$_] eq 'Price' } (0..scalar(@$header)); + if (defined $delete_col) { + delete($_->[$delete_col]) foreach ($header, @usage); + } + } + #kinda false laziness with FS::cust_main::bill, but perhaps #we should really change this bit to DateTime and DateTime::Duration # @@ -2832,6 +2860,13 @@ sub myaccount_passwd { my $error = ''; my $conf = new FS::Conf; + + return { 'error' => 'Incorrect current password.' } + if ( exists($p->{'old_password'}) + || $conf->exists('selfservice-password_change_oldpass') + ) + && ! $svc_acct->check_password($p->{'old_password'}); + $error = 'Password too short.' if length($p->{'new_password'}) < ($conf->config('passwordmin') || 6); $error = 'Password too long.' @@ -2840,6 +2875,16 @@ sub myaccount_passwd { $svc_acct->set_password($p->{'new_password'}); $error ||= $svc_acct->replace(); + #regular pw change in self-service should change contact pw too, otherwise its + #way too confusing. hell its confusing they're separate at all, but alas. + #need to support the "ISP provides email that's used as a contact email" case + #as well as we can. + my $contact = FS::contact->by_selfservice_email($svc_acct->email); + if ( $contact && $contact->custnum == $custnum ) { + #svc_acct was successful but this one returns an error? "shouldn't happen" + $error ||= $contact->change_password($p->{'new_password'}); + } + my($label, $value) = $svc_acct->cust_svc->label; return { 'error' => $error, @@ -2849,7 +2894,6 @@ sub myaccount_passwd { } -#regular pw change in self-service should change contact pw too, otherwise its way too confusing. hell its confusing they're separate at all, but alas. need to support the "ISP provides email that's used as a contact email" case as well as we can. # sub contact_passwd { # my $p = shift; # my($context, $session, $custnum) = _custoragent_session_custnum($p); @@ -2900,9 +2944,11 @@ sub myaccount_passwd { sub reset_passwd { my $p = shift; + my $info = skin_info($p); + my $conf = new FS::Conf; my $verification = $conf->config('selfservice-password_reset_verification') - or return { 'error' => 'Password resets disabled' }; + or return { %$info, 'error' => 'Password resets disabled' }; my $contact = ''; my $svc_acct = ''; @@ -2933,21 +2979,21 @@ sub reset_passwd { } - return { 'error' => 'Email address not found' } + return { %$info, 'error' => 'Email address not found' } unless $contact || $svc_acct; } elsif ( $p->{'username'} ) { #old style, looks in svc_acct only my $svc_domain = qsearchs('svc_domain', { 'domain' => $p->{'domain'} } ) - or return { 'error' => 'Account not found' }; + or return { %$info, 'error' => 'Account not found' }; $svc_acct = qsearchs('svc_acct', { 'username' => $p->{'username'}, 'domsvc' => $svc_domain->svcnum } ) - or return { 'error' => 'Account not found' }; + or return { %$info, 'error' => 'Account not found' }; my $cust_pkg = $svc_acct->cust_svc->cust_pkg - or return { 'error' => 'Account not found' }; + or return { %$info, 'error' => 'Account not found' }; $cust_main = $cust_pkg->cust_main; @@ -2981,7 +3027,7 @@ sub reset_passwd { foreach my $verify ( split(',', $verification) ) { &{ $verify{$verify} }( $p, $cust_main ) - or return { 'error' => 'Account not found' }; + or return { %$info, 'error' => 'Account not found' }; } @@ -2994,7 +3040,7 @@ sub reset_passwd { ); if ( $error ) { - return { 'error' => $error }; #???? + return { %$info, 'error' => $error }; #???? } } elsif ( $svc_acct ) { @@ -3002,7 +3048,8 @@ sub reset_passwd { #create a unique session my $reset_session = { - 'svcnum' => $svc_acct->svcnum, + 'svcnum' => $svc_acct->svcnum, + 'agentnum' => }; my $timeout = '1 hour'; #? @@ -3020,7 +3067,7 @@ sub reset_passwd { my $msgnum = $conf->config('selfservice-password_reset_msgnum', $cust_main->agentnum); #die "selfservice-password_reset_msgnum unset" unless $msgnum; - return { 'error' => "selfservice-password_reset_msgnum unset" } + return { %$info, 'error' => "selfservice-password_reset_msgnum unset" } unless $msgnum; my $msg_template = qsearchs('msg_template', { msgnum => $msgnum } ); my $error = $msg_template->send( 'cust_main' => $cust_main, @@ -3030,12 +3077,12 @@ sub reset_passwd { } ); if ( $error ) { - return { 'error' => $error }; #???? + return { %$info, 'error' => $error }; #???? } } - return { 'error' => '' }; + return { %$info, 'error' => '' }; } sub check_reset_passwd { @@ -3055,7 +3102,11 @@ sub check_reset_passwd { my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $svcnum } ) or return { 'error' => "Service not found" }; - return { 'error' => '', + $p->{'agentnum'} = $svc_acct->cust_svc->cust_pkg->cust_main->agentnum; + my $info = skin_info($p); + + return { %$info, + 'error' => '', 'session_id' => $p->{'session_id'}, 'username' => $svc_acct->username, }; @@ -3070,7 +3121,11 @@ sub check_reset_passwd { my @contact_email = $contact->contact_email; return { 'error' => 'No contact email' } unless @contact_email; - return { 'error' => '', + $p->{'agentnum'} = $contact->cust_main->agentnum; + my $info = skin_info($p); + + return { %$info, + 'error' => '', 'session_id' => $p->{'session_id'}, 'email' => $contact_email[0]->email, #the first? }; @@ -3090,26 +3145,49 @@ sub process_reset_passwd { my $verification = $conf->config('selfservice-password_reset_verification') or return { 'error' => 'Password resets disabled' }; - return { 'error' => "New passwords don't match." } - if $p->{'new_password'} ne $p->{'new_password2'}; - - return { 'error' => 'Enter new password' } - unless length($p->{'new_password'}); - my $reset_session = _cache->get('reset_passwd_'. $p->{'session_id'}) or return { 'error' => "Can't resume session" }; #better error message + my $info = ''; + + my $svc_acct = ''; if ( $reset_session->{'svcnum'} ) { my $svcnum = $reset_session->{'svcnum'}; - my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $svcnum } ) + $svc_acct = qsearchs('svc_acct', { 'svcnum' => $svcnum } ) or return { 'error' => "Service not found" }; + $p->{'agentnum'} ||= $svc_acct->cust_svc->cust_pkg->cust_main->agentnum; + $info ||= skin_info($p); + + } + + my $contact = ''; + if ( $reset_session->{'contactnum'} ) { + + my $contactnum = $reset_session->{'contactnum'}; + + $contact = qsearchs('contact', { 'contactnum' => $contactnum } ) + or return { 'error' => "Contact not found" }; + + $p->{'agentnum'} ||= $contact->cust_main->agentnum; + $info ||= skin_info($p); + + } + + return { %$info, 'error' => "New passwords don't match." } + if $p->{'new_password'} ne $p->{'new_password2'}; + + return { %$info, 'error' => 'Enter new password' } + unless length($p->{'new_password'}); + + if ( $svc_acct ) { + $svc_acct->set_password($p->{'new_password'}); my $error = $svc_acct->replace(); - return { 'error' => $error } if $error; + return { %$info, 'error' => $error } if $error; #my($label, $value) = $svc_acct->cust_svc->label; #return { 'error' => $error, @@ -3119,23 +3197,18 @@ sub process_reset_passwd { } - if ( $reset_session->{'contactnum'} ) { - - my $contactnum = $reset_session->{'contactnum'}; - - my $contact = qsearchs('contact', { 'contactnum' => $contactnum } ) - or return { 'error' => "Contact not found" }; + if ( $contact ) { my $error = $contact->change_password($p->{'new_password'}); - return { 'error' => $error }; # if $error; + return { %$info, 'error' => $error }; # if $error; } #password changed ,so remove session, don't want it reused _cache->remove($p->{'session_id'}); - return { 'error' => '' }; + return { %$info, 'error' => '' }; }