[freeside-commits] freeside/FS/FS/ClientAPI MyAccount.pm,1.48,1.49

Jeff Finucane,420,, jeff at wavetail.420.am
Thu Jan 4 21:19:37 PST 2007


Update of /home/cvs/cvsroot/freeside/FS/FS/ClientAPI
In directory wavetail:/tmp/cvs-serv27044/FS/FS/ClientAPI

Modified Files:
	MyAccount.pm 
Log Message:
more self-servicey stuff (change package, detailed usage)

Index: MyAccount.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/ClientAPI/MyAccount.pm,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -d -r1.48 -r1.49
--- MyAccount.pm	20 Dec 2006 01:20:18 -0000	1.48
+++ MyAccount.pm	5 Jan 2007 05:19:35 -0000	1.49
@@ -24,6 +24,14 @@
 use FS::cust_pkg;
 use HTML::Entities;
 
+#false laziness with FS::cust_main
+BEGIN {
+  eval "use Time::Local;";
+  die "Time::Local minimum version 1.05 required with Perl versions before 5.6"
+    if $] < 5.006 && !defined($Time::Local::VERSION);
+  eval "use Time::Local qw(timelocal_nocheck);";
+}
+
 use vars qw( @cust_main_editable_fields );
 @cust_main_editable_fields = qw(
   first last company address1 address2 city
@@ -538,8 +546,6 @@
 sub list_svcs {
   my $p = shift;
 
-  use Data::Dumper;
-
   my($context, $session, $custnum) = _custoragent_session_custnum($p);
   return { 'error' => $session } if $context eq 'error';
 
@@ -592,6 +598,85 @@
 
 }
 
+sub list_svc_usage {
+  my $p = shift;
+
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
+
+  my $search = { 'svcnum' => $p->{'svcnum'} };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $svc_acct = qsearchs ( 'svc_acct', $search );
+  return { 'error' => 'No service selected in list_svc_usage' } 
+    unless $svc_acct;
+
+  my $freq   = $svc_acct->cust_svc->cust_pkg->part_pkg->freq;
+  my $start  = $svc_acct->cust_svc->cust_pkg->setup;
+  my $end    = $svc_acct->cust_svc->cust_pkg->bill; # or time?
+
+  unless($p->{beginning}){
+    $p->{beginning} = $svc_acct->cust_svc->cust_pkg->last_bill;
+    $p->{ending} = $end;
+  }
+  my @usage = ();
+
+  foreach my $part_export ( 
+    map { qsearch ( 'part_export', { 'exporttype' => $_ } ) }
+    qw (sqlradius sqlradius_withdomain')
+  ) {
+
+    push @usage, @ { $part_export->usage_sessions($p->{beginning},
+                                                  $p->{ending},
+                                                  $svc_acct)
+                   };
+  }
+
+  #kinda false laziness with FS::cust_main::bill, but perhaps
+  #we should really change this bit to DateTime and DateTime::Duration
+  #
+  #change this bit to use Date::Manip? CAREFUL with timezones (see
+  # mailing list archive)
+  my ($nsec,$nmin,$nhour,$nmday,$nmon,$nyear) =
+    (localtime($p->{ending}) )[0,1,2,3,4,5];
+  my ($psec,$pmin,$phour,$pmday,$pmon,$pyear) =
+    (localtime($p->{beginning}) )[0,1,2,3,4,5];
+
+  if ( $freq =~ /^\d+$/ ) {
+    $nmon += $freq;
+    until ( $nmon < 12 ) { $nmon -= 12; $nyear++; }
+    $pmon -= $freq;
+    until ( $pmon >= 0 ) { $pmon += 12; $pyear--; }
+  } elsif ( $freq =~ /^(\d+)w$/ ) {
+    my $weeks = $1;
+    $nmday += $weeks * 7;
+    $pmday -= $weeks * 7;
+  } elsif ( $freq =~ /^(\d+)d$/ ) {
+    my $days = $1;
+    $nmday += $days;
+    $pmday -= $days;
+  } elsif ( $freq =~ /^(\d+)h$/ ) {
+    my $hours = $1;
+    $nhour += $hours;
+    $phour -= $hours;
+  } else {
+    return { 'error' => "unparsable frequency: ". $freq };
+  }
+  
+  my $previous  = timelocal_nocheck($psec,$pmin,$phour,$pmday,$pmon,$pyear);
+  my $next      = timelocal_nocheck($nsec,$nmin,$nhour,$nmday,$nmon,$nyear);
+
+
+  { 
+    'error'     => '',
+    'svcnum'    => $p->{svcnum},
+    'beginning' => $p->{beginning},
+    'ending'    => $p->{ending},
+    'previous'  => ($previous > $start) ? $previous : $start,
+    'next'      => ($next < $end) ? $next : $end,
+    'usage'     => \@usage,
+  };
+}
+
 sub order_pkg {
   my $p = shift;
 
@@ -674,23 +759,11 @@
   my $conf = new FS::Conf;
   if ( $conf->exists('signup_server-realtime') ) {
 
-    my $old_balance = $cust_main->balance;
-
-    my $bill_error = $cust_main->bill;
-    $cust_main->apply_payments;
-    $cust_main->apply_credits;
-    $bill_error = $cust_main->collect('realtime' => 1);
-
-    if (    $cust_main->balance > $old_balance
-         && $cust_main->balance > 0
-         && $cust_main->payby !~ /^(BILL|DCRD|DCHK)$/ ) {
-      #this makes sense.  credit is "un-doing" the invoice
-      $cust_main->credit( sprintf("%.2f", $cust_main->balance - $old_balance ),
-                          'self-service decline' );
-      $cust_main->apply_credits( 'order' => 'newest' );
+    my $bill_error = _do_bop_realtime( $cust_main );
 
+    if ($bill_error) {
       $cust_pkg->cancel('quiet'=>1);
-      return { 'error' => '_decline', 'bill_error' => $bill_error };
+      return $bill_error;
     } else {
       $cust_pkg->reexport;
     }
@@ -703,6 +776,47 @@
 
 }
 
+sub change_pkg {
+  my $p = shift;
+
+  my($context, $session, $custnum) = _custoragent_session_custnum($p);
+  return { 'error' => $session } if $context eq 'error';
+
+  my $search = { 'custnum' => $custnum };
+  $search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
+  my $cust_main = qsearchs('cust_main', $search )
+    or return { 'error' => "unknown custnum $custnum" };
+
+  my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $p->{pkgnum} } )
+    or return { 'error' => "unknown package $p->{pkgnum}" };
+
+  my @newpkg;
+  my $error = FS::cust_pkg::order( $custnum,
+                                   [$p->{pkgpart}],
+                                   [$p->{pkgnum}],
+                                   \@newpkg,
+                                 );
+
+  my $conf = new FS::Conf;
+  if ( $conf->exists('signup_server-realtime') ) {
+
+    my $bill_error = _do_bop_realtime( $cust_main );
+
+    if ($bill_error) {
+      $newpkg[0]->suspend;
+      return $bill_error;
+    } else {
+      $newpkg[0]->reexport;
+    }
+
+  } else {  
+    $newpkg[0]->reexport;
+  }
+
+  return { error => '', pkgnum => $cust_pkg->pkgnum };
+
+}
+
 sub order_recharge {
   my $p = shift;
 
@@ -726,8 +840,6 @@
          recharge_totalbytes );
   my $amount = $part_pkg->option('recharge_amount', 1); 
   
-  my $old_balance = $cust_main->balance;
-
   my ($l, $v, $d) = $cust_svc->label;  # blah
   my $pkg = "Recharge $v"; 
 
@@ -739,13 +851,36 @@
   my $conf = new FS::Conf;
   if ( $conf->exists('signup_server-realtime') && !$bill_error ) {
 
-    $bill_error = $cust_main->bill;
+    $bill_error = _do_bop_realtime( $cust_main );
+
+    if ('bill_error') {
+      return $bill_error;
+    } else {
+      my $error = $svc_x->recharge (\%vhash);
+      return { 'error' => $error } if $error;
+    }
+
+  } else {  
+    my $error = $bill_error;
+    $error ||= $svc_x->recharge (\%vhash);
+    return { 'error' => $error } if $error;
+  }
+
+  return { error => '', svc => $cust_svc->part_svc->svc };
+
+}
+
+sub _do_bop_realtime {
+  my ($cust_main) = @_;
+
+    my $old_balance = $cust_main->balance;
+
+    my $bill_error = $cust_main->bill;
 
     $cust_main->apply_payments;
     $cust_main->apply_credits;
     $bill_error = $cust_main->collect('realtime' => 1);
 
-    #false laziness with order_pkg
     if (    $cust_main->balance > $old_balance
          && $cust_main->balance > 0
          && $cust_main->payby !~ /^(BILL|DCRD|DCHK)$/ ) {
@@ -754,20 +889,10 @@
                           'self-service decline' );
       $cust_main->apply_credits( 'order' => 'newest' );
 
-      return { 'error' => '_decline', 'bill_error' => encode_entities($bill_error) };
-    } else {
-      my $error = $svc_x->recharge (\%vhash);
-      return { 'error' => $error } if $error;
+      return { 'error' => '_decline', 'bill_error' => $bill_error };
     }
 
-  } else {  
-    my $error = $bill_error;
-    $error ||= $svc_x->recharge (\%vhash);
-    return { 'error' => $error } if $error;
-  }
-
-  return { error => '', svc => $cust_svc->part_svc->svc };
-
+    '';
 }
 
 sub cancel_pkg {



More information about the freeside-commits mailing list