use FS::ClientAPI_SessionCache;
use FS::cust_svc;
use FS::svc_acct;
+use FS::svc_forward;
use FS::svc_domain;
use FS::svc_phone;
use FS::svc_external;
)
),
( map { $_ => $conf->exists("selfservice-$_", $agentnum ) }
- qw( menu_skipblanks menu_skipheadings menu_nounderline )
+ qw( menu_skipblanks menu_skipheadings menu_nounderline no_logo )
),
( map { $_ => scalar($conf->config_binary("selfservice-$_", $agentnum)) }
qw( title_left_image title_right_image
$p->{'payinfo1'} =~ /^([\dx]+)$/
or return { 'error' => "illegal account number ". $p->{'payinfo1'} };
my $payinfo1 = $1;
- $p->{'payinfo2'} =~ /^([\dx\.]+)$/ # . turned on by -require-bank-branch?
+ $p->{'payinfo2'} =~ /^([\dx\.]+)$/ # . turned on by echeck-country CA ?
or return { 'error' => "illegal ABA/routing number ". $p->{'payinfo2'} };
my $payinfo2 = $1;
$payinfo = $payinfo1. '@'. $payinfo2;
$payinfo = $p->{'payinfo'};
- #more intelligent mathing will be needed here if you change
+ #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 ( $validate->{'save'} ) {
my $new = new FS::cust_main { $cust_main->hash };
- if ($validate->{'payby'} eq 'CARD' || $validate->{'payby'} eq 'DCRD') {
+ if ($payby eq 'CARD' || $payby eq 'DCRD') {
$new->set( $_ => $validate->{$_} )
foreach qw( payname paystart_month paystart_year payissue payip
address1 address2 city state zip country );
return { 'error' => '',
'invnum' => $invnum,
- 'invoice_pdf' => $cust_bill->print_pdf( { unsquelch_cdr => 1 } ),
+ 'invoice_pdf' => $cust_bill->print_pdf({
+ 'unsquelch_cdr' => 1,
+ 'locale' => $p->{'locale'},
+ }),
};
}
my $legacyinvnum = $p->{'legacyinvnum'};
- my $legacy_cust_bill = qsearchs('legacy_cust_bill', {
+ my %hash = (
'legacyinvnum' => $legacyinvnum,
'custnum' => $custnum,
- }) or return { 'error' => "Can't find legacyinvnum" };
+ );
+
+ my $legacy_cust_bill =
+ qsearchs('legacy_cust_bill', { %hash, 'locale' => $p->{'locale'} } )
+ || qsearchs('legacy_cust_bill', \%hash )
+ or return { 'error' => "Can't find legacyinvnum" };
#my %return;
my @legacy_cust_bill = $cust_main->legacy_cust_bill;
- my @cust_bill = $cust_main->cust_bill;
-
- my $hide_taxclass = $conf->config('selfservice-hide_invoices-taxclass');
- if ( $hide_taxclass ) {
- @cust_bill = grep { my @cust_bill_pkg = $_->cust_bill_pkg;
- my @part_pkg= grep $_, map $_->part_pkg, @cust_bill_pkg;
- grep { $_->taxclass ne $hide_taxclass } @part_pkg;
- }
- @cust_bill;
- }
+ my @cust_bill = grep ! $_->hide, $cust_main->cust_bill;
my $balance = 0;
next if $pkgnum && $cust_pkg->pkgnum != $pkgnum;
push @cust_svc, @{[ $cust_pkg->cust_svc ]}; #@{[ ]} to force array context
}
+
+ @cust_svc = grep { $_->part_svc->selfservice_access ne 'hidden' } @cust_svc;
+
if ( $p->{'svcdb'} ) {
my $svcdb = ref($p->{'svcdb'}) eq 'HASH'
? $p->{'svcdb'}
map {
my $svc_x = $_->svc_x;
my($label, $value) = $_->label;
- my $svcdb = $_->part_svc->svcdb;
+ my $part_svc = $_->part_svc;
+ my $svcdb = $part_svc->svcdb;
my $cust_pkg = $_->cust_pkg;
my $part_pkg = $cust_pkg->part_pkg;
'label' => $label,
'value' => $value,
'pkg_status' => $cust_pkg->status,
+ 'readonly' => ( $part_svc->selfservice_access eq 'readonly' ),
);
if ( $svcdb eq 'svc_acct' ) {
}
sub _customer_svc_x {
- my($custnum, $svcnum, $table) = @_;
+ my($custnum, $svcnum, $table) = (shift, shift, shift);
+ my $hashref = ref($svcnum) ? $svcnum : { 'svcnum' => $svcnum };
$custnum =~ /^(\d+)$/ or die "illegal custnum";
my $search = " AND custnum = $1";
'addl_from' => 'LEFT JOIN cust_svc USING ( svcnum ) '.
'LEFT JOIN cust_pkg USING ( pkgnum ) ',#.
#'LEFT JOIN cust_main USING ( custnum ) ',
- 'hashref' => { 'svcnum' => $svcnum, },
+ 'hashref' => $hashref,
'extra_sql' => $search, #important
} );
my($context, $session, $custnum) = _custoragent_session_custnum($p);
return { 'error' => $session } if $context eq 'error';
- my $svc_x = _customer_svc_x( $custnum, $p->{'svcnum'})
+ #XXX only svc_dsl for now
+ my $svc_x = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_dsl')
or return { 'error' => "Service not found" };
my $html = $svc_x->getstatus_html;
}
+sub acct_forward_info {
+ my $p = shift;
+
+ my($context, $session, $custnum) = _custoragent_session_custnum($p);
+ return { 'error' => $session } if $context eq 'error';
+
+ my $svc_forward = _customer_svc_x( $custnum,
+ { 'srcsvc' => $p->{'svcnum'} },
+ 'svc_forward',
+ )
+ or return { 'error' => '',
+ 'dst' => '',
+ };
+
+ return { 'error' => '',
+ 'dst' => $svc_forward->dst || $svc_forward->dstsvc_acct->email,
+ };
+
+}
+
+sub process_acct_forward {
+ my $p = shift;
+ my($context, $session, $custnum) = _custoragent_session_custnum($p);
+ return { 'error' => $session } if $context eq 'error';
+
+ my $old = _customer_svc_x( $custnum,
+ { 'srcsvc' => $p->{'svcnum'} },
+ 'svc_forward',
+ );
+
+ if ( $p->{'dst'} eq '' ) {
+ if ( $old ) {
+ my $error = $old->delete;
+ return { 'error' => $error };
+ }
+ return { 'error' => '' };
+ }
+
+ my $new = new FS::svc_forward { 'srcsvc' => $p->{'svcnum'},
+ 'dst' => $p->{'dst'},
+ };
+
+ my $error;
+ if ( $old ) {
+ $new->svcnum($old->svcnum);
+ my $cust_svc = $old->cust_svc;
+ $new->svcpart($old->svcpart);
+ $new->pkgnuym($old->pkgnum);
+ $error = $new->replace($old);
+ } else {
+ my $conf = new FS::Conf;
+ $new->svcpart($conf->config('selfservice-svc_forward_svcpart'));
+
+ my $svc_acct = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_acct' )
+ or return { 'error' => 'No service' }; #how would we even get here?
+
+ $new->pkgnum( $svc_acct->cust_svc->pkgnum );
+
+ $error = $new->insert;
+ }
+
+ return { 'error' => $error };
+
+}
+
sub list_dsl_devices {
my $p = shift;
}
sub _list_cdr_usage {
- my($svc_phone, $begin, $end) = @_;
- map [ $_->downstream_csv('format' => 'default', 'keeparray' => 1) ], #XXX config for format
- $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, );
+ # XXX CDR type support...
+ my($svc_phone, $begin, $end, %opt) = @_;
+ map [ $_->downstream_csv(%opt, 'keeparray' => 1) ],
+ $svc_phone->get_cdrs( 'begin'=>$begin, 'end'=>$end, );
}
sub list_cdr_usage {
return { 'error' => 'No service selected in list_svc_usage' }
unless $svc_x;
- my $header = $svcdb eq 'svc_phone'
- ? [ split(',', FS::cdr::invoice_header('default') ) ] #XXX
- : [];
-
my $cust_pkg = $svc_x->cust_svc->cust_pkg;
my $freq = $cust_pkg->part_pkg->freq;
+ my %callback_opt;
+ my $header = [];
+ if ( $svcdb eq 'svc_phone' ) {
+ my $format = $cust_pkg->part_pkg->option('output_format') || '';
+ $format = '' if $format =~ /^sum_/;
+ # sensible default if there is no format or it's a summary format
+ if ( $cust_pkg->part_pkg->plan eq 'voip_inbound' ) {
+ $format ||= 'source_default';
+ $callback_opt{inbound} = 1;
+ }
+ else {
+ $format ||= 'default';
+ }
+
+ $callback_opt{format} = $format;
+ $header = [ split(',', FS::cdr::invoice_header($format) ) ];
+ }
+
my $start = $cust_pkg->setup;
#my $end = $cust_pkg->bill; # or time?
my $end = time;
$p->{ending} = $end;
}
- my (@usage) = &$callback($svc_x, $p->{beginning}, $p->{ending});
+ my (@usage) = &$callback($svc_x, $p->{beginning}, $p->{ending},
+ %callback_opt
+ );
#kinda false laziness with FS::cust_main::bill, but perhaps
#we should really change this bit to DateTime and DateTime::Duration