'key' => 'finance_pkgclass',
'section' => 'billing',
'description' => 'The package class for finance charges',
- 'type' => 'select-sub',
- 'options_sub' => sub { require FS::Record;
- require FS::pkg_class;
- map { $_->classnum => $_->classname }
- FS::Record::qsearch('pkg_class', {} );
- },
- 'option_sub' => sub { require FS::Record;
- require FS::pkg_class;
- my $pkg_class = FS::Record::qsearchs(
- 'pkg_class', { 'classnum'=>shift }
- );
- $pkg_class ? $pkg_class->classname : '';
- },
+ 'type' => 'select-pkg_class',
},
{
'key' => 'signup_server-classnum2',
'section' => '',
'description' => 'Package Class for first optional purchase',
- 'type' => 'select-sub',
- 'options_sub' => sub { require FS::Record;
- require FS::pkg_class;
- map { $_->classnum => $_->classname }
- FS::Record::qsearch('pkg_class', {} );
- },
- 'option_sub' => sub { require FS::Record;
- require FS::pkg_class;
- my $pkg_class = FS::Record::qsearchs(
- 'pkg_class', { 'classnum'=>shift }
- );
- $pkg_class ? $pkg_class->classname : '';
- },
+ 'type' => 'select-pkg_class',
},
{
'key' => 'signup_server-classnum3',
'section' => '',
'description' => 'Package Class for second optional purchase',
- 'type' => 'select-sub',
- 'options_sub' => sub { require FS::Record;
- require FS::pkg_class;
- map { $_->classnum => $_->classname }
- FS::Record::qsearch('pkg_class', {} );
- },
- 'option_sub' => sub { require FS::Record;
- require FS::pkg_class;
- my $pkg_class = FS::Record::qsearchs(
- 'pkg_class', { 'classnum'=>shift }
- );
- $pkg_class ? $pkg_class->classname : '';
- },
+ 'type' => 'select-pkg_class',
},
{
'type' => 'checkbox',
},
+ {
+ 'key' => 'breakage-days',
+ 'section' => 'billing',
+ 'description' => 'If set to a number of days, after an account goes that long without activity, recognizes any outstanding payments and credits as "breakage" by creating a breakage charge and invoice.',
+ 'type' => 'text',
+ 'per_agent' => 1,
+ },
+
+ {
+ 'key' => 'breakage-pkg_class',
+ 'section' => 'billing',
+ 'description' => 'Package class to use for breakage reconciliation.',
+ 'type' => 'select-pkg_class',
+ },
+
+
{ key => "apacheroot", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
{ key => "apachemachine", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
{ key => "apachemachines", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
--- /dev/null
+package FS::Cron::breakage;
+
+use strict;
+use base 'Exporter';
+use vars qw( @EXPORT_OK );
+use FS::Conf;
+use FS::Record qw(qsearch);
+use FS::agent;
+#use FS::cust_main;
+
+@EXPORT_OK = qw ( reconcile_breakage );
+
+#freeside-daily %opt
+# -v: enable debugging
+# -l: debugging level
+
+sub reconcile_breakage {
+ return;
+ #nothing yet
+
+ my $conf = new FS::Conf;
+
+ foreach my $agent (qsearch('agent', {})) {
+
+ my $days = $conf->config('breakage-days', $agent->agentnum)
+ or next;
+
+ #find customers w/a balance older than $days (and no activity since)
+
+ # - do a one time charge in the total amount of old unapplied payments.
+ # 'pkg' => 'Breakage', #or whatever.
+ # 'setuptax' => 'Y',
+ # 'classnum' => scalar($conf->config('breakage-pkg_class')),
+ # - use the new $cust_main->charge( 'bill_now' => 1 ) option to generate an invoice, etc.
+ # - apply_payments_and_credits
+
+ }
+
+}
+
+1;
}
} elsif (
$type =~ /^(editlist|selectmultiple)$/
- or ( $type =~ /^select(-(sub|part_svc|part_pkg))?$/ || $i->multiple )
+ or ( $type =~ /^select(-(sub|part_svc|part_pkg|pkg_class))?$/
+ || $i->multiple )
) {
if ( scalar(@{[ $cgi->param($i->key.$n) ]}) ) {
$conf->set($i->key, join("\n", @{[ $cgi->param($i->key.$n) ]} ), $agentnum);
} else {
$conf->delete($i->key, $agentnum);
}
- } elsif ( $type =~ /^(text|select(-(sub|part_svc|part_pkg))?)$/ ) {
+ } elsif ( $type =~ /^(text|select(-(sub|part_svc|part_pkg|pkg_class))?)$/ ) {
if ( $cgi->param($i->key.$n) ne '' ) {
$conf->set($i->key, $cgi->param($i->key.$n), $agentnum);
} else {
% } elsif ( $type eq 'text' || $type eq 'select' ) {
configCell.innerHTML = <% $conf->exists($i->key, $agentnum) ? $conf->config($i->key, $agentnum) : '' |js_string %>;
-% } elsif ( $type =~ /^select-(part_svc|part_pkg)$/ && ! $i->multiple ) {
+% } elsif ( $type =~ /^select-(part_svc|part_pkg|pkg_class)$/ && ! $i->multiple ) {
configCell.innerHTML =
<% $conf->config($i->key, $agentnum) |js_string %>
%# + ': ' +