diff options
Diffstat (limited to 'FS/bin/freeside-prepaidd')
| -rw-r--r-- | FS/bin/freeside-prepaidd | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/FS/bin/freeside-prepaidd b/FS/bin/freeside-prepaidd new file mode 100644 index 000000000..86bfe8794 --- /dev/null +++ b/FS/bin/freeside-prepaidd @@ -0,0 +1,106 @@ +#!/usr/bin/perl -w + +use strict; +use FS::Daemon qw(daemonize1 drop_root logfile daemonize2 sigint sigterm); +use FS::UID qw(adminsuidsetup); +use FS::Record qw(qsearch qsearchs); +use FS::cust_pkg; + +my $user = shift or die &usage; + +#daemonize1('freeside-sprepaidd', $user); #keep unique pid files w/multi installs +daemonize1('freeside-prepaidd'); + +drop_root(); + +adminsuidsetup($user); + +logfile( "%%%FREESIDE_LOG%%%/prepaidd-log.". $FS::UID::datasrc ); + +daemonize2(); + +#-- + +while (1) { + +  foreach my $cust_pkg (  +    qsearch( { +      'select'    => 'cust_pkg.*, part_pkg.plan', +      'table'     => 'cust_pkg', +      'addl_from' => 'LEFT JOIN part_pkg USING ( pkgpart )', +      #'hashref'   => { 'plan' => 'prepaid' },#should check part_pkg::is_prepaid +      #'extra_sql' => "AND bill < ". time. +      'hashref'   => {}, +      'extra_sql' => "WHERE plan = 'prepaid' AND bill < ". time. +                     " AND bill IS NOT NULL". +                     " AND ( susp   IS NULL OR susp   = 0)". +                     " AND ( cancel IS NULL OR cancel = 0)" +    } ) +  ) { + +    my $work_cust_pkg = $cust_pkg; + +    my $cust_main = $cust_pkg->cust_main; +    if (    $cust_main->total_unapplied_payments > 0 +         or $cust_main->total_credited > 0 +       ) +    { +      #this needs a flag to say only do the prepaid packages...  +      # and only try em if the renewal price matches.. but this will do for now +      my $b_error = $cust_main->bill; +      if ( $b_error ) { +        warn "Error billing customer #". $cust_main->custnum; +	next; +      } +      $b_error = $cust_main->apply_payments_and_credits; +      if ( $b_error ) { +        warn "Error applying payments&credits, customer #". $cust_main->custnum; +	next; +      } + +      $work_cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $work_cust_pkg->pkgnum } ); + +      next +        if  $cust_main->balance <= 0  +        and $work_cust_pkg->bill >= time; +    } + +    my $action = $work_cust_pkg->part_pkg->option('recur_action') || 'suspend'; + +    my $error = $work_cust_pkg->$action(); + +    warn "Error ${action}ing package ". $work_cust_pkg->pkgnum. +         " for custnum ". $work_cust_pkg->custnum. +         ": $error\n" +      if $error; +  } + +  die "exiting" if sigterm() || sigint(); +  sleep 5; + +} + +#-- + +sub usage {  +  die "Usage:\n\n  freeside-prepaidd user\n"; +} + +=head1 NAME + +freeside-prepaidd - Real-time daemon for prepaid packages + +=head1 SYNOPSIS + +  freeside-prepaidd + +=head1 DESCRIPTION + +Runs continuously and suspends or cancels any prepaid customer packages which +have passed their renewal date (next bill date). + +=head1 SEE ALSO + +=cut + +1; | 
