use FS::Misc qw(card_types);
use FS::Misc::DateTime qw(parse_datetime);
use FS::ClientAPI_SessionCache;
+use FS::cust_svc;
use FS::svc_acct;
use FS::svc_domain;
use FS::svc_phone;
$return{balance} = $cust_main->balance;
}
- $return{tickets} = [ ($cust_main->tickets) ];
+ my @tickets = $cust_main->tickets;
+ # unavoidable false laziness w/ httemplate/view/cust_main/tickets.html
+ if ( FS::TicketSystem->selfservice_priority ) {
+ my $dir = $conf->exists('ticket_system-priority_reverse') ? -1 : 1;
+ $return{tickets} = [
+ sort {
+ (
+ ($a->{'_selfservice_priority'} eq '') <=>
+ ($b->{'_selfservice_priority'} eq '')
+ ) ||
+ ( $dir *
+ ($b->{'_selfservice_priority'} <=> $a->{'_selfservice_priority'})
+ )
+ } @tickets
+ ];
+ }
+ else {
+ $return{tickets} = \@tickets;
+ }
unless ( $session->{'pkgnum'} ) {
my @open = map {
$return{discount_terms_hash} = { $cust_main->discount_terms_hash };
}
+ if ( $session->{'svcnum'} ) {
+ my $cust_svc = qsearchs('cust_svc', { 'svcnum' => $session->{'svcnum'} });
+ $return{'svc_label'} = ($cust_svc->label)[1] if $cust_svc;
+ }
+
} elsif ( $session->{'svcnum'} ) { #no customer record
my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $session->{'svcnum'} } )
if $cust_main->paymask eq $payinfo;
$payinfo =~ s/\D//g;
- $payinfo =~ /^(\d{13,16})$/
+ $payinfo =~ /^(\d{13,16}|\d{8,9})$/
or return { 'error' => gettext('invalid_card') }; # . ": ". $self->payinfo
$payinfo = $1;
}
+sub invoice_pdf {
+ my $p = shift;
+ my $session = _cache->get($p->{'session_id'})
+ or return { 'error' => "Can't resume session" }; #better error message
+
+ my $custnum = $session->{'custnum'};
+
+ my $invnum = $p->{'invnum'};
+
+ my $cust_bill = qsearchs('cust_bill', { 'invnum' => $invnum,
+ 'custnum' => $custnum } )
+ or return { 'error' => "Can't find invnum" };
+
+ #my %return;
+
+ return { 'error' => '',
+ 'invnum' => $invnum,
+ 'invoice_pdf' => $cust_bill->print_pdf( { unsquelch_cdr => 1 } ),
+ };
+
+}
+
sub invoice_logo {
my $p = shift;
my @cust_bill = $cust_main->cust_bill;
+ my $balance = 0;
+
return { 'error' => '',
- 'invoices' => [ map { { 'invnum' => $_->invnum,
- '_date' => $_->_date,
- 'date' => time2str("%b %o, %Y", $_->_date),
- }
- } @cust_bill
- ]
+ 'invoices' => [
+ map {
+ my $owed = $_->owed;
+ $balance += $owed;
+ +{ 'invnum' => $_->invnum,
+ '_date' => $_->_date,
+ 'date' => time2str("%b %o, %Y", $_->_date),
+ 'date_short' => time2str("%m-%d-%Y", $_->_date),
+ 'previous' => sprintf('%.2f', ($_->previous)[0]),
+ 'charged' => sprintf('%.2f', $_->charged),
+ 'owed' => sprintf('%.2f', $owed),
+ 'balance' => sprintf('%.2f', $balance),
+ }
+ }
+ @cust_bill
+ ]
};
}
{ 'svcnum' => $session->{'svcnum'},
'custnum' => $custnum,
'cust_pkg' => [ map {
- { $_->hash,
+ my $primary_cust_svc = $_->primary_cust_svc;
+ +{ $_->hash,
$_->part_pkg->hash,
+ status => $_->status,
part_svc =>
[ map $_->hashref, $_->available_part_svc ],
cust_svc =>
if $context eq 'agent'
&& $conf->exists('agent-showpasswords')
&& $_->part_svc->svcdb eq 'svc_acct';
+ $ref->{svchash} = { $_->svc_x->hash } if
+ $_->part_svc->svcdb eq 'svc_phone';
+ $ref->{svchash}->{svcpart} = $_->part_svc->svcpart
+ if $_->part_svc->svcdb eq 'svc_phone'; # hack
$ref;
} $_->cust_svc
],
+ primary_cust_svc =>
+ $primary_cust_svc
+ ? { $primary_cust_svc->hash,
+ label => [ $primary_cust_svc->label ],
+ finger => $primary_cust_svc->svc_x->finger, #uuh
+ $primary_cust_svc->part_svc->hash,
+ }
+ : {}, #'' ?
};
} $cust_main->ncancelled_pkgs
],
'svc_domain' => [ qw( domain ) ],
'svc_phone' => [ qw( phonenum pin sip_password phone_name ) ],
'svc_external' => [ qw( id title ) ],
- 'svc_pbx' => [ qw( id name ) ],
+ 'svc_pbx' => [ qw( id title ) ],
);
my $svc_x = "FS::$svcdb"->new( {
my @bulkdid;
@bulkdid = @{$p->{'bulkdid'}} if $p->{'bulkdid'};
+ if($p->{'svcnum'} && $p->{'svcnum'} =~ /^\d+$/){
+ my($context, $session, $custnum) = _custoragent_session_custnum($p);
+ return { 'error' => $session } if $context eq 'error';
+
+ my $svc_phone = qsearchs('svc_phone', { svcnum => $p->{'svcnum'} });
+ return { 'error' => 'service not found' } unless $svc_phone;
+ return { 'error' => 'invalid svcnum' }
+ if $svc_phone && $svc_phone->cust_svc->cust_pkg->custnum != $custnum;
+
+ $svc_phone->email($p->{'email'})
+ if $svc_phone->email ne $p->{'email'} && $p->{'email'} =~ /^([\w\.\d@]+|)$/;
+ $svc_phone->forwarddst($p->{'forwarddst'})
+ if $svc_phone->forwarddst ne $p->{'forwarddst'}
+ && $p->{'forwarddst'} =~ /^(\d+|)$/;
+ return { 'error' => $svc_phone->replace };
+ }
+
# single DID LNP
unless($p->{'lnp'}) {
$p->{'lnp_desired_due_date'} = parse_datetime($p->{'lnp_desired_due_date'});
my $conf = new FS::Conf;
- return {
+ my $ret = {
'svc' => $part_svc->svc,
'svcdb' => $part_svc->svcdb,
'pkgnum' => $pkgnum,
};
+ if ($p->{'svcnum'} && $p->{'svcnum'} =~ /^\d+$/
+ && $ret->{'svcdb'} eq 'svc_phone') {
+ $ret->{'svcnum'} = $p->{'svcnum'};
+ my $svc_phone = qsearchs('svc_phone', { svcnum => $p->{'svcnum'} });
+ if ( $svc_phone && $svc_phone->cust_svc->cust_pkg->custnum == $custnum ) {
+ $ret->{'email'} = $svc_phone->email;
+ $ret->{'forwarddst'} = $svc_phone->forwarddst;
+ }
+ }
+
+ $ret;
}
sub unprovision_svc {