} elsif ( defined($p->{'agentnum'}) and $p->{'agentnum'} =~ /^(\d+)$/ ) {
$agentnum = $1;
}
+ $p->{'agentnum'} = $agentnum;
my $conf = new FS::Conf;
&& (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;
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;
}
#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)$/ ) {
'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') ],
$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})$/
or return { 'error' => "CVV2 (CVC2/CID) is three digits." };
$paycvv = $1;
}
+ } elsif ( !$onfile && $conf->exists('selfservice-require_cvv') ) {
+ return { 'error' => 'CVV2 is required' };
}
} else {
'inbound' => ( $_ eq 'inbound' ? 1 : 0 ),
'begin' => ($cust_pkg->last_bill || 0),
'nonzero' => 1,
+ 'disable_charged_party' => 1,
);
$hash{$_} = $sum_cdr->hashref;
}
# 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 {
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';
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')
%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
#
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.'
$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,
}
-#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);
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 = '';
}
- 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;
foreach my $verify ( split(',', $verification) ) {
&{ $verify{$verify} }( $p, $cust_main )
- or return { 'error' => 'Account not found' };
+ or return { %$info, 'error' => 'Account not found' };
}
);
if ( $error ) {
- return { 'error' => $error }; #????
+ return { %$info, 'error' => $error }; #????
}
} elsif ( $svc_acct ) {
#create a unique session
my $reset_session = {
- 'svcnum' => $svc_acct->svcnum,
+ 'svcnum' => $svc_acct->svcnum,
+ 'agentnum' =>
};
my $timeout = '1 hour'; #?
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,
}
);
if ( $error ) {
- return { 'error' => $error }; #????
+ return { %$info, 'error' => $error }; #????
}
}
- return { 'error' => '' };
+ return { %$info, 'error' => '' };
}
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,
};
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?
};
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,
}
- 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' => '' };
}