X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FClientAPI%2FMyAccount.pm;h=fa0bbb8a76cb0f636d9d0fd6d50674f618590431;hb=158103c8701d8cd87148c579dc101979c808b8c2;hp=f6a71cd9b2e66a67fcbc66c0a2e7ec53623dd8c1;hpb=1eff7a1cd742bab7a0084d55f74b2f53c1f84e64;p=freeside.git diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index f6a71cd9b..fa0bbb8a7 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -18,6 +18,7 @@ use FS::Conf; use FS::Record qw(qsearch qsearchs dbh); use FS::Msgcat qw(gettext); use FS::Misc qw(card_types); +use FS::Misc::DateTime qw(parse_datetime); use FS::ClientAPI_SessionCache; use FS::svc_acct; use FS::svc_domain; @@ -237,6 +238,28 @@ sub logout { } } +sub payment_gateway { + # internal use only + # takes a cust_main and a cust_payby entry, returns the payment_gateway + my $conf = new FS::Conf; + my $cust_main = shift; + my $cust_payby = shift; + my $gatewaynum = $conf->config('selfservice-payment_gateway'); + if ( $gatewaynum ) { + my $pg = qsearchs('payment_gateway', { gatewaynum => $gatewaynum }); + die "configured gatewaynum $gatewaynum not found!" if !$pg; + return $pg; + } + else { + return '' if ! FS::payby->realtime($cust_payby); + my $pg = $cust_main->agent->payment_gateway( + 'method' => FS::payby->payby2bop($cust_payby), + 'nofatal' => 1 + ); + return $pg; + } +} + sub access_info { my $p = shift; @@ -262,18 +285,11 @@ sub access_info { my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } ) or return { 'error' => "unknown custnum $custnum" }; - $info->{hide_payment_fields} = - [ - map { my $pg = ''; - if ( FS::payby->realtime($_) ) { - $pg = $cust_main->agent->payment_gateway( - 'method' => FS::payby->payby2bop($_), - 'nofatal' => 1, - ); - } - $pg && $pg->gateway_namespace eq 'Business::OnlineThirdPartyPayment'; - } - @{ $info->{cust_paybys} } + $info->{'hide_payment_fields'} = [ + map { + my $pg = payment_gateway($cust_main, $_); + $pg && $pg->gateway_namespace eq 'Business::OnlineThirdPartyPayment'; + } @{ $info->{cust_paybys} } ]; $info->{'self_suspend_reason'} = @@ -517,6 +533,8 @@ sub payment_info { 'show_paystate' => $conf->exists('show_bankstate'), 'save_unchecked' => $conf->exists('selfservice-save_unchecked'), + + 'credit_card_surcharge_percentage' => $conf->config('credit-card-surcharge-percentage'), }; } @@ -532,18 +550,11 @@ sub payment_info { my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } ) or return { 'error' => "unknown custnum $custnum" }; - $return{hide_payment_fields} = - [ - map { my $pg = ''; - if ( FS::payby->realtime($_) ) { - $pg = $cust_main->agent->payment_gateway( - 'method' => FS::payby->payby2bop($_), - 'nofatal' => 1, - ); - } - $pg && $pg->gateway_namespace eq 'Business::OnlineThirdPartyPayment'; - } - @{ $return{cust_paybys} } + $return{'hide_payment_fields'} = [ + map { + my $pg = payment_gateway($cust_main, $_); + $pg && $pg->gateway_namespace eq 'Business::OnlineThirdPartyPayment'; + } @{ $return{cust_paybys} } ]; $return{balance} = $cust_main->balance; #XXX pkg-balances? @@ -629,6 +640,7 @@ sub process_payment { #false laziness w/process/payment.cgi my $payinfo; my $paycvv = ''; + my $paynum = ''; if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) { $p->{'payinfo1'} =~ /^([\dx]+)$/ @@ -690,8 +702,10 @@ sub process_payment { 'payname' => $payname, 'paybatch' => $paybatch, #this doesn't actually do anything 'paycvv' => $paycvv, + 'paynum_ref' => \$paynum, 'pkgnum' => $session->{'pkgnum'}, 'discount_term' => $discount_term, + 'selfservice' => 1, map { $_ => $p->{$_} } @{ $payby2fields{$payby} } ); return { 'error' => $error } if $error; @@ -731,7 +745,46 @@ sub process_payment { } } - return { 'error' => '' }; + my $receipt_html = ''; + if($paynum) { + # currently supported for realtime CC only; send receipt data to SS + my $cust_pay = qsearchs('cust_pay', { 'paynum' => $paynum } ); + if($cust_pay) { + $receipt_html = qq! + + + + + + + + + + + + + + + + + + + + + + + + + +
Payment#! . $cust_pay->paynum . qq!
Date! . + time2str("%a %b %o, %Y %r", $cust_pay->_date) + . qq!
Amount! . $cust_pay->paid . qq!
Payment method! . $cust_pay->payby_name .' #'. $cust_pay->paymask + . qq!
+!; + } + } + + return { 'error' => '', 'receipt_html' => $receipt_html, }; } @@ -746,18 +799,27 @@ sub realtime_collect { my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } ) or return { 'error' => "unknown custnum $custnum" }; + my $amount; + if ( $p->{'amount'} ) { + $amount = $p->{'amount'}; + } + elsif ( $session->{'pkgnum'} ) { + $amount = $cust_main->balance_pkgnum( $session->{'pkgnum'} ); + } + else { + $amount = $cust_main->balance; + } + my $error = $cust_main->realtime_collect( 'method' => $p->{'method'}, + 'amount' => $amount, 'pkgnum' => $session->{'pkgnum'}, 'session_id' => $p->{'session_id'}, 'apply' => 1, + 'selfservice'=> 1, ); return { 'error' => $error } unless ref( $error ); - my $amount = $session->{'pkgnum'} - ? $cust_main->balance_pkgnum( $session->{'pkgnum'} ) - : $cust_main->balance; - return { 'error' => '', amount => $amount, %$error }; } @@ -960,6 +1022,7 @@ sub list_pkgs { 'wholesale_view' => 1, 'login_svcpart' => [ $conf->config('selfservice_server-login_svcpart') ], 'date_format' => $conf->config('date_format') || '%m/%d/%Y', + 'lnp' => $conf->exists('svc_phone-lnp'), }; } @@ -1021,9 +1084,13 @@ sub list_svcs { #@svc_x = sort { $a->domain cmp $b->domain || $a->username cmp $b->username } # @svc_x; + my $conf = new FS::Conf; + { 'svcnum' => $session->{'svcnum'}, 'custnum' => $custnum, + 'date_format' => $conf->config('date_format') || '%m/%d/%Y', + 'view_usage_nodomain' => $conf->exists('selfservice-view_usage_nodomain'), 'svcs' => [ map { my $svc_x = $_->svc_x; @@ -1059,7 +1126,7 @@ sub list_svcs { # more... ); - } elsif ( $svcdb eq 'svc_phone' ) { + } elsif ( $svcdb eq 'svc_phone' || $svcdb eq 'svc_port' ) { %hash = ( %hash, ); @@ -1073,6 +1140,21 @@ sub list_svcs { } +sub port_graph { + my $p = shift; + _usage_details( \&_port_graph, $p, + 'svcdb' => 'svc_port', + ); +} + +sub _port_graph { + my($svc_port, $begin, $end) = @_; + my @usage = (); + my $pngOrError = $svc_port->graph_png( start=>$begin, end=> $end ); + push @usage, { 'png' => $pngOrError }; + (@usage); +} + sub _list_svc_usage { my($svc_acct, $begin, $end) = @_; my @usage = (); @@ -1114,8 +1196,8 @@ sub list_support_usage { sub _list_cdr_usage { my($svc_phone, $begin, $end) = @_; - map [ $_->downstream_csv('format' => 'default') ], #XXX config for format - $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, ); + map [ $_->downstream_csv('format' => 'default', 'keeparray' => 1) ], #XXX config for format + $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, ); } sub list_cdr_usage { @@ -1252,7 +1334,7 @@ sub order_pkg { map { $_ => $p->{$_} } @{$fields{$svcdb}} } ); - if ( $svcdb eq 'svc_acct' ) { + if ( $svcdb eq 'svc_acct' && exists($p->{"snarf_machine1"}) ) { my @acct_snarf; my $snarfnum = 1; while ( length($p->{"snarf_machine$snarfnum"}) ) { @@ -1282,7 +1364,7 @@ sub order_pkg { tie my %hash, 'Tie::RefHash'; %hash = ( $cust_pkg => \@svc ); #msgcat - $error = $cust_main->order_pkgs( \%hash, '', 'noexport' => 1 ); + $error = $cust_main->order_pkgs( \%hash, 'noexport' => 1 ); return { 'error' => $error } if $error; my $conf = new FS::Conf; @@ -1410,7 +1492,7 @@ sub _do_bop_realtime { my $bill_error = $cust_main->bill || $cust_main->apply_payments_and_credits - || $cust_main->realtime_collect; + || $cust_main->realtime_collect('selfservice' => 1); if ( $cust_main->balance > $old_balance && $cust_main->balance > 0 @@ -1548,6 +1630,54 @@ sub cancel_pkg { } +sub provision_phone { + my $p = shift; + my @bulkdid; + @bulkdid = @{$p->{'bulkdid'}} if $p->{'bulkdid'}; + +# single DID LNP + unless($p->{'lnp'}) { + $p->{'lnp_desired_due_date'} = parse_datetime($p->{'lnp_desired_due_date'}); + $p->{'lnp_status'} = "portingin"; + return _provision( 'FS::svc_phone', + [qw(lnp_desired_due_date lnp_other_provider + lnp_other_provider_account phonenum countrycode lnp_status)], + [qw(phonenum countrycode)], + $p, + @_ + ); + } + +# single DID order + unless (scalar(@bulkdid)) { + return _provision( 'FS::svc_phone', + [qw(phonenum countrycode)], + [qw(phonenum countrycode)], + $p, + @_ + ); + } + +# bulk DID order case + my $error; + foreach my $did ( @bulkdid ) { + $did =~ s/[^0-9]//g; + $error = _provision( 'FS::svc_phone', + [qw(phonenum countrycode)], + [qw(phonenum countrycode)], + { + 'pkgnum' => $p->{'pkgnum'}, + 'svcpart' => $p->{'svcpart'}, + 'phonenum' => $did, + 'countrycode' => $p->{'countrycode'}, + 'session_id' => $p->{'session_id'}, + } + ); + return $error if ($error->{'error'} && length($error->{'error'}) > 1); + } + { 'bulkdid' => [ @bulkdid ], 'svc' => $error->{'svc'} } +} + sub provision_acct { my $p = shift; warn "provision_acct called\n" @@ -1907,16 +2037,24 @@ sub get_ticket { # the requested ticket was actually linked to this customer my @custs = @{$err_or_ticket->{'custs'}}; my @txns = @{$err_or_ticket->{'txns'}}; + my @filtered_txns; return { 'error' => 'no customer' } unless ( $custnum && scalar(@custs) ); return { 'error' => 'invalid ticket requested' } unless grep($_ eq $custnum, @custs); + foreach my $txn ( @txns ) { + push @filtered_txns, $txn + if ($txn->{'type'} eq 'EmailRecord' + || $txn->{'type'} eq 'Correspond' + || $txn->{'type'} eq 'Create'); + } + warn "$me get_ticket: sucessful: \n" if $DEBUG; return { 'error' => '', - 'transactions' => \@txns, + 'transactions' => \@filtered_txns, 'ticket_id' => $p->{'ticket_id'}, }; } else {