summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
Diffstat (limited to 'FS')
-rw-r--r--FS/FS.pm4
-rw-r--r--FS/FS/ClientAPI/MyAccount.pm10
-rw-r--r--FS/FS/ClientAPI/Signup.pm7
-rw-r--r--FS/FS/Conf.pm132
-rw-r--r--FS/FS/ConfItem.pm2
-rw-r--r--FS/FS/Record.pm187
-rw-r--r--FS/FS/Schema.pm1277
-rw-r--r--FS/FS/TicketSystem.pm4
-rw-r--r--FS/FS/TicketSystem/RT_External.pm149
-rw-r--r--FS/FS/TicketSystem/RT_Internal.pm10
-rw-r--r--FS/FS/UI/Web.pm170
-rw-r--r--FS/FS/agent.pm63
-rw-r--r--FS/FS/agent_payment_gateway.pm139
-rw-r--r--FS/FS/banned_pay.pm136
-rw-r--r--FS/FS/cancel_reason.pm123
-rw-r--r--FS/FS/cust_bill.pm514
-rw-r--r--FS/FS/cust_bill_event.pm10
-rw-r--r--FS/FS/cust_bill_pkg.pm11
-rw-r--r--FS/FS/cust_credit.pm11
-rw-r--r--FS/FS/cust_main.pm592
-rw-r--r--FS/FS/cust_main_Mixin.pm103
-rw-r--r--FS/FS/cust_main_county.pm4
-rw-r--r--FS/FS/cust_pay.pm78
-rw-r--r--FS/FS/cust_pay_refund.pm16
-rw-r--r--FS/FS/cust_pay_void.pm54
-rw-r--r--FS/FS/cust_pkg.pm167
-rw-r--r--FS/FS/cust_refund.pm6
-rw-r--r--FS/FS/cust_svc.pm45
-rw-r--r--FS/FS/domain_record.pm35
-rw-r--r--FS/FS/export_svc.pm4
-rw-r--r--FS/FS/h_cust_svc.pm14
-rw-r--r--FS/FS/option_Common.pm295
-rw-r--r--FS/FS/part_bill_event.pm2
-rw-r--r--FS/FS/part_export.pm140
-rw-r--r--FS/FS/part_export/artera_turbo.pm2
-rw-r--r--FS/FS/part_export/cpanel.pm192
-rw-r--r--FS/FS/part_export/domain_shellcommands.pm1
-rw-r--r--FS/FS/part_export/everyone_net.pm132
-rw-r--r--FS/FS/part_export/forward_shellcommands.pm51
-rw-r--r--FS/FS/part_export/radiator.pm167
-rw-r--r--FS/FS/part_export/shellcommands.pm31
-rw-r--r--FS/FS/part_export/shellcommands_withdomain.pm9
-rw-r--r--FS/FS/part_export/sqlradius.pm10
-rw-r--r--FS/FS/part_export/sqlradius_withdomain.pm2
-rw-r--r--FS/FS/part_export/www_shellcommands.pm1
-rw-r--r--FS/FS/part_export_option.pm2
-rw-r--r--FS/FS/part_pkg.pm17
-rw-r--r--FS/FS/part_pkg/flat.pm33
-rw-r--r--FS/FS/part_pkg/sesmon_hour.pm2
-rw-r--r--FS/FS/part_pkg/sesmon_minute.pm2
-rw-r--r--FS/FS/part_pkg/sql_external.pm2
-rw-r--r--FS/FS/part_pkg/sql_generic.pm2
-rw-r--r--FS/FS/part_pkg/sqlradacct_hour.pm54
-rw-r--r--FS/FS/part_pkg/voip_sqlradacct.pm2
-rw-r--r--FS/FS/part_svc.pm157
-rwxr-xr-xFS/FS/part_virtual_field.pm5
-rw-r--r--FS/FS/payment_gateway.pm147
-rw-r--r--FS/FS/payment_gateway_option.pm126
-rw-r--r--FS/FS/raddb.pm3416
-rw-r--r--FS/FS/rate.pm2
-rw-r--r--FS/FS/svc_Common.pm51
-rw-r--r--FS/FS/svc_acct.pm126
-rw-r--r--FS/MANIFEST18
-rwxr-xr-xFS/bin/freeside-daily13
-rw-r--r--FS/bin/freeside-prepaidd75
-rwxr-xr-xFS/bin/freeside-setup1142
-rw-r--r--FS/bin/freeside-sqlradius-radacctd20
-rwxr-xr-xFS/bin/freeside-sqlradius-reset3
-rwxr-xr-xFS/bin/freeside-upgrade131
-rw-r--r--FS/t/agent_payment_gateway.t5
-rw-r--r--FS/t/banned_pay.t5
-rw-r--r--FS/t/cancel_reason.t5
-rw-r--r--FS/t/cust_main_Mixin.t5
-rw-r--r--FS/t/option_Common.t5
-rw-r--r--FS/t/part_export-radiator.t5
-rw-r--r--FS/t/payment_gateway.t5
-rw-r--r--FS/t/payment_gateway_option.t5
77 files changed, 3419 insertions, 7281 deletions
diff --git a/FS/FS.pm b/FS/FS.pm
index f41245e22..f5b2b96e4 100644
--- a/FS/FS.pm
+++ b/FS/FS.pm
@@ -237,11 +237,11 @@ The main documentation is in httemplate/docs.
=head1 SUPPORT
A mailing list for users is available. Send a blank message to
-<freeside-users-subscribe@sisd.com> to subscribe.
+<ivan-freeside-subscribe@sisd.com> to subscribe.
A mailing list for developers is available. It is intended to be lower volume
and higher SNR than the users list. Send a blank message to
-<freeside-devel-subscribe@sisd.com> to subscribe.
+<ivan-freeside-devel-subscribe@sisd.com> to subscribe.
Commercial support is available; see
<http://www.sisd.com/freeside/commercial.html>.
diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm
index 4b67f53af..45c2eb0de 100644
--- a/FS/FS/ClientAPI/MyAccount.pm
+++ b/FS/FS/ClientAPI/MyAccount.pm
@@ -27,7 +27,7 @@ use vars qw( @cust_main_editable_fields );
county state zip country daytime night fax
ship_first ship_last ship_company ship_address1 ship_address2 ship_city
ship_state ship_zip ship_country ship_daytime ship_night ship_fax
- payby payinfo payname paystart_month paystart_year payissue payip
+ payby payinfo payname
);
use subs qw(_provision);
@@ -226,8 +226,6 @@ sub payment_info {
'MasterCard' => 'MasterCard',
'Discover' => 'Discover card',
'American Express' => 'American Express card',
- 'Switch' => 'Switch',
- 'Solo' => 'Solo',
},
};
@@ -343,8 +341,7 @@ sub process_payment {
'payname' => $payname,
'paybatch' => $paybatch,
'paycvv' => $paycvv,
- map { $_ => $p->{$_} } qw( paystart_month paystart_year payissue payip
- address1 address2 city state zip )
+ map { $_ => $p->{$_} } qw( address1 address2 city state zip )
);
return { 'error' => $error } if $error;
@@ -353,8 +350,7 @@ sub process_payment {
if ( $p->{'save'} ) {
my $new = new FS::cust_main { $cust_main->hash };
$new->set( $_ => $p->{$_} )
- foreach qw( payname paystart_month paystart_year payissue payip
- address1 address2 city state zip payinfo );
+ foreach qw( payname address1 address2 city state zip payinfo );
$new->set( 'paydate' => $p->{'year'}. '-'. $p->{'month'}. '-01' );
$new->set( 'payby' => $p->{'auto'} ? 'CARD' : 'DCRD' );
my $error = $new->replace($cust_main);
diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm
index ed71651fa..ede7ba9a0 100644
--- a/FS/FS/ClientAPI/Signup.pm
+++ b/FS/FS/ClientAPI/Signup.pm
@@ -197,12 +197,7 @@ sub new_customer {
ship_city ship_county ship_state ship_zip ship_country
ship_daytime ship_night ship_fax
- payby
- payinfo paycvv paydate payname
- paystart_month paystart_year payissue
- payip
-
- referral_custnum comments
+ payby payinfo paycvv paydate payname referral_custnum comments
)
} );
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 88dbdf082..d78135ad0 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -512,7 +512,7 @@ httemplate/docs/config.html
{
'key' => 'erpcdmachines',
'section' => 'deprecated',
- 'description' => '<b>DEPRECATED</b>, ERPCD is no longer supported. Used to be ERPCD authentication machines, one per line. This enables export of `/usr/annex/acp_passwd\' and `/usr/annex/acp_dialup\'',
+ 'description' => '<b>DEPRECATED</b>, ERPCD is no longer supported. Used to be ERPCD authenticaion machines, one per line. This enables export of `/usr/annex/acp_passwd\' and `/usr/annex/acp_dialup\'',
'type' => 'textarea',
},
@@ -668,7 +668,7 @@ httemplate/docs/config.html
{
'key' => 'invoice_send_receipts',
- 'section' => 'deprecated',
+ 'section' => 'deprecated',q
'description' => '<b>DEPRECATED</b>, this used to send an invoice copy on payments and credits. See the payment_receipt_email and XXXX instead.',
'type' => 'checkbox',
},
@@ -676,7 +676,7 @@ httemplate/docs/config.html
{
'key' => 'payment_receipt_email',
'section' => 'billing',
- 'description' => 'Template file for payment receipts. Payment receipts are sent to the customer email invoice destination(s) when a payment is received. See the <a href="http://search.cpan.org/~mjd/Text-Template/lib/Text/Template.pm">Text::Template</a> documentation for details on the template substitution language. The following variables are available: <ul><li><code>$date</code> <li><code>$name</code> <li><code>$paynum</code> - Freeside payment number <li><code>$paid</code> - Amount of payment <li><code>$payby</code> - Payment type (Card, Check, Electronic check, etc.) <li><code>$payinfo</code> - Masked credit card number or check number <li><code>$balance</code> - New balance</ul>',
+ 'description' => 'Template file for payment receipts.',
'type' => 'textarea',
},
@@ -1202,13 +1202,6 @@ httemplate/docs/config.html
},
{
- 'key' => 'backend-realtime',
- 'section' => '',
- 'description' => 'Run billing for backend signups immediately.',
- 'type' => 'checkbox',
- },
-
- {
'key' => 'declinetemplate',
'section' => 'billing',
'description' => 'Template file for credit card decline emails.',
@@ -1265,16 +1258,9 @@ httemplate/docs/config.html
},
{
- 'key' => 'require_taxclasses',
- 'section' => 'billing',
- 'description' => 'Require a taxclass to be entered for every package',
- 'type' => 'checkbox',
- },
-
- {
'key' => 'welcome_email',
'section' => '',
- 'description' => 'Template file for welcome email. Welcome emails are sent to the customer email invoice destination(s) each time a svc_acct record is created. See the <a href="http://search.cpan.org/~mjd/Text-Template/lib/Text/Template.pm">Text::Template</a> documentation for details on the template substitution language. The following variables are available<ul><li><code>$username</code> <li><code>$password</code> <li><code>$first</code> <li><code>$last</code> <li><code>$pkg</code></ul>',
+ 'description' => 'Template file for welcome email. Welcome emails are sent to the customer email invoice destination(s) each time a svc_acct record is created. See the <a href="http://search.cpan.org/doc/MJD/Text-Template-1.42/Template.pm">Text::Template</a> documentation for details on the template substitution language. The following variables are available: <code>$username</code>, <code>$password</code>, <code>$first</code>, <code>$last</code> and <code>$pkg</code>.',
'type' => 'textarea',
},
@@ -1301,19 +1287,11 @@ httemplate/docs/config.html
},
{
- 'key' => 'payby',
- 'section' => 'billing',
- 'description' => 'Available payment types.',
- 'type' => 'selectmultiple',
- 'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD COMP) ],
- },
-
- {
'key' => 'payby-default',
'section' => 'UI',
'description' => 'Default payment type. HIDE disables display of billing information and sets customers to BILL.',
'type' => 'select',
- 'select_enum' => [ '', qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD COMP HIDE) ],
+ 'select_enum' => [ '', qw(CARD DCRD CHEK DCHK LECB BILL COMP HIDE) ],
},
{
@@ -1478,7 +1456,7 @@ httemplate/docs/config.html
{
'key' => 'ticket_system',
'section' => '',
- 'description' => 'Ticketing system integration. <b>RT_Internal</b> uses the built-in RT ticketing system (see the <a href="../docs/install-rt">integrated ticketing installation instructions</a>). <b>RT_External</b> accesses an external RT installation in a separate database (local or remote).',
+ 'description' => 'Ticketing system integraiton. <b>RT_Internal</b> uses the built-in RT ticketing system (see the <a href="../docs/install-rt">integrated ticketing installation instructions</a>). <b>RT_External</b> accesses an external RT installation in a separate database (local or remote).',
'type' => 'select',
#'select_enum' => [ '', qw(RT_Internal RT_Libs RT_External) ],
'select_enum' => [ '', qw(RT_Internal RT_External) ],
@@ -1487,28 +1465,8 @@ httemplate/docs/config.html
{
'key' => 'ticket_system-default_queueid',
'section' => '',
- 'description' => 'Default queue used when creating new customer tickets.',
- 'type' => 'select-sub',
- 'options_sub' => sub {
- my $conf = new FS::Conf;
- if ( $conf->config('ticket_system') ) {
- eval "use FS::TicketSystem;";
- die $@ if $@;
- FS::TicketSystem->queues();
- } else {
- ();
- }
- },
- 'option_sub' => sub {
- my $conf = new FS::Conf;
- if ( $conf->config('ticket_system') ) {
- eval "use FS::TicketSystem;";
- die $@ if $@;
- FS::TicketSystem->queue(shift);
- } else {
- '';
- }
- },
+ 'description' => 'Default queue number used when creating new customer tickets.',
+ 'type' => 'text',
},
{
@@ -1533,21 +1491,6 @@ httemplate/docs/config.html
},
{
- 'key' => 'ticket_system-rt_external_datasrc',
- 'section' => '',
- 'description' => 'With external RT integration, the DBI data source for the external RT installation, for example, <code>DBI:Pg:user=rt_user;password=rt_word;host=rt.example.com;dbname=rt</code>',
- 'type' => 'text',
-
- },
-
- {
- 'key' => 'ticket_system-rt_external_url',
- 'section' => '',
- 'description' => 'With external RT integration, the URL for the external RT installation, for example, <code>https://rt.example.com/rt</code>',
- 'type' => 'text',
- },
-
- {
'key' => 'company_name',
'section' => 'required',
'description' => 'Your company name',
@@ -1562,20 +1505,6 @@ httemplate/docs/config.html
},
{
- 'key' => 'cc-void',
- 'section' => 'billing',
- 'description' => 'Enable local-only voiding of credit card payments in addition to refunds against the payment gateway',
- 'type' => 'checkbox',
- },
-
- {
- 'key' => 'unvoid',
- 'section' => 'billing',
- 'description' => 'Enable unvoiding of voided payments',
- 'type' => 'checkbox',
- },
-
- {
'key' => 'address2-search',
'section' => 'UI',
'description' => 'Enable a "Unit" search box which searches the second address field',
@@ -1616,51 +1545,6 @@ httemplate/docs/config.html
'type' => 'checkbox',
},
- {
- 'key' => 'cust-fields',
- 'section' => 'UI',
- 'description' => 'Which customer fields to display on reports',
- 'type' => 'select',
- 'select_enum' => [
- 'Customer: Last, First</b> or</i> Company (Last, First)</b>',
- 'Cust# | Customer: custnum | Last, First or Company (Last, First)',
- 'Name | Company: Last, First | Company',
- 'Cust# | Name | Company: custnum | Last, First | Company',
- '(bill) Customer | (service) Customer: Last, First or Company (Last, First) | (same for service address if present)',
- 'Cust# | (bill) Customer | (service) Customer: custnum | Last, First or Company (Last, First) | (same for service address if present)',
- '(bill) Name | (bill) Company | (service) Name | (service) Company: Last, First | Company | (same for service address if present)',
- 'Cust# | (bill) Name | (bill) Company | (service) Name | (service) Company: custnum | Last, First | Company | (same for service address if present)',
- ],
- },
-
- {
- 'key' => 'cust_pkg-display_times',
- 'section' => 'UI',
- 'description' => 'Display full timestamps (not just dates) for customer packages. Useful if you are doing real-time things like hourly prepaid.',
- 'type' => 'checkbox',
- },
-
- {
- 'key' => 'svc_acct-edit_uid',
- 'section' => 'shell',
- 'description' => 'Allow UID editing.',
- 'type' => 'checkbox',
- },
-
- {
- 'key' => 'svc_acct-edit_gid',
- 'section' => 'shell',
- 'description' => 'Allow GID editing.',
- 'type' => 'checkbox',
- },
-
- {
- 'key' => 'zone-underscore',
- 'section' => 'BIND',
- 'description' => 'Allow underscores in zone names. As underscores are illegal characters in zone names, this option is not recommended.',
- 'type' => 'checkbox',
- },
-
);
1;
diff --git a/FS/FS/ConfItem.pm b/FS/FS/ConfItem.pm
index a0e997ac7..83295b4fa 100644
--- a/FS/FS/ConfItem.pm
+++ b/FS/FS/ConfItem.pm
@@ -2,7 +2,7 @@ package FS::ConfItem;
=head1 NAME
-FS::ConfItem - Configuration option meta-data.
+FS::ConfItem - Configutaion option meta-data.
=head1 SYNOPSIS
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index 887c8dcd4..5c8a322c9 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -1,8 +1,9 @@
package FS::Record;
use strict;
-use vars qw( $AUTOLOAD @ISA @EXPORT_OK $DEBUG
- $me %virtual_fields_cache $nowarn_identical );
+use vars qw( $dbdef_file $dbdef $setup_hack $AUTOLOAD @ISA @EXPORT_OK $DEBUG
+ $me %dbdef_cache %virtual_fields_cache $nowarn_identical );
+use subs qw(reload_dbdef);
use Exporter;
use Carp qw(carp cluck croak confess);
use File::CounterFile;
@@ -10,7 +11,6 @@ use Locale::Country;
use DBI qw(:sql_types);
use DBIx::DBSchema 0.25;
use FS::UID qw(dbh getotaker datasrc driver_name);
-use FS::Schema qw(dbdef);
use FS::SearchCache;
use FS::Msgcat qw(gettext);
use FS::Conf;
@@ -20,8 +20,6 @@ use FS::part_virtual_field;
use Tie::IxHash;
@ISA = qw(Exporter);
-
-#export dbdef for now... everything else expects to find it here
@EXPORT_OK = qw(dbh fields hfields qsearch qsearchs dbdef jsearch);
$DEBUG = 0;
@@ -35,10 +33,13 @@ my $rsa_loaded;
my $rsa_encrypt;
my $rsa_decrypt;
-FS::UID->install_callback( sub {
+#ask FS::UID to run this stuff for us later
+$FS::UID::callback{'FS::Record'} = sub {
$conf = new FS::Conf;
$File::CounterFile::DEFAULT_DIR = "/usr/local/etc/freeside/counters.". datasrc;
-} );
+ $dbdef_file = "/usr/local/etc/freeside/dbdef.". datasrc;
+ &reload_dbdef unless $setup_hack; #$setup_hack needed now?
+};
=head1 NAME
@@ -47,7 +48,7 @@ FS::Record - Database record objects
=head1 SYNOPSIS
use FS::Record;
- use FS::Record qw(dbh fields qsearch qsearchs);
+ use FS::Record qw(dbh fields qsearch qsearchs dbdef);
$record = new FS::Record 'table', \%hash;
$record = new FS::Record 'table', { 'column' => 'value', ... };
@@ -93,6 +94,10 @@ FS::Record - Database record objects
$error = $record->ut_anything('column');
$error = $record->ut_name('column');
+ $dbdef = reload_dbdef;
+ $dbdef = reload_dbdef "/non/standard/filename";
+ $dbdef = dbdef;
+
$quoted_value = _quote($value,'table','field');
#deprecated
@@ -185,36 +190,13 @@ sub create {
}
}
-=item qsearch PARAMS_HASHREF | TABLE, HASHREF, SELECT, EXTRA_SQL, CACHE_OBJ, ADDL_FROM
+=item qsearch TABLE, HASHREF, SELECT, EXTRA_SQL, CACHE_OBJ, ADDL_FROM
Searches the database for all records matching (at least) the key/value pairs
in HASHREF. Returns all the records found as `FS::TABLE' objects if that
module is loaded (i.e. via `use FS::cust_main;'), otherwise returns FS::Record
objects.
-The preferred usage is to pass a hash reference of named parameters:
-
- my @records = qsearch( {
- 'table' => 'table_name',
- 'hashref' => { 'field' => 'value'
- 'field' => { 'op' => '<',
- 'value' => '420',
- },
- },
-
- #these are optional...
- 'select' => '*',
- 'extra_sql' => 'AND field ',
- #'cache_obj' => '', #optional
- 'addl_from' => 'LEFT JOIN othtable USING ( field )',
- }
- );
-
-Much code still uses old-style positional parameters, this is also probably
-fine in the common case where there are only two parameters:
-
- my @records = qsearch( 'table', { 'field' => 'value' } );
-
###oops, argh, FS::Record::new only lets us create database fields.
#Normal behaviour if SELECT is not specified is `*', as in
#C<SELECT * FROM table WHERE ...>. However, there is an experimental new
@@ -227,28 +209,16 @@ fine in the common case where there are only two parameters:
=cut
sub qsearch {
- my($stable, $record, $select, $extra_sql, $cache, $addl_from );
- if ( ref($_[0]) ) { #hashref for now, eventually maybe accept a list too
- my $opt = shift;
- $stable = $opt->{'table'} or die "table name is required";
- $record = $opt->{'hashref'} || {};
- $select = $opt->{'select'} || '*';
- $extra_sql = $opt->{'extra_sql'} || '';
- $cache = $opt->{'cache_obj'} || '';
- $addl_from = $opt->{'addl_from'} || '';
- } else {
- ($stable, $record, $select, $extra_sql, $cache, $addl_from ) = @_;
- $select ||= '*';
- }
-
+ my($stable, $record, $select, $extra_sql, $cache, $addl_from ) = @_;
#$stable =~ /^([\w\_]+)$/ or die "Illegal table: $table";
#for jsearch
$stable =~ /^([\w\s\(\)\.\,\=]+)$/ or die "Illegal table: $stable";
$stable = $1;
+ $select ||= '*';
my $dbh = dbh;
my $table = $cache ? $cache->table : $stable;
- my $dbdef_table = dbdef->table($table)
+ my $dbdef_table = $dbdef->table($table)
or die "No schema for table $table found - ".
"do you need to create it or run dbdef-create?";
my $pkey = $dbdef_table->primary_key;
@@ -284,7 +254,7 @@ sub qsearch {
if ( ! defined( $record->{$_} ) || $record->{$_} eq '' ) {
if ( $op eq '=' ) {
if ( driver_name eq 'Pg' ) {
- my $type = dbdef->table($table)->column($column)->type;
+ my $type = $dbdef->table($table)->column($column)->type;
if ( $type =~ /(int|serial)/i ) {
qq-( $column IS NULL )-;
} else {
@@ -295,7 +265,7 @@ sub qsearch {
}
} elsif ( $op eq '!=' ) {
if ( driver_name eq 'Pg' ) {
- my $type = dbdef->table($table)->column($column)->type;
+ my $type = $dbdef->table($table)->column($column)->type;
if ( $type =~ /(int|serial)/i ) {
qq-( $column IS NOT NULL )-;
} else {
@@ -365,7 +335,7 @@ sub qsearch {
grep defined( $record->{$_} ) && $record->{$_} ne '', @real_fields
) {
if ( $record->{$field} =~ /^\d+(\.\d+)?$/
- && dbdef->table($table)->column($field)->type =~ /(int|serial)/i
+ && $dbdef->table($table)->column($field)->type =~ /(int|serial)/i
) {
$sth->bind_param($bind++, $record->{$field}, { TYPE => SQL_INTEGER } );
} else {
@@ -433,8 +403,7 @@ sub qsearch {
} values(%result);
}
} else {
- #okay, its been tested
- # warn "untested code (class FS::$table uses custom new method)";
+ warn "untested code (class FS::$table uses custom new method)";
@return = map {
eval 'FS::'. $table. '->new( { %{$_} } )';
} values(%result);
@@ -458,34 +427,6 @@ sub qsearch {
return @return;
}
-=item by_key PRIMARY_KEY_VALUE
-
-This is a class method that returns the record with the given primary key
-value. This method is only useful in FS::Record subclasses. For example:
-
- my $cust_main = FS::cust_main->by_key(1); # retrieve customer with custnum 1
-
-is equivalent to:
-
- my $cust_main = qsearchs('cust_main', { 'custnum' => 1 } );
-
-=cut
-
-sub by_key {
- my ($class, $pkey_value) = @_;
-
- my $table = $class->table
- or croak "No table for $class found";
-
- my $dbdef_table = dbdef->table($table)
- or die "No schema for table $table found - ".
- "do you need to create it or run dbdef-create?";
- my $pkey = $dbdef_table->primary_key
- or die "No primary key for table $table";
-
- return qsearchs($table, { $pkey => $pkey_value });
-}
-
=item jsearch TABLE, HASHREF, SELECT, EXTRA_SQL, PRIMARY_TABLE, PRIMARY_KEY
Experimental JOINed search method. Using this method, you can execute a
@@ -507,7 +448,7 @@ sub jsearch {
);
}
-=item qsearchs PARAMS_HASHREF | TABLE, HASHREF, SELECT, EXTRA_SQL, CACHE_OBJ, ADDL_FROM
+=item qsearchs TABLE, HASHREF, SELECT, EXTRA_SQL, CACHE_OBJ, ADDL_FROM
Same as qsearch, except that if more than one record matches, it B<carp>s but
returns the first. If this happens, you either made a logic error in asking
@@ -551,7 +492,7 @@ Returns the DBIx::DBSchema::Table object for the table.
sub dbdef_table {
my($self)=@_;
my($table)=$self->table;
- dbdef->table($table);
+ $dbdef->table($table);
}
=item get, getfield COLUMN
@@ -745,32 +686,18 @@ sub insert {
$sth->execute or return $sth->errstr;
- # get inserted id from the database, if applicable & needed
- if ( $db_seq && ! $self->getfield($primary_key) ) {
+ my $insertid = '';
+ if ( $db_seq ) { # get inserted id from the database, if applicable
warn "[debug]$me retreiving sequence from database\n" if $DEBUG;
-
- my $insertid = '';
-
if ( driver_name eq 'Pg' ) {
- #my $oid = $sth->{'pg_oid_status'};
- #my $i_sql = "SELECT $primary_key FROM $table WHERE oid = ?";
-
- my $default = $self->dbdef_table->column($primary_key)->default;
- unless ( $default =~ /^nextval\('"?([\w\.]+)"?'/i ) {
- dbh->rollback if $FS::UID::AutoCommit;
- return "can't parse $table.$primary_key default value".
- " for sequence name: $default";
- }
- my $sequence = $1;
-
- my $i_sql = "SELECT currval('$sequence')";
+ my $oid = $sth->{'pg_oid_status'};
+ my $i_sql = "SELECT $primary_key FROM $table WHERE oid = ?";
my $i_sth = dbh->prepare($i_sql) or do {
dbh->rollback if $FS::UID::AutoCommit;
return dbh->errstr;
};
- #$i_sth->execute($oid) or do {
- $i_sth->execute() or do {
+ $i_sth->execute($oid) or do {
dbh->rollback if $FS::UID::AutoCommit;
return $i_sth->errstr;
};
@@ -796,15 +723,11 @@ sub insert {
}
} else {
-
dbh->rollback if $FS::UID::AutoCommit;
return "don't know how to retreive inserted ids from ". driver_name.
", try using counterfiles (maybe run dbdef-create?)";
-
}
-
$self->setfield($primary_key, $insertid);
-
}
my @virtual_fields =
@@ -836,7 +759,7 @@ sub insert {
my $h_sth;
- if ( defined dbdef->table('h_'. $table) ) {
+ if ( defined $dbdef->table('h_'. $table) ) {
my $h_statement = $self->_h_statement('insert');
warn "[debug]$me $h_statement\n" if $DEBUG > 2;
$h_sth = dbh->prepare($h_statement) or do {
@@ -897,7 +820,7 @@ sub delete {
my $sth = dbh->prepare($statement) or return dbh->errstr;
my $h_sth;
- if ( defined dbdef->table('h_'. $self->table) ) {
+ if ( defined $dbdef->table('h_'. $self->table) ) {
my $h_statement = $self->_h_statement('delete');
warn "[debug]$me $h_statement\n" if $DEBUG > 2;
$h_sth = dbh->prepare($h_statement) or return dbh->errstr;
@@ -1041,7 +964,7 @@ sub replace {
my $sth = dbh->prepare($statement) or return dbh->errstr;
my $h_old_sth;
- if ( defined dbdef->table('h_'. $old->table) ) {
+ if ( defined $dbdef->table('h_'. $old->table) ) {
my $h_old_statement = $old->_h_statement('replace_old');
warn "[debug]$me $h_old_statement\n" if $DEBUG > 2;
$h_old_sth = dbh->prepare($h_old_statement) or return dbh->errstr;
@@ -1050,7 +973,7 @@ sub replace {
}
my $h_new_sth;
- if ( defined dbdef->table('h_'. $new->table) ) {
+ if ( defined $dbdef->table('h_'. $new->table) ) {
my $h_new_statement = $new->_h_statement('replace_new');
warn "[debug]$me $h_new_statement\n" if $DEBUG > 2;
$h_new_sth = dbh->prepare($h_new_statement) or return dbh->errstr;
@@ -1489,8 +1412,6 @@ Check/untaint zip codes.
=cut
-my @zip_reqd_countries = qw( CA ); #US implicit...
-
sub ut_zip {
my( $self, $field, $country ) = @_;
if ( $country eq 'US' ) {
@@ -1499,10 +1420,7 @@ sub ut_zip {
$self->getfield($field);
$self->setfield($field,$1);
} else {
- if ( $self->getfield($field) =~ /^\s*$/
- && ( !$country || ! grep { $_ eq $country } @zip_reqd_countries )
- )
- {
+ if ( $self->getfield($field) =~ /^\s*$/ ) {
$self->setfield($field,'');
} else {
$self->getfield($field) =~ /^\s*(\w[\w\-\s]{2,8}\w)\s*$/
@@ -1606,9 +1524,9 @@ sub virtual_fields {
my $table;
$table = $self->table or confess "virtual_fields called on non-table";
- confess "Unknown table $table" unless dbdef->table($table);
+ confess "Unknown table $table" unless $dbdef->table($table);
- return () unless dbdef->table('part_virtual_field');
+ return () unless $self->dbdef->table('part_virtual_field');
unless ( $virtual_fields_cache{$table} ) {
my $query = 'SELECT name from part_virtual_field ' .
@@ -1676,11 +1594,40 @@ fields() and other subroutines elsewhere in FS::Record.
sub real_fields {
my $table = shift;
- my($table_obj) = dbdef->table($table);
+ my($table_obj) = $dbdef->table($table);
confess "Unknown table $table" unless $table_obj;
$table_obj->columns;
}
+=item reload_dbdef([FILENAME])
+
+Load a database definition (see L<DBIx::DBSchema>), optionally from a
+non-default filename. This command is executed at startup unless
+I<$FS::Record::setup_hack> is true. Returns a DBIx::DBSchema object.
+
+=cut
+
+sub reload_dbdef {
+ my $file = shift || $dbdef_file;
+
+ unless ( exists $dbdef_cache{$file} ) {
+ warn "[debug]$me loading dbdef for $file\n" if $DEBUG;
+ $dbdef_cache{$file} = DBIx::DBSchema->load( $file )
+ or die "can't load database schema from $file";
+ } else {
+ warn "[debug]$me re-using cached dbdef for $file\n" if $DEBUG;
+ }
+ $dbdef = $dbdef_cache{$file};
+}
+
+=item dbdef
+
+Returns the current database definition. See L<DBIx::DBSchema>.
+
+=cut
+
+sub dbdef { $dbdef; }
+
=item _quote VALUE, TABLE, COLUMN
This is an internal function used to construct SQL statements. It returns
@@ -1691,7 +1638,7 @@ type (see L<DBIx::DBSchema::Column>) does not end in `char' or `binary'.
sub _quote {
my($value, $table, $column) = @_;
- my $column_obj = dbdef->table($table)->column($column);
+ my $column_obj = $dbdef->table($table)->column($column);
my $column_type = $column_obj->type;
my $nullable = $column_obj->null;
@@ -1726,7 +1673,7 @@ sub vfieldpart_hashref {
my $self = shift;
my $table = $self->table;
- return {} unless dbdef->table('part_virtual_field');
+ return {} unless $self->dbdef->table('part_virtual_field');
my $dbh = dbh;
my $statement = "SELECT vfieldpart, name FROM part_virtual_field WHERE ".
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
deleted file mode 100644
index 451ef2d2e..000000000
--- a/FS/FS/Schema.pm
+++ /dev/null
@@ -1,1277 +0,0 @@
-package FS::Schema;
-
-use vars qw(@ISA @EXPORT_OK $DEBUG $setup_hack %dbdef_cache);
-use subs qw(reload_dbdef);
-use Exporter;
-use DBIx::DBSchema 0.25;
-use DBIx::DBSchema::Table;
-use DBIx::DBSchema::Column;
-use DBIx::DBSchema::ColGroup::Unique;
-use DBIx::DBSchema::ColGroup::Index;
-use FS::UID qw(datasrc);
-
-@ISA = qw(Exporter);
-@EXPORT_OK = qw( dbdef dbdef_dist reload_dbdef );
-
-$DEBUG = 0;
-$me = '[FS::Schema]';
-
-#ask FS::UID to run this stuff for us later
-FS::UID->install_callback( sub {
- #$conf = new FS::Conf;
- &reload_dbdef("/usr/local/etc/freeside/dbdef.". datasrc)
- unless $setup_hack; #$setup_hack needed now?
-} );
-
-=head1 NAME
-
-FS::Schema - Freeside database schema
-
-=head1 SYNOPSYS
-
- use FS::Schema qw(dbdef dbdef_dist reload_dbdef);
-
- $dbdef = reload_dbdef;
- $dbdef = reload_dbdef "/non/standard/filename";
- $dbdef = dbdef;
- $dbdef_dist = dbdef_dist;
-
-=head1 DESCRIPTION
-
-This class represents the database schema.
-
-=head1 METHODS
-
-=over 4
-
-=item reload_dbdef([FILENAME])
-
-Load a database definition (see L<DBIx::DBSchema>), optionally from a
-non-default filename. This command is executed at startup unless
-I<$FS::Schema::setup_hack> is true. Returns a DBIx::DBSchema object.
-
-=cut
-
-sub reload_dbdef {
- my $file = shift;
-
- unless ( exists $dbdef_cache{$file} ) {
- warn "[debug]$me loading dbdef for $file\n" if $DEBUG;
- $dbdef_cache{$file} = DBIx::DBSchema->load( $file )
- or die "can't load database schema from $file";
- } else {
- warn "[debug]$me re-using cached dbdef for $file\n" if $DEBUG;
- }
- $dbdef = $dbdef_cache{$file};
-}
-
-=item dbdef
-
-Returns the current database definition (represents the current database,
-assuming it is up-to-date). See L<DBIx::DBSchema>.
-
-=cut
-
-sub dbdef { $dbdef; }
-
-=item dbdef_dist [ OPTION => VALUE ... ]
-
-Returns the current canoical database definition as defined in this file.
-
-=cut
-
-sub dbdef_dist {
-
- ###
- # create a dbdef object from the old data structure
- ###
-
- my $tables_hashref = tables_hashref();
-
- #turn it into objects
- my $dbdef = new DBIx::DBSchema map {
- my @columns;
- while (@{$tables_hashref->{$_}{'columns'}}) {
- my($name, $type, $null, $length) =
- splice @{$tables_hashref->{$_}{'columns'}}, 0, 4;
- push @columns, new DBIx::DBSchema::Column ( $name,$type,$null,$length );
- }
- DBIx::DBSchema::Table->new(
- $_,
- $tables_hashref->{$_}{'primary_key'},
- DBIx::DBSchema::ColGroup::Unique->new($tables_hashref->{$_}{'unique'}),
- DBIx::DBSchema::ColGroup::Index->new($tables_hashref->{$_}{'index'}),
- @columns,
- );
- } keys %$tables_hashref;
-
- if ( $DEBUG ) {
- warn "[debug]$me initial dbdef_dist created ($dbdef) with tables:\n";
- warn "[debug]$me $_\n" foreach $dbdef->tables;
- }
-
- my $cust_main = $dbdef->table('cust_main');
- #unless ($ship) { #remove ship_ from cust_main
- # $cust_main->delcolumn($_) foreach ( grep /^ship_/, $cust_main->columns );
- #} else { #add indices
- push @{$cust_main->index->lol_ref},
- map { [ "ship_$_" ] } qw( last company daytime night fax );
- #}
-
- #add radius attributes to svc_acct
- #
- #my($svc_acct)=$dbdef->table('svc_acct');
- #
- #my($attribute);
- #foreach $attribute (@attributes) {
- # $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
- # 'radius_'. $attribute,
- # 'varchar',
- # 'NULL',
- # $char_d,
- # ));
- #}
- #
- #foreach $attribute (@check_attributes) {
- # $svc_acct->addcolumn( new DBIx::DBSchema::Column (
- # 'rc_'. $attribute,
- # 'varchar',
- # 'NULL',
- # $char_d,
- # ));
- #}
-
- #create history tables (false laziness w/create-history-tables)
- foreach my $table (
- grep { ! /^clientapi_session/ }
- grep { ! /^h_/ }
- $dbdef->tables
- ) {
- my $tableobj = $dbdef->table($table)
- or die "unknown table $table";
-
- die "unique->lol_ref undefined for $table"
- unless defined $tableobj->unique->lol_ref;
- die "index->lol_ref undefined for $table"
- unless defined $tableobj->index->lol_ref;
-
- my $h_tableobj = DBIx::DBSchema::Table->new( {
- name => "h_$table",
- primary_key => 'historynum',
- unique => DBIx::DBSchema::ColGroup::Unique->new( [] ),
- 'index' => DBIx::DBSchema::ColGroup::Index->new( [
- @{$tableobj->unique->lol_ref},
- @{$tableobj->index->lol_ref}
- ] ),
- columns => [
- DBIx::DBSchema::Column->new( {
- 'name' => 'historynum',
- 'type' => 'serial',
- 'null' => 'NOT NULL',
- 'length' => '',
- 'default' => '',
- 'local' => '',
- } ),
- DBIx::DBSchema::Column->new( {
- 'name' => 'history_date',
- 'type' => 'int',
- 'null' => 'NULL',
- 'length' => '',
- 'default' => '',
- 'local' => '',
- } ),
- DBIx::DBSchema::Column->new( {
- 'name' => 'history_user',
- 'type' => 'varchar',
- 'null' => 'NOT NULL',
- 'length' => '80',
- 'default' => '',
- 'local' => '',
- } ),
- DBIx::DBSchema::Column->new( {
- 'name' => 'history_action',
- 'type' => 'varchar',
- 'null' => 'NOT NULL',
- 'length' => '80',
- 'default' => '',
- 'local' => '',
- } ),
- map {
- my $column = $tableobj->column($_);
-
- #clone so as to not disturb the original
- $column = DBIx::DBSchema::Column->new( {
- map { $_ => $column->$_() }
- qw( name type null length default local )
- } );
-
- if ( $column->type eq 'serial' ) {
- $column->type('int');
- $column->null('NULL');
- }
- #$column->default('')
- # if $column->default =~ /^nextval\(/i;
- #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
- #$column->local($local);
- $column;
- } $tableobj->columns
- ],
- } );
- $dbdef->addtable($h_tableobj);
- }
-
- $dbdef;
-
-}
-
-sub tables_hashref {
-
- my $char_d = 80; #default maxlength for text fields
-
- #my(@date_type) = ( 'timestamp', '', '' );
- my @date_type = ( 'int', 'NULL', '' );
- my @perl_type = ( 'text', 'NULL', '' );
- my @money_type = ( 'decimal', '', '10,2' );
-
- my $username_len = 32; #usernamemax config file
-
- return {
-
- 'agent' => {
- 'columns' => [
- 'agentnum', 'serial', '', '',
- 'agent', 'varchar', '', $char_d,
- 'typenum', 'int', '', '',
- 'freq', 'int', 'NULL', '',
- 'prog', @perl_type,
- 'disabled', 'char', 'NULL', 1,
- 'username', 'varchar', 'NULL', $char_d,
- '_password','varchar', 'NULL', $char_d,
- 'ticketing_queueid', 'int', 'NULL', '',
- ],
- 'primary_key' => 'agentnum',
- 'unique' => [],
- 'index' => [ ['typenum'], ['disabled'] ],
- },
-
- 'agent_type' => {
- 'columns' => [
- 'typenum', 'serial', '', '',
- 'atype', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'typenum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'type_pkgs' => {
- 'columns' => [
- 'typepkgnum', 'serial', '', '',
- 'typenum', 'int', '', '',
- 'pkgpart', 'int', '', '',
- ],
- 'primary_key' => 'typepkgnum',
- 'unique' => [ ['typenum', 'pkgpart'] ],
- 'index' => [ ['typenum'] ],
- },
-
- 'cust_bill' => {
- 'columns' => [
- 'invnum', 'serial', '', '',
- 'custnum', 'int', '', '',
- '_date', @date_type,
- 'charged', @money_type,
- 'printed', 'int', '', '',
- 'closed', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'invnum',
- 'unique' => [],
- 'index' => [ ['custnum'], ['_date'] ],
- },
-
- 'cust_bill_event' => {
- 'columns' => [
- 'eventnum', 'serial', '', '',
- 'invnum', 'int', '', '',
- 'eventpart', 'int', '', '',
- '_date', @date_type,
- 'status', 'varchar', '', $char_d,
- 'statustext', 'text', 'NULL', '',
- ],
- 'primary_key' => 'eventnum',
- #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
- 'unique' => [],
- 'index' => [ ['invnum'], ['status'] ],
- },
-
- 'part_bill_event' => {
- 'columns' => [
- 'eventpart', 'serial', '', '',
- 'payby', 'char', '', 4,
- 'event', 'varchar', '', $char_d,
- 'eventcode', @perl_type,
- 'seconds', 'int', 'NULL', '',
- 'weight', 'int', '', '',
- 'plan', 'varchar', 'NULL', $char_d,
- 'plandata', 'text', 'NULL', '',
- 'disabled', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'eventpart',
- 'unique' => [],
- 'index' => [ ['payby'], ['disabled'], ],
- },
-
- 'cust_bill_pkg' => {
- 'columns' => [
- 'billpkgnum', 'serial', '', '',
- 'pkgnum', 'int', '', '',
- 'invnum', 'int', '', '',
- 'setup', @money_type,
- 'recur', @money_type,
- 'sdate', @date_type,
- 'edate', @date_type,
- 'itemdesc', 'varchar', 'NULL', $char_d,
- ],
- 'primary_key' => 'billpkgnum',
- 'unique' => [],
- 'index' => [ ['invnum'], [ 'pkgnum' ] ],
- },
-
- 'cust_bill_pkg_detail' => {
- 'columns' => [
- 'detailnum', 'serial', '', '',
- 'pkgnum', 'int', '', '',
- 'invnum', 'int', '', '',
- 'detail', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'detailnum',
- 'unique' => [],
- 'index' => [ [ 'pkgnum', 'invnum' ] ],
- },
-
- 'cust_credit' => {
- 'columns' => [
- 'crednum', 'serial', '', '',
- 'custnum', 'int', '', '',
- '_date', @date_type,
- 'amount', @money_type,
- 'otaker', 'varchar', '', 32,
- 'reason', 'text', 'NULL', '',
- 'closed', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'crednum',
- 'unique' => [],
- 'index' => [ ['custnum'] ],
- },
-
- 'cust_credit_bill' => {
- 'columns' => [
- 'creditbillnum', 'serial', '', '',
- 'crednum', 'int', '', '',
- 'invnum', 'int', '', '',
- '_date', @date_type,
- 'amount', @money_type,
- ],
- 'primary_key' => 'creditbillnum',
- 'unique' => [],
- 'index' => [ ['crednum'], ['invnum'] ],
- },
-
- 'cust_main' => {
- 'columns' => [
- 'custnum', 'serial', '', '',
- 'agentnum', 'int', '', '',
-# 'titlenum', 'int', 'NULL', '',
- 'last', 'varchar', '', $char_d,
-# 'middle', 'varchar', 'NULL', $char_d,
- 'first', 'varchar', '', $char_d,
- 'ss', 'varchar', 'NULL', 11,
- 'company', 'varchar', 'NULL', $char_d,
- 'address1', 'varchar', '', $char_d,
- 'address2', 'varchar', 'NULL', $char_d,
- 'city', 'varchar', '', $char_d,
- 'county', 'varchar', 'NULL', $char_d,
- 'state', 'varchar', 'NULL', $char_d,
- 'zip', 'varchar', 'NULL', 10,
- 'country', 'char', '', 2,
- 'daytime', 'varchar', 'NULL', 20,
- 'night', 'varchar', 'NULL', 20,
- 'fax', 'varchar', 'NULL', 12,
- 'ship_last', 'varchar', 'NULL', $char_d,
-# 'ship_middle', 'varchar', 'NULL', $char_d,
- 'ship_first', 'varchar', 'NULL', $char_d,
- 'ship_company', 'varchar', 'NULL', $char_d,
- 'ship_address1', 'varchar', 'NULL', $char_d,
- 'ship_address2', 'varchar', 'NULL', $char_d,
- 'ship_city', 'varchar', 'NULL', $char_d,
- 'ship_county', 'varchar', 'NULL', $char_d,
- 'ship_state', 'varchar', 'NULL', $char_d,
- 'ship_zip', 'varchar', 'NULL', 10,
- 'ship_country', 'char', 'NULL', 2,
- 'ship_daytime', 'varchar', 'NULL', 20,
- 'ship_night', 'varchar', 'NULL', 20,
- 'ship_fax', 'varchar', 'NULL', 12,
- 'payby', 'char', '', 4,
- 'payinfo', 'varchar', 'NULL', 512,
- 'paycvv', 'varchar', 'NULL', 512,
- 'paymask', 'varchar', 'NULL', $char_d,
- #'paydate', @date_type,
- 'paydate', 'varchar', 'NULL', 10,
- 'paystart_month', 'int', 'NULL', '',
- 'paystart_year', 'int', 'NULL', '',
- 'payissue', 'varchar', 'NULL', 2,
- 'payname', 'varchar', 'NULL', $char_d,
- 'payip', 'varchar', 'NULL', 15,
- 'tax', 'char', 'NULL', 1,
- 'otaker', 'varchar', '', 32,
- 'refnum', 'int', '', '',
- 'referral_custnum', 'int', 'NULL', '',
- 'comments', 'text', 'NULL', '',
- ],
- 'primary_key' => 'custnum',
- 'unique' => [],
- #'index' => [ ['last'], ['company'] ],
- 'index' => [ ['last'], [ 'company' ], [ 'referral_custnum' ],
- [ 'daytime' ], [ 'night' ], [ 'fax' ], [ 'refnum' ],
- [ 'county' ], [ 'state' ], [ 'country' ]
- ],
- },
-
- 'cust_main_invoice' => {
- 'columns' => [
- 'destnum', 'serial', '', '',
- 'custnum', 'int', '', '',
- 'dest', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'destnum',
- 'unique' => [],
- 'index' => [ ['custnum'], ],
- },
-
- 'cust_main_county' => { #county+state+country are checked off the
- #cust_main_county for validation and to provide
- # a tax rate.
- 'columns' => [
- 'taxnum', 'serial', '', '',
- 'state', 'varchar', 'NULL', $char_d,
- 'county', 'varchar', 'NULL', $char_d,
- 'country', 'char', '', 2,
- 'taxclass', 'varchar', 'NULL', $char_d,
- 'exempt_amount', @money_type,
- 'tax', 'real', '', '', #tax %
- 'taxname', 'varchar', 'NULL', $char_d,
- 'setuptax', 'char', 'NULL', 1, # Y = setup tax exempt
- 'recurtax', 'char', 'NULL', 1, # Y = recur tax exempt
- ],
- 'primary_key' => 'taxnum',
- 'unique' => [],
- # 'unique' => [ ['taxnum'], ['state', 'county'] ],
- 'index' => [ [ 'county' ], [ 'state' ], [ 'country' ] ],
- },
-
- 'cust_pay' => {
- 'columns' => [
- 'paynum', 'serial', '', '',
- #now cust_bill_pay #'invnum', 'int', '', '',
- 'custnum', 'int', '', '',
- 'paid', @money_type,
- '_date', @date_type,
- 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index into
- # payment type table.
- 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
- 'paybatch', 'varchar', 'NULL', $char_d, #for auditing purposes.
- 'closed', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'paynum',
- 'unique' => [],
- 'index' => [ [ 'custnum' ], [ 'paybatch' ], [ 'payby' ], [ '_date' ] ],
- },
-
- 'cust_pay_void' => {
- 'columns' => [
- 'paynum', 'int', '', '',
- 'custnum', 'int', '', '',
- 'paid', @money_type,
- '_date', @date_type,
- 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index into
- # payment type table.
- 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
- 'paybatch', 'varchar', 'NULL', $char_d, #for auditing purposes.
- 'closed', 'char', 'NULL', 1,
- 'void_date', @date_type,
- 'reason', 'varchar', 'NULL', $char_d,
- 'otaker', 'varchar', '', 32,
- ],
- 'primary_key' => 'paynum',
- 'unique' => [],
- 'index' => [ [ 'custnum' ] ],
- },
-
- 'cust_bill_pay' => {
- 'columns' => [
- 'billpaynum', 'serial', '', '',
- 'invnum', 'int', '', '',
- 'paynum', 'int', '', '',
- 'amount', @money_type,
- '_date', @date_type
- ],
- 'primary_key' => 'billpaynum',
- 'unique' => [],
- 'index' => [ [ 'paynum' ], [ 'invnum' ] ],
- },
-
- 'cust_pay_batch' => { #what's this used for again? list of customers
- #in current CARD batch? (necessarily CARD?)
- 'columns' => [
- 'paybatchnum', 'serial', '', '',
- 'invnum', 'int', '', '',
- 'custnum', 'int', '', '',
- 'last', 'varchar', '', $char_d,
- 'first', 'varchar', '', $char_d,
- 'address1', 'varchar', '', $char_d,
- 'address2', 'varchar', 'NULL', $char_d,
- 'city', 'varchar', '', $char_d,
- 'state', 'varchar', 'NULL', $char_d,
- 'zip', 'varchar', 'NULL', 10,
- 'country', 'char', '', 2,
-# 'trancode', 'int', '', '',
- 'cardnum', 'varchar', '', 16,
- #'exp', @date_type,
- 'exp', 'varchar', '', 11,
- 'payname', 'varchar', 'NULL', $char_d,
- 'amount', @money_type,
- ],
- 'primary_key' => 'paybatchnum',
- 'unique' => [],
- 'index' => [ ['invnum'], ['custnum'] ],
- },
-
- 'cust_pkg' => {
- 'columns' => [
- 'pkgnum', 'serial', '', '',
- 'custnum', 'int', '', '',
- 'pkgpart', 'int', '', '',
- 'otaker', 'varchar', '', 32,
- 'setup', @date_type,
- 'bill', @date_type,
- 'last_bill', @date_type,
- 'susp', @date_type,
- 'cancel', @date_type,
- 'expire', @date_type,
- 'manual_flag', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'pkgnum',
- 'unique' => [],
- 'index' => [ ['custnum'], ['pkgpart'] ],
- },
-
- 'cust_refund' => {
- 'columns' => [
- 'refundnum', 'serial', '', '',
- #now cust_credit_refund #'crednum', 'int', '', '',
- 'custnum', 'int', '', '',
- '_date', @date_type,
- 'refund', @money_type,
- 'otaker', 'varchar', '', 32,
- 'reason', 'varchar', '', $char_d,
- 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index
- # into payment type table.
- 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
- 'paybatch', 'varchar', 'NULL', $char_d,
- 'closed', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'refundnum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'cust_credit_refund' => {
- 'columns' => [
- 'creditrefundnum', 'serial', '', '',
- 'crednum', 'int', '', '',
- 'refundnum', 'int', '', '',
- 'amount', @money_type,
- '_date', @date_type
- ],
- 'primary_key' => 'creditrefundnum',
- 'unique' => [],
- 'index' => [ [ 'crednum', 'refundnum' ] ],
- },
-
-
- 'cust_svc' => {
- 'columns' => [
- 'svcnum', 'serial', '', '',
- 'pkgnum', 'int', 'NULL', '',
- 'svcpart', 'int', '', '',
- ],
- 'primary_key' => 'svcnum',
- 'unique' => [],
- 'index' => [ ['svcnum'], ['pkgnum'], ['svcpart'] ],
- },
-
- 'part_pkg' => {
- 'columns' => [
- 'pkgpart', 'serial', '', '',
- 'pkg', 'varchar', '', $char_d,
- 'comment', 'varchar', '', $char_d,
- 'promo_code', 'varchar', 'NULL', $char_d,
- 'setup', @perl_type,
- 'freq', 'varchar', '', $char_d, #billing frequency
- 'recur', @perl_type,
- 'setuptax', 'char', 'NULL', 1,
- 'recurtax', 'char', 'NULL', 1,
- 'plan', 'varchar', 'NULL', $char_d,
- 'plandata', 'text', 'NULL', '',
- 'disabled', 'char', 'NULL', 1,
- 'taxclass', 'varchar', 'NULL', $char_d,
- ],
- 'primary_key' => 'pkgpart',
- 'unique' => [],
- 'index' => [ [ 'promo_code' ], [ 'disabled' ] ],
- },
-
-# 'part_title' => {
-# 'columns' => [
-# 'titlenum', 'int', '', '',
-# 'title', 'varchar', '', $char_d,
-# ],
-# 'primary_key' => 'titlenum',
-# 'unique' => [ [] ],
-# 'index' => [ [] ],
-# },
-
- 'pkg_svc' => {
- 'columns' => [
- 'pkgsvcnum', 'serial', '', '',
- 'pkgpart', 'int', '', '',
- 'svcpart', 'int', '', '',
- 'quantity', 'int', '', '',
- 'primary_svc','char', 'NULL', 1,
- ],
- 'primary_key' => 'pkgsvcnum',
- 'unique' => [ ['pkgpart', 'svcpart'] ],
- 'index' => [ ['pkgpart'] ],
- },
-
- 'part_referral' => {
- 'columns' => [
- 'refnum', 'serial', '', '',
- 'referral', 'varchar', '', $char_d,
- 'disabled', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'refnum',
- 'unique' => [],
- 'index' => [ ['disabled'] ],
- },
-
- 'part_svc' => {
- 'columns' => [
- 'svcpart', 'serial', '', '',
- 'svc', 'varchar', '', $char_d,
- 'svcdb', 'varchar', '', $char_d,
- 'disabled', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'svcpart',
- 'unique' => [],
- 'index' => [ [ 'disabled' ] ],
- },
-
- 'part_svc_column' => {
- 'columns' => [
- 'columnnum', 'serial', '', '',
- 'svcpart', 'int', '', '',
- 'columnname', 'varchar', '', 64,
- 'columnvalue', 'varchar', 'NULL', $char_d,
- 'columnflag', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'columnnum',
- 'unique' => [ [ 'svcpart', 'columnname' ] ],
- 'index' => [ [ 'svcpart' ] ],
- },
-
- #(this should be renamed to part_pop)
- 'svc_acct_pop' => {
- 'columns' => [
- 'popnum', 'serial', '', '',
- 'city', 'varchar', '', $char_d,
- 'state', 'varchar', '', $char_d,
- 'ac', 'char', '', 3,
- 'exch', 'char', '', 3,
- 'loc', 'char', 'NULL', 4, #NULL for legacy purposes
- ],
- 'primary_key' => 'popnum',
- 'unique' => [],
- 'index' => [ [ 'state' ] ],
- },
-
- 'part_pop_local' => {
- 'columns' => [
- 'localnum', 'serial', '', '',
- 'popnum', 'int', '', '',
- 'city', 'varchar', 'NULL', $char_d,
- 'state', 'char', 'NULL', 2,
- 'npa', 'char', '', 3,
- 'nxx', 'char', '', 3,
- ],
- 'primary_key' => 'localnum',
- 'unique' => [],
- 'index' => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
- },
-
- 'svc_acct' => {
- 'columns' => [
- 'svcnum', 'int', '', '',
- 'username', 'varchar', '', $username_len, #unique (& remove dup code)
- '_password', 'varchar', '', 72, #13 for encryped pw's plus ' *SUSPENDED* (md5 passwords can be 34, blowfish 60)
- 'sec_phrase', 'varchar', 'NULL', $char_d,
- 'popnum', 'int', 'NULL', '',
- 'uid', 'int', 'NULL', '',
- 'gid', 'int', 'NULL', '',
- 'finger', 'varchar', 'NULL', $char_d,
- 'dir', 'varchar', 'NULL', $char_d,
- 'shell', 'varchar', 'NULL', $char_d,
- 'quota', 'varchar', 'NULL', $char_d,
- 'slipip', 'varchar', 'NULL', 15, #four TINYINTs, bah.
- 'seconds', 'int', 'NULL', '', #uhhhh
- 'domsvc', 'int', '', '',
- ],
- 'primary_key' => 'svcnum',
- #'unique' => [ [ 'username', 'domsvc' ] ],
- 'unique' => [],
- 'index' => [ ['username'], ['domsvc'] ],
- },
-
- #'svc_charge' => {
- # 'columns' => [
- # 'svcnum', 'int', '', '',
- # 'amount', @money_type,
- # ],
- # 'primary_key' => 'svcnum',
- # 'unique' => [ [] ],
- # 'index' => [ [] ],
- #},
-
- 'svc_domain' => {
- 'columns' => [
- 'svcnum', 'int', '', '',
- 'domain', 'varchar', '', $char_d,
- 'catchall', 'int', 'NULL', '',
- ],
- 'primary_key' => 'svcnum',
- 'unique' => [ ['domain'] ],
- 'index' => [],
- },
-
- 'domain_record' => {
- 'columns' => [
- 'recnum', 'serial', '', '',
- 'svcnum', 'int', '', '',
- #'reczone', 'varchar', '', $char_d,
- 'reczone', 'varchar', '', 255,
- 'recaf', 'char', '', 2,
- 'rectype', 'varchar', '', 5,
- #'recdata', 'varchar', '', $char_d,
- 'recdata', 'varchar', '', 255,
- ],
- 'primary_key' => 'recnum',
- 'unique' => [],
- 'index' => [ ['svcnum'] ],
- },
-
- 'svc_forward' => {
- 'columns' => [
- 'svcnum', 'int', '', '',
- 'srcsvc', 'int', 'NULL', '',
- 'src', 'varchar', 'NULL', 255,
- 'dstsvc', 'int', 'NULL', '',
- 'dst', 'varchar', 'NULL', 255,
- ],
- 'primary_key' => 'svcnum',
- 'unique' => [],
- 'index' => [ ['srcsvc'], ['dstsvc'] ],
- },
-
- 'svc_www' => {
- 'columns' => [
- 'svcnum', 'int', '', '',
- 'recnum', 'int', '', '',
- 'usersvc', 'int', '', '',
- ],
- 'primary_key' => 'svcnum',
- 'unique' => [],
- 'index' => [],
- },
-
- #'svc_wo' => {
- # 'columns' => [
- # 'svcnum', 'int', '', '',
- # 'svcnum', 'int', '', '',
- # 'svcnum', 'int', '', '',
- # 'worker', 'varchar', '', $char_d,
- # '_date', @date_type,
- # ],
- # 'primary_key' => 'svcnum',
- # 'unique' => [ [] ],
- # 'index' => [ [] ],
- #},
-
- 'prepay_credit' => {
- 'columns' => [
- 'prepaynum', 'serial', '', '',
- 'identifier', 'varchar', '', $char_d,
- 'amount', @money_type,
- 'seconds', 'int', 'NULL', '',
- 'agentnum', 'int', 'NULL', '',
- ],
- 'primary_key' => 'prepaynum',
- 'unique' => [ ['identifier'] ],
- 'index' => [],
- },
-
- 'port' => {
- 'columns' => [
- 'portnum', 'serial', '', '',
- 'ip', 'varchar', 'NULL', 15,
- 'nasport', 'int', 'NULL', '',
- 'nasnum', 'int', '', '',
- ],
- 'primary_key' => 'portnum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'nas' => {
- 'columns' => [
- 'nasnum', 'serial', '', '',
- 'nas', 'varchar', '', $char_d,
- 'nasip', 'varchar', '', 15,
- 'nasfqdn', 'varchar', '', $char_d,
- 'last', 'int', '', '',
- ],
- 'primary_key' => 'nasnum',
- 'unique' => [ [ 'nas' ], [ 'nasip' ] ],
- 'index' => [ [ 'last' ] ],
- },
-
- 'session' => {
- 'columns' => [
- 'sessionnum', 'serial', '', '',
- 'portnum', 'int', '', '',
- 'svcnum', 'int', '', '',
- 'login', @date_type,
- 'logout', @date_type,
- ],
- 'primary_key' => 'sessionnum',
- 'unique' => [],
- 'index' => [ [ 'portnum' ] ],
- },
-
- 'queue' => {
- 'columns' => [
- 'jobnum', 'serial', '', '',
- 'job', 'text', '', '',
- '_date', 'int', '', '',
- 'status', 'varchar', '', $char_d,
- 'statustext', 'text', 'NULL', '',
- 'svcnum', 'int', 'NULL', '',
- ],
- 'primary_key' => 'jobnum',
- 'unique' => [],
- 'index' => [ [ 'svcnum' ], [ 'status' ] ],
- },
-
- 'queue_arg' => {
- 'columns' => [
- 'argnum', 'serial', '', '',
- 'jobnum', 'int', '', '',
- 'arg', 'text', 'NULL', '',
- ],
- 'primary_key' => 'argnum',
- 'unique' => [],
- 'index' => [ [ 'jobnum' ] ],
- },
-
- 'queue_depend' => {
- 'columns' => [
- 'dependnum', 'serial', '', '',
- 'jobnum', 'int', '', '',
- 'depend_jobnum', 'int', '', '',
- ],
- 'primary_key' => 'dependnum',
- 'unique' => [],
- 'index' => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
- },
-
- 'export_svc' => {
- 'columns' => [
- 'exportsvcnum' => 'serial', '', '',
- 'exportnum' => 'int', '', '',
- 'svcpart' => 'int', '', '',
- ],
- 'primary_key' => 'exportsvcnum',
- 'unique' => [ [ 'exportnum', 'svcpart' ] ],
- 'index' => [ [ 'exportnum' ], [ 'svcpart' ] ],
- },
-
- 'part_export' => {
- 'columns' => [
- 'exportnum', 'serial', '', '',
- #'svcpart', 'int', '', '',
- 'machine', 'varchar', '', $char_d,
- 'exporttype', 'varchar', '', $char_d,
- 'nodomain', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'exportnum',
- 'unique' => [],
- 'index' => [ [ 'machine' ], [ 'exporttype' ] ],
- },
-
- 'part_export_option' => {
- 'columns' => [
- 'optionnum', 'serial', '', '',
- 'exportnum', 'int', '', '',
- 'optionname', 'varchar', '', $char_d,
- 'optionvalue', 'text', 'NULL', '',
- ],
- 'primary_key' => 'optionnum',
- 'unique' => [],
- 'index' => [ [ 'exportnum' ], [ 'optionname' ] ],
- },
-
- 'radius_usergroup' => {
- 'columns' => [
- 'usergroupnum', 'serial', '', '',
- 'svcnum', 'int', '', '',
- 'groupname', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'usergroupnum',
- 'unique' => [],
- 'index' => [ [ 'svcnum' ], [ 'groupname' ] ],
- },
-
- 'msgcat' => {
- 'columns' => [
- 'msgnum', 'serial', '', '',
- 'msgcode', 'varchar', '', $char_d,
- 'locale', 'varchar', '', 16,
- 'msg', 'text', '', '',
- ],
- 'primary_key' => 'msgnum',
- 'unique' => [ [ 'msgcode', 'locale' ] ],
- 'index' => [],
- },
-
- 'cust_tax_exempt' => {
- 'columns' => [
- 'exemptnum', 'serial', '', '',
- 'custnum', 'int', '', '',
- 'taxnum', 'int', '', '',
- 'year', 'int', '', '',
- 'month', 'int', '', '',
- 'amount', @money_type,
- ],
- 'primary_key' => 'exemptnum',
- 'unique' => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
- 'index' => [],
- },
-
- 'router' => {
- 'columns' => [
- 'routernum', 'serial', '', '',
- 'routername', 'varchar', '', $char_d,
- 'svcnum', 'int', 'NULL', '',
- ],
- 'primary_key' => 'routernum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'part_svc_router' => {
- 'columns' => [
- 'svcrouternum', 'serial', '', '',
- 'svcpart', 'int', '', '',
- 'routernum', 'int', '', '',
- ],
- 'primary_key' => 'svcrouternum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'addr_block' => {
- 'columns' => [
- 'blocknum', 'serial', '', '',
- 'routernum', 'int', '', '',
- 'ip_gateway', 'varchar', '', 15,
- 'ip_netmask', 'int', '', '',
- ],
- 'primary_key' => 'blocknum',
- 'unique' => [ [ 'blocknum', 'routernum' ] ],
- 'index' => [],
- },
-
- 'svc_broadband' => {
- 'columns' => [
- 'svcnum', 'int', '', '',
- 'blocknum', 'int', '', '',
- 'speed_up', 'int', '', '',
- 'speed_down', 'int', '', '',
- 'ip_addr', 'varchar', '', 15,
- ],
- 'primary_key' => 'svcnum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'part_virtual_field' => {
- 'columns' => [
- 'vfieldpart', 'int', '', '',
- 'dbtable', 'varchar', '', 32,
- 'name', 'varchar', '', 32,
- 'check_block', 'text', 'NULL', '',
- 'length', 'int', 'NULL', '',
- 'list_source', 'text', 'NULL', '',
- 'label', 'varchar', 'NULL', 80,
- ],
- 'primary_key' => 'vfieldpart',
- 'unique' => [],
- 'index' => [],
- },
-
- 'virtual_field' => {
- 'columns' => [
- 'vfieldnum', 'serial', '', '',
- 'recnum', 'int', '', '',
- 'vfieldpart', 'int', '', '',
- 'value', 'varchar', '', 128,
- ],
- 'primary_key' => 'vfieldnum',
- 'unique' => [ [ 'vfieldpart', 'recnum' ] ],
- 'index' => [],
- },
-
- 'acct_snarf' => {
- 'columns' => [
- 'snarfnum', 'int', '', '',
- 'svcnum', 'int', '', '',
- 'machine', 'varchar', '', 255,
- 'protocol', 'varchar', '', $char_d,
- 'username', 'varchar', '', $char_d,
- '_password', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'snarfnum',
- 'unique' => [],
- 'index' => [ [ 'svcnum' ] ],
- },
-
- 'svc_external' => {
- 'columns' => [
- 'svcnum', 'int', '', '',
- 'id', 'int', 'NULL', '',
- 'title', 'varchar', 'NULL', $char_d,
- ],
- 'primary_key' => 'svcnum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'cust_pay_refund' => {
- 'columns' => [
- 'payrefundnum', 'serial', '', '',
- 'paynum', 'int', '', '',
- 'refundnum', 'int', '', '',
- '_date', @date_type,
- 'amount', @money_type,
- ],
- 'primary_key' => 'payrefundnum',
- 'unique' => [],
- 'index' => [ ['paynum'], ['refundnum'] ],
- },
-
- 'part_pkg_option' => {
- 'columns' => [
- 'optionnum', 'serial', '', '',
- 'pkgpart', 'int', '', '',
- 'optionname', 'varchar', '', $char_d,
- 'optionvalue', 'text', 'NULL', '',
- ],
- 'primary_key' => 'optionnum',
- 'unique' => [],
- 'index' => [ [ 'pkgpart' ], [ 'optionname' ] ],
- },
-
- 'rate' => {
- 'columns' => [
- 'ratenum', 'serial', '', '',
- 'ratename', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'ratenum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'rate_detail' => {
- 'columns' => [
- 'ratedetailnum', 'serial', '', '',
- 'ratenum', 'int', '', '',
- 'orig_regionnum', 'int', 'NULL', '',
- 'dest_regionnum', 'int', '', '',
- 'min_included', 'int', '', '',
- 'min_charge', @money_type,
- 'sec_granularity', 'int', '', '',
- #time period (link to table of periods)?
- ],
- 'primary_key' => 'ratedetailnum',
- 'unique' => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
- 'index' => [ [ 'ratenum', 'dest_regionnum' ] ],
- },
-
- 'rate_region' => {
- 'columns' => [
- 'regionnum', 'serial', '', '',
- 'regionname', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'regionnum',
- 'unique' => [],
- 'index' => [],
- },
-
- 'rate_prefix' => {
- 'columns' => [
- 'prefixnum', 'serial', '', '',
- 'regionnum', 'int', '', '',,
- 'countrycode', 'varchar', '', 3,
- 'npa', 'varchar', 'NULL', 6,
- 'nxx', 'varchar', 'NULL', 3,
- ],
- 'primary_key' => 'prefixnum',
- 'unique' => [],
- 'index' => [ [ 'countrycode' ], [ 'regionnum' ] ],
- },
-
- 'reg_code' => {
- 'columns' => [
- 'codenum', 'serial', '', '',
- 'code', 'varchar', '', $char_d,
- 'agentnum', 'int', '', '',
- ],
- 'primary_key' => 'codenum',
- 'unique' => [ [ 'agentnum', 'code' ] ],
- 'index' => [ [ 'agentnum' ] ],
- },
-
- 'reg_code_pkg' => {
- 'columns' => [
- 'codepkgnum', 'serial', '', '',
- 'codenum', 'int', '', '',
- 'pkgpart', 'int', '', '',
- ],
- 'primary_key' => 'codepkgnum',
- 'unique' => [ [ 'codenum', 'pkgpart' ] ],
- 'index' => [ [ 'codenum' ] ],
- },
-
- 'clientapi_session' => {
- 'columns' => [
- 'sessionnum', 'serial', '', '',
- 'sessionid', 'varchar', '', $char_d,
- 'namespace', 'varchar', '', $char_d,
- ],
- 'primary_key' => 'sessionnum',
- 'unique' => [ [ 'sessionid', 'namespace' ] ],
- 'index' => [],
- },
-
- 'clientapi_session_field' => {
- 'columns' => [
- 'fieldnum', 'serial', '', '',
- 'sessionnum', 'int', '', '',
- 'fieldname', 'varchar', '', $char_d,
- 'fieldvalue', 'text', 'NULL', '',
- ],
- 'primary_key' => 'fieldnum',
- 'unique' => [ [ 'sessionnum', 'fieldname' ] ],
- 'index' => [],
- },
-
- 'payment_gateway' => {
- 'columns' => [
- 'gatewaynum', 'serial', '', '',
- 'gateway_module', 'varchar', '', $char_d,
- 'gateway_username', 'varchar', 'NULL', $char_d,
- 'gateway_password', 'varchar', 'NULL', $char_d,
- 'gateway_action', 'varchar', 'NULL', $char_d,
- 'disabled', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'gatewaynum',
- 'unique' => [],
- 'index' => [ [ 'disabled' ] ],
- },
-
- 'payment_gateway_option' => {
- 'columns' => [
- 'optionnum', 'serial', '', '',
- 'gatewaynum', 'int', '', '',
- 'optionname', 'varchar', '', $char_d,
- 'optionvalue', 'text', 'NULL', '',
- ],
- 'primary_key' => 'optionnum',
- 'unique' => [],
- 'index' => [ [ 'gatewaynum' ], [ 'optionname' ] ],
- },
-
- 'agent_payment_gateway' => {
- 'columns' => [
- 'agentgatewaynum', 'serial', '', '',
- 'agentnum', 'int', '', '',
- 'gatewaynum', 'int', '', '',
- 'cardtype', 'varchar', 'NULL', $char_d,
- 'taxclass', 'varchar', 'NULL', $char_d,
- ],
- 'primary_key' => 'agentgatewaynum',
- 'unique' => [],
- 'index' => [ [ 'agentnum', 'cardtype' ], ],
- },
-
- 'banned_pay' => {
- 'columns' => [
- 'bannum', 'serial', '', '',
- 'payby', 'char', '', 4,
- 'payinfo', 'varchar', '', 128, #say, a 512-big digest _hex encoded
- #'paymask', 'varchar', 'NULL', $char_d,
- '_date', @date_type,
- 'otaker', 'varchar', '', 32,
- 'reason', 'varchar', 'NULL', $char_d,
- ],
- 'primary_key' => 'bannum',
- 'unique' => [ [ 'payby', 'payinfo' ] ],
- 'index' => [],
- },
-
- 'cancel_reason' => {
- 'columns' => [
- 'reasonnum', 'serial', '', '',
- 'reason', 'varchar', '', $char_d,
- 'disabled', 'char', 'NULL', 1,
- ],
- 'primary_key' => 'reasonnum',
- 'unique' => [],
- 'index' => [ [ 'disabled' ] ],
- },
-
- };
-
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<DBIx::DBSchema>
-
-=cut
-
-1;
-
diff --git a/FS/FS/TicketSystem.pm b/FS/FS/TicketSystem.pm
index a80a82789..9d961fc47 100644
--- a/FS/FS/TicketSystem.pm
+++ b/FS/FS/TicketSystem.pm
@@ -5,10 +5,10 @@ use vars qw( $conf $system $AUTOLOAD );
use FS::Conf;
use FS::UID;
-FS::UID->install_callback( sub {
+install_callback FS::UID sub {
$conf = new FS::Conf;
$system = $conf->config('ticket_system');
-} );
+};
sub AUTOLOAD {
my $self = shift;
diff --git a/FS/FS/TicketSystem/RT_External.pm b/FS/FS/TicketSystem/RT_External.pm
index d951cc0e7..63eee867b 100644
--- a/FS/FS/TicketSystem/RT_External.pm
+++ b/FS/FS/TicketSystem/RT_External.pm
@@ -3,13 +3,11 @@ package FS::TicketSystem::RT_External;
use strict;
use vars qw( $conf $default_queueid
$priority_field $priority_field_queue $field
- $dbh $external_url );
+ $external_dbh $external_url );
use URI::Escape;
-use FS::UID qw(dbh);
-use FS::Record qw(qsearchs);
-use FS::cust_main;
+use FS::UID;
-FS::UID->install_callback( sub {
+install_callback FS::UID sub {
my $conf = new FS::Conf;
$default_queueid = $conf->config('ticket_system-default_queueid');
$priority_field =
@@ -26,23 +24,24 @@ FS::UID->install_callback( sub {
}
$external_url = '';
- $dbh = dbh;
if ($conf->config('ticket_system') eq 'RT_External') {
my ($datasrc, $user, $pass) = $conf->config('ticket_system-rt_external_datasrc');
- $dbh = DBI->connect($datasrc, $user, $pass, { 'ChopBlanks' => 1 })
+ $external_dbh = DBI->connect($datasrc, $user, $pass, { 'ChopBlanks' => 1 })
or die "RT_External DBI->connect error: $DBI::errstr\n";
$external_url = $conf->config('ticket_system-rt_external_url');
}
-} );
+};
sub num_customer_tickets {
- my( $self, $custnum, $priority ) = @_;
+ my( $self, $custnum, $priority, $dbh ) = @_;
+
+ $dbh ||= $external_dbh;
my( $from_sql, @param) = $self->_from_customer( $custnum, $priority );
- my $sql = "SELECT COUNT(*) $from_sql";
+ my $sql = "select count(*) $from_sql";
my $sth = $dbh->prepare($sql) or die $dbh->errstr. " preparing $sql";
$sth->execute(@param) or die $sth->errstr. " executing $sql";
@@ -51,13 +50,15 @@ sub num_customer_tickets {
}
sub customer_tickets {
- my( $self, $custnum, $limit, $priority ) = @_;
+ my( $self, $custnum, $limit, $priority, $dbh ) = @_;
$limit ||= 0;
+ $dbh ||= $external_dbh;
+
my( $from_sql, @param) = $self->_from_customer( $custnum, $priority );
- my $sql = "SELECT tickets.*, queues.name".
- ( length($priority) ? ", objectcustomfieldvalues.content" : '' ).
- " $from_sql ORDER BY priority DESC LIMIT $limit";
+ my $sql = "select tickets.*, queues.name".
+ ( length($priority) ? ", ticketcustomfieldvalues.content" : '' ).
+ " $from_sql order by priority desc limit $limit";
my $sth = $dbh->prepare($sql) or die $dbh->errstr. "preparing $sql";
$sth->execute(@param) or die $sth->errstr. "executing $sql";
@@ -75,23 +76,9 @@ sub _from_customer {
my $where = '';
if ( defined($priority) ) {
- my $queue_sql = " ObjectCustomFields.ObjectId = ( SELECT id FROM queues
- WHERE queues.name = ? )
- OR ( ? = '' AND ObjectCustomFields.ObjectId = 0 )";
-
- my $customfield_sql =
- "customfield = (
- SELECT CustomFields.Id FROM CustomFields
- JOIN ObjectCustomFields
- ON ( CustomFields.id = ObjectCustomFields.CustomField )
- WHERE LookupType = 'RT::Queue-RT::Ticket'
- AND name = ?
- AND ( $queue_sql )
- )";
-
- push @param, $priority_field,
- $priority_field_queue,
- $priority_field_queue;
+ my $queue_sql = " customfields.queue = ( select id from queues
+ where queues.name = ? )
+ or ( ? = '' and customfields.queue = 0 )";
if ( length($priority) ) {
#$where = "
@@ -103,35 +90,40 @@ sub _from_customer {
# )
# )
#";
- unshift @param, $priority;
+ push @param, $priority;
- $join = "JOIN ObjectCustomFieldValues
- ON ( tickets.id = ObjectCustomFieldValues.ObjectId )";
+ $join = "join TicketCustomFieldValues
+ on ( tickets.id = TicketCustomFieldValues.ticket )";
- $where = " AND content = ?
- AND ObjectType = 'RT::Ticket'
- AND $customfield_sql";
-
+ $where = "and content = ?
+ and customfield = ( select id from customfields
+ where name = ?
+ and ( $queue_sql )
+ )
+ ";
} else {
-
$where =
- "AND 0 = ( SELECT count(*) FROM ObjectCustomFieldValues
- WHERE ObjectId = tickets.id
- AND ObjectType = 'RT::Ticket'
- AND $customfield_sql
+ "and 0 = ( select count(*) from TicketCustomFieldValues
+ where ticket = tickets.id
+ and customfield = ( select id from customfields
+ where name = ?
+ and ( $queue_sql )
+ )
)
";
}
-
+ push @param, $priority_field,
+ $priority_field_queue,
+ $priority_field_queue;
}
my $sql = "
- FROM tickets
- JOIN queues ON ( tickets.queue = queues.id )
- JOIN links ON ( tickets.id = links.localbase )
+ from tickets
+ join queues on ( tickets.queue = queues.id )
+ join links on ( tickets.id = links.localbase )
$join
- WHERE ( status = 'new' OR status = 'open' OR status = 'stalled' )
- AND target = 'freeside://freeside/cust_main/$custnum'
+ where ( status = 'new' or status = 'open' or status = 'stalled' )
+ and target = 'freeside://freeside/cust_main/$custnum'
$where
";
@@ -139,14 +131,12 @@ sub _from_customer {
}
-sub href_customer_tickets {
+sub _href_customer_tickets {
my( $self, $custnum, $priority ) = @_;
- my $href = $self->baseurl;
-
#i snarfed this from an RT bookmarked search, it could be unescaped in the
#source for readability and run through uri_escape
- $href .=
+ my $href =
'Search/Results.html?Order=ASC&Query=%20MemberOf%20%3D%20%27freeside%3A%2F%2Ffreeside%2Fcust_main%2F'.
$custnum.
'%27%20%20AND%20%28%20Status%20%3D%20%27open%27%20%20OR%20Status%20%3D%20%27new%27%20%20OR%20Status%20%3D%20%27stalled%27%20%29%20'
@@ -188,54 +178,35 @@ sub href_customer_tickets {
}
-sub href_new_ticket {
- my( $self, $custnum_or_cust_main, $requestors ) = @_;
+sub href_customer_tickets {
+ my $self = shift;
+ $self->baseurl. $self->_href_customer_tickets(@_);
+}
- my( $custnum, $cust_main );
- if ( ref($custnum_or_cust_main) ) {
- $cust_main = $custnum_or_cust_main;
- $custnum = $cust_main->custnum;
- } else {
- $custnum = $custnum_or_cust_main;
- $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } );
- }
- my $queueid = $cust_main->agent->ticketing_queueid || $default_queueid;
- $self->baseurl.
+sub _href_new_ticket {
+ my( $self, $custnum, $requestors ) = @_;
+
'Ticket/Create.html?'.
- "Queue=$queueid".
+ "Queue=$default_queueid".
"&new-MemberOf=freeside://freeside/cust_main/$custnum".
( $requestors ? '&Requestors='. uri_escape($requestors) : '' )
;
}
-sub href_ticket {
- my($self, $ticketnum) = @_;
- $self->baseurl. 'Ticket/Display.html?id='.$ticketnum;
+sub href_new_ticket {
+ my $self = shift;
+ $self->baseurl. $self->_href_new_ticket(@_);
}
-sub queues {
- my($self) = @_;
-
- my $sql = "SELECT id, name FROM queues WHERE disabled = 0";
- my $sth = $dbh->prepare($sql) or die $dbh->errstr. " preparing $sql";
- $sth->execute() or die $sth->errstr. " executing $sql";
-
- map { $_->[0] => $_->[1] } @{ $sth->fetchall_arrayref([]) };
-
+sub _href_ticket {
+ my($self, $ticketnum) = @_;
+ 'Ticket/Display.html?id='.$ticketnum;
}
-sub queue {
- my($self, $queueid) = @_;
-
- return '' unless $queueid;
-
- my $sql = "SELECT name FROM queues WHERE id = ?";
- my $sth = $dbh->prepare($sql) or die $dbh->errstr. " preparing $sql";
- $sth->execute($queueid) or die $sth->errstr. " executing $sql";
-
- $sth->fetchrow_arrayref->[0];
-
+sub href_ticket {
+ my $self = shift;
+ $self->baseurl. $self->_href_ticket(@_);
}
sub baseurl {
diff --git a/FS/FS/TicketSystem/RT_Internal.pm b/FS/FS/TicketSystem/RT_Internal.pm
index 8fce918e0..6f28faf0f 100644
--- a/FS/FS/TicketSystem/RT_Internal.pm
+++ b/FS/FS/TicketSystem/RT_Internal.pm
@@ -16,6 +16,16 @@ sub sql_num_customer_tickets {
)";
}
+sub num_customer_tickets {
+ my( $self, $custnum, $priority ) = ( shift, shift, shift );
+ $self->SUPER::num_customer_tickets( $custnum, $priority, dbh );
+}
+
+sub customer_tickets {
+ my( $self, $custnum, $limit, $priority ) = ( shift, shift, shift, shift );
+ $self->SUPER::customer_tickets( $custnum, $limit, $priority, dbh );
+}
+
sub baseurl {
#my $self = shift;
if ( $RT::URI::freeside::URL ) {
diff --git a/FS/FS/UI/Web.pm b/FS/FS/UI/Web.pm
index 49e3fbf7e..e701141ec 100644
--- a/FS/FS/UI/Web.pm
+++ b/FS/FS/UI/Web.pm
@@ -1,9 +1,5 @@
package FS::UI::Web;
-use vars qw($DEBUG);
-use FS::Conf;
-use FS::Record qw(dbdef);
-
#use vars qw(@ISA);
#use FS::UI
#@ISA = qw( FS::UI );
@@ -12,132 +8,30 @@ use Date::Parse;
sub parse_beginning_ending {
my($cgi) = @_;
- my $beginning = 0;
- if ( $cgi->param('begin') =~ /^(\d+)$/ ) {
- $beginning = $1;
- } elsif ( $cgi->param('beginning') =~ /^([ 0-9\-\/]{1,64})$/ ) {
- $beginning = str2time($1) || 0;
- }
+ $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/;
+ my $beginning = str2time($1) || 0;
- my $ending = 4294967295; #2^32-1
- if ( $cgi->param('end') =~ /^(\d+)$/ ) {
- $ending = $1 - 1;
- } elsif ( $cgi->param('ending') =~ /^([ 0-9\-\/]{1,64})$/ ) {
- #probably need an option to turn off the + 86399
- $ending = str2time($1) + 86399;
- }
+ #need an option to turn off the + 86399 ???
+ $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/;
+ my $ending = ( $1 ? str2time($1) : 4294880896 ) + 86399;
( $beginning, $ending );
}
-###
-# cust_main report methods
-###
-
-=item cust_header
-
-Returns an array of customer information headers according to the
-B<cust-fields> configuration setting.
-
-=cut
-
-use vars qw( @cust_fields );
-
-sub cust_sql_fields {
- my @fields = qw( last first company );
- push @fields, map "ship_$_", @fields
- if dbdef->table('cust_main')->column('ship_last');
- map "cust_main.$_", @fields;
-}
-
-sub cust_header {
-
- warn "FS::svc_Common::cust_header called"
- if $DEBUG;
-
- my $conf = new FS::Conf;
-
- my %header2method = (
- 'Customer' => 'name',
- 'Cust#' => 'custnum',
- 'Name' => 'contact',
- 'Company' => 'company',
- '(bill) Customer' => 'name',
- '(service) Customer' => 'ship_name',
- '(bill) Name' => 'contact',
- '(service) Name' => 'ship_contact',
- '(bill) Company' => 'company',
- '(service) Company' => 'ship_company',
- );
-
- my @cust_header;
- if ( $conf->exists('cust-fields')
- && $conf->config('cust-fields') =~ /^([\w \|\#\(\)]+):/
- )
- {
- warn " found cust-fields configuration value"
- if $DEBUG;
-
- my $cust_fields = $1;
- @cust_header = split(/ \| /, $cust_fields);
- @cust_fields = map { $header2method{$_} } @cust_header;
- } else {
- warn " no cust-fields configuration value found; using default 'Customer'"
- if $DEBUG;
- @cust_header = ( 'Customer' );
- @cust_fields = ( 'name' );
- }
-
- #my $svc_x = shift;
- @cust_header;
-}
-
-=item cust_fields
-
-Given a svc_ object that contains fields from cust_main (say, from a
-JOINed search. See httemplate/search/svc_* for examples), returns an array
-of customer information according to the <B>cust-fields</B> configuration
-setting, or "(unlinked)" if this service is not linked to a customer.
-
-=cut
-
-sub cust_fields {
- my $svc_x = shift;
- warn "FS::svc_Common::cust_fields called for $svc_x ".
- "(cust_fields: @cust_fields)"
- if $DEBUG > 1;
-
- cust_header() unless @cust_fields;
-
- my $seen_unlinked = 0;
- map {
- if ( $svc_x->custnum ) {
- warn " $svc_x -> $_"
- if $DEBUG > 1;
- $svc_x->$_(@_);
- } else {
- warn " ($svc_x unlinked)"
- if $DEBUG > 1;
- $seen_unlinked++ ? '' : '(unlinked)';
- }
- } @cust_fields;
-}
-
-###
# begin JSRPC code...
-###
package FS::UI::Web::JSRPC;
use strict;
-use vars qw($DEBUG);
+use vars qw(@ISA $DEBUG);
use Storable qw(nfreeze);
use MIME::Base64;
-use JSON;
+use JavaScript::RPC::Server::CGI;
use FS::UID;
use FS::Record qw(qsearchs);
use FS::queue;
+@ISA = qw( JavaScript::RPC::Server::CGI );
$DEBUG = 0;
sub new {
@@ -145,48 +39,13 @@ sub new {
my $self = {
env => {},
job => shift,
- cgi => shift,
};
bless $self, $class;
- die "CGI object required as second argument" unless $self->{'cgi'};
-
return $self;
}
-sub process {
-
- my $self = shift;
-
- my $cgi = $self->{'cgi'};
-
- # XXX this should parse JSON foo and build a proper data structure
- my @args = $cgi->param('arg');
-
- #work around konqueror bug!
- @args = map { s/\x00$//; $_; } @args;
-
- my $sub = $cgi->param('sub'); #????
-
- warn "FS::UI::Web::JSRPC::process:\n".
- " cgi=$cgi\n".
- " sub=$sub\n".
- " args=".join(', ',@args)."\n"
- if $DEBUG;
-
- if ( $sub eq 'start_job' ) {
-
- $self->start_job(@args);
-
- } elsif ( $sub eq 'job_status' ) {
-
- $self->job_status(@args);
-
- }
-
-}
-
sub start_job {
my $self = shift;
@@ -227,10 +86,7 @@ sub start_job {
my $error = $job->insert( '_JOB', encode_base64(nfreeze(\%param)) );
if ( $error ) {
- $error; #this doesn't seem to be handled well,
- # will trigger "illegal jobnum" below?
- # (should never be an error inserting the job, though, only thing
- # would be Pg f%*kage)
+ $error;
} else {
$job->jobnum;
}
@@ -240,7 +96,7 @@ sub start_job {
sub job_status {
my( $self, $jobnum ) = @_; #$url ???
- sleep 1; # XXX could use something better...
+ sleep 5; #could use something better...
my $job;
if ( $jobnum =~ /^(\d+)$/ ) {
@@ -259,8 +115,12 @@ sub job_status {
@return = ( 'error', $job ? $job->statustext : $jobnum );
}
- objToJson(\@return);
+ join("\n",@return);
+
+}
+sub get_new_query {
+ FS::UID::cgi();
}
1;
diff --git a/FS/FS/agent.pm b/FS/FS/agent.pm
index 83f0ce5b5..fc1d1a93e 100644
--- a/FS/FS/agent.pm
+++ b/FS/FS/agent.pm
@@ -2,13 +2,11 @@ package FS::agent;
use strict;
use vars qw( @ISA );
-#use Crypt::YAPassGen;
use FS::Record qw( dbh qsearch qsearchs );
use FS::cust_main;
-use FS::cust_pkg;
use FS::agent_type;
use FS::reg_code;
-use FS::TicketSystem;
+#use Crypt::YAPassGen;
@ISA = qw( FS::Record );
@@ -168,18 +166,6 @@ sub pkgpart_hashref {
$self->agent_type->pkgpart_hashref;
}
-=item ticketing_queue
-
-Returns the queue name corresponding with the id from the I<ticketing_queueid>
-field, or the empty string.
-
-=cut
-
-sub ticketing_queue {
- my $self = shift;
- FS::TicketSystem->queue($self->ticketing_queueid);
-};
-
=item num_prospect_cust_main
Returns the number of prospects (customers with no packages ever ordered) for
@@ -193,9 +179,10 @@ sub num_prospect_cust_main {
sub num_sql {
my( $self, $sql ) = @_;
- my $statement = "SELECT COUNT(*) FROM cust_main WHERE agentnum = ? AND $sql";
- my $sth = dbh->prepare($statement) or die dbh->errstr." preparing $statement";
- $sth->execute($self->agentnum) or die $sth->errstr. "executing $statement";
+ my $sth = dbh->prepare(
+ "SELECT COUNT(*) FROM cust_main WHERE agentnum = ? AND $sql"
+ ) or die dbh->errstr;
+ $sth->execute($self->agentnum) or die $sth->errstr;
$sth->fetchrow_arrayref->[0];
}
@@ -279,46 +266,6 @@ sub cancel_cust_main {
shift->cust_main_sql(FS::cust_main->cancel_sql);
}
-=item num_active_cust_pkg
-
-Returns the number of active customer packages for this agent.
-
-=cut
-
-sub num_active_cust_pkg {
- shift->num_pkg_sql(FS::cust_pkg->active_sql);
-}
-
-sub num_pkg_sql {
- my( $self, $sql ) = @_;
- my $statement =
- "SELECT COUNT(*) FROM cust_pkg LEFT JOIN cust_main USING ( custnum )".
- " WHERE agentnum = ? AND $sql";
- my $sth = dbh->prepare($statement) or die dbh->errstr." preparing $statement";
- $sth->execute($self->agentnum) or die $sth->errstr. "executing $statement";
- $sth->fetchrow_arrayref->[0];
-}
-
-=item num_susp_cust_pkg
-
-Returns the number of suspended customer packages for this agent.
-
-=cut
-
-sub num_susp_cust_pkg {
- shift->num_pkg_sql(FS::cust_pkg->susp_sql);
-}
-
-=item num_cancel_cust_pkg
-
-Returns the number of cancelled customer packages for this agent.
-
-=cut
-
-sub num_cancel_cust_pkg {
- shift->num_pkg_sql(FS::cust_pkg->cancel_sql);
-}
-
=item generate_reg_codes NUM PKGPART_ARRAYREF
Generates the specified number of registration codes, allowing purchase of the
diff --git a/FS/FS/agent_payment_gateway.pm b/FS/FS/agent_payment_gateway.pm
deleted file mode 100644
index bd99d0ccd..000000000
--- a/FS/FS/agent_payment_gateway.pm
+++ /dev/null
@@ -1,139 +0,0 @@
-package FS::agent_payment_gateway;
-
-use strict;
-use vars qw( @ISA );
-use FS::Record qw( qsearch qsearchs );
-use FS::payment_gateway;
-
-@ISA = qw(FS::Record);
-
-=head1 NAME
-
-FS::agent_payment_gateway - Object methods for agent_payment_gateway records
-
-=head1 SYNOPSIS
-
- use FS::agent_payment_gateway;
-
- $record = new FS::agent_payment_gateway \%hash;
- $record = new FS::agent_payment_gateway { 'column' => 'value' };
-
- $error = $record->insert;
-
- $error = $new_record->replace($old_record);
-
- $error = $record->delete;
-
- $error = $record->check;
-
-=head1 DESCRIPTION
-
-An FS::agent_payment_gateway object represents a payment gateway override for
-a specific agent. FS::agent_payment_gateway inherits from FS::Record. The
-following fields are currently supported:
-
-=over 4
-
-=item agentgatewaynum - primary key
-
-=item agentnum -
-
-=item gatewaynum -
-
-=item cardtype -
-
-=item taxclass -
-
-=back
-
-=head1 METHODS
-
-=over 4
-
-=item new HASHREF
-
-Creates a new override. To add the override to the database, see L<"insert">.
-
-Note that this stores the hash reference, not a distinct copy of the hash it
-points to. You can ask the object for a copy with the I<hash> method.
-
-=cut
-
-# the new method can be inherited from FS::Record, if a table method is defined
-
-sub table { 'agent_payment_gateway'; }
-
-=item insert
-
-Adds this record to the database. If there is an error, returns the error,
-otherwise returns false.
-
-=cut
-
-# the insert method can be inherited from FS::Record
-
-=item delete
-
-Delete this record from the database.
-
-=cut
-
-# the delete method can be inherited from FS::Record
-
-=item replace OLD_RECORD
-
-Replaces the OLD_RECORD with this one in the database. If there is an error,
-returns the error, otherwise returns false.
-
-=cut
-
-# the replace method can be inherited from FS::Record
-
-=item check
-
-Checks all fields to make sure this is a valid override. If there is
-an error, returns the error, otherwise returns false. Called by the insert
-and replace methods.
-
-=cut
-
-# the check method should currently be supplied - FS::Record contains some
-# data checking routines
-
-sub check {
- my $self = shift;
-
- my $error =
- $self->ut_numbern('agentgatewaynum')
- || $self->ut_foreign_key('agentnum', 'agent', 'agentnum')
- || $self->ut_foreign_key('gatewaynum', 'payment_gateway', 'gatewaynum' )
- || $self->ut_textn('cardtype')
- || $self->ut_textn('taxclass')
- ;
- return $error if $error;
-
- $self->SUPER::check;
-}
-
-=item payment_gateway
-
-=cut
-
-sub payment_gateway {
- my $self = shift;
- qsearchs('payment_gateway', { 'gatewaynum' => $self->gatewaynum } );
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::payment_gateway>, L<FS::agent>, L<FS::Record>, schema.html from the
-base documentation.
-
-=cut
-
-1;
-
diff --git a/FS/FS/banned_pay.pm b/FS/FS/banned_pay.pm
deleted file mode 100644
index 1ad87f508..000000000
--- a/FS/FS/banned_pay.pm
+++ /dev/null
@@ -1,136 +0,0 @@
-package FS::banned_pay;
-
-use strict;
-use vars qw( @ISA );
-use FS::Record qw( qsearch qsearchs );
-use FS::UID qw( getotaker );
-
-@ISA = qw(FS::Record);
-
-=head1 NAME
-
-FS::banned_pay - Object methods for banned_pay records
-
-=head1 SYNOPSIS
-
- use FS::banned_pay;
-
- $record = new FS::banned_pay \%hash;
- $record = new FS::banned_pay { 'column' => 'value' };
-
- $error = $record->insert;
-
- $error = $new_record->replace($old_record);
-
- $error = $record->delete;
-
- $error = $record->check;
-
-=head1 DESCRIPTION
-
-An FS::banned_pay object represents an banned credit card or ACH account.
-FS::banned_pay inherits from FS::Record. The following fields are currently
-supported:
-
-=over 4
-
-=item bannum - primary key
-
-=item payby - I<CARD> or I<CHEK>
-
-=item payinfo - fingerprint of banned card (base64-encoded MD5 digest)
-
-=item _date - specified as a UNIX timestamp; see L<perlfunc/"time">. Also see
-L<Time::Local> and L<Date::Parse> for conversion functions.
-
-=item otaker - order taker (assigned automatically, see L<FS::UID>)
-
-=item reason - reason (text)
-
-=back
-
-=head1 METHODS
-
-=over 4
-
-=item new HASHREF
-
-Creates a new ban. To add the ban to the database, see L<"insert">.
-
-Note that this stores the hash reference, not a distinct copy of the hash it
-points to. You can ask the object for a copy with the I<hash> method.
-
-=cut
-
-# the new method can be inherited from FS::Record, if a table method is defined
-
-sub table { 'banned_pay'; }
-
-=item insert
-
-Adds this record to the database. If there is an error, returns the error,
-otherwise returns false.
-
-=cut
-
-# the insert method can be inherited from FS::Record
-
-=item delete
-
-Delete this record from the database.
-
-=cut
-
-# the delete method can be inherited from FS::Record
-
-=item replace OLD_RECORD
-
-Replaces the OLD_RECORD with this one in the database. If there is an error,
-returns the error, otherwise returns false.
-
-=cut
-
-# the replace method can be inherited from FS::Record
-
-=item check
-
-Checks all fields to make sure this is a valid ban. If there is
-an error, returns the error, otherwise returns false. Called by the insert
-and replace methods.
-
-=cut
-
-# the check method should currently be supplied - FS::Record contains some
-# data checking routines
-
-sub check {
- my $self = shift;
-
- my $error =
- $self->ut_numbern('bannum')
- || $self->ut_enum('payby', [ 'CARD', 'CHEK' ] )
- || $self->ut_text('payinfo')
- || $self->ut_numbern('_date')
- || $self->ut_textn('reason')
- ;
- return $error if $error;
-
- $self->_date(time) unless $self->_date;
-
- $self->otaker(getotaker);
-
- $self->SUPER::check;
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::Record>, schema.html from the base documentation.
-
-=cut
-
-1;
-
diff --git a/FS/FS/cancel_reason.pm b/FS/FS/cancel_reason.pm
deleted file mode 100644
index 19cc7214e..000000000
--- a/FS/FS/cancel_reason.pm
+++ /dev/null
@@ -1,123 +0,0 @@
-package FS::cancel_reason;
-
-use strict;
-use vars qw( @ISA );
-use FS::Record qw( qsearch qsearchs );
-
-@ISA = qw(FS::Record);
-
-=head1 NAME
-
-FS::cancel_reason - Object methods for cancel_reason records
-
-=head1 SYNOPSIS
-
- use FS::cancel_reason;
-
- $record = new FS::cancel_reason \%hash;
- $record = new FS::cancel_reason { 'column' => 'value' };
-
- $error = $record->insert;
-
- $error = $new_record->replace($old_record);
-
- $error = $record->delete;
-
- $error = $record->check;
-
-=head1 DESCRIPTION
-
-An FS::cancel_reason object represents an cancellation reason.
-FS::cancel_reason inherits from FS::Record. The following fields are
-currently supported:
-
-=over 4
-
-=item reasonnum - primary key
-
-=item reason -
-
-=item disabled - empty or "Y"
-
-=back
-
-=head1 METHODS
-
-=over 4
-
-=item new HASHREF
-
-Creates a new cancellation reason. To add the reason to the database, see
-L<"insert">.
-
-Note that this stores the hash reference, not a distinct copy of the hash it
-points to. You can ask the object for a copy with the I<hash> method.
-
-=cut
-
-# the new method can be inherited from FS::Record, if a table method is defined
-
-sub table { 'cancel_reason'; }
-
-=item insert
-
-Adds this record to the database. If there is an error, returns the error,
-otherwise returns false.
-
-=cut
-
-# the insert method can be inherited from FS::Record
-
-=item delete
-
-Delete this record from the database.
-
-=cut
-
-# the delete method can be inherited from FS::Record
-
-=item replace OLD_RECORD
-
-Replaces the OLD_RECORD with this one in the database. If there is an error,
-returns the error, otherwise returns false.
-
-=cut
-
-# the replace method can be inherited from FS::Record
-
-=item check
-
-Checks all fields to make sure this is a valid reason. If there is
-an error, returns the error, otherwise returns false. Called by the insert
-and replace methods.
-
-=cut
-
-# the check method should currently be supplied - FS::Record contains some
-# data checking routines
-
-sub check {
- my $self = shift;
-
- my $error =
- $self->ut_numbern('reasonnum')
- || $self->ut_text('reason')
- || $self->ut_enum('disabled', [ '', 'Y' ] )
- ;
- return $error if $error;
-
- $self->SUPER::check;
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::Record>, schema.html from the base documentation.
-
-=cut
-
-1;
-
diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm
index 6e3b2b2f8..b9a99c900 100644
--- a/FS/FS/cust_bill.pm
+++ b/FS/FS/cust_bill.pm
@@ -3,7 +3,6 @@ package FS::cust_bill;
use strict;
use vars qw( @ISA $DEBUG $conf $money_char );
use vars qw( $invoice_lines @buf ); #yuck
-use Fcntl qw(:flock); #for spool_csv
use IPC::Run3;
use Date::Format;
use Text::Template 1.20;
@@ -12,9 +11,8 @@ use String::ShellQuote;
use HTML::Entities;
use Locale::Country;
use FS::UID qw( datasrc );
-use FS::Misc qw( send_email send_fax );
use FS::Record qw( qsearch qsearchs );
-use FS::cust_main_Mixin;
+use FS::Misc qw( send_email send_fax );
use FS::cust_main;
use FS::cust_bill_pkg;
use FS::cust_credit;
@@ -27,7 +25,7 @@ use FS::part_pkg;
use FS::cust_bill_pay;
use FS::part_bill_event;
-@ISA = qw( FS::cust_main_Mixin FS::Record );
+@ISA = qw( FS::Record );
$DEBUG = 0;
@@ -107,13 +105,6 @@ Invoices are normally created by calling the bill method of a customer object
sub table { 'cust_bill'; }
-sub cust_linked { $_[0]->cust_main_custnum; }
-sub cust_unlinked_msg {
- my $self = shift;
- "WARNING: can't find cust_main.custnum ". $self->custnum.
- ' (cust_bill.invnum '. $self->invnum. ')';
-}
-
=item insert
Adds this invoice to the database ("Posts" the invoice). If there is an error,
@@ -236,25 +227,6 @@ sub cust_main {
qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
}
-=item cust_suspend_if_balance_over AMOUNT
-
-Suspends the customer associated with this invoice if the total amount owed on
-this invoice and all older invoices is greater than the specified amount.
-
-Returns a list: an empty list on success or a list of errors.
-
-=cut
-
-sub cust_suspend_if_balance_over {
- my( $self, $amount ) = ( shift, shift );
- my $cust_main = $self->cust_main;
- if ( $cust_main->total_owed_date($self->_date) < $amount ) {
- return ();
- } else {
- $cust_main->suspend;
- }
-}
-
=item cust_credit
Depreciated. See the cust_credited method.
@@ -445,7 +417,7 @@ sub generate_email {
my $path = "$FS::UID::conf_dir/conf.$FS::UID::datasrc";
my $file;
- if ( defined($args{'_template'}) && length($args{'_template'})
+ if ( length($args{'_template'})
&& -e "$path/logo_". $args{'_template'}. ".png"
)
{
@@ -747,7 +719,7 @@ sub send_if_newest {
$self->send(@_);
}
-=item send_csv OPTION => VALUE, ...
+=item send_csv OPTIONS
Sends invoice as a CSV data-file to a remote host with the specified protocol.
@@ -762,141 +734,7 @@ dir
The file will be named "N-YYYYMMDDHHMMSS.csv" where N is the invoice number
and YYMMDDHHMMSS is a timestamp.
-See L</print_csv> for a description of the output format.
-
-=cut
-
-sub send_csv {
- my($self, %opt) = @_;
-
- #create file(s)
-
- my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/cust_bill";
- mkdir $spooldir, 0700 unless -d $spooldir;
-
- my $tracctnum = $self->invnum. time2str('-%Y%m%d%H%M%S', time);
- my $file = "$spooldir/$tracctnum.csv";
-
- my ( $header, $detail ) = $self->print_csv(%opt, 'tracctnum' => $tracctnum );
-
- open(CSV, ">$file") or die "can't open $file: $!";
- print CSV $header;
-
- print CSV $detail;
-
- close CSV;
-
- my $net;
- if ( $opt{protocol} eq 'ftp' ) {
- eval "use Net::FTP;";
- die $@ if $@;
- $net = Net::FTP->new($opt{server}) or die @$;
- } else {
- die "unknown protocol: $opt{protocol}";
- }
-
- $net->login( $opt{username}, $opt{password} )
- or die "can't FTP to $opt{username}\@$opt{server}: login error: $@";
-
- $net->binary or die "can't set binary mode";
-
- $net->cwd($opt{dir}) or die "can't cwd to $opt{dir}";
-
- $net->put($file) or die "can't put $file: $!";
-
- $net->quit;
-
- unlink $file;
-
-}
-
-=item spool_csv
-
-Spools CSV invoice data.
-
-Options are:
-
-=over 4
-
-=item format - 'default' or 'billco'
-
-=item dest - if set (to POST, EMAIL or FAX), only sends spools invoices if the customer has the corresponding invoice destinations set (see L<FS::cust_main_invoice>).
-
-=item agent_spools - if set to a true value, will spool to per-agent files rather than a single global file
-
-=back
-
-=cut
-
-sub spool_csv {
- my($self, %opt) = @_;
-
- my $cust_main = $self->cust_main;
-
- if ( $opt{'dest'} ) {
- my %invoicing_list = map { /^(POST|FAX)$/ or 'EMAIL' =~ /^(.*)$/; $1 => 1 }
- $cust_main->invoicing_list;
- return 'N/A' unless $invoicing_list{$opt{'dest'}}
- || ! keys %invoicing_list;
- }
-
- my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/cust_bill";
- mkdir $spooldir, 0700 unless -d $spooldir;
-
- my $tracctnum = $self->invnum. time2str('-%Y%m%d%H%M%S', time);
-
- my $file =
- "$spooldir/".
- ( $opt{'agent_spools'} ? 'agentnum'.$cust_main->agentnum : 'spool' ).
- ( lc($opt{'format'}) eq 'billco' ? '-header' : '' ) .
- '.csv';
-
- my ( $header, $detail ) = $self->print_csv(%opt, 'tracctnum' => $tracctnum );
-
- open(CSV, ">>$file") or die "can't open $file: $!";
- flock(CSV, LOCK_EX);
- seek(CSV, 0, 2);
-
- print CSV $header;
-
- if ( lc($opt{'format'}) eq 'billco' ) {
-
- flock(CSV, LOCK_UN);
- close CSV;
-
- $file =
- "$spooldir/".
- ( $opt{'agent_spools'} ? 'agentnum'.$cust_main->agentnum : 'spool' ).
- '-detail.csv';
-
- open(CSV,">>$file") or die "can't open $file: $!";
- flock(CSV, LOCK_EX);
- seek(CSV, 0, 2);
- }
-
- print CSV $detail;
-
- flock(CSV, LOCK_UN);
- close CSV;
-
- return '';
-
-}
-
-=item print_csv OPTION => VALUE, ...
-
-Returns CSV data for this invoice.
-
-Options are:
-
-format - 'default' or 'billco'
-
-Returns a list consisting of two scalars. The first is a single line of CSV
-header information for this invoice. The second is one or more lines of CSV
-detail information for this invoice.
-
-If I<format> is not specified or "default", the fields of the CSV file are as
-follows:
+The fields of the CSV file is as follows:
record_type, invnum, custnum, _date, charged, first, last, company, address1, address2, city, state, zip, country, pkg, setup, recur, sdate, edate
@@ -904,13 +742,13 @@ record_type, invnum, custnum, _date, charged, first, last, company, address1, ad
=item record type - B<record_type> is either C<cust_bill> or C<cust_bill_pkg>
-B<record_type> is C<cust_bill> for the initial header line only. The
+If B<record_type> is C<cust_bill>, this is a primary invoice record. The
last five fields (B<pkg> through B<edate>) are irrelevant, and all other
fields are filled in.
-B<record_type> is C<cust_bill_pkg> for detail lines. Only the first two fields
-(B<record_type> and B<invnum>) and the last five fields (B<pkg> through B<edate>)
-are filled in.
+If B<record_type> is C<cust_bill_pkg>, this is a line item record. Only the
+first two fields (B<record_type> and B<invnum>) and the last five fields
+(B<pkg> through B<edate>) are filled in.
=item invnum - invoice number
@@ -950,213 +788,101 @@ are filled in.
=back
-If I<format> is "billco", the fields of the header CSV file are as follows:
-
- +-------------------------------------------------------------------+
- | FORMAT HEADER FILE |
- |-------------------------------------------------------------------|
- | Field | Description | Name | Type | Width |
- | 1 | N/A-Leave Empty | RC | CHAR | 2 |
- | 2 | N/A-Leave Empty | CUSTID | CHAR | 15 |
- | 3 | Transaction Account No | TRACCTNUM | CHAR | 15 |
- | 4 | Transaction Invoice No | TRINVOICE | CHAR | 15 |
- | 5 | Transaction Zip Code | TRZIP | CHAR | 5 |
- | 6 | Transaction Company Bill To | TRCOMPANY | CHAR | 30 |
- | 7 | Transaction Contact Bill To | TRNAME | CHAR | 30 |
- | 8 | Additional Address Unit Info | TRADDR1 | CHAR | 30 |
- | 9 | Bill To Street Address | TRADDR2 | CHAR | 30 |
- | 10 | Ancillary Billing Information | TRADDR3 | CHAR | 30 |
- | 11 | Transaction City Bill To | TRCITY | CHAR | 20 |
- | 12 | Transaction State Bill To | TRSTATE | CHAR | 2 |
- | 13 | Bill Cycle Close Date | CLOSEDATE | CHAR | 10 |
- | 14 | Bill Due Date | DUEDATE | CHAR | 10 |
- | 15 | Previous Balance | BALFWD | NUM* | 9 |
- | 16 | Pmt/CR Applied | CREDAPPLY | NUM* | 9 |
- | 17 | Total Current Charges | CURRENTCHG | NUM* | 9 |
- | 18 | Total Amt Due | TOTALDUE | NUM* | 9 |
- | 19 | Total Amt Due | AMTDUE | NUM* | 9 |
- | 20 | 30 Day Aging | AMT30 | NUM* | 9 |
- | 21 | 60 Day Aging | AMT60 | NUM* | 9 |
- | 22 | 90 Day Aging | AMT90 | NUM* | 9 |
- | 23 | Y/N | AGESWITCH | CHAR | 1 |
- | 24 | Remittance automation | SCANLINE | CHAR | 100 |
- | 25 | Total Taxes & Fees | TAXTOT | NUM* | 9 |
- | 26 | Customer Reference Number | CUSTREF | CHAR | 15 |
- | 27 | Federal Tax*** | FEDTAX | NUM* | 9 |
- | 28 | State Tax*** | STATETAX | NUM* | 9 |
- | 29 | Other Taxes & Fees*** | OTHERTAX | NUM* | 9 |
- +-------+-------------------------------+------------+------+-------+
-
-If I<format> is "billco", the fields of the detail CSV file are as follows:
-
- FORMAT FOR DETAIL FILE
- | | | |
- Field | Description | Name | Type | Width
- 1 | N/A-Leave Empty | RC | CHAR | 2
- 2 | N/A-Leave Empty | CUSTID | CHAR | 15
- 3 | Account Number | TRACCTNUM | CHAR | 15
- 4 | Invoice Number | TRINVOICE | CHAR | 15
- 5 | Line Sequence (sort order) | LINESEQ | NUM | 6
- 6 | Transaction Detail | DETAILS | CHAR | 100
- 7 | Amount | AMT | NUM* | 9
- 8 | Line Format Control** | LNCTRL | CHAR | 2
- 9 | Grouping Code | GROUP | CHAR | 2
- 10 | User Defined | ACCT CODE | CHAR | 15
-
=cut
-sub print_csv {
+sub send_csv {
my($self, %opt) = @_;
-
- eval "use Text::CSV_XS";
- die $@ if $@;
- my $cust_main = $self->cust_main;
+ #part one: create file
- my $csv = Text::CSV_XS->new({'always_quote'=>1});
+ my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/cust_bill";
+ mkdir $spooldir, 0700 unless -d $spooldir;
- if ( lc($opt{'format'}) eq 'billco' ) {
+ my $file = $spooldir. '/'. $self->invnum. time2str('-%Y%m%d%H%M%S.csv', time);
- my $taxtotal = 0;
- $taxtotal += $_->{'amount'} foreach $self->_items_tax;
+ open(CSV, ">$file") or die "can't open $file: $!";
- my $duedate = '';
- if ( $conf->exists('invoice_default_terms')
- && $conf->config('invoice_default_terms')=~ /^\s*Net\s*(\d+)\s*$/ ) {
- $duedate = time2str("%m/%d/%Y", $self->_date + ($1*86400) );
- }
+ eval "use Text::CSV_XS";
+ die $@ if $@;
- my( $previous_balance, @unused ) = $self->previous; #previous balance
+ my $csv = Text::CSV_XS->new({'always_quote'=>1});
- my $pmt_cr_applied = 0;
- $pmt_cr_applied += $_->{'amount'}
- foreach ( $self->_items_payments, $self->_items_credits ) ;
+ my $cust_main = $self->cust_main;
- my $totaldue = sprintf('%.2f', $self->owed + $previous_balance);
+ $csv->combine(
+ 'cust_bill',
+ $self->invnum,
+ $self->custnum,
+ time2str("%x", $self->_date),
+ sprintf("%.2f", $self->charged),
+ ( map { $cust_main->getfield($_) }
+ qw( first last company address1 address2 city state zip country ) ),
+ map { '' } (1..5),
+ ) or die "can't create csv";
+ print CSV $csv->string. "\n";
+
+ #new charges (false laziness w/print_text and _items stuff)
+ foreach my $cust_bill_pkg ( $self->cust_bill_pkg ) {
+
+ my($pkg, $setup, $recur, $sdate, $edate);
+ if ( $cust_bill_pkg->pkgnum ) {
+
+ ($pkg, $setup, $recur, $sdate, $edate) = (
+ $cust_bill_pkg->cust_pkg->part_pkg->pkg,
+ ( $cust_bill_pkg->setup != 0
+ ? sprintf("%.2f", $cust_bill_pkg->setup )
+ : '' ),
+ ( $cust_bill_pkg->recur != 0
+ ? sprintf("%.2f", $cust_bill_pkg->recur )
+ : '' ),
+ time2str("%x", $cust_bill_pkg->sdate),
+ time2str("%x", $cust_bill_pkg->edate),
+ );
- $csv->combine(
- '', # 1 | N/A-Leave Empty CHAR 2
- '', # 2 | N/A-Leave Empty CHAR 15
- $opt{'tracctnum'}, # 3 | Transaction Account No CHAR 15
- $self->invnum, # 4 | Transaction Invoice No CHAR 15
- $cust_main->zip, # 5 | Transaction Zip Code CHAR 5
- $cust_main->company, # 6 | Transaction Company Bill To CHAR 30
- #$cust_main->payname, # 7 | Transaction Contact Bill To CHAR 30
- $cust_main->contact, # 7 | Transaction Contact Bill To CHAR 30
- $cust_main->address2, # 8 | Additional Address Unit Info CHAR 30
- $cust_main->address1, # 9 | Bill To Street Address CHAR 30
- '', # 10 | Ancillary Billing Information CHAR 30
- $cust_main->city, # 11 | Transaction City Bill To CHAR 20
- $cust_main->state, # 12 | Transaction State Bill To CHAR 2
-
- # XXX ?
- time2str("%m/%d/%Y", $self->_date), # 13 | Bill Cycle Close Date CHAR 10
-
- # XXX ?
- $duedate, # 14 | Bill Due Date CHAR 10
-
- $previous_balance, # 15 | Previous Balance NUM* 9
- $pmt_cr_applied, # 16 | Pmt/CR Applied NUM* 9
- sprintf("%.2f", $self->charged), # 17 | Total Current Charges NUM* 9
- $totaldue, # 18 | Total Amt Due NUM* 9
- $totaldue, # 19 | Total Amt Due NUM* 9
- '', # 20 | 30 Day Aging NUM* 9
- '', # 21 | 60 Day Aging NUM* 9
- '', # 22 | 90 Day Aging NUM* 9
- 'N', # 23 | Y/N CHAR 1
- '', # 24 | Remittance automation CHAR 100
- $taxtotal, # 25 | Total Taxes & Fees NUM* 9
- $self->custnum, # 26 | Customer Reference Number CHAR 15
- '0', # 27 | Federal Tax*** NUM* 9
- sprintf("%.2f", $taxtotal), # 28 | State Tax*** NUM* 9
- '0', # 29 | Other Taxes & Fees*** NUM* 9
- );
+ } else { #pkgnum tax
+ next unless $cust_bill_pkg->setup != 0;
+ my $itemdesc = defined $cust_bill_pkg->dbdef_table->column('itemdesc')
+ ? ( $cust_bill_pkg->itemdesc || 'Tax' )
+ : 'Tax';
+ ($pkg, $setup, $recur, $sdate, $edate) =
+ ( $itemdesc, sprintf("%10.2f",$cust_bill_pkg->setup), '', '', '' );
+ }
- } else {
-
$csv->combine(
- 'cust_bill',
+ 'cust_bill_pkg',
$self->invnum,
- $self->custnum,
- time2str("%x", $self->_date),
- sprintf("%.2f", $self->charged),
- ( map { $cust_main->getfield($_) }
- qw( first last company address1 address2 city state zip country ) ),
- map { '' } (1..5),
+ ( map { '' } (1..11) ),
+ ($pkg, $setup, $recur, $sdate, $edate)
) or die "can't create csv";
- }
+ print CSV $csv->string. "\n";
- my $header = $csv->string. "\n";
-
- my $detail = '';
- if ( lc($opt{'format'}) eq 'billco' ) {
-
- my $lineseq = 0;
- foreach my $item ( $self->_items_pkg ) {
-
- $csv->combine(
- '', # 1 | N/A-Leave Empty CHAR 2
- '', # 2 | N/A-Leave Empty CHAR 15
- $opt{'tracctnum'}, # 3 | Account Number CHAR 15
- $self->invnum, # 4 | Invoice Number CHAR 15
- $lineseq++, # 5 | Line Sequence (sort order) NUM 6
- $item->{'description'}, # 6 | Transaction Detail CHAR 100
- $item->{'amount'}, # 7 | Amount NUM* 9
- '', # 8 | Line Format Control** CHAR 2
- '', # 9 | Grouping Code CHAR 2
- '', # 10 | User Defined CHAR 15
- );
+ }
- $detail .= $csv->string. "\n";
+ close CSV or die "can't close CSV: $!";
- }
+ #part two: upload it
+ my $net;
+ if ( $opt{protocol} eq 'ftp' ) {
+ eval "use Net::FTP;";
+ die $@ if $@;
+ $net = Net::FTP->new($opt{server}) or die @$;
} else {
+ die "unknown protocol: $opt{protocol}";
+ }
- foreach my $cust_bill_pkg ( $self->cust_bill_pkg ) {
-
- my($pkg, $setup, $recur, $sdate, $edate);
- if ( $cust_bill_pkg->pkgnum ) {
-
- ($pkg, $setup, $recur, $sdate, $edate) = (
- $cust_bill_pkg->cust_pkg->part_pkg->pkg,
- ( $cust_bill_pkg->setup != 0
- ? sprintf("%.2f", $cust_bill_pkg->setup )
- : '' ),
- ( $cust_bill_pkg->recur != 0
- ? sprintf("%.2f", $cust_bill_pkg->recur )
- : '' ),
- ( $cust_bill_pkg->sdate
- ? time2str("%x", $cust_bill_pkg->sdate)
- : '' ),
- ($cust_bill_pkg->edate
- ?time2str("%x", $cust_bill_pkg->edate)
- : '' ),
- );
-
- } else { #pkgnum tax
- next unless $cust_bill_pkg->setup != 0;
- my $itemdesc = defined $cust_bill_pkg->dbdef_table->column('itemdesc')
- ? ( $cust_bill_pkg->itemdesc || 'Tax' )
- : 'Tax';
- ($pkg, $setup, $recur, $sdate, $edate) =
- ( $itemdesc, sprintf("%10.2f",$cust_bill_pkg->setup), '', '', '' );
- }
-
- $csv->combine(
- 'cust_bill_pkg',
- $self->invnum,
- ( map { '' } (1..11) ),
- ($pkg, $setup, $recur, $sdate, $edate)
- ) or die "can't create csv";
+ $net->login( $opt{username}, $opt{password} )
+ or die "can't FTP to $opt{username}\@$opt{server}: login error: $@";
- $detail .= $csv->string. "\n";
+ $net->binary or die "can't set binary mode";
- }
+ $net->cwd($opt{dir}) or die "can't cwd to $opt{dir}";
- }
+ $net->put($file) or die "can't put $file: $!";
+
+ $net->quit;
- ( $header, $detail );
+ unlink $file;
}
@@ -1581,7 +1307,7 @@ L<Time::Local> and L<Date::Parse> for conversion functions.
=cut
-#still some false laziness w/print_text and print_html (and send_csv) (mostly print_text should use _items stuff though)
+#still some false laziness w/print_text (mostly print_text should use _items stuff though)
sub print_latex {
my( $self, $today, $template ) = @_;
@@ -2008,7 +1734,6 @@ when emailing the invoice as part of a multipart/related MIME email.
=cut
-#some falze laziness w/print_text and print_latex (and send_csv)
sub print_html {
my( $self, $today, $template, $cid ) = @_;
$today ||= time;
@@ -2052,25 +1777,17 @@ sub print_html {
# 'conf_dir' => "$FS::UID::conf_dir/conf.$FS::UID::datasrc",
);
- if (
- defined( $conf->config_orbase('invoice_htmlreturnaddress', $template) )
- && length( $conf->config_orbase('invoice_htmlreturnaddress', $template) )
- ) {
- $invoice_data{'returnaddress'} =
- join("\n", $conf->config('invoice_htmlreturnaddress', $template) );
- } else {
- $invoice_data{'returnaddress'} =
- join("\n", map {
- s/~/&nbsp;/g;
- s/\\\\\*?\s*$/<BR>/;
- s/\\hyphenation\{[\w\s\-]+\}//;
- $_;
- }
- $conf->config_orbase( 'invoice_latexreturnaddress',
- $template
- )
- );
- }
+ $invoice_data{'returnaddress'} =
+ length( $conf->config_orbase('invoice_htmlreturnaddress', $template) )
+ ? join("\n", $conf->config('invoice_htmlreturnaddress', $template) )
+ : join("\n", map {
+ s/~/&nbsp;/g;
+ s/\\\\\*?\s*$/<BR>/;
+ s/\\hyphenation\{[\w\s\-]+\}//;
+ $_;
+ }
+ $conf->config_orbase('invoice_latexreturnaddress', $template)
+ );
my $countrydefault = $conf->config('countrydefault') || 'US';
if ( $cust_main->country eq $countrydefault ) {
@@ -2080,26 +1797,20 @@ sub print_html {
encode_entities(code2country($cust_main->country));
}
- if (
- defined( $conf->config_orbase('invoice_htmlnotes', $template) )
- && length( $conf->config_orbase('invoice_htmlnotes', $template) )
- ) {
- $invoice_data{'notes'} =
- join("\n", $conf->config_orbase('invoice_htmlnotes', $template) );
- } else {
- $invoice_data{'notes'} =
- join("\n", map {
- s/%%(.*)$/<!-- $1 -->/;
- s/\\section\*\{\\textsc\{(.)(.*)\}\}/<p><b><font size="+1">$1<\/font>\U$2<\/b>/;
- s/\\begin\{enumerate\}/<ol>/;
- s/\\item / <li>/;
- s/\\end\{enumerate\}/<\/ol>/;
- s/\\textbf\{(.*)\}/<b>$1<\/b>/;
- $_;
- }
- $conf->config_orbase('invoice_latexnotes', $template)
- );
- }
+ $invoice_data{'notes'} =
+ length($conf->config_orbase('invoice_htmlnotes', $template))
+ ? join("\n", $conf->config_orbase('invoice_htmlnotes', $template) )
+ : join("\n", map {
+ s/%%(.*)$/<!-- $1 -->/;
+ s/\\section\*\{\\textsc\{(.)(.*)\}\}/<p><b><font size="+1">$1<\/font>\U$2<\/b>/;
+ s/\\begin\{enumerate\}/<ol>/;
+ s/\\item / <li>/;
+ s/\\end\{enumerate\}/<\/ol>/;
+ s/\\textbf\{(.*)\}/<b>$1<\/b>/;
+ $_;
+ }
+ $conf->config_orbase('invoice_latexnotes', $template)
+ );
# #do variable substitutions in notes
# $invoice_data{'notes'} =
@@ -2108,18 +1819,12 @@ sub print_html {
# $conf->config_orbase('invoice_latexnotes', $suffix)
# );
- if (
- defined( $conf->config_orbase('invoice_htmlfooter', $template) )
- && length( $conf->config_orbase('invoice_htmlfooter', $template) )
- ) {
$invoice_data{'footer'} =
- join("\n", $conf->config_orbase('invoice_htmlfooter', $template) );
- } else {
- $invoice_data{'footer'} =
- join("\n", map { s/~/&nbsp;/g; s/\\\\\*?\s*$/<BR>/; $_; }
- $conf->config_orbase('invoice_latexfooter', $template)
- );
- }
+ length($conf->config_orbase('invoice_htmlfooter', $template))
+ ? join("\n", $conf->config_orbase('invoice_htmlfooter', $template) )
+ : join("\n", map { s/~/&nbsp;/g; s/\\\\\*?\s*$/<BR>/; $_; }
+ $conf->config_orbase('invoice_latexfooter', $template)
+ );
$invoice_data{'po_line'} =
( $cust_main->payby eq 'BILL' && $cust_main->payinfo )
@@ -2408,7 +2113,6 @@ sub _items_payments {
}
-
=back
=head1 SUBROUTINES
diff --git a/FS/FS/cust_bill_event.pm b/FS/FS/cust_bill_event.pm
index 128e5a53d..7b981391e 100644
--- a/FS/FS/cust_bill_event.pm
+++ b/FS/FS/cust_bill_event.pm
@@ -3,11 +3,10 @@ package FS::cust_bill_event;
use strict;
use vars qw( @ISA $DEBUG );
use FS::Record qw( qsearch qsearchs );
-use FS::cust_main_Mixin;
use FS::cust_bill;
use FS::part_bill_event;
-@ISA = qw(FS::cust_main_Mixin FS::Record);
+@ISA = qw(FS::Record);
$DEBUG = 0;
@@ -71,13 +70,6 @@ points to. You can ask the object for a copy with the I<hash> method.
sub table { 'cust_bill_event'; }
-sub cust_linked { $_[0]->cust_main_custnum; }
-sub cust_unlinked_msg {
- my $self = shift;
- "WARNING: can't find cust_main.custnum ". $self->custnum.
- ' (cust_bill.invnum '. $self->invnum. ')';
-}
-
=item insert
Adds this record to the database. If there is an error, returns the error,
diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm
index d718b05fd..77429f287 100644
--- a/FS/FS/cust_bill_pkg.pm
+++ b/FS/FS/cust_bill_pkg.pm
@@ -3,12 +3,11 @@ package FS::cust_bill_pkg;
use strict;
use vars qw( @ISA );
use FS::Record qw( qsearch qsearchs dbdef dbh );
-use FS::cust_main_Mixin;
use FS::cust_pkg;
use FS::cust_bill;
use FS::cust_bill_pkg_detail;
-@ISA = qw( FS::cust_main_Mixin FS::Record );
+@ISA = qw( FS::Record );
=head1 NAME
@@ -226,14 +225,6 @@ sub desc {
=back
-=head1 CLASS METHODS
-
-=over 4
-
-=item
-
-=back
-
=head1 BUGS
=head1 SEE ALSO
diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm
index 9cc92d2e8..026b92e84 100644
--- a/FS/FS/cust_credit.pm
+++ b/FS/FS/cust_credit.pm
@@ -4,14 +4,13 @@ use strict;
use vars qw( @ISA $conf $unsuspendauto );
use Date::Format;
use FS::UID qw( dbh getotaker );
-use FS::Misc qw(send_email);
use FS::Record qw( qsearch qsearchs );
-use FS::cust_main_Mixin;
+use FS::Misc qw(send_email);
use FS::cust_main;
use FS::cust_refund;
use FS::cust_credit_bill;
-@ISA = qw( FS::cust_main_Mixin FS::Record );
+@ISA = qw( FS::Record );
#ask FS::UID to run this stuff for us later
$FS::UID::callback{'FS::cust_credit'} = sub {
@@ -76,12 +75,6 @@ Creates a new credit. To add the credit to the database, see L<"insert">.
=cut
sub table { 'cust_credit'; }
-sub cust_linked { $_[0]->cust_main_custnum; }
-sub cust_unlinked_msg {
- my $self = shift;
- "WARNING: can't find cust_main.custnum ". $self->custnum.
- ' (cust_credit.crednum '. $self->crednum. ')';
-}
=item insert
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index a265e4177..1bbf191ec 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -2,7 +2,7 @@ package FS::cust_main;
use strict;
use vars qw( @ISA @EXPORT_OK $DEBUG $me $conf @encrypted_fields
- $import $skip_fuzzyfiles $ignore_expired_card );
+ $import $skip_fuzzyfiles );
use vars qw( $realtime_bop_decline_quiet ); #ugh
use Safe;
use Carp;
@@ -14,15 +14,13 @@ BEGIN {
#eval "use Time::Local qw(timelocal timelocal_nocheck);";
eval "use Time::Local qw(timelocal_nocheck);";
}
-use Digest::MD5 qw(md5_base64);
use Date::Format;
#use Date::Manip;
use String::Approx qw(amatch);
-use Business::CreditCard 0.28;
+use Business::CreditCard;
use FS::UID qw( getotaker dbh );
use FS::Record qw( qsearchs qsearch dbdef );
use FS::Misc qw( send_email );
-use FS::Msgcat qw(gettext);
use FS::cust_pkg;
use FS::cust_svc;
use FS::cust_bill;
@@ -44,9 +42,7 @@ use FS::part_bill_event;
use FS::cust_bill_event;
use FS::cust_tax_exempt;
use FS::type_pkgs;
-use FS::payment_gateway;
-use FS::agent_payment_gateway;
-use FS::banned_pay;
+use FS::Msgcat qw(gettext);
@ISA = qw( FS::Record );
@@ -54,15 +50,11 @@ use FS::banned_pay;
$realtime_bop_decline_quiet = 0;
-# 1 is mostly method/subroutine entry and options
-# 2 traces progress of some operations
-# 3 is even more information including possibly sensitive data
$DEBUG = 0;
$me = '[FS::cust_main]';
$import = 0;
$skip_fuzzyfiles = 0;
-$ignore_expired_card = 0;
@encrypted_fields = ('payinfo', 'paycvv');
@@ -248,7 +240,7 @@ sub paymask {
if ( defined($value) && !$self->is_encrypted($value)) {
my $payinfo = $value;
my $payby = $self->payby;
- if ($payby eq 'CARD' || $payby eq 'DCRD') { # Credit Cards (Show last four)
+ if ($payby eq 'CARD' || $payby eq 'DCARD') { # Credit Cards (Show last four)
$paymask = 'x'x(length($payinfo)-4). substr($payinfo,(length($payinfo)-4));
} elsif ($payby eq 'CHEK' ||
$payby eq 'DCHK' ) { # Checks (Show last 2 @ bank)
@@ -264,18 +256,13 @@ sub paymask {
return $paymask;
}
-=item paydate - expiration date, mm/yyyy, m/yyyy, mm/yy or m/yy
-=item paystart_month - start date month (maestro/solo cards only)
-=item paystart_year - start date year (maestro/solo cards only)
-=item payissue - issue number (maestro/solo cards only)
+=item paydate - expiration date, mm/yyyy, m/yyyy, mm/yy or m/yy
=item payname - name on card or billing name
-=item payip - IP address from which payment information was received
-
=item tax - tax exempt, empty or `Y'
=item otaker - order taker (assigned automatically, see L<FS::UID>)
@@ -347,7 +334,7 @@ sub insert {
my $cust_pkgs = @_ ? shift : {};
my $invoicing_list = @_ ? shift : '';
my %options = @_;
- warn "$me insert called with options ".
+ warn "FS::cust_main::insert called with options ".
join(', ', map { "$_: $options{$_}" } keys %options ). "\n"
if $DEBUG;
@@ -364,16 +351,12 @@ sub insert {
my $prepay_identifier = '';
my( $amount, $seconds ) = ( 0, 0 );
- my $payby = '';
if ( $self->payby eq 'PREPAY' ) {
$self->payby('BILL');
$prepay_identifier = $self->payinfo;
$self->payinfo('');
- warn " looking up prepaid card $prepay_identifier\n"
- if $DEBUG > 1;
-
my $error = $self->get_prepay($prepay_identifier, \$amount, \$seconds);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
@@ -381,19 +364,8 @@ sub insert {
return $error;
}
- $payby = 'PREP' if $amount;
-
- } elsif ( $self->payby =~ /^(CASH|WEST|MCRD)$/ ) {
-
- $payby = $1;
- $self->payby('BILL');
- $amount = $self->paid;
-
}
- warn " inserting $self\n"
- if $DEBUG > 1;
-
my $error = $self->SUPER::insert;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
@@ -401,9 +373,7 @@ sub insert {
return $error;
}
- warn " setting invoicing list\n"
- if $DEBUG > 1;
-
+ # invoicing list
if ( $invoicing_list ) {
$error = $self->check_invoicing_list( $invoicing_list );
if ( $error ) {
@@ -413,9 +383,7 @@ sub insert {
$self->invoicing_list( $invoicing_list );
}
- warn " ordering packages\n"
- if $DEBUG > 1;
-
+ # packages
$error = $self->order_pkgs($cust_pkgs, \$seconds, %options);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
@@ -428,18 +396,14 @@ sub insert {
}
if ( $amount ) {
- warn " inserting initial $payby payment of $amount\n"
- if $DEBUG > 1;
- $error = $self->insert_cust_pay($payby, $amount, $prepay_identifier);
+ $error = $self->insert_cust_pay_prepay($amount, $prepay_identifier);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
- return "inserting payment (transaction rolled back): $error";
+ return "inserting prepayment (transaction rolled back): $error";
}
}
unless ( $import || $skip_fuzzyfiles ) {
- warn " queueing fuzzyfiles update\n"
- if $DEBUG > 1;
$error = $self->queue_fuzzyfiles_update;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
@@ -447,9 +411,6 @@ sub insert {
}
}
- warn " insert complete; committing transaction\n"
- if $DEBUG > 1;
-
$dbh->commit or die $dbh->errstr if $oldAutoCommit;
'';
@@ -496,7 +457,7 @@ sub order_pkgs {
my %svc_options = ();
$svc_options{'depend_jobnum'} = $options{'depend_jobnum'}
if exists $options{'depend_jobnum'};
- warn "$me order_pkgs called with options ".
+ warn "FS::cust_main::order_pkgs called with options ".
join(', ', map { "$_: $options{$_}" } keys %options ). "\n"
if $DEBUG;
@@ -692,7 +653,7 @@ sub increment_seconds {
my $cust_pkg = $cust_pkg[0];
warn " found package pkgnum ". $cust_pkg->pkgnum. "\n"
- if $DEBUG > 1;
+ if $DEBUG;
my @cust_svc =
$cust_pkg->cust_svc( $cust_pkg->part_pkg->svcpart('svc_acct') );
@@ -706,7 +667,7 @@ sub increment_seconds {
my $svc_acct = $cust_svc[0]->svc_x;
warn " found service svcnum ". $svc_acct->pkgnum.
' ('. $svc_acct->email. ")\n"
- if $DEBUG > 1;
+ if $DEBUG;
$svc_acct->increment_seconds($seconds);
@@ -721,42 +682,14 @@ If there is an error, returns the error, otherwise returns false.
=cut
sub insert_cust_pay_prepay {
- shift->insert_cust_pay('PREP', @_);
-}
-
-=item insert_cust_pay_cash AMOUNT [ PAYINFO ]
-
-Inserts a cash payment in the specified amount for this customer. An optional
-second argument can specify the payment identifier for tracking purposes.
-If there is an error, returns the error, otherwise returns false.
-
-=cut
-
-sub insert_cust_pay_cash {
- shift->insert_cust_pay('CASH', @_);
-}
-
-=item insert_cust_pay_west AMOUNT [ PAYINFO ]
-
-Inserts a Western Union payment in the specified amount for this customer. An
-optional second argument can specify the prepayment identifier for tracking
-purposes. If there is an error, returns the error, otherwise returns false.
-
-=cut
-
-sub insert_cust_pay_west {
- shift->insert_cust_pay('WEST', @_);
-}
-
-sub insert_cust_pay {
- my( $self, $payby, $amount ) = splice(@_, 0, 3);
+ my( $self, $amount ) = splice(@_, 0, 2);
my $payinfo = scalar(@_) ? shift : '';
my $cust_pay = new FS::cust_pay {
'custnum' => $self->custnum,
'paid' => sprintf('%.2f', $amount),
#'_date' => #date the prepaid card was purchased???
- 'payby' => $payby,
+ 'payby' => 'PREP',
'payinfo' => $payinfo,
};
$cust_pay->insert;
@@ -777,7 +710,7 @@ otherwise returns false.
sub reexport {
my $self = shift;
- carp "WARNING: FS::cust_main::reexport is deprectated; ".
+ carp "warning: FS::cust_main::reexport is deprectated; ".
"use the depend_jobnum option to insert or order_pkgs to delay export";
local $SIG{HUP} = 'IGNORE';
@@ -945,11 +878,6 @@ sub replace {
unless grep { $_ eq getotaker } $conf->config('users-allow_comp');
}
- local($ignore_expired_card) = 1
- if $old->payby =~ /^(CARD|DCRD)$/
- && $self->payby =~ /^(CARD|DCRD)$/
- && $old->payinfo eq $self->payinfo;
-
my $oldAutoCommit = $FS::UID::AutoCommit;
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
@@ -1046,8 +974,7 @@ and replace methods.
sub check {
my $self = shift;
- warn "$me check BEFORE: \n". $self->_dump
- if $DEBUG > 2;
+ #warn "BEFORE: \n". $self->_dump;
my $error =
$self->ut_numbern('custnum')
@@ -1146,7 +1073,7 @@ sub check {
} ) ) {
return "Unknown ship_state/ship_county/ship_country: ".
$self->ship_state. "/". $self->ship_county. "/". $self->ship_country
- unless qsearch('cust_main_county',{
+ unless qsearchs('cust_main_county',{
'state' => $self->ship_state,
'county' => $self->ship_county,
'country' => $self->ship_country,
@@ -1169,22 +1096,9 @@ sub check {
}
}
- $self->payby =~ /^(CARD|DCRD|CHEK|DCHK|LECB|BILL|COMP|PREPAY|CASH|WEST|MCRD)$/
+ $self->payby =~ /^(CARD|DCRD|CHEK|DCHK|LECB|BILL|COMP|PREPAY)$/
or return "Illegal payby: ". $self->payby;
- $error = $self->ut_numbern('paystart_month')
- || $self->ut_numbern('paystart_year')
- || $self->ut_numbern('payissue')
- ;
- return $error if $error;
-
- if ( $self->payip eq '' ) {
- $self->payip('');
- } else {
- $error = $self->ut_ip('payip');
- return $error if $error;
- }
-
# If it is encrypted and the private key is not availaible then we can't
# check the credit card.
@@ -1196,7 +1110,7 @@ sub check {
$self->payby($1);
- if ( $check_payinfo && $self->payby =~ /^(CARD|DCRD)$/ ) {
+ if ( $check_payinfo && ($self->payby eq 'CARD' || $self->payby eq 'DCRD')) {
my $payinfo = $self->payinfo;
$payinfo =~ s/\D//g;
@@ -1206,13 +1120,8 @@ sub check {
$self->payinfo($payinfo);
validate($payinfo)
or return gettext('invalid_card'); # . ": ". $self->payinfo;
-
return gettext('unknown_card_type')
if cardtype($self->payinfo) eq "Unknown";
-
- my $ban = qsearchs('banned_pay', $self->_banned_pay_hashref);
- return "Banned credit card" if $ban;
-
if ( defined $self->dbdef_table->column('paycvv') ) {
if (length($self->paycvv) && !$self->is_encrypted($self->paycvv)) {
if ( cardtype($self->payinfo) eq 'American Express card' ) {
@@ -1229,31 +1138,7 @@ sub check {
}
}
- my $cardtype = cardtype($payinfo);
- if ( $cardtype =~ /^(Switch|Solo)$/i ) {
-
- return "Start date or issue number is required for $cardtype cards"
- unless $self->paystart_month && $self->paystart_year or $self->payissue;
-
- return "Start month must be between 1 and 12"
- if $self->paystart_month
- and $self->paystart_month < 1 || $self->paystart_month > 12;
-
- return "Start year must be 1990 or later"
- if $self->paystart_year
- and $self->paystart_year < 1990;
-
- return "Issue number must be beween 1 and 99"
- if $self->payissue
- and $self->payissue < 1 || $self->payissue > 99;
-
- } else {
- $self->paystart_month('');
- $self->paystart_year('');
- $self->payissue('');
- }
-
- } elsif ( $check_payinfo && $self->payby =~ /^(CHEK|DCHK)$/ ) {
+ } elsif ($check_payinfo && ( $self->payby eq 'CHEK' || $self->payby eq 'DCHK' )) {
my $payinfo = $self->payinfo;
$payinfo =~ s/[^\d\@]//g;
@@ -1262,9 +1147,6 @@ sub check {
$self->payinfo($payinfo);
$self->paycvv('') if $self->dbdef_table->column('paycvv');
- my $ban = qsearchs('banned_pay', $self->_banned_pay_hashref);
- return "Banned ACH account" if $ban;
-
} elsif ( $self->payby eq 'LECB' ) {
my $payinfo = $self->payinfo;
@@ -1306,7 +1188,7 @@ sub check {
if ( $self->paydate eq '' || $self->paydate eq '-' ) {
return "Expriation date required"
- unless $self->payby =~ /^(BILL|PREPAY|CHEK|DCHK|LECB|CASH|WEST|MCRD)$/;
+ unless $self->payby =~ /^(BILL|PREPAY|CHEK|LECB)$/;
$self->paydate('');
} else {
my( $m, $y );
@@ -1320,9 +1202,7 @@ sub check {
$self->paydate("$y-$m-01");
my($nowm,$nowy)=(localtime(time))[4,5]; $nowm++; $nowy+=1900;
return gettext('expired_card')
- if !$import
- && !$ignore_expired_card
- && ( $y<$nowy || ( $y==$nowy && $1<$nowm ) );
+ if !$import && ( $y<$nowy || ( $y==$nowy && $1<$nowm ) );
}
if ( $self->payname eq '' && $self->payby !~ /^(CHEK|DCHK)$/ &&
@@ -1341,8 +1221,7 @@ sub check {
$self->otaker(getotaker) unless $self->otaker;
- warn "$me check AFTER: \n". $self->_dump
- if $DEBUG > 2;
+ #warn "AFTER: \n". $self->_dump;
$self->SUPER::check;
}
@@ -1460,8 +1339,7 @@ sub unsuspend {
=item suspend
Suspends all unsuspended packages (see L<FS::cust_pkg>) for this customer.
-
-Returns a list: an empty list on success or a list of errors.
+Always returns a list: an empty list on success or a list of errors.
=cut
@@ -1473,9 +1351,8 @@ sub suspend {
=item suspend_if_pkgpart PKGPART [ , PKGPART ... ]
Suspends all unsuspended packages (see L<FS::cust_pkg>) matching the listed
-PKGPARTs (see L<FS::part_pkg>).
-
-Returns a list: an empty list on success or a list of errors.
+PKGPARTs (see L<FS::part_pkg>). Always returns a list: an empty list on
+success or a list of errors.
=cut
@@ -1490,9 +1367,8 @@ sub suspend_if_pkgpart {
=item suspend_unless_pkgpart PKGPART [ , PKGPART ... ]
Suspends all unsuspended packages (see L<FS::cust_pkg>) unless they match the
-listed PKGPARTs (see L<FS::part_pkg>).
-
-Returns a list: an empty list on success or a list of errors.
+listed PKGPARTs (see L<FS::part_pkg>). Always returns a list: an empty list
+on success or a list of errors.
=cut
@@ -1508,56 +1384,19 @@ sub suspend_unless_pkgpart {
Cancels all uncancelled packages (see L<FS::cust_pkg>) for this customer.
-Available options are: I<quiet>, I<reasonnum>, and I<ban>
+Available options are: I<quiet>
I<quiet> can be set true to supress email cancellation notices.
-# I<reasonnum> can be set to a cancellation reason (see L<FS::cancel_reason>)
-
-I<ban> can be set true to ban this customer's credit card or ACH information,
-if present.
-
Always returns a list: an empty list on success or a list of errors.
=cut
sub cancel {
my $self = shift;
- my %opt = @_;
-
- if ( $opt{'ban'} && $self->payby =~ /^(CARD|DCRD|CHEK|DCHK)$/ ) {
-
- #should try decryption (we might have the private key)
- # and if not maybe queue a job for the server that does?
- return ( "Can't (yet) ban encrypted credit cards" )
- if $self->is_encrypted($self->payinfo);
-
- my $ban = new FS::banned_pay $self->_banned_pay_hashref;
- my $error = $ban->insert;
- return ( $error ) if $error;
-
- }
-
grep { $_ } map { $_->cancel(@_) } $self->ncancelled_pkgs;
}
-sub _banned_pay_hashref {
- my $self = shift;
-
- my %payby2ban = (
- 'CARD' => 'CARD',
- 'DCRD' => 'CARD',
- 'CHEK' => 'CHEK',
- 'DCHK' => 'CHEK'
- );
-
- {
- 'payby' => $payby2ban{$self->payby},
- 'payinfo' => md5_base64($self->payinfo),
- #'reason' =>
- };
-}
-
=item agent
Returns the agent (see L<FS::agent>) for this customer.
@@ -1596,8 +1435,7 @@ If there is an error, returns the error, otherwise returns false.
sub bill {
my( $self, %options ) = @_;
return '' if $self->payby eq 'COMP';
- warn "$me bill customer ". $self->custnum. "\n"
- if $DEBUG;
+ warn "bill customer ". $self->custnum. "\n" if $DEBUG;
my $time = $options{'time'} || time;
@@ -1636,7 +1474,7 @@ sub bill {
#NO!! next if $cust_pkg->cancel;
next if $cust_pkg->getfield('cancel');
- warn " bill package ". $cust_pkg->pkgnum. "\n" if $DEBUG > 1;
+ warn " bill package ". $cust_pkg->pkgnum. "\n" if $DEBUG;
#? to avoid use of uninitialized value errors... ?
$cust_pkg->setfield('bill', '')
@@ -1653,7 +1491,7 @@ sub bill {
my $setup = 0;
if ( !$cust_pkg->setup || $options{'resetup'} ) {
- warn " bill setup\n" if $DEBUG > 1;
+ warn " bill setup\n" if $DEBUG;
$setup = eval { $cust_pkg->calc_setup( $time ) };
if ( $@ ) {
@@ -1672,7 +1510,7 @@ sub bill {
( $cust_pkg->getfield('bill') || 0 ) <= $time
) {
- warn " bill recur\n" if $DEBUG > 1;
+ warn " bill recur\n" if $DEBUG;
# XXX shared with $recur_prog
$sdate = $cust_pkg->bill || $cust_pkg->setup || $time;
@@ -1704,9 +1542,6 @@ sub bill {
} elsif ( $part_pkg->freq =~ /^(\d+)d$/ ) {
my $days = $1;
$mday += $days;
- } elsif ( $part_pkg->freq =~ /^(\d+)h$/ ) {
- my $hours = $1;
- $hour += $hours;
} else {
$dbh->rollback if $oldAutoCommit;
return "unparsable frequency: ". $part_pkg->freq;
@@ -1721,8 +1556,7 @@ sub bill {
if ( $cust_pkg->modified ) {
- warn " package ". $cust_pkg->pkgnum. " modified; updating\n"
- if $DEBUG >1;
+ warn " package ". $cust_pkg->pkgnum. " modified; updating\n" if $DEBUG;
$error=$cust_pkg->replace($old_cust_pkg);
if ( $error ) { #just in case
@@ -1742,7 +1576,7 @@ sub bill {
}
if ( $setup != 0 || $recur != 0 ) {
warn " charges (setup=$setup, recur=$recur); queueing line items\n"
- if $DEBUG > 1;
+ if $DEBUG;
my $cust_bill_pkg = new FS::cust_bill_pkg ({
'pkgnum' => $cust_pkg->pkgnum,
'setup' => $setup,
@@ -2009,8 +1843,7 @@ sub collect {
$self->select_for_update; #mutex
my $balance = $self->balance;
- warn "$me collect customer ". $self->custnum. ": balance $balance\n"
- if $DEBUG;
+ warn "collect customer ". $self->custnum. ": balance $balance\n" if $DEBUG;
unless ( $balance > 0 ) { #redundant?????
$dbh->rollback if $oldAutoCommit; #hmm
return '';
@@ -2035,8 +1868,8 @@ sub collect {
last if $self->balance <= 0;
- warn " invnum ". $cust_bill->invnum. " (owed ". $cust_bill->owed. ")\n"
- if $DEBUG > 1;
+ warn "invnum ". $cust_bill->invnum. " (owed ". $cust_bill->owed. ")\n"
+ if $DEBUG;
foreach my $part_bill_event (
sort { $a->seconds <=> $b->seconds
@@ -2056,8 +1889,8 @@ sub collect {
last if $cust_bill->owed <= 0 # don't run subsequent events if owed<=0
|| $self->balance <= 0; # or if balance<=0
- warn " calling invoice event (". $part_bill_event->eventcode. ")\n"
- if $DEBUG > 1;
+ warn "calling invoice event (". $part_bill_event->eventcode. ")\n"
+ if $DEBUG;
my $cust_main = $self; #for callback
my $error;
@@ -2197,84 +2030,31 @@ I<quiet> can be set true to surpress email decline notices.
sub realtime_bop {
my( $self, $method, $amount, %options ) = @_;
if ( $DEBUG ) {
- warn "$me realtime_bop: $method $amount\n";
+ warn "$self $method $amount\n";
warn " $_ => $options{$_}\n" foreach keys %options;
}
$options{'description'} ||= 'Internet services';
+ #pre-requisites
+ die "Real-time processing not enabled\n"
+ unless $conf->exists('business-onlinepayment');
eval "use Business::OnlinePayment";
die $@ if $@;
- my $payinfo = exists($options{'payinfo'})
- ? $options{'payinfo'}
- : $self->payinfo;
-
- ###
- # select a gateway
- ###
-
- my $taxclass = '';
- if ( $options{'invnum'} ) {
- my $cust_bill = qsearchs('cust_bill', { 'invnum' => $options{'invnum'} } );
- die "invnum ". $options{'invnum'}. " not found" unless $cust_bill;
- my @taxclasses =
- map { $_->part_pkg->taxclass }
- grep { $_ }
- map { $_->cust_pkg }
- $cust_bill->cust_bill_pkg;
- unless ( grep { $taxclasses[0] ne $_ } @taxclasses ) { #unless there are
- #different taxclasses
- $taxclass = $taxclasses[0];
- }
- }
-
- #look for an agent gateway override first
- my $cardtype;
- if ( $method eq 'CC' ) {
- $cardtype = cardtype($payinfo);
- } elsif ( $method eq 'ECHECK' ) {
- $cardtype = 'ACH';
- } else {
- $cardtype = $method;
- }
-
- my $override =
- qsearchs('agent_payment_gateway', { agentnum => $self->agentnum,
- cardtype => $cardtype,
- taxclass => $taxclass, } )
- || qsearchs('agent_payment_gateway', { agentnum => $self->agentnum,
- cardtype => '',
- taxclass => $taxclass, } )
- || qsearchs('agent_payment_gateway', { agentnum => $self->agentnum,
- cardtype => $cardtype,
- taxclass => '', } )
- || qsearchs('agent_payment_gateway', { agentnum => $self->agentnum,
- cardtype => '',
- taxclass => '', } );
-
- my $payment_gateway = '';
- my( $processor, $login, $password, $action, @bop_options );
- if ( $override ) { #use a payment gateway override
-
- $payment_gateway = $override->payment_gateway;
-
- $processor = $payment_gateway->gateway_module;
- $login = $payment_gateway->gateway_username;
- $password = $payment_gateway->gateway_password;
- $action = $payment_gateway->gateway_action;
- @bop_options = $payment_gateway->options;
-
- } else { #use the standard settings from the config
-
- ( $processor, $login, $password, $action, @bop_options ) =
- $self->default_payment_gateway($method);
-
- }
+ #load up config
+ my $bop_config = 'business-onlinepayment';
+ $bop_config .= '-ach'
+ if $method eq 'ECHECK' && $conf->exists($bop_config. '-ach');
+ my ( $processor, $login, $password, $action, @bop_options ) =
+ $conf->config($bop_config);
+ $action ||= 'normal authorization';
+ pop @bop_options if scalar(@bop_options) % 2 && $bop_options[-1] =~ /^\s*$/;
+ die "No real-time processor is enabled - ".
+ "did you set the business-onlinepayment configuration value?\n"
+ unless $processor;
- ###
- # massage data
- ###
+ #massage data
my $address = exists($options{'address1'})
? $options{'address1'}
@@ -2308,14 +2088,11 @@ sub realtime_bop {
? $conf->config('business-onlinepayment-email-override')
: $invoicing_list[0];
- my %content = ();
-
- my $payip = exists($options{'payip'})
- ? $options{'payip'}
- : $self->payip;
- $content{customer_ip} = $payip
- if length($payip);
+ my $payinfo = exists($options{'payinfo'})
+ ? $options{'payinfo'}
+ : $self->payinfo;
+ my %content = ();
if ( $method eq 'CC' ) {
$content{card_number} = $payinfo;
@@ -2325,27 +2102,13 @@ sub realtime_bop {
$paydate =~ /^\d{2}(\d{2})[\/\-](\d+)[\/\-]\d+$/;
$content{expiration} = "$2/$1";
- my $paycvv = exists($options{'paycvv'})
- ? $options{'paycvv'}
- : $self->paycvv;
- $content{cvv2} = $self->paycvv
- if length($paycvv);
-
- my $paystart_month = exists($options{'paystart_month'})
- ? $options{'paystart_month'}
- : $self->paystart_month;
-
- my $paystart_year = exists($options{'paystart_year'})
- ? $options{'paystart_year'}
- : $self->paystart_year;
-
- $content{card_start} = "$paystart_month/$paystart_year"
- if $paystart_month && $paystart_year;
-
- my $payissue = exists($options{'payissue'})
- ? $options{'payissue'}
- : $self->payissue;
- $content{issue_number} = $payissue if $payissue;
+ if ( defined $self->dbdef_table->column('paycvv') ) {
+ my $paycvv = exists($options{'paycvv'})
+ ? $options{'paycvv'}
+ : $self->paycvv;
+ $content{cvv2} = $self->paycvv
+ if length($paycvv);
+ }
$content{recurring_billing} = 'YES'
if qsearch('cust_pay', { 'custnum' => $self->custnum,
@@ -2367,9 +2130,7 @@ sub realtime_bop {
$content{phone} = $payinfo;
}
- ###
- # run transaction(s)
- ###
+ #transaction(s)
my( $action1, $action2 ) = split(/\s*\,\s*/, $action );
@@ -2447,10 +2208,7 @@ sub realtime_bop {
}
- ###
- # remove paycvv after initial transaction
- ###
-
+ #remove paycvv after initial transaction
#false laziness w/misc/process/payment.cgi - check both to make sure working
# correctly
if ( defined $self->dbdef_table->column('paycvv')
@@ -2459,14 +2217,11 @@ sub realtime_bop {
) {
my $error = $self->remove_cvv;
if ( $error ) {
- warn "WARNING: error removing cvv: $error\n";
+ warn "error removing cvv: $error\n";
}
}
- ###
- # result handling
- ###
-
+ #result handling
if ( $transaction->is_success() ) {
my %method2payby = (
@@ -2475,13 +2230,7 @@ sub realtime_bop {
'LEC' => 'LECB',
);
- my $paybatch = '';
- if ( $payment_gateway ) { # agent override
- $paybatch = $payment_gateway->gatewaynum. '-';
- }
-
- $paybatch .= "$processor:". $transaction->authorization;
-
+ my $paybatch = "$processor:". $transaction->authorization;
$paybatch .= ':'. $transaction->order_number
if $transaction->can('order_number')
&& length($transaction->order_number);
@@ -2548,31 +2297,6 @@ sub realtime_bop {
}
-=item default_payment_gateway
-
-=cut
-
-sub default_payment_gateway {
- my( $self, $method ) = @_;
-
- die "Real-time processing not enabled\n"
- unless $conf->exists('business-onlinepayment');
-
- #load up config
- my $bop_config = 'business-onlinepayment';
- $bop_config .= '-ach'
- if $method eq 'ECHECK' && $conf->exists($bop_config. '-ach');
- my ( $processor, $login, $password, $action, @bop_options ) =
- $conf->config($bop_config);
- $action ||= 'normal authorization';
- pop @bop_options if scalar(@bop_options) % 2 && $bop_options[-1] =~ /^\s*$/;
- die "No real-time processor is enabled - ".
- "did you set the business-onlinepayment configuration value?\n"
- unless $processor;
-
- ( $processor, $login, $password, $action, @bop_options )
-}
-
=item remove_cvv
Removes the I<paycvv> field from the database directly.
@@ -2629,98 +2353,43 @@ gateway is attempted.
sub realtime_refund_bop {
my( $self, $method, %options ) = @_;
if ( $DEBUG ) {
- warn "$me realtime_refund_bop: $method refund\n";
+ warn "$self $method refund\n";
warn " $_ => $options{$_}\n" foreach keys %options;
}
+ #pre-requisites
+ die "Real-time processing not enabled\n"
+ unless $conf->exists('business-onlinepayment');
eval "use Business::OnlinePayment";
die $@ if $@;
- ###
- # look up the original payment and optionally a gateway for that payment
- ###
+ #load up config
+ my $bop_config = 'business-onlinepayment';
+ $bop_config .= '-ach'
+ if $method eq 'ECHECK' && $conf->exists($bop_config. '-ach');
+ my ( $processor, $login, $password, $unused_action, @bop_options ) =
+ $conf->config($bop_config);
+ #$action ||= 'normal authorization';
+ pop @bop_options if scalar(@bop_options) % 2 && $bop_options[-1] =~ /^\s*$/;
+ die "No real-time processor is enabled - ".
+ "did you set the business-onlinepayment configuration value?\n"
+ unless $processor;
my $cust_pay = '';
my $amount = $options{'amount'};
-
- my( $processor, $login, $password, @bop_options ) ;
- my( $auth, $order_number ) = ( '', '', '' );
-
+ my( $pay_processor, $auth, $order_number ) = ( '', '', '' );
if ( $options{'paynum'} ) {
-
- warn " paynum: $options{paynum}\n" if $DEBUG > 1;
+ warn "FS::cust_main::realtime_bop: paynum: $options{paynum}\n" if $DEBUG;
$cust_pay = qsearchs('cust_pay', { paynum=>$options{'paynum'} } )
or return "Unknown paynum $options{'paynum'}";
$amount ||= $cust_pay->paid;
-
- $cust_pay->paybatch =~ /^((\d+)\-)?(\w+):\s*([\w\-]*)(:([\w\-]+))?$/
+ $cust_pay->paybatch =~ /^(\w+):([\w-]*)(:(\w+))?$/
or return "Can't parse paybatch for paynum $options{'paynum'}: ".
$cust_pay->paybatch;
- my $gatewaynum = '';
- ( $gatewaynum, $processor, $auth, $order_number ) = ( $2, $3, $4, $6 );
-
- if ( $gatewaynum ) { #gateway for the payment to be refunded
-
- my $payment_gateway =
- qsearchs('payment_gateway', { 'gatewaynum' => $gatewaynum } );
- die "payment gateway $gatewaynum not found"
- unless $payment_gateway;
-
- $processor = $payment_gateway->gateway_module;
- $login = $payment_gateway->gateway_username;
- $password = $payment_gateway->gateway_password;
- @bop_options = $payment_gateway->options;
-
- } else { #try the default gateway
-
- my( $conf_processor, $unused_action );
- ( $conf_processor, $login, $password, $unused_action, @bop_options ) =
- $self->default_payment_gateway($method);
-
- return "processor of payment $options{'paynum'} $processor does not".
- " match default processor $conf_processor"
- unless $processor eq $conf_processor;
-
- }
-
-
- } else { # didn't specify a paynum, so look for agent gateway overrides
- # like a normal transaction
-
- my $cardtype;
- if ( $method eq 'CC' ) {
- $cardtype = cardtype($self->payinfo);
- } elsif ( $method eq 'ECHECK' ) {
- $cardtype = 'ACH';
- } else {
- $cardtype = $method;
- }
- my $override =
- qsearchs('agent_payment_gateway', { agentnum => $self->agentnum,
- cardtype => $cardtype,
- taxclass => '', } )
- || qsearchs('agent_payment_gateway', { agentnum => $self->agentnum,
- cardtype => '',
- taxclass => '', } );
-
- if ( $override ) { #use a payment gateway override
-
- my $payment_gateway = $override->payment_gateway;
-
- $processor = $payment_gateway->gateway_module;
- $login = $payment_gateway->gateway_username;
- $password = $payment_gateway->gateway_password;
- #$action = $payment_gateway->gateway_action;
- @bop_options = $payment_gateway->options;
-
- } else { #use the standard settings from the config
-
- my $unused_action;
- ( $processor, $login, $password, $unused_action, @bop_options ) =
- $self->default_payment_gateway($method);
-
- }
-
+ ( $pay_processor, $auth, $order_number ) = ( $1, $2, $4 );
+ return "processor of payment $options{'paynum'} $pay_processor does not".
+ " match current processor $processor"
+ unless $pay_processor eq $processor;
}
return "neither amount nor paynum specified" unless $amount;
@@ -2738,7 +2407,7 @@ sub realtime_refund_bop {
#first try void if applicable
if ( $cust_pay && $cust_pay->paid == $amount ) { #and check dates?
- warn " attempting void\n" if $DEBUG > 1;
+ warn "FS::cust_main::realtime_bop: attempting void\n" if $DEBUG;
my $void = new Business::OnlinePayment( $processor, @bop_options );
$void->content( 'action' => 'void', %content );
$void->submit();
@@ -2751,13 +2420,13 @@ sub realtime_refund_bop {
warn $e;
return $e;
}
- warn " void successful\n" if $DEBUG > 1;
+ warn "FS::cust_main::realtime_bop: void successful\n" if $DEBUG;
return '';
}
}
- warn " void unsuccessful, trying refund\n"
- if $DEBUG > 1;
+ warn "FS::cust_main::realtime_bop: void unsuccessful, trying refund\n"
+ if $DEBUG;
#massage data
my $address = $self->address1;
@@ -3491,53 +3160,11 @@ Returns a name string for this customer, either "Company (Last, First)" or
sub name {
my $self = shift;
- my $name = $self->contact;
+ my $name = $self->get('last'). ', '. $self->first;
$name = $self->company. " ($name)" if $self->company;
$name;
}
-=item ship_name
-
-Returns a name string for this (service/shipping) contact, either
-"Company (Last, First)" or "Last, First".
-
-=cut
-
-sub ship_name {
- my $self = shift;
- if ( $self->get('ship_last') ) {
- my $name = $self->ship_contact;
- $name = $self->ship_company. " ($name)" if $self->ship_company;
- $name;
- } else {
- $self->name;
- }
-}
-
-=item contact
-
-Returns this customer's full (billing) contact name only, "Last, First"
-
-=cut
-
-sub contact {
- my $self = shift;
- $self->get('last'). ', '. $self->first;
-}
-
-=item ship_contact
-
-Returns this customer's full (shipping) contact name only, "Last, First"
-
-=cut
-
-sub ship_contact {
- my $self = shift;
- $self->get('ship_last')
- ? $self->get('ship_last'). ', '. $self->ship_first
- : $self->contact;
-}
-
=item status
Returns a status string for this customer, currently:
@@ -3609,10 +3236,17 @@ Returns an SQL expression identifying active cust_main records.
=cut
+my $recurring_sql = "
+ '0' != ( select freq from part_pkg
+ where cust_pkg.pkgpart = part_pkg.pkgpart )
+";
+
sub active_sql { "
0 < ( SELECT COUNT(*) FROM cust_pkg
WHERE cust_pkg.custnum = cust_main.custnum
- AND ". FS::cust_pkg->active_sql. "
+ AND $recurring_sql
+ AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
+ AND ( cust_pkg.susp IS NULL OR cust_pkg.susp = 0 )
)
"; }
@@ -3623,12 +3257,6 @@ Returns an SQL expression identifying suspended cust_main records.
=cut
-#my $recurring_sql = FS::cust_pkg->recurring_sql;
-my $recurring_sql = "
- '0' != ( select freq from part_pkg
- where cust_pkg.pkgpart = part_pkg.pkgpart )
-";
-
sub suspended_sql { susp_sql(@_); }
sub susp_sql { "
0 < ( SELECT COUNT(*) FROM cust_pkg
@@ -3638,7 +3266,9 @@ sub susp_sql { "
)
AND 0 = ( SELECT COUNT(*) FROM cust_pkg
WHERE cust_pkg.custnum = cust_main.custnum
- AND ". FS::cust_pkg->active_sql. "
+ AND $recurring_sql
+ AND ( cust_pkg.susp IS NULL OR cust_pkg.susp = 0 )
+ AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
)
"; }
diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm
deleted file mode 100644
index a114c5a8a..000000000
--- a/FS/FS/cust_main_Mixin.pm
+++ /dev/null
@@ -1,103 +0,0 @@
-package FS::cust_main_Mixin;
-
-use strict;
-use FS::cust_main;
-
-=head1 NAME
-
-FS::cust_main_Mixin - Mixin class for records that contain fields from cust_main
-
-=head1 SYNOPSIS
-
-package FS::some_table;
-use vars qw(@ISA);
-@ISA = qw( FS::cust_main_Mixin FS::Record );
-
-=head1 DESCRIPTION
-
-This is a mixin class for records that contain fields from the cust_main table,
-for example, from a JOINed search. See httemplate/search/ for examples.
-
-=head1 METHODS
-
-=over 4
-
-=item name
-
-Given an object that contains fields from cust_main (say, from a JOINed
-search; see httemplate/search/ for examples), returns the equivalent of the
-FS::cust_main I<name> method, or "(unlinked)" if this object is not linked to
-a customer.
-
-=cut
-
-sub cust_unlinked_msg { '(unlinked)'; }
-sub cust_linked { $_[0]->custnum; }
-
-sub name {
- my $self = shift;
- $self->cust_linked
- ? FS::cust_main::name($self)
- : $self->cust_unlinked_msg;
-}
-
-=item ship_name
-
-Given an object that contains fields from cust_main (say, from a JOINed
-search; see httemplate/search/ for examples), returns the equivalent of the
-FS::cust_main I<ship_name> method, or "(unlinked)" if this object is not
-linked to a customer.
-
-=cut
-
-sub ship_name {
- my $self = shift;
- $self->cust_linked
- ? FS::cust_main::ship_name($self)
- : $self->cust_unlinked_msg;
-}
-
-=item contact
-
-Given an object that contains fields from cust_main (say, from a JOINed
-search; see httemplate/search/ for examples), returns the equivalent of the
-FS::cust_main I<contact> method, or "(unlinked)" if this object is not linked
-to a customer.
-
-=cut
-
-sub contact {
- my $self = shift;
- $self->cust_linked
- ? FS::cust_main::contact($self)
- : $self->cust_unlinked_msg;
-}
-
-=item ship_contact
-
-Given an object that contains fields from cust_main (say, from a JOINed
-search; see httemplate/search/ for examples), returns the equivalent of the
-FS::cust_main I<ship_contact> method, or "(unlinked)" if this object is not
-linked to a customer.
-
-=cut
-
-sub ship_contact {
- my $self = shift;
- $self->cust_linked
- ? FS::cust_main::ship_contact($self)
- : $self->cust_unlinked_msg;
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::cust_main>, L<FS::Record>
-
-=cut
-
-1;
-
diff --git a/FS/FS/cust_main_county.pm b/FS/FS/cust_main_county.pm
index 17f346071..e44f919f2 100644
--- a/FS/FS/cust_main_county.pm
+++ b/FS/FS/cust_main_county.pm
@@ -251,7 +251,7 @@ END
foreach my $state ( sort keys %{ $cust_main_county{$selected_country} } ) {
my $text = $state || '(n/a)';
my $selected = $state eq $selected_state ? 'SELECTED' : '';
- $state_html .= qq(\n<OPTION $selected VALUE="$state">$text</OPTION>);
+ $state_html .= "\n<OPTION $selected VALUE=$state>$text</OPTION>"
}
$state_html .= '</SELECT>';
@@ -265,7 +265,7 @@ END
keys %cust_main_county
) {
my $selected = $country eq $selected_country ? ' SELECTED' : '';
- $country_html .= qq(\n<OPTION$selected VALUE="$country">$country</OPTION>");
+ $country_html .= "\n<OPTION$selected>$country</OPTION>"
}
$country_html .= '</SELECT>';
diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm
index f057d2faf..ccf991dc1 100644
--- a/FS/FS/cust_pay.pm
+++ b/FS/FS/cust_pay.pm
@@ -5,16 +5,15 @@ use vars qw( @ISA $conf $unsuspendauto $ignore_noapply );
use Date::Format;
use Business::CreditCard;
use Text::Template;
-use FS::Misc qw(send_email);
use FS::Record qw( dbh qsearch qsearchs );
-use FS::cust_main_Mixin;
+use FS::Misc qw(send_email);
use FS::cust_bill;
use FS::cust_bill_pay;
use FS::cust_pay_refund;
use FS::cust_main;
use FS::cust_pay_void;
-@ISA = qw( FS::cust_main_Mixin FS::Record );
+@ISA = qw( FS::Record );
$ignore_noapply = 0;
@@ -61,9 +60,7 @@ currently supported:
L<Time::Local> and L<Date::Parse> for conversion functions.
=item payby - `CARD' (credit cards), `CHEK' (electronic check/ACH),
-`LECB' (phone bill billing), `BILL' (billing), `PREP` (prepaid card),
-`CASH' (cash), `WEST' (Western Union), `MCRD' (Manual credit card), or
-`COMP' (free)
+`LECB' (phone bill billing), `BILL' (billing), or `COMP' (free)
=item payinfo - card number, check #, or comp issuer (4-8 lowercase alphanumerics; think username), respectively
@@ -84,12 +81,6 @@ Creates a new payment. To add the payment to the databse, see L<"insert">.
=cut
sub table { 'cust_pay'; }
-sub cust_linked { $_[0]->cust_main_custnum; }
-sub cust_unlinked_msg {
- my $self = shift;
- "WARNING: can't find cust_main.custnum ". $self->custnum.
- ' (cust_pay.paynum '. $self->paynum. ')';
-}
=item insert
@@ -124,13 +115,12 @@ sub insert {
$self->custnum($cust_bill->custnum );
}
+ my $cust_main = $self->cust_main;
+ my $old_balance = $cust_main->balance;
my $error = $self->check;
return $error if $error;
- my $cust_main = $self->cust_main;
- my $old_balance = $cust_main->balance;
-
$error = $self->SUPER::insert;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
@@ -375,8 +365,7 @@ sub check {
$self->_date(time) unless $self->_date;
- $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|PREP|CASH|WEST|MCRD)$/
- or return "Illegal payby";
+ $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|PREP)$/ or return "Illegal payby";
$self->payby($1);
#false laziness with cust_refund::check
@@ -402,61 +391,6 @@ sub check {
$self->SUPER::check;
}
-=item batch_insert CUST_PAY_OBJECT, ...
-
-Class method which inserts multiple payments. Takes a list of FS::cust_pay
-objects. Returns a list, each element representing the status of inserting the
-corresponding payment - empty. If there is an error inserting any payment, the
-entire transaction is rolled back, i.e. all payments are inserted or none are.
-
-For example:
-
- my @errors = FS::cust_pay->batch_insert(@cust_pay);
- my $num_errors = scalar(grep $_, @errors);
- if ( $num_errors == 0 ) {
- #success; all payments were inserted
- } else {
- #failure; no payments were inserted.
- }
-
-=cut
-
-sub batch_insert {
- my $self = shift; #class method
-
- local $SIG{HUP} = 'IGNORE';
- local $SIG{INT} = 'IGNORE';
- local $SIG{QUIT} = 'IGNORE';
- local $SIG{TERM} = 'IGNORE';
- local $SIG{TSTP} = 'IGNORE';
- local $SIG{PIPE} = 'IGNORE';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- my $errors = 0;
-
- my @errors = map {
- my $error = $_->insert;
- if ( $error ) {
- $errors++;
- } else {
- $_->cust_main->apply_payments;
- }
- $error;
- } @_;
-
- if ( $errors ) {
- $dbh->rollback if $oldAutoCommit;
- } else {
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
- }
-
- @errors;
-
-}
-
=item cust_bill_pay
Returns all applications to invoices (see L<FS::cust_bill_pay>) for this
diff --git a/FS/FS/cust_pay_refund.pm b/FS/FS/cust_pay_refund.pm
index 15e0e533a..af25f1774 100644
--- a/FS/FS/cust_pay_refund.pm
+++ b/FS/FS/cust_pay_refund.pm
@@ -138,26 +138,26 @@ sub check {
$self->SUPER::check;
}
-=item sub cust_pay
+=item sub cust_credit
-Returns the payment (see L<FS::cust_pay>)
+Returns the credit (see L<FS::cust_credit>)
=cut
-sub cust_pay {
+sub cust_credit {
my $self = shift;
- qsearchs( 'cust_pay', { 'paynum' => $self->paynum } );
+ qsearchs( 'cust_credit', { 'crednum' => $self->crednum } );
}
-=item cust_refund
+=item cust_bill
-Returns the refund (see L<FS::cust_refund>)
+Returns the invoice (see L<FS::cust_bill>)
=cut
-sub cust_refund {
+sub cust_bill {
my $self = shift;
- qsearchs( 'cust_refund', { 'refundnum' => $self->refundnum } );
+ qsearchs( 'cust_bill', { 'invnum' => $self->invnum } );
}
=back
diff --git a/FS/FS/cust_pay_void.pm b/FS/FS/cust_pay_void.pm
index 946d69fe1..7267929c8 100644
--- a/FS/FS/cust_pay_void.pm
+++ b/FS/FS/cust_pay_void.pm
@@ -3,8 +3,7 @@ use strict;
use vars qw( @ISA );
use Business::CreditCard;
use FS::UID qw(getotaker);
-use FS::Record qw(qsearchs dbh fields); # qsearch );
-use FS::cust_pay;
+use FS::Record qw(qsearchs); # dbh qsearch );
#use FS::cust_bill;
#use FS::cust_bill_pay;
#use FS::cust_pay_refund;
@@ -48,8 +47,7 @@ are currently supported:
L<Time::Local> and L<Date::Parse> for conversion functions.
=item payby - `CARD' (credit cards), `CHEK' (electronic check/ACH),
-`LECB' (phone bill billing), `BILL' (billing), `CASH' (cash),
-`WEST' (Western Union), `MCRD' (Manual credit card), or `COMP' (free)
+`LECB' (phone bill billing), `BILL' (billing), or `COMP' (free)
=item payinfo - card number, check #, or comp issuer (4-8 lowercase alphanumerics; think username), respectively
@@ -79,53 +77,16 @@ sub table { 'cust_pay_void'; }
Adds this voided payment to the database.
-=item unvoid
+=item delete
-"Un-void"s this payment: Deletes the voided payment from the database and adds
-back a normal payment.
+Currently unimplemented.
=cut
-sub unvoid {
- my $self = shift;
-
- local $SIG{HUP} = 'IGNORE';
- local $SIG{INT} = 'IGNORE';
- local $SIG{QUIT} = 'IGNORE';
- local $SIG{TERM} = 'IGNORE';
- local $SIG{TSTP} = 'IGNORE';
- local $SIG{PIPE} = 'IGNORE';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- my $cust_pay = new FS::cust_pay ( {
- map { $_ => $self->get($_) } fields('cust_pay')
- } );
- my $error = $cust_pay->insert;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
-
- $error = $self->delete;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-
+sub delete {
+ return "Can't delete voided payments!";
}
-=item delete
-
-Deletes this voided payment. You probably don't want to use this directly; see
-the B<unvoid> method to add the original payment back.
-
=item replace OLD_RECORD
Currently unimplemented.
@@ -167,8 +128,7 @@ sub check {
$self->void_date(time) unless $self->void_date;
- $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|PREP|CASH|WEST|MCRD)$/
- or return "Illegal payby";
+ $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP)$/ or return "Illegal payby";
$self->payby($1);
#false laziness with cust_refund::check
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index 783cc73a3..f5c1de3e2 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -3,9 +3,8 @@ package FS::cust_pkg;
use strict;
use vars qw(@ISA $disable_agentcheck @SVCDB_CANCEL_SEQ $DEBUG);
use FS::UID qw( getotaker dbh );
-use FS::Misc qw( send_email );
use FS::Record qw( qsearch qsearchs );
-use FS::cust_main_Mixin;
+use FS::Misc qw( send_email );
use FS::cust_svc;
use FS::part_pkg;
use FS::cust_main;
@@ -17,7 +16,7 @@ use FS::reg_code;
# need to 'use' these instead of 'require' in sub { cancel, suspend, unsuspend,
# setup }
-# because they load configuration by setting FS::UID::callback (see TODO)
+# because they load configuraion by setting FS::UID::callback (see TODO)
use FS::svc_acct;
use FS::svc_domain;
use FS::svc_www;
@@ -26,7 +25,7 @@ use FS::svc_forward;
# for sending cancel emails in sub cancel
use FS::Conf;
-@ISA = qw( FS::cust_main_Mixin FS::Record );
+@ISA = qw( FS::Record );
$DEBUG = 0;
@@ -142,12 +141,6 @@ Create a new billing item. To add the item to the database, see L<"insert">.
=cut
sub table { 'cust_pkg'; }
-sub cust_linked { $_[0]->cust_main_custnum; }
-sub cust_unlinked_msg {
- my $self = shift;
- "WARNING: can't find cust_main.custnum ". $self->custnum.
- ' (cust_pkg.pkgnum '. $self->pkgnum. ')';
-}
=item insert [ OPTION => VALUE ... ]
@@ -264,8 +257,6 @@ suspend is normally updated by the suspend and unsuspend methods.
cancel is normally updated by the cancel method (and also the order subroutine
in some cases).
-Calls
-
=cut
sub replace {
@@ -283,51 +274,7 @@ sub replace {
local($disable_agentcheck) = 1 if $old->pkgpart == $new->pkgpart;
- local $SIG{HUP} = 'IGNORE';
- local $SIG{INT} = 'IGNORE';
- local $SIG{QUIT} = 'IGNORE';
- local $SIG{TERM} = 'IGNORE';
- local $SIG{TSTP} = 'IGNORE';
- local $SIG{PIPE} = 'IGNORE';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- #save off and freeze RADIUS attributes for any associated svc_acct records
- my @svc_acct = ();
- if ( $old->part_pkg->is_prepaid || $new->part_pkg->is_prepaid ) {
-
- #also check for specific exports?
- # to avoid spurious modify export events
- @svc_acct = map { $_->svc_x }
- grep { $_->part_svc->svcdb eq 'svc_acct' }
- $old->cust_svc;
-
- $_->snapshot foreach @svc_acct;
-
- }
-
- my $error = $new->SUPER::replace($old);
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
-
- #for prepaid packages,
- #trigger export of new RADIUS Expiration attribute when cust_pkg.bill changes
- foreach my $old_svc_acct ( @svc_acct ) {
- my $new_svc_acct = new FS::svc_acct { $old_svc_acct->hash };
- my $s_error = $new_svc_acct->replace($old_svc_acct);
- if ( $s_error ) {
- $dbh->rollback if $oldAutoCommit;
- return $s_error;
- }
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
- '';
-
+ $new->SUPER::replace($old);
}
=item check
@@ -359,7 +306,7 @@ sub check {
qsearchs( 'reg_code', { 'code' => $self->reg_code,
'agentnum' => $self->cust_main->agentnum })
) {
- return "Unknown registration code";
+ return "Unknown registraiton code";
}
} elsif ( $self->promo_code ) {
@@ -453,7 +400,7 @@ sub cancel {
if ( $remaining_value > 0 ) {
my $error = $self->cust_main->credit(
$remaining_value,
- 'Credit for unused time on '. $self->part_pkg->pkg,
+ 'Credit for unused time on'. $self->part_pkg->pkg,
);
if ($error) {
$dbh->rollback if $oldAutoCommit;
@@ -801,54 +748,6 @@ sub available_part_svc {
$self->part_pkg->pkg_svc;
}
-=item status
-
-Returns a short status string for this package, currently:
-
-=over 4
-
-=item not yet billed
-
-=item one-time charge
-
-=item active
-
-=item suspended
-
-=item cancelled
-
-=back
-
-=cut
-
-sub status {
- my $self = shift;
-
- return 'cancelled' if $self->get('cancel');
- return 'suspended' if $self->susp;
- return 'not yet billed' unless $self->setup;
- return 'one-time charge' if $self->part_pkg->freq =~ /^(0|$)/;
- return 'active';
-}
-
-=item statuscolor
-
-Returns a hex triplet color string for this package's status.
-
-=cut
-
-my %statuscolor = (
- 'not yet billed' => '000000',
- 'one-time charge' => '000000',
- 'active' => '00CC00',
- 'suspended' => 'FF9900',
- 'cancelled' => 'FF0000',
-);
-sub statuscolor {
- my $self = shift;
- $statuscolor{$self->status};
-}
-
=item labels
Returns a list of lists, calling the label method for all services
@@ -1163,60 +1062,6 @@ sub reexport {
=back
-=head1 CLASS METHOD
-
-=over 4
-
-=item recurring_sql
-
-Returns an SQL expression identifying recurring packages.
-
-=cut
-
-sub recurring_sql { "
- '0' != ( select freq from part_pkg
- where cust_pkg.pkgpart = part_pkg.pkgpart )
-"; }
-
-=item active_sql
-
-Returns an SQL expression identifying active packages.
-
-=cut
-
-sub active_sql { "
- ". $_[0]->recurring_sql(). "
- AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
- AND ( cust_pkg.susp IS NULL OR cust_pkg.susp = 0 )
-"; }
-
-=item susp_sql
-=item suspended_sql
-
-Returns an SQL expression identifying suspended packages.
-
-=cut
-
-sub suspended_sql { susp_sql(@_); }
-sub susp_sql { "
- ". $_[0]->recurring_sql(). "
- AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 )
- AND cust_pkg.susp IS NOT NULL AND cust_pkg.susp != 0
-"; }
-
-=item cancel_sql
-=item cancelled_sql
-
-Returns an SQL exprression identifying cancelled packages.
-
-=cut
-
-sub cancelled_sql { cancel_sql(@_); }
-sub cancel_sql { "
- ". $_[0]->recurring_sql(). "
- AND cust_pkg.cancel IS NOT NULL AND cust_pkg.cancel != 0
-"; }
-
=head1 SUBROUTINES
=over 4
diff --git a/FS/FS/cust_refund.pm b/FS/FS/cust_refund.pm
index 8c672b8d7..106ccd3c3 100644
--- a/FS/FS/cust_refund.pm
+++ b/FS/FS/cust_refund.pm
@@ -51,8 +51,7 @@ inherits from FS::Record. The following fields are currently supported:
L<Time::Local> and L<Date::Parse> for conversion functions.
=item payby - `CARD' (credit cards), `CHEK' (electronic check/ACH),
-`LECB' (Phone bill billing), `BILL' (billing), `CASH' (cash),
-`WEST' (Western Union), `MCRD' (Manual credit card), or `COMP' (free)
+`LECB' (Phone bill billing), `BILL' (billing), or `COMP' (free)
=item payinfo - card number, P.O.#, or comp issuer (4-8 lowercase alphanumerics; think username)
@@ -212,8 +211,7 @@ sub check {
unless $self->crednum
|| qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
- $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|CASH|WEST|MCRD)$/
- or return "Illegal payby";
+ $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP)$/ or return "Illegal payby";
$self->payby($1);
#false laziness with cust_pay::check
diff --git a/FS/FS/cust_svc.pm b/FS/FS/cust_svc.pm
index ad87cab7e..86894f791 100644
--- a/FS/FS/cust_svc.pm
+++ b/FS/FS/cust_svc.pm
@@ -200,7 +200,7 @@ sub replace {
=item check
Checks all fields to make sure this is a valid service. If there is an error,
-returns the error, otherwise returns false. Called by the insert and
+returns the error, otehrwise returns false. Called by the insert and
replace methods.
=cut
@@ -274,7 +274,6 @@ Returns a list consisting of:
- The name of this service (from part_svc)
- A meaningful identifier (username, domain, or mail alias)
- The table name (i.e. svc_domain) for this service
-- svcnum
=cut
@@ -327,7 +326,7 @@ sub _svc_label {
$tag = $svc_x->getfield('svcnum');
}
- $self->part_svc->svc, $tag, $svcdb, $self->svcnum;
+ $self->part_svc->svc, $tag, $svcdb;
}
@@ -384,9 +383,10 @@ sub seconds_since_sqlradacct {
my $svc_x = $self->svc_x;
- my @part_export = $self->part_svc->part_export_usage;
- die "no accounting-capable exports are enabled for ". $self->part_svc->svc.
- " service definition"
+ my @part_export = $self->part_svc->part_export('sqlradius');
+ push @part_export, $self->part_svc->part_export('sqlradius_withdomain');
+ die "no sqlradius or sqlradius_withdomain export configured for this".
+ "service type"
unless @part_export;
#or return undef;
@@ -411,7 +411,14 @@ sub seconds_since_sqlradacct {
$str2time = 'extract(epoch from ';
}
- my $username = $part_export->export_username($svc_x);
+ my $username;
+ if ( $part_export->exporttype eq 'sqlradius' ) {
+ $username = $svc_x->username;
+ } elsif ( $part_export->exporttype eq 'sqlradius_withdomain' ) {
+ $username = $svc_x->email;
+ } else {
+ die 'unknown exporttype '. $part_export->exporttype;
+ }
my $query;
@@ -493,9 +500,10 @@ sub attribute_since_sqlradacct {
my $svc_x = $self->svc_x;
- my @part_export = $self->part_svc->part_export_usage;
- die "no accounting-capable exports are enabled for ". $self->part_svc->svc.
- " service definition"
+ my @part_export = $self->part_svc->part_export('sqlradius');
+ push @part_export, $self->part_svc->part_export('sqlradius_withdomain');
+ die "no sqlradius or sqlradius_withdomain export configured for this".
+ "service type"
unless @part_export;
#or return undef;
@@ -521,7 +529,14 @@ sub attribute_since_sqlradacct {
$str2time = 'extract(epoch from ';
}
- my $username = $part_export->export_username($svc_x);
+ my $username;
+ if ( $part_export->exporttype eq 'sqlradius' ) {
+ $username = $svc_x->username;
+ } elsif ( $part_export->exporttype eq 'sqlradius_withdomain' ) {
+ $username = $svc_x->email;
+ } else {
+ die 'unknown exporttype '. $part_export->exporttype;
+ }
my $sth = $dbh->prepare("SELECT SUM($attrib)
FROM radacct
@@ -553,9 +568,11 @@ sub get_session_history {
#$attrib ???
- my @part_export = $self->part_svc->part_export_usage;
- die "no accounting-capable exports are enabled for ". $self->part_svc->svc.
- " service definition"
+ #my @part_export = $cust_svc->part_svc->part_export->can('usage_sessions');
+ my @part_export = $self->part_svc->part_export('sqlradius');
+ push @part_export, $self->part_svc->part_export('sqlradius_withdomain');
+ die "no sqlradius or sqlradius_withdomain export configured for this".
+ "service type"
unless @part_export;
#or return undef;
diff --git a/FS/FS/domain_record.pm b/FS/FS/domain_record.pm
index 3c65a1a05..e975cac51 100644
--- a/FS/FS/domain_record.pm
+++ b/FS/FS/domain_record.pm
@@ -250,17 +250,9 @@ sub check {
return "Unknown svcnum (in svc_domain)"
unless qsearchs('svc_domain', { 'svcnum' => $self->svcnum } );
- my $conf = new FS::Conf;
-
- if ( $conf->exists('zone-underscore') ) {
- $self->reczone =~ /^(@|[a-z0-9_\.\-\*]+)$/i
- or return "Illegal reczone: ". $self->reczone;
- $self->reczone($1);
- } else {
- $self->reczone =~ /^(@|[a-z0-9\.\-\*]+)$/i
- or return "Illegal reczone: ". $self->reczone;
- $self->reczone($1);
- }
+ $self->reczone =~ /^(@|[a-z0-9\.\-\*]+)$/i
+ or return "Illegal reczone: ". $self->reczone;
+ $self->reczone($1);
$self->recaf =~ /^(IN)$/ or return "Illegal recaf: ". $self->recaf;
$self->recaf($1);
@@ -292,26 +284,17 @@ sub check {
or return "Illegal data for A record: ". $self->recdata;
$self->recdata($1);
} elsif ( $self->rectype eq 'PTR' ) {
- if ( $conf->exists('zone-underscore') ) {
- $self->recdata =~ /^([a-z0-9_\.\-]+)$/i
- or return "Illegal data for PTR record: ". $self->recdata;
- $self->recdata($1);
- } else {
- $self->recdata =~ /^([a-z0-9\.\-]+)$/i
- or return "Illegal data for PTR record: ". $self->recdata;
- $self->recdata($1);
- }
+ $self->recdata =~ /^([a-z0-9\.\-]+)$/i
+ or return "Illegal data for PTR record: ". $self->recdata;
+ $self->recdata($1);
} elsif ( $self->rectype eq 'CNAME' ) {
$self->recdata =~ /^([a-z0-9\.\-]+|\@)$/i
or return "Illegal data for CNAME record: ". $self->recdata;
$self->recdata($1);
} elsif ( $self->rectype eq 'TXT' ) {
- if ( $self->recdata =~ /^((?:\S+)|(?:".+"))$/ ) {
- $self->recdata($1);
- } else {
- $self->recdata('"'. $self->recdata. '"'); #?
- }
- # or return "Illegal data for TXT record: ". $self->recdata;
+ $self->recdata =~ /^((?:\S+)|(?:".+"))$/
+ or return "Illegal data for TXT record: ". $self->recdata;
+ $self->recdata($1);
} elsif ( $self->rectype eq '_mstr' ) {
$self->recdata =~ /^((\d{1,3}\.){3}\d{1,3})$/
or return "Illegal data for _master pseudo-record: ". $self->recdata;
diff --git a/FS/FS/export_svc.pm b/FS/FS/export_svc.pm
index 0370f5f0b..e5c7ed8db 100644
--- a/FS/FS/export_svc.pm
+++ b/FS/FS/export_svc.pm
@@ -198,8 +198,8 @@ sub insert {
' on '. $self->part_export->machine.
' : '. scalar(@dup_svc). " duplicate $label".
' ('. scalar(@diff_customer_svc). " from different customers)".
- ": ". join(', ', sort $sortby map { $_->$method() } @dup_svc )
- #": ". join(', ', sort $sortby map { $_->$method() } @diff_customer_svc )
+ #": ". join(', ', sort $sortby map { $_->$method() } @dup_svc )
+ ": ". join(', ', sort $sortby map { $_->$method() } @diff_customer_svc )
;
}
diff --git a/FS/FS/h_cust_svc.pm b/FS/FS/h_cust_svc.pm
index af0bf6064..718f2c7ed 100644
--- a/FS/FS/h_cust_svc.pm
+++ b/FS/FS/h_cust_svc.pm
@@ -80,15 +80,13 @@ sub h_svc_x {
"h_$svcdb",
{ 'svcnum' => $self->svcnum, },
"FS::h_$svcdb"->sql_h_searchs(@_),
- ) || $self->SUPER::svc_x;
+ ) || $self->SUPER::svc_x
+ or die "no history ${svcdb}.svcnum for cust_svc.svcnum ". $self->svcnum;
- if ($svc_x) {
- carp "Using $svcdb in place of missing h_${svcdb} record."
- if ($svc_x->isa('FS::' . $svcdb) and $DEBUG);
- return $svc_x;
- } else {
- return '';
- }
+ carp "Using $svcdb in place of missing h_${svcdb} record."
+ if ($svc_x->isa('FS::' . $svcdb) and $DEBUG);
+
+ return $svc_x;
}
diff --git a/FS/FS/option_Common.pm b/FS/FS/option_Common.pm
deleted file mode 100644
index f258fa1d6..000000000
--- a/FS/FS/option_Common.pm
+++ /dev/null
@@ -1,295 +0,0 @@
-package FS::option_Common;
-
-use strict;
-use vars qw( @ISA $DEBUG );
-use FS::Record qw( qsearch qsearchs dbh );
-
-@ISA = qw( FS::Record );
-
-$DEBUG = 0;
-
-=head1 NAME
-
-FS::option_Common - Base class for option sub-classes
-
-=head1 SYNOPSIS
-
-use FS::option_Common;
-
-@ISA = qw( FS::option_Common );
-
-=head1 DESCRIPTION
-
-FS::option_Common is intended as a base class for classes which have a
-simple one-to-many class associated with them, used to store a hash-like data
-structure of keys and values.
-
-=head1 METHODS
-
-=over 4
-
-=item insert [ HASHREF | OPTION => VALUE ... ]
-
-Adds this record to the database. If there is an error, returns the error,
-otherwise returns false.
-
-If a list or hash reference of options is supplied, option records are also
-created.
-
-=cut
-
-#false laziness w/queue.pm
-sub insert {
- my $self = shift;
- my $options =
- ( ref($_[0]) eq 'HASH' )
- ? shift
- : { @_ };
- warn "FS::option_Common::insert called on $self with options ".
- join(', ', map "$_ => ".$options->{$_}, keys %$options)
- if $DEBUG;
-
- local $SIG{HUP} = 'IGNORE';
- local $SIG{INT} = 'IGNORE';
- local $SIG{QUIT} = 'IGNORE';
- local $SIG{TERM} = 'IGNORE';
- local $SIG{TSTP} = 'IGNORE';
- local $SIG{PIPE} = 'IGNORE';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- my $error = $self->SUPER::insert;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
-
- my $pkey = $self->pkey;
- my $option_table = $self->option_table;
-
- foreach my $optionname ( keys %{$options} ) {
- my $href = {
- $pkey => $self->get($pkey),
- 'optionname' => $optionname,
- 'optionvalue' => $options->{$optionname},
- };
-
- #my $option_record = eval "new FS::$option_table \$href";
- #if ( $@ ) {
- # $dbh->rollback if $oldAutoCommit;
- # return $@;
- #}
- my $option_record = "FS::$option_table"->new($href);
-
- $error = $option_record->insert;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-
-}
-
-=item delete
-
-Delete this record from the database. Any associated option records are also
-deleted.
-
-=cut
-
-#foreign keys would make this much less tedious... grr dumb mysql
-sub delete {
- my $self = shift;
- local $SIG{HUP} = 'IGNORE';
- local $SIG{INT} = 'IGNORE';
- local $SIG{QUIT} = 'IGNORE';
- local $SIG{TERM} = 'IGNORE';
- local $SIG{TSTP} = 'IGNORE';
- local $SIG{PIPE} = 'IGNORE';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- my $error = $self->SUPER::delete;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
-
- my $pkey = $self->pkey;
- #my $option_table = $self->option_table;
-
- foreach my $obj ( $self->option_objects ) {
- my $error = $obj->delete;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-
-}
-
-=item replace [ HASHREF | OPTION => VALUE ... ]
-
-Replaces the OLD_RECORD with this one in the database. If there is an error,
-returns the error, otherwise returns false.
-
-If a list hash reference of options is supplied, part_export_option records are
-created or modified (see L<FS::part_export_option>).
-
-=cut
-
-sub replace {
- my $self = shift;
- my $old = shift;
- my $options =
- ( ref($_[0]) eq 'HASH' )
- ? shift
- : { @_ };
- warn "FS::option_Common::insert called on $self with options ".
- join(', ', map "$_ => ". $options->{$_}, keys %$options)
- if $DEBUG;
-
- local $SIG{HUP} = 'IGNORE';
- local $SIG{INT} = 'IGNORE';
- local $SIG{QUIT} = 'IGNORE';
- local $SIG{TERM} = 'IGNORE';
- local $SIG{TSTP} = 'IGNORE';
- local $SIG{PIPE} = 'IGNORE';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- my $error = $self->SUPER::replace($old);
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
-
- my $pkey = $self->pkey;
- my $option_table = $self->option_table;
-
- foreach my $optionname ( keys %{$options} ) {
- my $old = qsearchs( $option_table, {
- $pkey => $self->get($pkey),
- 'optionname' => $optionname,
- } );
-
- my $href = {
- $pkey => $self->get($pkey),
- 'optionname' => $optionname,
- 'optionvalue' => $options->{$optionname},
- };
-
- #my $new = eval "new FS::$option_table \$href";
- #if ( $@ ) {
- # $dbh->rollback if $oldAutoCommit;
- # return $@;
- #}
- my $new = "FS::$option_table"->new($href);
-
- $new->optionnum($old->optionnum) if $old;
- my $error = $old ? $new->replace($old) : $new->insert;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
- }
-
- #remove extraneous old options
- foreach my $opt (
- grep { !exists $options->{$_->optionname} } $old->option_objects
- ) {
- my $error = $opt->delete;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return $error;
- }
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-
-}
-
-=item option_objects
-
-Returns all options as FS::I<tablename>_option objects.
-
-=cut
-
-sub option_objects {
- my $self = shift;
- my $pkey = $self->pkey;
- my $option_table = $self->option_table;
- qsearch($option_table, { $pkey => $self->get($pkey) } );
-}
-
-=item options
-
-Returns a list of option names and values suitable for assigning to a hash.
-
-=cut
-
-sub options {
- my $self = shift;
- map { $_->optionname => $_->optionvalue } $self->option_objects;
-}
-
-=item option OPTIONNAME
-
-Returns the option value for the given name, or the empty string.
-
-=cut
-
-sub option {
- my $self = shift;
- my $pkey = $self->pkey;
- my $option_table = $self->option_table;
- my $obj =
- qsearchs($option_table, {
- $pkey => $self->get($pkey),
- optionname => shift,
- } );
- $obj ? $obj->optionvalue : '';
-}
-
-
-sub pkey {
- my $self = shift;
- my $pkey = $self->dbdef_table->primary_key;
-}
-
-sub option_table {
- my $self = shift;
- my $option_table = $self->table . '_option';
- eval "use FS::$option_table";
- die $@ if $@;
- $option_table;
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::Record>
-
-=cut
-
-1;
-
diff --git a/FS/FS/part_bill_event.pm b/FS/FS/part_bill_event.pm
index 8143e3473..573b21b59 100644
--- a/FS/FS/part_bill_event.pm
+++ b/FS/FS/part_bill_event.pm
@@ -134,8 +134,6 @@ sub check {
or $c =~ /^\s*\$cust_main\->suspend_(if|unless)_pkgpart\([\d\,\s]*\);\s*$/
- or $c =~ /^\s*\$cust_bill\->cust_suspend_if_balance_over\([\d\.\s]*\);\s*$/
-
or do {
#log
return "illegal eventcode: $c";
diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm
index dce2d2a44..3f677b267 100644
--- a/FS/FS/part_export.pm
+++ b/FS/FS/part_export.pm
@@ -5,12 +5,11 @@ use vars qw( @ISA @EXPORT_OK $DEBUG %exports );
use Exporter;
use Tie::IxHash;
use FS::Record qw( qsearch qsearchs dbh );
-use FS::option_Common;
use FS::part_svc;
use FS::part_export_option;
use FS::export_svc;
-@ISA = qw( FS::option_Common );
+@ISA = qw(FS::Record);
@EXPORT_OK = qw(export_info);
$DEBUG = 0;
@@ -104,6 +103,48 @@ otherwise returns false.
If a hash reference of options is supplied, part_export_option records are
created (see L<FS::part_export_option>).
+=cut
+
+#false laziness w/queue.pm
+sub insert {
+ my $self = shift;
+ my $options = shift;
+ local $SIG{HUP} = 'IGNORE';
+ local $SIG{INT} = 'IGNORE';
+ local $SIG{QUIT} = 'IGNORE';
+ local $SIG{TERM} = 'IGNORE';
+ local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
+
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
+ my $error = $self->SUPER::insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ foreach my $optionname ( keys %{$options} ) {
+ my $part_export_option = new FS::part_export_option ( {
+ 'exportnum' => $self->exportnum,
+ 'optionname' => $optionname,
+ 'optionvalue' => $options->{$optionname},
+ } );
+ $error = $part_export_option->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+ '';
+
+}
+
=item delete
Delete this record from the database.
@@ -130,6 +171,14 @@ sub delete {
return $error;
}
+ foreach my $part_export_option ( $self->part_export_option ) {
+ my $error = $part_export_option->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
foreach my $export_svc ( $self->export_svc ) {
my $error = $export_svc->delete;
if ( $error ) {
@@ -144,6 +193,72 @@ sub delete {
}
+=item replace OLD_RECORD HASHREF
+
+Replaces the OLD_RECORD with this one in the database. If there is an error,
+returns the error, otherwise returns false.
+
+If a hash reference of options is supplied, part_export_option records are
+created or modified (see L<FS::part_export_option>).
+
+=cut
+
+sub replace {
+ my $self = shift;
+ my $old = shift;
+ my $options = shift;
+ local $SIG{HUP} = 'IGNORE';
+ local $SIG{INT} = 'IGNORE';
+ local $SIG{QUIT} = 'IGNORE';
+ local $SIG{TERM} = 'IGNORE';
+ local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
+
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
+ my $error = $self->SUPER::replace($old);
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ foreach my $optionname ( keys %{$options} ) {
+ my $old = qsearchs( 'part_export_option', {
+ 'exportnum' => $self->exportnum,
+ 'optionname' => $optionname,
+ } );
+ my $new = new FS::part_export_option ( {
+ 'exportnum' => $self->exportnum,
+ 'optionname' => $optionname,
+ 'optionvalue' => $options->{$optionname},
+ } );
+ $new->optionnum($old->optionnum) if $old;
+ my $error = $old ? $new->replace($old) : $new->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ #remove extraneous old options
+ foreach my $opt (
+ grep { !exists $options->{$_->optionname} } $old->part_export_option
+ ) {
+ my $error = $opt->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+ '';
+
+};
+
=item check
Checks all fields to make sure this is a valid export. If there is
@@ -232,17 +347,36 @@ L<FS::part_export_option>).
sub part_export_option {
my $self = shift;
- $self->option_objects;
+ qsearch('part_export_option', { 'exportnum' => $self->exportnum } );
}
=item options
Returns a list of option names and values suitable for assigning to a hash.
+=cut
+
+sub options {
+ my $self = shift;
+ map { $_->optionname => $_->optionvalue } $self->part_export_option;
+}
+
=item option OPTIONNAME
Returns the option value for the given name, or the empty string.
+=cut
+
+sub option {
+ my $self = shift;
+ my $part_export_option =
+ qsearchs('part_export_option', {
+ exportnum => $self->exportnum,
+ optionname => shift,
+ } );
+ $part_export_option ? $part_export_option->optionvalue : '';
+}
+
=item _rebless
Reblesses the object into the FS::part_export::EXPORTTYPE class, where
diff --git a/FS/FS/part_export/artera_turbo.pm b/FS/FS/part_export/artera_turbo.pm
index c006db9cd..bbc6be945 100644
--- a/FS/FS/part_export/artera_turbo.pm
+++ b/FS/FS/part_export/artera_turbo.pm
@@ -43,7 +43,7 @@ Reseller API. Requires installation of
<a href="http://search.cpan.org/dist/Net-Artera">Net::Artera</a>
from CPAN. You probably also want to:
<UL>
- <LI>In the configuration UI section: set the <B>svc_external-skip_manual</B> and <B>svc_external-display_type</B> configuration values.
+ <LI>In the configuraiton UI section: set the <B>svc_external-skip_manual</B> and <B>svc_external-display_type</B> configuration values.
<LI>In the message catalog: set <B>svc_external-id</B> to <I>Artera Serial Number</I> and set <B>svc_external-title</B> to <I>Artera Key Code</I>.
</UL>
END
diff --git a/FS/FS/part_export/cpanel.pm b/FS/FS/part_export/cpanel.pm
deleted file mode 100644
index 0ad00df01..000000000
--- a/FS/FS/part_export/cpanel.pm
+++ /dev/null
@@ -1,192 +0,0 @@
-package FS::part_export::cpanel;
-
-use vars qw(@ISA %info);
-use Tie::IxHash;
-use FS::part_export;
-
-@ISA = qw(FS::part_export);
-
-tie my %options, 'Tie::IxHash',
- 'user' => { label=>'Remote access username' },
- 'accesshash' => { label=>'Remote access key', type=>'textarea' },
- 'debug' => { label=>'Enable debugging', type=>'checkbox' },
-;
-
-%info = (
- 'svc' => 'svc_acct',
- 'desc' => 'Real-time export to Cpanel control panel.',
- 'options' => \%options,
- 'nodomain' => 'Y',
- 'notes' => 'Real time export to a the <a href="http://www.cpanel.net/">Cpanel</a> control panel software. Service definition names are exported as Cpanel packages. Requires installation of the Cpanel::Accounting perl module distributed with Cpanel.',
-);
-
-sub rebless { shift; }
-
-sub _export_insert {
- my($self, $svc_acct) = (shift, shift);
- $err_or_queue = $self->cpanel_queue( $svc_acct->svcnum, 'insert',
- $svc_acct->domain,
- $svc_acct->username,
- $svc_acct->_password,
- $svc_acct->cust_svc->part_svc->svc,
- );
- ref($err_or_queue) ? '' : $err_or_queue;
-}
-
-sub _export_replace {
- my( $self, $new, $old ) = (shift, shift, shift);
- return "can't change username with cpanel"
- if $old->username ne $new->username;
- return "can't change password with cpanel"
- if $old->_passsword ne $new->_password;
- return "can't change domain with cpanel"
- if $old->domain ne $new->domain;
-
- '';
-
- ##return '' unless $old->_password ne $new->_password;
- #$err_or_queue = $self->cpanel_queue( $new->svcnum,
- # 'replace', $new->username, $new->_password );
- #ref($err_or_queue) ? '' : $err_or_queue;
-}
-
-sub _export_delete {
- my( $self, $svc_acct ) = (shift, shift);
- $err_or_queue = $self->cpanel_queue( $svc_acct->svcnum,
- 'delete', $svc_acct->username
- );
- ref($err_or_queue) ? '' : $err_or_queue;
-}
-
-sub _export_suspend {
- my( $self, $svc_acct ) = (shift, shift);
- $err_or_queue = $self->cpanel_queue( $svc_acct->svcnum,
- 'suspend', $svc_acct->username );
- ref($err_or_queue) ? '' : $err_or_queue;
-}
-
-sub _export_unsuspend {
- my( $self, $svc_acct ) = (shift, shift);
- $err_or_queue = $self->cpanel_queue( $svc_acct->svcnum,
- 'unsuspend', $svc_acct->username );
- ref($err_or_queue) ? '' : $err_or_queue;
-}
-
-
-sub cpanel_queue {
- my( $self, $svcnum, $method ) = (shift, shift, shift);
- my $queue = new FS::queue {
- 'svcnum' => $svcnum,
- 'job' => "FS::part_export::cpanel::cpanel_$method",
- };
- $queue->insert(
- $self->machine,
- $self->option('user'),
- $self->option('accesshash'),
- $self->option('debug'),
- @_
- ) or $queue;
-}
-
-
-sub cpanel_insert { #subroutine, not method
- my( $machine, $user, $accesshash, $debug ) = splice(@_,0,4);
-
-# my $whm = cpanel_connect($machine, $user, $accesshash, $debug);
-# warn " cpanel->createacct ". join(', ', @_). "\n"
-# if $debug;
-# my $response = $whm->createacct(@_);
-# die $whm->{'error'} if $whm->{'error'};
-# warn " cpanel response: $response\n"
-# if $debug;
-
- warn "cpanel_insert: attempting web interface to add POP"
- if $debug;
-
- my($domain, $username, $password, $svc) = @_;
-
- use LWP::UserAgent;
- use HTTP::Request::Common qw(POST);
-
- my $url =
- "http://$user:$accesshash\@$domain:2082/frontend/x/mail/addpop2.html";
-
- my $ua = LWP::UserAgent->new();
-
- #$req->authorization_basic($user, $accesshash);
-
- my $res = $ua->request(
- POST( $url,
- [
- 'email' => $username,
- 'domain' => $domain,
- 'password' => $password,
- 'quota' => 10, #?
- ]
- )
- );
-
- die "Error submitting data to $url: ". $res->status_line
- unless $res->is_success;
-
- die "Username in use"
- if $res->content =~ /exists/;
-
- die "Account not created: ". $res->content
- if $res->content =~ /failure/;
-
-}
-
-#sub cpanel_replace { #subroutine, not method
-#}
-
-sub cpanel_delete { #subroutine, not method
- my( $machine, $user, $accesshash, $debug ) = splice(@_,0,4);
- my $whm = cpanel_connect($machine, $user, $accesshash, $debug);
- warn " cpanel->killacct ". join(', ', @_). "\n"
- if $debug;
- my $response = $whm->killacct(shift);
- die $whm->{'error'} if $whm->{'error'};
- warn " cpanel response: $response\n"
- if $debug;
-}
-
-sub cpanel_suspend { #subroutine, not method
- my( $machine, $user, $accesshash, $debug ) = splice(@_,0,4);
- my $whm = cpanel_connect($machine, $user, $accesshash, $debug);
- warn " cpanel->suspend ". join(', ', @_). "\n"
- if $debug;
- my $response = $whm->suspend(shift);
- die $whm->{'error'} if $whm->{'error'};
- warn " cpanel response: $response\n"
- if $debug;
-}
-
-sub cpanel_unsuspend { #subroutine, not method
- my( $machine, $user, $accesshash, $debug ) = splice(@_,0,4);
- my $whm = cpanel_connect($machine, $user, $accesshash, $debug);
- warn " cpanel->unsuspend ". join(', ', @_). "\n"
- if $debug;
- my $response = $whm->unsuspend(shift);
- die $whm->{'error'} if $whm->{'error'};
- warn " cpanel response: $response\n"
- if $debug;
-}
-
-sub cpanel_connect {
- my( $host, $user, $accesshash, $debug ) = @_;
-
- eval "use Cpanel::Accounting;";
- die $@ if $@;
-
- warn "creating new Cpanel::Accounting connection to $user@$host\n"
- if $debug;
-
- my $whm = new Cpanel::Accounting;
- $whm->{'host'} = $host;
- $whm->{'user'} = $user;
- $whm->{'accesshash'} = $accesshash;
- $whm->{'usessl'} = 1;
-
- $whm;
-}
diff --git a/FS/FS/part_export/domain_shellcommands.pm b/FS/FS/part_export/domain_shellcommands.pm
index d15f41a84..0ba561711 100644
--- a/FS/FS/part_export/domain_shellcommands.pm
+++ b/FS/FS/part_export/domain_shellcommands.pm
@@ -70,7 +70,6 @@ sub _export_delete {
sub _export_command {
my ( $self, $action, $svc_domain) = (shift, shift, shift);
my $command = $self->option($action);
- return '' if $command =~ /^\s*$/;
#set variable for the command
no strict 'vars';
diff --git a/FS/FS/part_export/everyone_net.pm b/FS/FS/part_export/everyone_net.pm
deleted file mode 100644
index e04318e10..000000000
--- a/FS/FS/part_export/everyone_net.pm
+++ /dev/null
@@ -1,132 +0,0 @@
-package FS::part_export::everyone_net;
-
-use vars qw(@ISA %info);
-use Tie::IxHash;
-use FS::part_export;
-
-@ISA = qw(FS::part_export);
-
-tie my %options, 'Tie::IxHash',
- 'clientID' => { label=>'clientID' },
- 'password' => { label=>'Password' },
- #'workgroup' => { label=>'Default Workgroup' },
- 'debug' => { label=>'Enable debugging',
- type=>'checkbox' },
-;
-
-%info = (
- 'svc' => 'svc_acct',
- 'desc' => 'Real-time export to Everyone.net outsourced mail service',
- 'options'=> \%options,
- 'notes' => <<'END'
-Real-time export to
-<a href="http://www.cp.net/">Everyone.net</a> via the XRC Remote API.
-Requires installation of
-<a href="http://search.cpan.org/dist/Net-XRC">Net::XRC</a>
-from CPAN.
-END
-);
-
-sub rebless { shift; }
-
-# experiement: want the status of these right away (don't want account to
-# create or whatever and then get error in the queue from dup username or
-# something), so no queueing
-
-sub _export_insert {
- my( $self, $svc_acct ) = (shift, shift);
-
- eval "use Net::XRC qw(:types);";
- return $@ if $@;
-
- $self->_xrc_command( 'createUser',
- $svc_acct->domain,
- [],
- string($svc_acct->username),
- string($svc_acct->_password),
- );
-}
-
-sub _xrc_command {
- my( $self, $method, $domain, @args ) = @_;
-
- eval "use Net::XRC qw(:types);";
- return $@ if $@;
-
- local($Net::XRC::DEBUG) = 1
- if $self->option('debug');
-
- my $xrc = new Net::XRC (
- 'clientID' => $self->option('clientID'),
- 'password' => $self->option('password'),
- );
-
- my $dresponse = $xrc->lookupMXReadyClientIDByEmailDomain( string($domain) );
- return $dresponse->error unless $dresponse->is_success;
- my $clientID = $dresponse->content;
- return "clientID for domain $domain not found"
- if $clientID == -1;
-
- my $response = $xrc->$method($clientID, @args);
- return $response->error unless $response->is_success;
- '';
-
-}
-
-sub _export_replace {
- my( $self, $new, $old ) = (shift, shift, shift);
-
- eval "use Net::XRC qw(:types);";
- return $@ if $@;
-
- return "can't change domain with Everyone.net"
- if $old->domain ne $new->domain;
- return "can't change username with Everyone.net"
- if $old->username ne $new->username;
- return '' unless $old->_password ne $new->_password;
-
- $self->_xrc_command( 'setUserPassword',
- $new->domain,
- string($new->username),
- string($new->_password),
- );
-}
-
-sub _export_delete {
- my( $self, $svc_acct ) = (shift, shift);
-
- eval "use Net::XRC qw(:types);";
- return $@ if $@;
-
- $self->_xrc_command( 'deleteUser',
- $svc_acct->domain,
- string($svc_acct->username),
- );
-}
-
-sub _export_suspend {
- my( $self, $svc_acct ) = (shift, shift);
-
- eval "use Net::XRC qw(:types);";
- return $@ if $@;
-
- $self->_xrc_command( 'suspendUser',
- $svc_acct->domain,
- string($svc_acct->username),
- );
-}
-
-sub _export_unsuspend {
- my( $self, $svc_acct ) = (shift, shift);
-
- eval "use Net::XRC qw(:types);";
- return $@ if $@;
-
- $self->_xrc_command( 'unsuspendUser',
- $svc_acct->domain,
- string($svc_acct->username),
- );
-}
-
-1;
-
diff --git a/FS/FS/part_export/forward_shellcommands.pm b/FS/FS/part_export/forward_shellcommands.pm
index cee24e452..fe304350c 100644
--- a/FS/FS/part_export/forward_shellcommands.pm
+++ b/FS/FS/part_export/forward_shellcommands.pm
@@ -45,9 +45,8 @@ Run remote commands via SSH, for forwards. You will need to
The following variables are available for interpolation (prefixed with
<code>new_</code> or <code>old_</code> for replace operations):
<UL>
- <LI><code>$username</code> - username of forward source
- <LI><code>$domain</code> - domain of forward source
- <LI><code>$source</code> - forward source ($username@$domain)
+ <LI><code>$username</code>
+ <LI><code>$domain</code>
<LI><code>$destination</code> - forward destination
<LI>All other fields in <a href="../docs/schema.html#svc_forward">svc_forward</a> are also available.
</UL>
@@ -69,7 +68,6 @@ sub _export_delete {
sub _export_command {
my ( $self, $action, $svc_forward ) = (shift, shift, shift);
my $command = $self->option($action);
- return '' if $command =~ /^\s*$/;
#set variable for the command
no strict 'vars';
@@ -78,17 +76,10 @@ sub _export_command {
${$_} = $svc_forward->getfield($_) foreach $svc_forward->fields;
}
- if ( $svc_forward->srcsvc ) {
- my $srcsvc_acct = $svc_forward->srcsvc_acct;
- $username = $srcsvc_acct->username;
- $domain = $srcsvc_acct->domain;
- $source = $srcsvc_acct->email;
- } else {
- $source = $svc_forward->src;
- ( $username, $domain ) = split(/\@/, $source);
- }
-
- if ($svc_forward->dstsvc) {
+ my $svc_acct = $svc_forward->srcsvc_acct;
+ $username = $svc_acct->username;
+ $domain = $svc_acct->domain;
+ if ($svc_forward->dstsvc_acct) {
$destination = $svc_forward->dstsvc_acct->email;
} else {
$destination = $svc_forward->dst;
@@ -115,33 +106,19 @@ sub _export_replace {
${"new_$_"} = $new->getfield($_) foreach $new->fields;
}
- if ( $old->srcsvc ) {
- my $srcsvc_acct = $old->srcsvc_acct;
- $old_username = $srcsvc_acct->username;
- $old_domain = $srcsvc_acct->domain;
- $old_source = $srcsvc_acct->email;
- } else {
- $old_source = $old->src;
- ( $old_username, $old_domain ) = split(/\@/, $old_source);
- }
-
- if ( $old->dstsvc ) {
+ my $old_svc_acct = $old->srcsvc_acct;
+ $old_username = $old_svc_acct->username;
+ $old_domain = $old_svc_acct->domain;
+ if ($old->dstsvc_acct) {
$old_destination = $old->dstsvc_acct->email;
} else {
$old_destination = $old->dst;
}
- if ( $new->srcsvc ) {
- my $srcsvc_acct = $new->srcsvc_acct;
- $new_username = $srcsvc_acct->username;
- $new_domain = $srcsvc_acct->domain;
- $new_source = $srcsvc_acct->email;
- } else {
- $new_source = $new->src;
- ( $new_username, $new_domain ) = split(/\@/, $new_source);
- }
-
- if ( $new->dstsvc ) {
+ my $new_svc_acct = $new->srcsvc_acct;
+ $new_username = $new_svc_acct->username;
+ $new_domain = $new_svc_acct->domain;
+ if ($new->dstsvc) {
$new_destination = $new->dstsvc_acct->email;
} else {
$new_destination = $new->dst;
diff --git a/FS/FS/part_export/radiator.pm b/FS/FS/part_export/radiator.pm
deleted file mode 100644
index 2ac3edb22..000000000
--- a/FS/FS/part_export/radiator.pm
+++ /dev/null
@@ -1,167 +0,0 @@
-package FS::part_export::radiator;
-
-use vars qw(@ISA %info $radusers);
-use Tie::IxHash;
-use FS::part_export::sqlradius;
-
-tie my %options, 'Tie::IxHash', %FS::part_export::sqlradius::options;
-
-%info = (
- 'svc' => 'svc_acct',
- 'desc' => 'Real-time export to RADIATOR',
- 'options' => \%options,
- 'nodomain' => '',
- 'notes' => <<'END',
-Real-time export of the <b>radusers</b> table to any SQL database in
-<a href="http://www.open.com.au/radiator/">Radiator</a>-native format.
-To setup accounting, see the RADIATOR documentation for hooks to update
-a standard <b>radacct</b> table.
-END
-);
-
-@ISA = qw(FS::part_export::sqlradius); #for regular sqlradius accounting
-
-$radusers = 'RADUSERS'; #MySQL is case sensitive about table names! huh
-
-#sub export_username {
-# my($self, $svc_acct) = (shift, shift);
-# $svc_acct->email;
-#}
-
-sub _export_insert {
- my( $self, $svc_acct ) = (shift, shift);
-
- $self->radiator_queue(
- $svc_acct->svcnum,
- 'insert',
- $self->_radiator_hash($svc_acct),
- );
-}
-
-sub _export_replace {
- my( $self, $new, $old ) = (shift, shift, shift);
-
-# return "can't (yet) change domain with radiator export"
-# if $old->domain ne $new->domain;
-# return "can't (yet) change username with radiator export"
-# if $old->username ne $new->username;
-
- $self->radiator_queue(
- $new->svcnum,
- 'replace',
- $self->export_username($old),
- $self->_radiator_hash($new),
- );
-}
-
-sub _export_delete {
- my( $self, $svc_acct ) = (shift, shift);
-
- $self->radiator_queue(
- $svc_acct->svcnum,
- 'delete',
- $self->export_username($svc_acct),
- );
-}
-
-sub _radiator_hash {
- my( $self, $svc_acct ) = @_;
- my %hash = (
- 'username' => $self->export_username($svc_acct),
- 'pass_word' => $svc_acct->crypt_password,
- 'fullname' => $svc_acct->finger,
- map { my $method = "radius_$_"; $_ => $svc_acct->$method(); }
- qw( framed_filter_id framed_mtu framed_netmask framed_protocol
- framed_routing login_host login_service login_tcp_port )
- );
- $hash{'timeleft'} = $svc_acct->seconds
- if $svc_acct->seconds =~ /^\d+$/;
- $hash{'staticaddress'} = $svc_acct->slipip
- if $svc_acct->slipip =~ /^[\d\.]+$/; # and $self->slipip ne '0.0.0.0';
-
- $hash{'servicename'} = ( $svc_acct->radius_groups )[0];
-
- my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
- $hash{'validto'} = $cust_pkg->bill
- if $cust_pkg && $cust_pkg->part_pkg->is_prepaid && $cust_pkg->bill;
-
- #some other random stuff, should probably be attributes or virtual fields
- #$hash{'state'} = 0; #only inserts
- #$hash{'badlogins'} = 0; #only inserts
- $hash{'maxlogins'} = 1;
- $hash{'addeddate'} = $cust_pkg->setup
- if $cust_pkg && $cust_pkg->setup;
- $hash{'validfrom'} = $cust_pkg->last_bill || $cust_pkg->setup
- if $cust_pkg && ( $cust_pkg->last_bill || $cust_pkg->setup );
- $hash{'state'} = $cust_pkg->susp ? 1 : 0
- if $cust_pkg;
-
- %hash;
-}
-
-sub radiator_queue {
- my( $self, $svcnum, $method ) = (shift, shift, shift);
- my $queue = new FS::queue {
- 'svcnum' => $svcnum,
- 'job' => "FS::part_export::radiator::radiator_$method",
- };
- $queue->insert(
- $self->option('datasrc'),
- $self->option('username'),
- $self->option('password'),
- @_,
- ); # or $queue;
-}
-
-sub radiator_insert { #subroutine, not method
- my $dbh = radiator_connect(shift, shift, shift);
- my %hash = @_;
- $hash{'state'} = 0; #see "random stuff" above
- $hash{'badlogins'} = 0; #see "random stuff" above
-
- my $sth = $dbh->prepare(
- "INSERT INTO $radusers ( ". join(', ', keys %hash ). ' ) '.
- 'VALUES ( '. join(', ', map '?', keys %hash ). ' ) '
- ) or die $dbh->errstr;
- $sth->execute( values %hash )
- or die $sth->errstr;
-
- $dbh->disconnect;
-
-}
-
-sub radiator_replace { #subroutine, not method
- my $dbh = radiator_connect(shift, shift, shift);
- my ( $old_username, %hash ) = @_;
-
- my $sth = $dbh->prepare(
- "UPDATE $radusers SET ". join(', ', map " $_ = ?", keys %hash ).
- ' WHERE username = ?'
- ) or die $dbh->errstr;
- $sth->execute( values(%hash), $old_username )
- or die $sth->errstr;
-
- $dbh->disconnect;
-}
-
-sub radiator_delete { #subroutine, not method
- my $dbh = radiator_connect(shift, shift, shift);
- my ( $username ) = @_;
-
- my $sth = $dbh->prepare(
- "DELETE FROM $radusers WHERE username = ?"
- ) or die $dbh->errstr;
- $sth->execute( $username )
- or die $sth->errstr;
-
- $dbh->disconnect;
-}
-
-
-sub radiator_connect {
- #my($datasrc, $username, $password) = @_;
- #DBI->connect($datasrc, $username, $password) or die $DBI::errstr;
- DBI->connect(@_) or die $DBI::errstr;
-}
-
-1;
diff --git a/FS/FS/part_export/shellcommands.pm b/FS/FS/part_export/shellcommands.pm
index 646c5ff71..2d5356f26 100644
--- a/FS/FS/part_export/shellcommands.pm
+++ b/FS/FS/part_export/shellcommands.pm
@@ -38,12 +38,9 @@ tie my %options, 'Tie::IxHash',
type =>'textarea',
default=>'',
},
- 'usermod_pwonly' => { label=>'Disallow username, domain, uid, gid, and dir changes', #and RADIUS group changes',
+ 'usermod_pwonly' => { label=>'Disallow username changes',
type =>'checkbox',
},
- 'usermod_nousername' => { label=>'Disallow just username changes',
- type =>'checkbox',
- },
'suspend' => { label=>'Suspension command',
default=>'usermod -L $username',
},
@@ -151,8 +148,8 @@ old_ for replace operations):
<UL>
<LI><code>$username</code>
<LI><code>$_password</code>
- <LI><code>$quoted_password</code> - unencrypted password, already quoted for the shell (do not add additional quotes)
- <LI><code>$crypt_password</code> - encrypted password, already quoted for the shell (do not add additional quotes)
+ <LI><code>$quoted_password</code> - unencrypted password quoted for the shell
+ <LI><code>$crypt_password</code> - encrypted password (quoted for the shell)
<LI><code>$uid</code>
<LI><code>$gid</code>
<LI><code>$finger</code> - GECOS, already quoted for the shell (do not add additional quotes)
@@ -273,33 +270,27 @@ sub _export_replace {
@old_radius_groups = $old->radius_groups;
@new_radius_groups = $new->radius_groups;
- my $error = '';
- if ( $self->option('usermod_pwonly') || $self->option('usermod_nousername') ){
+ if ( $self->option('usermod_pwonly') ) {
+ my $error = '';
if ( $old_username ne $new_username ) {
$error ||= "can't change username";
}
- }
- if ( $self->option('usermod_pwonly') ) {
if ( $old_domain ne $new_domain ) {
$error ||= "can't change domain";
}
if ( $old_uid != $new_uid ) {
$error ||= "can't change uid";
}
- if ( $old_gid != $new_gid ) {
- $error ||= "can't change gid";
- }
if ( $old_dir ne $new_dir ) {
$error ||= "can't change dir";
}
- #if ( join("\n", sort @old_radius_groups) ne
- # join("\n", sort @new_radius_groups) ) {
- # $error ||= "can't change RADIUS groups";
- #}
+ if ( join("\n", sort @old_radius_groups) ne
+ join("\n", sort @new_radius_groups) ) {
+ $error ||= "can't change RADIUS groups";
+ }
+ return $error. ' ('. $self->exporttype. ' to '. $self->machine. ')'
+ if $error;
}
- return $error. ' ('. $self->exporttype. ' to '. $self->machine. ')'
- if $error;
-
$self->shellcommands_queue( $new->svcnum,
user => $self->option('user')||'root',
host => $self->machine,
diff --git a/FS/FS/part_export/shellcommands_withdomain.pm b/FS/FS/part_export/shellcommands_withdomain.pm
index 7c5d9045f..61cea79ed 100644
--- a/FS/FS/part_export/shellcommands_withdomain.pm
+++ b/FS/FS/part_export/shellcommands_withdomain.pm
@@ -29,12 +29,9 @@ tie my %options, 'Tie::IxHash',
type =>'textarea',
#default=>"$_password\n$_password\n",
},
- 'usermod_pwonly' => { label=>'Disallow username, domain, uid, dir and RADIUS group changes',
+ 'usermod_pwonly' => { label=>'Disallow username changes',
type =>'checkbox',
},
- 'usermod_nousername' => { label=>'Disallow just username changes',
- type =>'checkbox',
- },
'suspend' => { label=>'Suspension command',
default=>'',
},
@@ -92,8 +89,8 @@ The following variables are available for interpolation (prefixed with
<LI><code>$username</code>
<LI><code>$domain</code>
<LI><code>$_password</code>
- <LI><code>$quoted_password</code> - unencrypted password, already quoted for the shell (do not add additional quotes)
- <LI><code>$crypt_password</code> - encrypted password, already quoted for the shell (do not add additional quotes)
+ <LI><code>$quoted_password</code> - unencrypted password quoted for the shell
+ <LI><code>$crypt_password</code> - encrypted password (quoted for the shell)
<LI><code>$uid</code>
<LI><code>$gid</code>
<LI><code>$finger</code> - GECOS, already quoted for the shell (do not add additional quotes)
diff --git a/FS/FS/part_export/sqlradius.pm b/FS/FS/part_export/sqlradius.pm
index 10bccb034..772da1255 100644
--- a/FS/FS/part_export/sqlradius.pm
+++ b/FS/FS/part_export/sqlradius.pm
@@ -34,10 +34,10 @@ tie %options, 'Tie::IxHash',
;
$notes1 = <<'END';
-Real-time export of <b>radcheck</b>, <b>radreply</b> and <b>usergroup</b>
-tables to any SQL database for
-<a href="http://www.freeradius.org/">FreeRADIUS</a>
-or <a href="http://radius.innercite.com/">ICRADIUS</a>.
+Real-time export of radcheck, radreply and usergroup tables to any SQL database
+for <a href="http://www.freeradius.org/">FreeRADIUS</a>,
+<a href="http://radius.innercite.com/">ICRADIUS</a>
+or <a href="http://www.open.com.au/radiator/">Radiator</a>.
END
$notes2 = <<'END';
@@ -66,7 +66,7 @@ END
%info = (
'svc' => 'svc_acct',
- 'desc' => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS)',
+ 'desc' => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator)',
'options' => \%options,
'nodomain' => 'Y',
'notes' => $notes1.
diff --git a/FS/FS/part_export/sqlradius_withdomain.pm b/FS/FS/part_export/sqlradius_withdomain.pm
index e5a7151a2..6130e5eb6 100644
--- a/FS/FS/part_export/sqlradius_withdomain.pm
+++ b/FS/FS/part_export/sqlradius_withdomain.pm
@@ -8,7 +8,7 @@ tie my %options, 'Tie::IxHash', %FS::part_export::sqlradius::options;
%info = (
'svc' => 'svc_acct',
- 'desc' => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS) with realms',
+ 'desc' => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator) with realms',
'options' => \%options,
'nodomain' => '',
'notes' => $FS::part_export::sqlradius::notes1.
diff --git a/FS/FS/part_export/www_shellcommands.pm b/FS/FS/part_export/www_shellcommands.pm
index 9d3564e12..0e50d607c 100644
--- a/FS/FS/part_export/www_shellcommands.pm
+++ b/FS/FS/part_export/www_shellcommands.pm
@@ -80,7 +80,6 @@ sub _export_delete {
sub _export_command {
my ( $self, $action, $svc_www) = (shift, shift, shift);
my $command = $self->option($action);
- return '' if $command =~ /^\s*$/;
#set variable for the command
no strict 'vars';
diff --git a/FS/FS/part_export_option.pm b/FS/FS/part_export_option.pm
index e75940429..33b5e5a67 100644
--- a/FS/FS/part_export_option.pm
+++ b/FS/FS/part_export_option.pm
@@ -104,7 +104,7 @@ sub check {
my $error =
$self->ut_numbern('optionnum')
- || $self->ut_foreign_key('exportnum', 'part_export', 'exportnum')
+ || $self->ut_number('exportnum')
|| $self->ut_alpha('optionname')
|| $self->ut_anything('optionvalue')
;
diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm
index 73f3bae04..fb08ddd91 100644
--- a/FS/FS/part_pkg.pm
+++ b/FS/FS/part_pkg.pm
@@ -13,9 +13,7 @@ use FS::agent_type;
use FS::type_pkgs;
use FS::part_pkg_option;
-@ISA = qw( FS::Record ); # FS::option_Common ); # this can use option_Common
- # when all the plandata bs is
- # gone
+@ISA = qw( FS::Record );
$DEBUG = 0;
@@ -420,7 +418,7 @@ sub check {
my $error = $self->ut_number('freq');
return $error if $error;
} else {
- $self->freq =~ /^(\d+[hdw]?)$/
+ $self->freq =~ /^(\d+[dw]?)$/
or return "Illegal or empty freq: ". $self->freq;
$self->freq($1);
}
@@ -441,10 +439,6 @@ sub check {
return 'Unknown plan '. $self->plan
unless exists($plans{$self->plan});
- my $conf = new FS::Conf;
- return 'Taxclass is required'
- if ! $self->taxclass && $conf->exists('require_taxclasses');
-
'';
}
@@ -539,7 +533,6 @@ Returns an english representation of the I<freq> field, such as "monthly",
tie %freq, 'Tie::IxHash',
'0' => '(no recurring fee)',
- '1h' => 'hourly',
'1d' => 'daily',
'1w' => 'weekly',
'2w' => 'biweekly (every 2 weeks)',
@@ -562,8 +555,8 @@ sub freq_pretty {
$freq{$freq};
} else {
my $interval = 'month';
- if ( $freq =~ /^(\d+)([hdw])$/ ) {
- my %interval = ( 'h' => 'hour', 'd'=>'day', 'w'=>'week' );
+ if ( $freq =~ /^(\d+)([dw])$/ ) {
+ my %interval = ( 'd'=>'day', 'w'=>'week' );
$interval = $interval{$2};
}
if ( $1 == 1 ) {
@@ -762,8 +755,6 @@ The delete method is unimplemented.
setup and recur semantics are not yet defined (and are implemented in
FS::cust_bill. hmm.).
-plandata should go
-
=head1 SEE ALSO
L<FS::Record>, L<FS::cust_pkg>, L<FS::type_pkgs>, L<FS::pkg_svc>, L<Safe>.
diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm
index 59b625746..f2f3a8d9a 100644
--- a/FS/FS/part_pkg/flat.pm
+++ b/FS/FS/part_pkg/flat.pm
@@ -4,6 +4,7 @@ use strict;
use vars qw(@ISA %info);
#use FS::Record qw(qsearch);
use FS::part_pkg;
+use Date::Manip;
@ISA = qw(FS::part_pkg);
@@ -44,29 +45,33 @@ sub base_recur {
sub calc_remain {
my ($self, $cust_pkg) = @_;
- my $time = time; #should be able to pass this in for credit calculation
+ my $time = time;
my $next_bill = $cust_pkg->getfield('bill') || 0;
my $last_bill = $cust_pkg->last_bill || 0;
return 0 if ! $self->base_recur
|| ! $self->option('unused_credit', 1)
|| ! $last_bill
- || ! $next_bill
- || $next_bill < $time;
+ || ! $next_bill;
- my %sec = (
- 'h' => 3600, # 60 * 60
- 'd' => 86400, # 60 * 60 * 24
- 'w' => 604800, # 60 * 60 * 24 * 7
- 'm' => 2629744, # 60 * 60 * 24 * 365.2422 / 12
- );
+ my $now_date = ParseDate("epoch $time");
+ my $last_date = ParseDate("epoch $last_bill");
+ my $next_date = ParseDate("epoch $next_bill");
+ my $err;
+ my $delta = DateCalc($now_date,$next_date,\$err, 0);
+ my $days_remaining = Delta_Format($delta, 4, "%dh");
- $self->freq =~ /^(\d+)([hdwm]?)$/
- or die 'unparsable frequency: '. $self->freq;
- my $freq_sec = $1 * $sec{$2||'m'};
- return 0 unless $freq_sec;
+ my $frequency = $self->freq;
- sprintf("%.2f", $self->base_recur * ( $next_bill - $time ) / $freq_sec );
+ # TODO: Remove this after the frequencies are Data::Manip friendly.
+ $frequency .= "m" unless $frequency =~ /[wd]$/;
+ my $freq_delta = ParseDateDelta($frequency);
+ my $days = Delta_Format($freq_delta,4,"%dh");
+
+ my $recurring= $self->base_recur;
+ my $daily = $recurring/$days;
+
+ sprintf("%.2f",($daily * $days_remaining));
}
sub is_free_options {
diff --git a/FS/FS/part_pkg/sesmon_hour.pm b/FS/FS/part_pkg/sesmon_hour.pm
index 9843edbec..b80fac3e4 100644
--- a/FS/FS/part_pkg/sesmon_hour.pm
+++ b/FS/FS/part_pkg/sesmon_hour.pm
@@ -13,7 +13,7 @@ use FS::part_pkg::flat;
'setup_fee' => { 'name' => 'Setup fee for this package',
'default' => 0,
},
- 'recur_flat' => { 'name' => 'Base recurring fee for this package',
+ 'recur_flat' => { 'name' => 'Base monthly charge for this package',
'default' => 0,
},
'unused_credit' => { 'name' => 'Credit the customer for the unused portion'.
diff --git a/FS/FS/part_pkg/sesmon_minute.pm b/FS/FS/part_pkg/sesmon_minute.pm
index 39516f8b3..6af7c0870 100644
--- a/FS/FS/part_pkg/sesmon_minute.pm
+++ b/FS/FS/part_pkg/sesmon_minute.pm
@@ -13,7 +13,7 @@ use FS::part_pkg::flat;
'setup_fee' => { 'name' => 'Setup fee for this package',
'default' => 0,
},
- 'recur_flat' => { 'name' => 'Base recurring fee for this package',
+ 'recur_flat' => { 'name' => 'Base monthly charge for this package',
'default' => 0,
},
'unused_credit' => { 'name' => 'Credit the customer for the unused portion'.
diff --git a/FS/FS/part_pkg/sql_external.pm b/FS/FS/part_pkg/sql_external.pm
index ca58c4e66..6aba9153b 100644
--- a/FS/FS/part_pkg/sql_external.pm
+++ b/FS/FS/part_pkg/sql_external.pm
@@ -14,7 +14,7 @@ use FS::part_pkg::flat;
'setup_fee' => { 'name' => 'Setup fee for this package',
'default' => 0,
},
- 'recur_flat' => { 'name' => 'Base recurring fee for this package',
+ 'recur_flat' => { 'name' => 'Base monthly charge for this package',
'default' => 0,
},
'unused_credit' => { 'name' => 'Credit the customer for the unused portion'.
diff --git a/FS/FS/part_pkg/sql_generic.pm b/FS/FS/part_pkg/sql_generic.pm
index 0e6ab7c0d..b8ee286e1 100644
--- a/FS/FS/part_pkg/sql_generic.pm
+++ b/FS/FS/part_pkg/sql_generic.pm
@@ -14,7 +14,7 @@ use FS::part_pkg::flat;
'setup_fee' => { 'name' => 'Setup fee for this package',
'default' => 0,
},
- 'recur_flat' => { 'name' => 'Base recurring fee for this package',
+ 'recur_flat' => { 'name' => 'Base monthly charge for this package',
'default' => 0,
},
'unused_credit' => { 'name' => 'Credit the customer for the unused portion'.
diff --git a/FS/FS/part_pkg/sqlradacct_hour.pm b/FS/FS/part_pkg/sqlradacct_hour.pm
index e54a8a553..19887ea0d 100644
--- a/FS/FS/part_pkg/sqlradacct_hour.pm
+++ b/FS/FS/part_pkg/sqlradacct_hour.pm
@@ -13,26 +13,19 @@ use FS::part_pkg::flat;
'setup_fee' => { 'name' => 'Setup fee for this package',
'default' => 0,
},
- 'recur_flat' => { 'name' => 'Base recurring fee for this package',
+ 'recur_flat' => { 'name' => 'Base monthly charge for this package',
'default' => 0,
},
'unused_credit' => { 'name' => 'Credit the customer for the unused portion'.
' of service at cancellation',
'type' => 'checkbox',
},
-
'recur_included_hours' => { 'name' => 'Hours included',
'default' => 0,
},
'recur_hourly_charge' => { 'name' => 'Additional charge per hour',
'default' => 0,
},
- 'recur_hourly_cap' => { 'name' => 'Maximum overage charge for hours'.
- ' (0 means no cap)',
-
- 'default' => 0,
- },
-
'recur_included_input' => { 'name' => 'Upload megabytes included',
'default' => 0,
},
@@ -40,11 +33,6 @@ use FS::part_pkg::flat;
'Additional charge per megabyte upload',
'default' => 0,
},
- 'recur_input_cap' => { 'name' => 'Maximum overage charge for upload'.
- ' (0 means no cap)',
- 'default' => 0,
- },
-
'recur_included_output' => { 'name' => 'Download megabytes included',
'default' => 0,
},
@@ -52,11 +40,6 @@ use FS::part_pkg::flat;
'Additional charge per megabyte download',
'default' => 0,
},
- 'recur_output_cap' => { 'name' => 'Maximum overage charge for download'.
- ' (0 means no cap)',
- 'default' => 0,
- },
-
'recur_included_total' => { 'name' =>
'Total megabytes included',
'default' => 0,
@@ -65,18 +48,8 @@ use FS::part_pkg::flat;
'Additional charge per megabyte total',
'default' => 0,
},
- 'recur_total_cap' => { 'name' => 'Maximum overage charge for total'.
- ' megabytes (0 means no cap)',
- 'default' => 0,
- },
-
- 'global_cap' => { 'name' => 'Global cap on all overage charges'.
- ' (0 means no cap)',
- 'default' => 0,
- },
-
},
- 'fieldorder' => [qw( setup_fee recur_flat unused_credit recur_included_hours recur_hourly_charge recur_hourly_cap recur_included_input recur_input_charge recur_input_cap recur_included_output recur_output_charge recur_output_cap recur_included_total recur_total_charge recur_total_cap global_cap )],
+ 'fieldorder' => [qw( setup_fee recur_flat unused_credit recur_included_hours recur_hourly_charge recur_included_input recur_input_charge recur_included_output recur_output_charge recur_included_total recur_total_charge )],
#'setup' => 'what.setup_fee.value',
#'recur' => '\'my $last_bill = $cust_pkg->last_bill; my $hours = $cust_pkg->seconds_since_sqlradacct($last_bill, $sdate ) / 3600 - \' + what.recur_included_hours.value + \'; $hours = 0 if $hours < 0; my $input = $cust_pkg->attribute_since_sqlradacct($last_bill, $sdate, \"AcctInputOctets\" ) / 1048576; my $output = $cust_pkg->attribute_since_sqlradacct($last_bill, $sdate, \"AcctOutputOctets\" ) / 1048576; my $total = $input + $output - \' + what.recur_included_total.value + \'; $total = 0 if $total < 0; my $input = $input - \' + what.recur_included_input.value + \'; $input = 0 if $input < 0; my $output = $output - \' + what.recur_included_output.value + \'; $output = 0 if $output < 0; my $totalcharge = sprintf(\"%.2f\", \' + what.recur_total_charge.value + \' * $total); my $inputcharge = sprintf(\"%.2f\", \' + what.recur_input_charge.value + \' * $input); my $outputcharge = sprintf(\"%.2f\", \' + what.recur_output_charge.value + \' * $output); my $hourscharge = sprintf(\"%.2f\", \' + what.recur_hourly_charge.value + \' * $hours); if ( \' + what.recur_total_charge.value + \' > 0 ) { push @details, \"Last month\\\'s data \". sprintf(\"%.1f\", $total). \" megs: \\\$$totalcharge\" } if ( \' + what.recur_input_charge.value + \' > 0 ) { push @details, \"Last month\\\'s download \". sprintf(\"%.1f\", $input). \" megs: \\\$$inputcharge\" } if ( \' + what.recur_output_charge.value + \' > 0 ) { push @details, \"Last month\\\'s upload \". sprintf(\"%.1f\", $output). \" megs: \\\$$outputcharge\" } if ( \' + what.recur_hourly_charge.value + \' > 0 ) { push @details, \"Last month\\\'s time \". sprintf(\"%.1f\", $hours). \" hours: \\\$$hourscharge\"; } \' + what.recur_flat.value + \' + $hourscharge + $inputcharge + $outputcharge + $totalcharge ;\'',
'weight' => 40,
@@ -109,27 +82,13 @@ sub calc_recur {
my $totalcharge =
$total * sprintf('%.2f', $self->option('recur_total_charge'));
- $totalcharge = $self->option('recur_total_cap')
- if $self->option('recur_total_cap')
- && $totalcharge > $self->option('recur_total_cap');
-
my $inputcharge =
$input * sprintf('%.2f', $self->option('recur_input_charge'));
- $inputcharge = $self->option('recur_input_cap')
- if $self->option('recur_input_cap')
- && $inputcharge > $self->option('recur_input_cap');
-
my $outputcharge =
$output * sprintf('%.2f', $self->option('recur_output_charge'));
- $outputcharge = $self->option('recur_output_cap')
- if $self->option('recur_output_cap')
- && $outputcharge > $self->option('recur_output_cap');
my $hourscharge =
$hours * sprintf('%.2f', $self->option('recur_hourly_charge'));
- $hourscharge = $self->option('recur_hours_cap')
- if $self->option('recur_hours_cap')
- && $hourscharge > $self->option('recur_hours_cap');
if ( $self->option('recur_total_charge') > 0 ) {
push @$details, "Last month's data ".
@@ -148,13 +107,8 @@ sub calc_recur {
sprintf('%.1f', $hours). " hours: $hourscharge";
}
- my $charges = $hourscharge + $inputcharge + $outputcharge + $totalcharge;
- if ( $self->option('global_cap') && $charges > $self->option('global_cap') ) {
- $charges = $self->option('global_cap');
- push @$details, "Usage charges capped at: $charges";
- }
-
- $self->option('recur_flat') + $charges;
+ $self->option('recur_flat')
+ + $hourscharge + $inputcharge + $outputcharge + $totalcharge;
}
sub is_free_options {
diff --git a/FS/FS/part_pkg/voip_sqlradacct.pm b/FS/FS/part_pkg/voip_sqlradacct.pm
index fd9c1ddb5..382ebac3a 100644
--- a/FS/FS/part_pkg/voip_sqlradacct.pm
+++ b/FS/FS/part_pkg/voip_sqlradacct.pm
@@ -18,7 +18,7 @@ $DEBUG = 1;
'setup_fee' => { 'name' => 'Setup fee for this package',
'default' => 0,
},
- 'recur_flat' => { 'name' => 'Base recurring fee for this package',
+ 'recur_flat' => { 'name' => 'Base monthly charge for this package',
'default' => 0,
},
'unused_credit' => { 'name' => 'Credit the customer for the unused portion'.
diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm
index 1a478a9cd..e94c803b7 100644
--- a/FS/FS/part_svc.pm
+++ b/FS/FS/part_svc.pm
@@ -3,7 +3,6 @@ package FS::part_svc;
use strict;
use vars qw( @ISA $DEBUG );
use FS::Record qw( qsearch qsearchs fields dbh );
-use FS::Schema qw( dbdef );
use FS::part_svc_column;
use FS::part_export;
use FS::export_svc;
@@ -11,7 +10,7 @@ use FS::cust_svc;
@ISA = qw(FS::Record);
-$DEBUG = 0;
+$DEBUG = 1;
=head1 NAME
@@ -393,8 +392,8 @@ sub all_part_svc_column {
=item part_export [ EXPORTTYPE ]
-Returns a list of all exports (see L<FS::part_export>) for this service, or,
-if an export type is specified, only returns exports of the given type.
+Returns all exports (see L<FS::part_export>) for this service, or, if an
+export type is specified, only returns exports of the given type.
=cut
@@ -406,85 +405,15 @@ sub part_export {
qsearch('export_svc', { 'svcpart' => $self->svcpart } );
}
-=item part_export_usage
+=item cust_svc
-Returns a list of any exports (see L<FS::part_export>) for this service that
-are capable of reporting usage information.
-
-=cut
-
-sub part_export_usage {
- my $self = shift;
- grep $_->can('usage_sessions'), $self->part_export;
-}
-
-=item cust_svc [ PKGPART ]
-
-Returns a list of associated customer services (FS::cust_svc records).
-
-If a PKGPART is specified, returns the customer services which are contained
-within packages of that type (see L<FS::part_pkg>). If PKGPARTis specified as
-B<0>, returns unlinked customer services.
+Returns a list of associated FS::cust_svc records.
=cut
sub cust_svc {
my $self = shift;
-
- my $hashref = { 'svcpart' => $self->svcpart };
-
- my( $addl_from, $extra_sql ) = ( '', '' );
- if ( @_ ) {
- my $pkgpart = shift;
- if ( $pkgpart =~ /^(\d+)$/ ) {
- $addl_from = 'LEFT JOIN cust_pkg USING ( pkgnum )';
- $extra_sql = "AND pkgpart = $1";
- } elsif ( $pkgpart eq '0' ) {
- $hashref->{'pkgnum'} = '';
- }
- }
-
- qsearch({
- 'table' => 'cust_svc',
- 'addl_from' => $addl_from,
- 'hashref' => $hashref,
- 'extra_sql' => $extra_sql,
- });
-}
-
-=item num_cust_svc [ PKGPART ]
-
-Returns the number of associated customer services (FS::cust_svc records).
-
-If a PKGPART is specified, returns the number of customer services which are
-contained within packages of that type (see L<FS::part_pkg>). If PKGPART
-is specified as B<0>, returns the number of unlinked customer services.
-
-=cut
-
-sub num_cust_svc {
- my $self = shift;
-
- my @param = ( $self->svcpart );
-
- my( $join, $and ) = ( '', '' );
- if ( @_ ) {
- my $pkgpart = shift;
- if ( $pkgpart ) {
- $join = 'LEFT JOIN cust_pkg USING ( pkgnum )';
- $and = 'AND pkgpart = ?';
- push @param, $pkgpart;
- } elsif ( $pkgpart eq '0' ) {
- $and = 'AND pkgnum IS NULL';
- }
- }
-
- my $sth = dbh->prepare(
- "SELECT COUNT(*) FROM cust_svc $join WHERE svcpart = ? $and"
- ) or die dbh->errstr;
- $sth->execute(@param)
- or die $sth->errstr;
- $sth->fetchrow_arrayref->[0];
+ qsearch('cust_svc', { 'svcpart' => $self->svcpart } );
}
=item svc_x
@@ -498,7 +427,6 @@ sub svc_x {
map { $_->svc_x } $self->cust_svc;
}
-
=back
=head1 SUBROUTINES
@@ -507,7 +435,7 @@ sub svc_x {
=item process
-Job-queue processor for web interface adds/edits
+Experimental job-queue processor for web interface adds/edits
=cut
@@ -526,7 +454,7 @@ sub process {
$param->{'svc_acct__usergroup'} =
ref($param->{'svc_acct__usergroup'})
? join(',', @{$param->{'svc_acct__usergroup'}} )
- : $param->{'svc_acct__usergroup'};
+ : '';
my $new = new FS::part_svc ( {
map {
@@ -537,7 +465,7 @@ sub process {
my @fields = fields($svcdb);
push @fields, 'usergroup' if $svcdb eq 'svc_acct'; #kludge
map { ( $svcdb.'__'.$_, $svcdb.'__'.$_.'_flag' ) } @fields;
- } grep defined( dbdef->table($_) ),
+ } grep defined( $FS::Record::dbdef->table($_) ),
qw( svc_acct svc_domain svc_forward svc_www svc_broadband )
)
} );
@@ -562,70 +490,7 @@ sub process {
$param->{'svcpart'} = $new->getfield('svcpart');
}
- die "$error\n" if $error;
-}
-
-=item process_bulk_cust_svc
-
-Job-queue processor for web interface bulk customer service changes
-
-=cut
-
-use Storable qw(thaw);
-use Data::Dumper;
-use MIME::Base64;
-sub process_bulk_cust_svc {
- my $job = shift;
-
- my $param = thaw(decode_base64(shift));
- warn Dumper($param) if $DEBUG;
-
- my $old_part_svc =
- qsearchs('part_svc', { 'svcpart' => $param->{'old_svcpart'} } );
-
- die "Must select a new service definition\n" unless $param->{'new_svcpart'};
-
- #the rest should be abstracted out to to its own subroutine?
-
- local $SIG{HUP} = 'IGNORE';
- local $SIG{INT} = 'IGNORE';
- local $SIG{QUIT} = 'IGNORE';
- local $SIG{TERM} = 'IGNORE';
- local $SIG{TSTP} = 'IGNORE';
- local $SIG{PIPE} = 'IGNORE';
-
- my $oldAutoCommit = $FS::UID::AutoCommit;
- local $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- local( $FS::cust_svc::ignore_quantity ) = 1;
-
- my $total = $old_part_svc->num_cust_svc( $param->{'pkgpart'} );
-
- my $n = 0;
- foreach my $old_cust_svc ( $old_part_svc->cust_svc( $param->{'pkgpart'} ) ) {
-
- my $new_cust_svc = new FS::cust_svc { $old_cust_svc->hash };
-
- $new_cust_svc->svcpart( $param->{'new_svcpart'} );
- my $error = $new_cust_svc->replace($old_cust_svc);
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- die "$error\n" if $error;
- }
-
- $error = $job->update_statustext( int( 100 * ++$n / $total ) );
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- die $error if $error;
- }
-
- }
-
- $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
- '';
-
+ die $error if $error;
}
=head1 BUGS
@@ -635,7 +500,7 @@ Delete is unimplemented.
The list of svc_* tables is hardcoded. When svc_acct_pop is renamed, this
should be fixed.
-all_part_svc_column methods should be documented
+all_part_svc_column method should be documented
=head1 SEE ALSO
diff --git a/FS/FS/part_virtual_field.pm b/FS/FS/part_virtual_field.pm
index 992d4496e..f6a8fe745 100755
--- a/FS/FS/part_virtual_field.pm
+++ b/FS/FS/part_virtual_field.pm
@@ -2,8 +2,7 @@ package FS::part_virtual_field;
use strict;
use vars qw( @ISA );
-use FS::Record qw( qsearchs qsearch );
-use FS::Schema qw( dbdef );
+use FS::Record qw( qsearchs qsearch dbdef );
@ISA = qw( FS::Record );
@@ -162,7 +161,7 @@ sub check {
# Make sure it's a real table with a numeric primary key
my ($table, $pkey);
- if($table = dbdef->table($self->dbtable)) {
+ if($table = $FS::Record::dbdef->table($self->dbtable)) {
if($pkey = $table->primary_key) {
if($table->column($pkey)->type =~ /int/i) {
# this is what it should be
diff --git a/FS/FS/payment_gateway.pm b/FS/FS/payment_gateway.pm
deleted file mode 100644
index a5cdd9d8d..000000000
--- a/FS/FS/payment_gateway.pm
+++ /dev/null
@@ -1,147 +0,0 @@
-package FS::payment_gateway;
-
-use strict;
-use vars qw( @ISA );
-use FS::Record qw( qsearch qsearchs );
-use FS::option_Common;
-
-@ISA = qw( FS::option_Common );
-
-=head1 NAME
-
-FS::payment_gateway - Object methods for payment_gateway records
-
-=head1 SYNOPSIS
-
- use FS::payment_gateway;
-
- $record = new FS::payment_gateway \%hash;
- $record = new FS::payment_gateway { 'column' => 'value' };
-
- $error = $record->insert;
-
- $error = $new_record->replace($old_record);
-
- $error = $record->delete;
-
- $error = $record->check;
-
-=head1 DESCRIPTION
-
-An FS::payment_gateway object represents an payment gateway.
-FS::payment_gateway inherits from FS::Record. The following fields are
-currently supported:
-
-=over 4
-
-=item gatewaynum - primary key
-
-=item gateway_module - Business::OnlinePayment:: module name
-
-=item gateway_username - payment gateway username
-
-=item gateway_password - payment gateway password
-
-=item gateway_action - optional action or actions (multiple actions are separated with `,': for example: `Authorization Only, Post Authorization'). Defaults to `Normal Authorization'.
-
-=item disabled - Disabled flag, empty or 'Y'
-
-=back
-
-=head1 METHODS
-
-=over 4
-
-=item new HASHREF
-
-Creates a new payment gateway. To add the payment gateway to the database, see
-L<"insert">.
-
-Note that this stores the hash reference, not a distinct copy of the hash it
-points to. You can ask the object for a copy with the I<hash> method.
-
-=cut
-
-# the new method can be inherited from FS::Record, if a table method is defined
-
-sub table { 'payment_gateway'; }
-
-=item insert
-
-Adds this record to the database. If there is an error, returns the error,
-otherwise returns false.
-
-=cut
-
-# the insert method can be inherited from FS::Record
-
-=item delete
-
-Delete this record from the database.
-
-=cut
-
-# the delete method can be inherited from FS::Record
-
-=item replace OLD_RECORD
-
-Replaces the OLD_RECORD with this one in the database. If there is an error,
-returns the error, otherwise returns false.
-
-=cut
-
-# the replace method can be inherited from FS::Record
-
-=item check
-
-Checks all fields to make sure this is a valid payment gateway. If there is
-an error, returns the error, otherwise returns false. Called by the insert
-and replace methods.
-
-=cut
-
-# the check method should currently be supplied - FS::Record contains some
-# data checking routines
-
-sub check {
- my $self = shift;
-
- my $error =
- $self->ut_numbern('gatewaynum')
- || $self->ut_alpha('gateway_module')
- || $self->ut_textn('gateway_username')
- || $self->ut_anything('gateway_password')
- || $self->ut_enum('disabled', [ '', 'Y' ] )
- #|| $self->ut_textn('gateway_action')
- ;
- return $error if $error;
-
- if ( $self->gateway_action ) {
- my @actions = split(/,\s*/, $self->gateway_action);
- $self->gateway_action(
- join( ',', map { /^(Normal Authorization|Authorization Only|Credit|Post Authorization)$/
- or return "Unknown action $_";
- $1
- }
- @actions
- )
- );
- } else {
- $self->gateway_action('Normal Authorization');
- }
-
- $self->SUPER::check;
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::Record>, schema.html from the base documentation.
-
-=cut
-
-1;
-
diff --git a/FS/FS/payment_gateway_option.pm b/FS/FS/payment_gateway_option.pm
deleted file mode 100644
index 057602291..000000000
--- a/FS/FS/payment_gateway_option.pm
+++ /dev/null
@@ -1,126 +0,0 @@
-package FS::payment_gateway_option;
-
-use strict;
-use vars qw( @ISA );
-use FS::Record qw( qsearch qsearchs );
-
-@ISA = qw(FS::Record);
-
-=head1 NAME
-
-FS::payment_gateway_option - Object methods for payment_gateway_option records
-
-=head1 SYNOPSIS
-
- use FS::payment_gateway_option;
-
- $record = new FS::payment_gateway_option \%hash;
- $record = new FS::payment_gateway_option { 'column' => 'value' };
-
- $error = $record->insert;
-
- $error = $new_record->replace($old_record);
-
- $error = $record->delete;
-
- $error = $record->check;
-
-=head1 DESCRIPTION
-
-An FS::payment_gateway_option object represents an option key and value for
-a payment gateway. FS::payment_gateway_option inherits from
-FS::Record. The following fields are currently supported:
-
-=over 4
-
-=item optionnum - primary key
-
-=item gatewaynum -
-
-=item optionname -
-
-=item optionvalue -
-
-
-=back
-
-=head1 METHODS
-
-=over 4
-
-=item new HASHREF
-
-Creates a new option. To add the option to the database, see L<"insert">.
-
-Note that this stores the hash reference, not a distinct copy of the hash it
-points to. You can ask the object for a copy with the I<hash> method.
-
-=cut
-
-# the new method can be inherited from FS::Record, if a table method is defined
-
-sub table { 'payment_gateway_option'; }
-
-=item insert
-
-Adds this record to the database. If there is an error, returns the error,
-otherwise returns false.
-
-=cut
-
-# the insert method can be inherited from FS::Record
-
-=item delete
-
-Delete this record from the database.
-
-=cut
-
-# the delete method can be inherited from FS::Record
-
-=item replace OLD_RECORD
-
-Replaces the OLD_RECORD with this one in the database. If there is an error,
-returns the error, otherwise returns false.
-
-=cut
-
-# the replace method can be inherited from FS::Record
-
-=item check
-
-Checks all fields to make sure this is a valid option. If there is
-an error, returns the error, otherwise returns false. Called by the insert
-and replace methods.
-
-=cut
-
-# the check method should currently be supplied - FS::Record contains some
-# data checking routines
-
-sub check {
- my $self = shift;
-
- my $error =
- $self->ut_numbern('optionnum')
- || $self->ut_foreign_key('gatewaynum', 'payment_gateway', 'gatewaynum')
- || $self->ut_text('optionname')
- || $self->ut_textn('optionvalue')
- ;
- return $error if $error;
-
- $self->SUPER::check;
-}
-
-=back
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::Record>, schema.html from the base documentation.
-
-=cut
-
-1;
-
diff --git a/FS/FS/raddb.pm b/FS/FS/raddb.pm
index 506b32568..6233772ba 100644
--- a/FS/FS/raddb.pm
+++ b/FS/FS/raddb.pm
@@ -2,1910 +2,1600 @@ package FS::raddb;
use vars qw(%attrib);
%attrib = (
- '3com_user_access_level' => '3Com-User-Access-Level',
- '3gpp2_accounting_contain' => '3GPP2-Accounting-Container',
- '3gpp2_acct_stop_trigger' => '3GPP2-Acct-Stop-Trigger',
- '3gpp2_active_time' => '3GPP2-Active-Time',
- '3gpp2_airlink_priority' => '3GPP2-Airlink-Priority',
- '3gpp2_airlink_record_typ' => '3GPP2-Airlink-Record-Type',
- '3gpp2_airlink_sequence_n' => '3GPP2-Airlink-Sequence-Number',
- '3gpp2_allowed_diffserv_m' => '3GPP2-Allowed-Diffserv-Marking',
- '3gpp2_allowed_persistent' => '3GPP2-Allowed-Persistent-TFTs',
- '3gpp2_bad_ppp_frame_coun' => '3GPP2-Bad-PPP-Frame-Count',
- '3gpp2_begin_session' => '3GPP2-Begin-Session',
- '3gpp2_bsid' => '3GPP2-BSID',
- '3gpp2_compulsory_tunnel_' => '3GPP2-Compulsory-Tunnel-Indicator',
- '3gpp2_correlation_id' => '3GPP2-Correlation-Id',
- '3gpp2_dcch_frame_size' => '3GPP2-DCCH-Frame-Size',
- '3gpp2_diffserv_class_opt' => '3GPP2-Diffserv-Class-Option',
- '3gpp2_disconnect_reason' => '3GPP2-Disconnect-Reason',
- '3gpp2_dns_update_capabil' => '3GPP2-DNS-Update-Capability',
- '3gpp2_dns_update_require' => '3GPP2-DNS-Update-Required',
- '3gpp2_esn' => '3GPP2-ESN',
- '3gpp2_fch_frame_size' => '3GPP2-FCH-Frame-Size',
- '3gpp2_foreign_agent_addr' => '3GPP2-Foreign-Agent-Address',
- '3gpp2_forward_dcch_mux_o' => '3GPP2-Forward-DCCH-Mux-Option',
- '3gpp2_forward_dcch_rc' => '3GPP2-Forward-DCCH-RC',
- '3gpp2_forward_fch_mux_op' => '3GPP2-Forward-FCH-Mux-Option',
- '3gpp2_forward_fch_rc' => '3GPP2-Forward-FCH-RC',
- '3gpp2_forward_pdch_rc' => '3GPP2-Forward-PDCH-RC',
- '3gpp2_forward_traffic_ty' => '3GPP2-Forward-Traffic-Type',
- '3gpp2_home_agent_ip_addr' => '3GPP2-Home-Agent-IP-Address',
- '3gpp2_ike_preshared_secr' => '3GPP2-Ike-Preshared-Secret-Request',
- '3gpp2_inbound_mobile_ip_' => '3GPP2-Inbound-Mobile-IP-Sig-Octets',
- '3gpp2_ip_qos' => '3GPP2-IP-QoS',
- '3gpp2_ip_technology' => '3GPP2-IP-Technology',
- '3gpp2_keyid' => '3GPP2-KeyID',
- '3gpp2_last_user_activity' => '3GPP2-Last-User-Activity-Time',
- '3gpp2_mip_lifetime' => '3GPP2-MIP-Lifetime',
- '3gpp2_mn_aaa_removal_ind' => '3GPP2-MN-AAA-Removal-Indication',
- '3gpp2_mn_ha_shared_key' => '3GPP2-MN-HA-Shared-Key',
- '3gpp2_mn_ha_spi' => '3GPP2-MN-HA-SPI',
- '3gpp2_module_orig_term_i' => '3GPP2-Module-Orig-Term-Indicator',
- '3gpp2_number_active_tran' => '3GPP2-Number-Active-Transitions',
- '3gpp2_originating_number' => '3GPP2-Originating-Number-SDBs',
- '3gpp2_originating_sdb_oc' => '3GPP2-Originating-SDB-OCtet-Count',
- '3gpp2_outbound_mobile_ip' => '3GPP2-Outbound-Mobile-IP-Sig-Octets',
- '3gpp2_pcf_ip_address' => '3GPP2-PCF-IP-Address',
- '3gpp2_pre_shared_secret' => '3GPP2-Pre-Shared-Secret',
- '3gpp2_prepaid_acct_capab' => '3GPP2-Prepaid-acct-Capability',
- '3gpp2_prepaid_acct_quota' => '3GPP2-Prepaid-Acct-Quota',
- '3gpp2_prepaid_tariff_swi' => '3GPP2-PrePaid-Tariff-Switching',
- '3gpp2_received_hdlc_octe' => '3GPP2-Received-HDLC-Octets',
- '3gpp2_release_indicator' => '3GPP2-Release-Indicator',
- '3gpp2_remote_address_tab' => '3GPP2-Remote-Address-Table-Index',
- '3gpp2_remote_ip_address' => '3GPP2-Remote-IP-Address',
- '3gpp2_remote_ipv4_addr_o' => '3GPP2-Remote-IPv4-Addr-Octet-Count',
- '3gpp2_remote_ipv6_addres' => '3GPP2-Remote-IPv6-Address',
- '3gpp2_remote_ipv6_octet_' => '3GPP2-Remote-IPv6-Octet-Count',
- '3gpp2_reverse_dcch_mux_o' => '3GPP2-Reverse-DCCH-Mux-Option',
- '3gpp2_reverse_dhhc_rc' => '3GPP2-Reverse-DHHC-RC',
- '3gpp2_reverse_fch_mux_op' => '3GPP2-Reverse-FCH-Mux-Option',
- '3gpp2_reverse_fch_rc' => '3GPP2-Reverse-FCH-RC',
- '3gpp2_reverse_traffic_ty' => '3GPP2-Reverse-Traffic-Type',
- '3gpp2_reverse_tunnel_spe' => '3GPP2-Reverse-Tunnel-Spec',
- '3gpp2_rn_packet_data_ina' => '3GPP2-RN-Packet-Data-Inactivity-Timer',
- '3gpp2_s_key' => '3GPP2-S-Key',
- '3gpp2_s_lifetime' => '3GPP2-S-Lifetime',
- '3gpp2_s_request' => '3GPP2-S-Request',
- '3gpp2_security_level' => '3GPP2-Security-Level',
- '3gpp2_service_option' => '3GPP2-Service-Option',
- '3gpp2_service_option_pro' => '3GPP2-Service-Option-Profile',
- '3gpp2_service_reference_' => '3GPP2-Service-Reference-Id',
- '3gpp2_session_continue' => '3GPP2-Session-Continue',
- '3gpp2_session_terminatio' => '3GPP2-Session-Termination-Capability',
- '3gpp2_terminating_number' => '3GPP2-Terminating-Number-SDBs',
- '3gpp2_terminating_sdb_oc' => '3GPP2-Terminating-SDB-Octet-Count',
- '3gpp2_user_id' => '3GPP2-User-Id',
- '3gpp_charging_characteri' => '3GPP-Charging-Characteristics',
- '3gpp_charging_gateway_ad' => '3GPP-Charging-Gateway-Address',
- '3gpp_charging_gateway_ip' => '3GPP-Charging-Gateway-IPv6-Address',
- '3gpp_charging_id' => '3GPP-Charging-ID',
- '3gpp_ggsn_address' => '3GPP-GGSN-Address',
- '3gpp_ggsn_ipv6_address' => '3GPP-GGSN-IPv6-Address',
- '3gpp_ggsn_mcc_mnc' => '3GPP-GGSN-MCC-MNC',
- '3gpp_gprs_negotiated_qos' => '3GPP-GPRS-Negotiated-QoS-profile',
- '3gpp_imsi' => '3GPP-IMSI',
- '3gpp_imsi_mcc_mnc' => '3GPP-IMSI-MCC-MNC',
- '3gpp_ipv6_dns_servers' => '3GPP-IPv6-DNS-Servers',
- '3gpp_nsapi' => '3GPP-NSAPI',
- '3gpp_pdp_type' => '3GPP-PDP-Type',
- '3gpp_selection_mode' => '3GPP-Selection-Mode',
- '3gpp_session_stop_indica' => '3GPP-Session-Stop-Indicator',
- '3gpp_sgsn_address' => '3GPP-SGSN-Address',
- '3gpp_sgsn_ipv6_address' => '3GPP-SGSN-IPv6-Address',
- 'aat_assign_ip_pool' => 'AAT-Assign-IP-Pool',
- 'aat_atm_direct' => 'AAT-ATM-Direct',
- 'aat_atm_traffic_profile' => 'AAT-ATM-Traffic-Profile',
- 'aat_atm_vci' => 'AAT-ATM-VCI',
- 'aat_atm_vpi' => 'AAT-ATM-VPI',
- 'aat_client_primary_dns' => 'AAT-Client-Primary-DNS',
- 'aat_client_primary_wins_' => 'AAT-Client-Primary-WINS-NBNS',
- 'aat_client_secondary_win' => 'AAT-Client-Secondary-WINS-NBNS',
- 'aat_data_filter' => 'AAT-Data-Filter',
- 'aat_input_octets_diff' => 'AAT-Input-Octets-Diff',
- 'aat_ip_pool_definition' => 'AAT-IP-Pool-Definition',
- 'aat_ip_tos' => 'AAT-IP-TOS',
- 'aat_ip_tos_apply_to' => 'AAT-IP-TOS-Apply-To',
- 'aat_ip_tos_precedence' => 'AAT-IP-TOS-Precedence',
- 'aat_mcast_client' => 'AAT-MCast-Client',
- 'aat_output_octets_diff' => 'AAT-Output-Octets-Diff',
- 'aat_ppp_address' => 'AAT-PPP-Address',
- 'aat_require_auth' => 'AAT-Require-Auth',
- 'aat_source_ip_check' => 'AAT-Source-IP-Check',
- 'aat_user_mac_address' => 'AAT-User-MAC-Address',
- 'aat_vrouter_name' => 'AAT-Vrouter-Name',
- 'acc_access_community' => 'Acc-Access-Community',
- 'acc_access_partition' => 'Acc-Access-Partition',
- 'acc_acct_on_off_reason' => 'Acc-Acct-On-Off-Reason',
- 'acc_ace_token' => 'Acc-Ace-Token',
- 'acc_ace_token_ttl' => 'Acc-Ace-Token-Ttl',
- 'acc_apsm_oversubscribed' => 'Acc-Apsm-Oversubscribed',
- 'acc_bridging_support' => 'Acc-Bridging-Support',
- 'acc_callback_cbcp_type' => 'Acc-Callback-CBCP-Type',
- 'acc_callback_delay' => 'Acc-Callback-Delay',
- 'acc_callback_mode' => 'Acc-Callback-Mode',
- 'acc_callback_num_valid' => 'Acc-Callback-Num-Valid',
- 'acc_ccp_option' => 'Acc-Ccp-Option',
- 'acc_clearing_cause' => 'Acc-Clearing-Cause',
- 'acc_clearing_location' => 'Acc-Clearing-Location',
- 'acc_connect_rx_speed' => 'Acc-Connect-Rx-Speed',
- 'acc_connect_tx_speed' => 'Acc-Connect-Tx-Speed',
- 'acc_customer_id' => 'Acc-Customer-Id',
- 'acc_dial_port_index' => 'Acc-Dial-Port-Index',
- 'acc_dialout_auth_mode' => 'Acc-Dialout-Auth-Mode',
- 'acc_dialout_auth_passwor' => 'Acc-Dialout-Auth-Password',
- 'acc_dialout_auth_usernam' => 'Acc-Dialout-Auth-Username',
- 'acc_dns_server_pri' => 'Acc-Dns-Server-Pri',
- 'acc_dns_server_sec' => 'Acc-Dns-Server-Sec',
- 'acc_igmp_admin_state' => 'Acc-Igmp-Admin-State',
- 'acc_igmp_version' => 'Acc-Igmp-Version',
- 'acc_input_errors' => 'Acc-Input-Errors',
- 'acc_ip_compression' => 'Acc-Ip-Compression',
- 'acc_ip_gateway_pri' => 'Acc-Ip-Gateway-Pri',
- 'acc_ip_gateway_sec' => 'Acc-Ip-Gateway-Sec',
- 'acc_ip_pool_name' => 'Acc-Ip-Pool-Name',
- 'acc_ipx_compression' => 'Acc-Ipx-Compression',
- 'acc_ml_call_threshold' => 'Acc-ML-Call-Threshold',
- 'acc_ml_clear_threshold' => 'Acc-ML-Clear-Threshold',
- 'acc_ml_damping_factor' => 'Acc-ML-Damping-Factor',
- 'acc_ml_mlx_admin_state' => 'Acc-ML-MLX-Admin-State',
- 'acc_modem_error_protocol' => 'Acc-Modem-Error-Protocol',
- 'acc_modem_modulation_typ' => 'Acc-Modem-Modulation-Type',
- 'acc_nbns_server_pri' => 'Acc-Nbns-Server-Pri',
- 'acc_nbns_server_sec' => 'Acc-Nbns-Server-Sec',
- 'acc_output_errors' => 'Acc-Output-Errors',
- 'acc_reason_code' => 'Acc-Reason-Code',
- 'acc_request_type' => 'Acc-Request-Type',
- 'acc_route_policy' => 'Acc-Route-Policy',
- 'acc_service_profile' => 'Acc-Service-Profile',
- 'acc_tunnel_port' => 'Acc-Tunnel-Port',
- 'acc_tunnel_secret' => 'Acc-Tunnel-Secret',
- 'acc_vpsm_reject_cause' => 'Acc-Vpsm-Reject-Cause',
- 'acct_authentic' => 'Acct-Authentic',
- 'acct_delay_time' => 'Acct-Delay-Time',
- 'acct_dyn_ac_ent' => 'Acct_Dyn_Ac_Ent',
- 'acct_dyn_ac_enu' => 'Acct-Dyn-Ac-Ent',
- 'acct_input_gigawords' => 'Acct-Input-Gigawords',
- 'acct_input_octets' => 'Acct-Input-Octets',
- 'acct_input_octets_64' => 'Acct_Input_Octets_64',
- 'acct_input_octets_65' => 'Acct-Input-Octets-64',
- 'acct_input_packets' => 'Acct-Input-Packets',
- 'acct_input_packets_64' => 'Acct_Input_Packets_64',
- 'acct_input_packets_65' => 'Acct-Input-Packets-64',
- 'acct_interim_interval' => 'Acct-Interim-Interval',
- 'acct_link_count' => 'Acct-Link-Count',
- 'acct_mcast_in_octets' => 'Acct_Mcast_In_Octets',
- 'acct_mcast_in_octett' => 'Acct-Mcast-In-Octets',
- 'acct_mcast_in_packets' => 'Acct_Mcast_In_Packets',
- 'acct_mcast_in_packett' => 'Acct-Mcast-In-Packets',
- 'acct_mcast_out_octets' => 'Acct_Mcast_Out_Octets',
- 'acct_mcast_out_octett' => 'Acct-Mcast-Out-Octets',
- 'acct_mcast_out_packets' => 'Acct_Mcast_Out_Packets',
- 'acct_mcast_out_packett' => 'Acct-Mcast-Out-Packets',
- 'acct_multi_session_id' => 'Acct-Multi-Session-Id',
- 'acct_output_gigawords' => 'Acct-Output-Gigawords',
- 'acct_output_octets' => 'Acct-Output-Octets',
- 'acct_output_octets_64' => 'Acct_Output_Octets_64',
- 'acct_output_octets_65' => 'Acct-Output-Octets-64',
- 'acct_output_packets' => 'Acct-Output-Packets',
- 'acct_output_packets_64' => 'Acct_Output_Packets_64',
- 'acct_output_packets_65' => 'Acct-Output-Packets-64',
- 'acct_session_gigawords' => 'Acct-Session-Gigawords',
- 'acct_session_id' => 'Acct-Session-Id',
- 'acct_session_input_gigaw' => 'Acct-Session-Input-Gigawords',
- 'acct_session_input_octet' => 'Acct-Session-Input-Octets',
- 'acct_session_octets' => 'Acct-Session-Octets',
- 'acct_session_output_giga' => 'Acct-Session-Output-Gigawords',
- 'acct_session_output_octe' => 'Acct-Session-Output-Octets',
- 'acct_session_start_time' => 'Acct-Session-Start-Time',
- 'acct_session_time' => 'Acct-Session-Time',
- 'acct_status_type' => 'Acct-Status-Type',
- 'acct_terminate_cause' => 'Acct-Terminate-Cause',
- 'acct_tunnel_connection' => 'Acct-Tunnel-Connection',
- 'acct_tunnel_packets_lost' => 'Acct-Tunnel-Packets-Lost',
- 'acct_type' => 'Acct-Type',
- 'acct_unique_session_id' => 'Acct-Unique-Session-Id',
- 'add_prefix' => 'Add-Prefix',
- 'add_suffix' => 'Add-Suffix',
- 'alteon_service_type' => 'Alteon-Service-Type',
- 'altiga_access_hours_g_u' => 'Altiga-Access-Hours-G/U',
- 'altiga_allow_alpha_only_' => 'Altiga-Allow-Alpha-Only-Passwords-G',
- 'altiga_ipsec_allow_passw' => 'Altiga-IPSec-Allow-Passwd-Store-G/U',
- 'altiga_ipsec_authenticat' => 'Altiga-IPSec-Authentication-G',
- 'altiga_ipsec_banner_g' => 'Altiga-IPSec-Banner-G',
- 'altiga_ipsec_default_dom' => 'Altiga-IPSec-Default-Domain-G',
- 'altiga_ipsec_l2l_keepali' => 'Altiga-IPSec-L2L-Keepalives-G',
- 'altiga_ipsec_mode_config' => 'Altiga-IPSec-Mode-Config-G',
- 'altiga_ipsec_over_nat_g' => 'Altiga-IPSec-Over-NAT-G',
- 'altiga_ipsec_over_nat_po' => 'Altiga-IPSec-Over-NAT-Port-Num-G',
- 'altiga_ipsec_sec_associa' => 'Altiga-IPSec-Sec-Association-G/U',
- 'altiga_ipsec_secondary_d' => 'Altiga-IPSec-Secondary-Domains-G',
- 'altiga_ipsec_split_tunne' => 'Altiga-IPSec-Split-Tunnel-List-G',
- 'altiga_ipsec_tunnel_type' => 'Altiga-IPSec-Tunnel-Type-G',
- 'altiga_ipsec_user_group_' => 'Altiga-IPSec-User-Group-Lock-G',
- 'altiga_l2tp_encryption_g' => 'Altiga-L2TP-Encryption-G',
- 'altiga_l2tp_min_authenti' => 'Altiga-L2TP-Min-Authentication-G/U',
- 'altiga_min_password_leng' => 'Altiga-Min-Password-Length-G',
- 'altiga_pptp_encryption_g' => 'Altiga-PPTP-Encryption-G',
- 'altiga_pptp_min_authenti' => 'Altiga-PPTP-Min-Authentication-G/U',
- 'altiga_primary_dns_g' => 'Altiga-Primary-DNS-G',
- 'altiga_primary_wins_g' => 'Altiga-Primary-WINS-G',
- 'altiga_priority_on_sep_g' => 'Altiga-Priority-on-SEP-G/U',
- 'altiga_secondary_dns_g' => 'Altiga-Secondary-DNS-G',
- 'altiga_secondary_wins_g' => 'Altiga-Secondary-WINS-G',
- 'altiga_sep_card_assignme' => 'Altiga-SEP-Card-Assignment-G/U',
- 'altiga_simultaneous_logi' => 'Altiga-Simultaneous-Logins-G/U',
- 'altiga_tunneling_protoco' => 'Altiga-Tunneling-Protocols-G/U',
- 'altiga_use_client_addres' => 'Altiga-Use-Client-Address-G/U',
- 'annex_acct_servers' => 'Annex-Acct-Servers',
- 'annex_addr_resolution_pr' => 'Annex-Addr-Resolution-Protocol',
- 'annex_addr_resolution_se' => 'Annex-Addr-Resolution-Servers',
- 'annex_audit_level' => 'Annex-Audit-Level',
- 'annex_authen_servers' => 'Annex-Authen-Servers',
- 'annex_begin_modulation' => 'Annex-Begin-Modulation',
- 'annex_begin_receive_line' => 'Annex-Begin-Receive-Line-Level',
- 'annex_callback_portlist' => 'Annex-Callback-Portlist',
- 'annex_cli_command' => 'Annex-CLI-Command',
- 'annex_cli_filter' => 'Annex-CLI-Filter',
+ 'usr_at_zip_output_filter' => 'USR-AT-Zip-Output-Filter',
+ 'ms_filter' => 'MS-Filter',
'annex_compression_protoc' => 'Annex-Compression-Protocol',
- 'annex_connect_progress' => 'Annex-Connect-Progress',
- 'annex_disconnect_reason' => 'Annex-Disconnect-Reason',
- 'annex_domain_name' => 'Annex-Domain-Name',
- 'annex_edo' => 'Annex-EDO',
- 'annex_end_modulation' => 'Annex-End-Modulation',
- 'annex_end_receive_line_l' => 'Annex-End-Receive-Line-Level',
+ 'xedia_ssh_privileges' => 'Xedia-SSH-Privileges',
+ 'usr_blocks_received' => 'USR-Blocks-Received',
+ 'shiva_called_number' => 'Shiva-Called-Number',
+ 'annex_filter' => 'Annex-Filter',
+ 'usr_channel_expansion' => 'USR-Channel-Expansion',
+ 'erx_tunnel_tos' => 'ERX-Tunnel-Tos',
+ 'session_timeout' => 'Session-Timeout',
+ 'ascend_route_ipx' => 'Ascend-Route-IPX',
'annex_error_correction_p' => 'Annex-Error-Correction-Prot',
- 'annex_filter' => 'Annex-Filter',
- 'annex_host_allow' => 'Annex-Host-Allow',
- 'annex_host_restrict' => 'Annex-Host-Restrict',
- 'annex_input_filter' => 'Annex-Input-Filter',
- 'annex_keypress_timeout' => 'Annex-Keypress-Timeout',
- 'annex_local_ip_address' => 'Annex-Local-IP-Address',
- 'annex_local_username' => 'Annex-Local-Username',
- 'annex_logical_channel_nu' => 'Annex-Logical-Channel-Number',
- 'annex_maximum_call_durat' => 'Annex-Maximum-Call-Duration',
- 'annex_modem_disc_reason' => 'Annex-Modem-Disc-Reason',
- 'annex_mrru' => 'Annex-MRRU',
- 'annex_multicast_rate_lim' => 'Annex-Multicast-Rate-Limit',
- 'annex_multilink_id' => 'Annex-Multilink-Id',
- 'annex_num_in_multilink' => 'Annex-Num-In-Multilink',
- 'annex_output_filter' => 'Annex-Output-Filter',
- 'annex_pool_id' => 'Annex-Pool-Id',
- 'annex_port' => 'Annex-Port',
- 'annex_ppp_trace_level' => 'Annex-PPP-Trace-Level',
- 'annex_pre_input_octets' => 'Annex-Pre-Input-Octets',
- 'annex_pre_input_packets' => 'Annex-Pre-Input-Packets',
- 'annex_pre_output_octets' => 'Annex-Pre-Output-Octets',
- 'annex_pre_output_packets' => 'Annex-Pre-Output-Packets',
- 'annex_primary_dns_server' => 'Annex-Primary-DNS-Server',
- 'annex_primary_nbns_serve' => 'Annex-Primary-NBNS-Server',
- 'annex_product_name' => 'Annex-Product-Name',
- 'annex_rate_reneg_req_rcv' => 'Annex-Rate-Reneg-Req-Rcvd',
- 'annex_rate_reneg_req_sen' => 'Annex-Rate-Reneg-Req-Sent',
- 'annex_re_chap_timeout' => 'Annex-Re-CHAP-Timeout',
- 'annex_receive_speed' => 'Annex-Receive-Speed',
- 'annex_retrain_requests_r' => 'Annex-Retrain-Requests-Rcvd',
- 'annex_retrain_requests_s' => 'Annex-Retrain-Requests-Sent',
- 'annex_retransmitted_pack' => 'Annex-Retransmitted-Packets',
- 'annex_sec_profile_index' => 'Annex-Sec-Profile-Index',
- 'annex_secondary_dns_serv' => 'Annex-Secondary-DNS-Server',
- 'annex_secondary_nbns_ser' => 'Annex-Secondary-NBNS-Server',
- 'annex_signal_to_noise_ra' => 'Annex-Signal-to-Noise-Ratio',
- 'annex_sw_version' => 'Annex-SW-Version',
- 'annex_syslog_tap' => 'Annex-Syslog-Tap',
+ 'acc_callback_mode' => 'Acc-Callback-Mode',
+ 'usr_filter_zones' => 'USR-Filter-Zones',
+ 'erx_input_gigapkts' => 'ERX-Input-Gigapkts',
+ 'ascend_session_svr_key' => 'Ascend-Session-Svr-Key',
+ 'bind_l2tp_tunnel_namf' => 'Bind_L2TP_Tunnel_Name',
+ 'ascend_dsl_cir_recv_limi' => 'Ascend-Dsl-CIR-Recv-Limit',
+ 'altiga_secondary_wins_g' => 'Altiga-Secondary-WINS-G',
+ 'ascend_ts_idle_limit' => 'Ascend-TS-Idle-Limit',
+ 'usr_port_tap_priority' => 'USR-Port-Tap-Priority',
+ 'cvpn3000_ipsec_client_fw' => 'CVPN3000-IPSec-Client-Fw-Filter-Name',
+ 'ascend_private_route_req' => 'Ascend-Private-Route-Required',
+ 'ascend_private_route' => 'Ascend-Private-Route',
+ 'prompt' => 'Prompt',
+ 'acct_link_count' => 'Acct-Link-Count',
+ 'bind_auth_service_grq' => 'Bind_Auth_Service_Grp',
+ 'itk_tunnel_ip' => 'ITK-Tunnel-IP',
+ 'login_lat_node' => 'Login-LAT-Node',
+ 'usr_mbi_ct_pri_card_slot' => 'USR-Mbi_Ct_PRI_Card_Slot',
+ 'lac_real_poru' => 'LAC_Real_Port',
+ 'erx_ingress_statistics' => 'ERX-Ingress-Statistics',
+ 'digest_nonce' => 'Digest-Nonce',
'annex_system_disc_reason' => 'Annex-System-Disc-Reason',
- 'annex_transmit_speed' => 'Annex-Transmit-Speed',
- 'annex_transmitted_packet' => 'Annex-Transmitted-Packets',
- 'annex_tunnel_authen_mode' => 'Annex-Tunnel-Authen-Mode',
- 'annex_tunnel_authen_type' => 'Annex-Tunnel-Authen-Type',
- 'annex_unauthenticated_ti' => 'Annex-Unauthenticated-Time',
- 'annex_user_level' => 'Annex-User-Level',
+ 'pool_name' => 'Pool-Name',
+ 'altiga_use_client_addres' => 'Altiga-Use-Client-Address-G/U',
+ 'police_bursu' => 'Police_Burst',
+ 'usr_call_arrival_time' => 'USR-Call-Arrival-Time',
+ 'ascend_disconnect_cause' => 'Ascend-Disconnect-Cause',
+ 'ascend_user_acct_time' => 'Ascend-User-Acct-Time',
+ 'chap_challenge' => 'CHAP-Challenge',
+ 'ascend_mpp_idle_percent' => 'Ascend-MPP-Idle-Percent',
+ 'ascend_user_acct_port' => 'Ascend-User-Acct-Port',
+ 'ldap_group' => 'Ldap-Group',
+ 'ascend_numbering_plan_id' => 'Ascend-Numbering-Plan-ID',
+ 'usr_last_number_dialed_o' => 'USR-Last-Number-Dialed-Out',
+ 'pvc_encapsulation_type' => 'PVC-Encapsulation-Type',
+ 'ascend_bir_bridge_group' => 'Ascend-BIR-Bridge-Group',
+ 'ascend_atm_group' => 'Ascend-ATM-Group',
+ 'ascend_fr_svc_addr' => 'Ascend-FR-SVC-Addr',
+ 'x_ascend_send_auth' => 'X-Ascend-Send-Auth',
+ 'le_ip_pool' => 'LE-IP-Pool',
+ 'post_proxy_type' => 'Post-Proxy-Type',
+ 'wispr_session_terminate_' => 'WISPr-Session-Terminate-Time',
+ 'bintec_pppextiftable' => 'BinTec-pppExtIfTable',
+ 'nomadix_subnet' => 'Nomadix-Subnet',
+ 'login_port' => 'Login-Port',
+ 'ms_chap2_response' => 'MS-CHAP2-Response',
+ 'ascend_ipsec_profile' => 'Ascend-IPSEC-Profile',
+ 'usr_compression_algorith' => 'USR-Compression-Algorithm',
+ 'usr_accm_type' => 'USR-ACCM-Type',
+ 'simultaneous_use' => 'Simultaneous-Use',
+ 'cisco_account_info' => 'Cisco-Account-Info',
+ 'framed_protocol' => 'Framed-Protocol',
+ 'erx_tunnel_maximum_sessi' => 'ERX-Tunnel-Maximum-Sessions',
+ 'redcreek_tunneled_wins_t' => 'RedCreek-Tunneled-WINS-Server2',
+ 'ascend_recv_name' => 'Ascend-Recv-Name',
+ 'usr_call_connecting_time' => 'USR-Call-Connecting-Time',
+ 'quintum_h323_gw_id' => 'Quintum-h323-gw-id',
+ 'acct_dyn_ac_ent' => 'Acct-Dyn-Ac-Ent',
+ 'tunnel_remote_name' => 'Tunnel-Remote-Name',
+ 'annex_ppp_trace_level' => 'Annex-PPP-Trace-Level',
+ 'cisco_call_type' => 'Cisco-Call-Type',
+ 'cisco_fax_recipient_coun' => 'Cisco-Fax-Recipient-Count',
+ 'altiga_ipsec_authenticat' => 'Altiga-IPSec-Authentication-G',
+ 'wispr_location_id' => 'WISPr-Location-ID',
+ 'itk_start_delay' => 'ITK-Start-Delay',
+ 'ascend_pre_output_packet' => 'Ascend-Pre-Output-Packets',
+ 'usr_rmmie_firmware_versi' => 'USR-RMMIE-Firmware-Version',
+ 'usr_vts_session_key' => 'USR-VTS-Session-Key',
+ 'ascend_fr_dce_n393' => 'Ascend-FR-DCE-N393',
+ 'login_host' => 'Login-Host',
+ 'usr_reply_script3' => 'USR-Reply-Script3',
+ 'cvpn3000_ipsec_split_tuo' => 'CVPN3000-IPSec-Split-Tunneling-Policy',
+ 'ascend_pppoe_enable' => 'Ascend-PPPoE-Enable',
+ 'annex_primary_dns_server' => 'Annex-Primary-DNS-Server',
+ 'x_ascend_bridge_address' => 'X-Ascend-Bridge-Address',
+ 'usr_number_of_link_naks' => 'USR-Number-of-Link-NAKs',
+ 'altiga_priority_on_sep_g' => 'Altiga-Priority-on-SEP-G/U',
+ 'annex_cli_command' => 'Annex-CLI-Command',
+ 'usr_pw_framed_routing_v2' => 'USR-PW_Framed_Routing_V2',
+ 'session_error_codf' => 'Session_Error_Code',
'annex_user_server_locati' => 'Annex-User-Server-Location',
- 'annex_wan_number' => 'Annex-Wan-Number',
- 'arap_challenge_response' => 'ARAP-Challenge-Response',
- 'arap_features' => 'ARAP-Features',
- 'arap_password' => 'ARAP-Password',
- 'arap_security' => 'ARAP-Security',
- 'arap_security_data' => 'ARAP-Security-Data',
- 'arap_zone_access' => 'ARAP-Zone-Access',
- 'ascend_access_intercept_' => 'Ascend-Access-Intercept-LEA',
- 'ascend_access_intercepta' => 'Ascend-Access-Intercept-Log',
- 'ascend_add_seconds' => 'Ascend-Add-Seconds',
- 'ascend_appletalk_peer_mo' => 'Ascend-Appletalk-Peer-Mode',
- 'ascend_appletalk_route' => 'Ascend-Appletalk-Route',
- 'ascend_ara_pw' => 'Ascend-Ara-PW',
- 'ascend_assign_ip_client' => 'Ascend-Assign-IP-Client',
- 'ascend_assign_ip_global_' => 'Ascend-Assign-IP-Global-Pool',
- 'ascend_assign_ip_pool' => 'Ascend-Assign-IP-Pool',
- 'ascend_assign_ip_server' => 'Ascend-Assign-IP-Server',
- 'ascend_atm_connect_group' => 'Ascend-ATM-Connect-Group',
- 'ascend_atm_connect_vci' => 'Ascend-ATM-Connect-Vci',
- 'ascend_atm_connect_vpi' => 'Ascend-ATM-Connect-Vpi',
- 'ascend_atm_direct' => 'Ascend-ATM-Direct',
- 'ascend_atm_direct_profil' => 'Ascend-ATM-Direct-Profile',
- 'ascend_atm_fault_managem' => 'Ascend-ATM-Fault-Management',
- 'ascend_atm_group' => 'Ascend-ATM-Group',
- 'ascend_atm_loopback_cell' => 'Ascend-ATM-Loopback-Cell-Loss',
- 'ascend_atm_vci' => 'Ascend-ATM-Vci',
- 'ascend_atm_vpi' => 'Ascend-ATM-Vpi',
- 'ascend_auth_delay' => 'Ascend-Auth-Delay',
- 'ascend_auth_type' => 'Ascend-Auth-Type',
- 'ascend_authen_alias' => 'Ascend-Authen-Alias',
- 'ascend_backup' => 'Ascend-Backup',
- 'ascend_bacp_enable' => 'Ascend-BACP-Enable',
- 'ascend_base_channel_coun' => 'Ascend-Base-Channel-Count',
- 'ascend_bi_directional_au' => 'Ascend-Bi-Directional-Auth',
- 'ascend_billing_number' => 'Ascend-Billing-Number',
- 'ascend_bir_bridge_group' => 'Ascend-BIR-Bridge-Group',
- 'ascend_bir_enable' => 'Ascend-BIR-Enable',
- 'ascend_bir_proxy' => 'Ascend-BIR-Proxy',
- 'ascend_bridge' => 'Ascend-Bridge',
- 'ascend_bridge_address' => 'Ascend-Bridge-Address',
- 'ascend_bridge_non_pppoe' => 'Ascend-Bridge-Non-PPPoE',
- 'ascend_cache_refresh' => 'Ascend-Cache-Refresh',
- 'ascend_cache_time' => 'Ascend-Cache-Time',
- 'ascend_call_attempt_limi' => 'Ascend-Call-Attempt-Limit',
- 'ascend_call_block_durati' => 'Ascend-Call-Block-Duration',
- 'ascend_call_by_call' => 'Ascend-Call-By-Call',
- 'ascend_call_direction' => 'Ascend-Call-Direction',
- 'ascend_call_filter' => 'Ascend-Call-Filter',
- 'ascend_call_type' => 'Ascend-Call-Type',
- 'ascend_callback' => 'Ascend-Callback',
- 'ascend_callback_delay' => 'Ascend-Callback-Delay',
- 'ascend_calling_id_number' => 'Ascend-Calling-Id-Number-Plan',
- 'ascend_calling_id_presen' => 'Ascend-Calling-Id-Presentatn',
- 'ascend_calling_id_screen' => 'Ascend-Calling-Id-Screening',
- 'ascend_calling_id_type_o' => 'Ascend-Calling-Id-Type-Of-Num',
+ 'cisco_fax_mdn_address' => 'Cisco-Fax-Mdn-Address',
'ascend_calling_subaddres' => 'Ascend-Calling-Subaddress',
- 'ascend_cbcp_delay' => 'Ascend-CBCP-Delay',
- 'ascend_cbcp_enable' => 'Ascend-CBCP-Enable',
- 'ascend_cbcp_mode' => 'Ascend-CBCP-Mode',
- 'ascend_cbcp_trunk_group' => 'Ascend-CBCP-Trunk-Group',
- 'ascend_cir_timer' => 'Ascend-CIR-Timer',
- 'ascend_ckt_type' => 'Ascend-Ckt-Type',
- 'ascend_client_assign_dns' => 'Ascend-Client-Assign-DNS',
- 'ascend_client_assign_win' => 'Ascend-Client-Assign-WINS',
- 'ascend_client_gateway' => 'Ascend-Client-Gateway',
- 'ascend_client_primary_dn' => 'Ascend-Client-Primary-DNS',
- 'ascend_client_primary_wi' => 'Ascend-Client-Primary-WINS',
- 'ascend_client_secondary_' => 'Ascend-Client-Secondary-WINS',
- 'ascend_client_secondarya' => 'Ascend-Client-Secondary-DNS',
- 'ascend_connect_progress' => 'Ascend-Connect-Progress',
- 'ascend_data_filter' => 'Ascend-Data-Filter',
- 'ascend_data_rate' => 'Ascend-Data-Rate',
- 'ascend_data_svc' => 'Ascend-Data-Svc',
- 'ascend_dba_monitor' => 'Ascend-DBA-Monitor',
- 'ascend_dec_channel_count' => 'Ascend-Dec-Channel-Count',
- 'ascend_destination_nas_p' => 'Ascend-Destination-Nas-Port',
+ 'ascend_call_by_call' => 'Ascend-Call-By-Call',
+ 'ascend_first_dest' => 'Ascend-First-Dest',
+ 'annex_tunnel_authen_type' => 'Annex-Tunnel-Authen-Type',
+ 'acct_type' => 'Acct-Type',
+ 'sql_user_name' => 'SQL-User-Name',
+ 'erx_secondary_dns' => 'ERX-Secondary-Dns',
+ 'bridge_grouq' => 'Bridge_Group',
+ 'h323_return_code' => 'h323-return-code',
+ 'annex_host_allow' => 'Annex-Host-Allow',
+ 'cvx_modem_end_recv_line_' => 'CVX-Modem-End-Recv-Line-Lvl',
+ 'sip_method' => 'Sip-Method',
+ 'x_ascend_require_auth' => 'X-Ascend-Require-Auth',
+ 'cvpn3000_sep_card_assign' => 'CVPN3000-SEP-Card-Assignment',
+ 'le_ipsec_deny_action' => 'LE-IPSec-Deny-Action',
+ 'annex_edo' => 'Annex-EDO',
+ 'acct_delay_time' => 'Acct-Delay-Time',
+ 'login_tcp_port' => 'Login-TCP-Port',
+ 'ascend_temporary_rtes' => 'Ascend-Temporary-Rtes',
+ 'versanet_termination_cau' => 'Versanet-Termination-Cause',
+ 'ascend_dialed_number' => 'Ascend-Dialed-Number',
+ 'cvpn3000_ipsec_authentic' => 'CVPN3000-IPSec-Authentication',
+ 'ascend_fr_dlci' => 'Ascend-FR-DLCI',
+ 'annex_modem_disc_reason' => 'Annex-Modem-Disc-Reason',
+ 'x_ascend_receive_secret' => 'X-Ascend-Receive-Secret',
+ 'usr_ospf_addressless_ind' => 'USR-OSPF-Addressless-Index',
+ 'usr_ip_default_route_opt' => 'USR-IP-Default-Route-Option',
+ 'char_noecho' => 'Char-Noecho',
+ 'redcreek_tunneled_search' => 'RedCreek-Tunneled-Search-List',
+ 'ascend_pri_number_type' => 'Ascend-PRI-Number-Type',
+ 'aat_ip_tos_apply_to' => 'AAT-IP-TOS-Apply-To',
+ 'x_ascend_modem_shelfno' => 'X-Ascend-Modem-ShelfNo',
+ 'prefix' => 'Prefix',
+ 'usr_rad_dvmrp_metric' => 'USR-Rad-Dvmrp-Metric',
+ 'x_ascend_call_attempt_li' => 'X-Ascend-Call-Attempt-Limit',
+ 'usr_ip_saa_filter' => 'USR-IP-SAA-Filter',
+ 'itk_prompt' => 'ITK-Prompt',
+ 'ascend_port_redir_protoc' => 'Ascend-Port-Redir-Protocol',
+ 'cvx_modem_tx_packets' => 'CVX-Modem-Tx-Packets',
+ 'usr_tunnel_switch_endpoi' => 'USR-Tunnel-Switch-Endpoint',
+ 'ascend_home_network_name' => 'Ascend-Home-Network-Name',
+ 'acc_customer_id' => 'Acc-Customer-Id',
+ 'message_authenticator' => 'Message-Authenticator',
+ 'cisco_fax_coverpage_flag' => 'Cisco-Fax-Coverpage-Flag',
+ 'usr_multicast_forwarding' => 'USR-Multicast-Forwarding',
+ 'cvpn3000_allow_network_e' => 'CVPN3000-Allow-Network-Extension-Mode',
+ 'ascend_call_direction' => 'Ascend-Call-Direction',
+ 'acc_connect_rx_speed' => 'Acc-Connect-Rx-Speed',
+ 'ascend_force_56' => 'Ascend-Force-56',
+ 'st_service_domain' => 'ST-Service-Domain',
+ 'usr_harc_disconnect_code' => 'USR-HARC-Disconnect-Code',
+ 'shasta_service_profile' => 'Shasta-Service-Profile',
+ 'cisco_maximum_time' => 'Cisco-Maximum-Time',
+ 'usr_tunnel_auth_hostname' => 'USR-Tunnel-Auth-Hostname',
+ 'acc_ip_gateway_pri' => 'Acc-Ip-Gateway-Pri',
+ 'ascend_bridge_address' => 'Ascend-Bridge-Address',
+ 'altiga_pptp_min_authenti' => 'Altiga-PPTP-Min-Authentication-G/U',
+ 'ns_secondary_wins' => 'NS-Secondary-WINS',
+ 'cbbsm_bandwidth' => 'CBBSM-Bandwidth',
+ 'x_ascend_fr_link_mgt' => 'X-Ascend-FR-Link-Mgt',
+ 'altiga_ipsec_banner_g' => 'Altiga-IPSec-Banner-G',
+ 'ascend_handle_ipx' => 'Ascend-Handle-IPX',
+ 'ascend_x25_pad_alias_2' => 'Ascend-X25-Pad-Alias-2',
+ 'st_policy_name' => 'ST-Policy-Name',
+ 'ascend_group' => 'Ascend-Group',
+ 'ascend_dsl_rate_type' => 'Ascend-Dsl-Rate-Type',
+ 'tunnel_contexu' => 'Tunnel_Context',
+ 'ascend_require_auth' => 'Ascend-Require-Auth',
+ 'cvx_modem_local_retrains' => 'CVX-Modem-Local-Retrains',
+ 'cvpn5000_echo' => 'CVPN5000-Echo',
+ 'cvx_secondary_dns' => 'CVX-Secondary-DNS',
+ 'x_ascend_billing_number' => 'X-Ascend-Billing-Number',
+ 'usr_orig_nas_type' => 'USR-Orig-NAS-Type',
+ 'ascend_remote_fw' => 'Ascend-Remote-FW',
+ 'acct_output_packets' => 'Acct-Output-Packets',
+ 'lm_password' => 'LM-Password',
+ 'tunnel_window' => 'Tunnel-Window',
+ 'cisco_avpair' => 'Cisco-AVPair',
+ 'st_service_name' => 'ST-Service-Name',
+ 'shiva_event_flags' => 'Shiva-Event-Flags',
+ 'annex_retrain_requests_s' => 'Annex-Retrain-Requests-Sent',
+ 'ascend_ts_idle_mode' => 'Ascend-TS-Idle-Mode',
+ 'usr_ip_rip_simple_auth_p' => 'USR-IP-RIP-Simple-Auth-Password',
+ 'tunnel_deadtimf' => 'Tunnel_Deadtime',
+ 'state' => 'State',
+ 'usr_keypress_timeout' => 'USR-Keypress-Timeout',
+ 'usr_pw_vpn_neighbor' => 'USR-PW_VPN_Neighbor',
+ 'erx_pppoe_description' => 'ERX-Pppoe-Description',
+ 'ldap_userdn' => 'Ldap-UserDn',
+ 'x_ascend_fr_n391' => 'X-Ascend-FR-N391',
+ 'ascend_calling_id_presen' => 'Ascend-Calling-Id-Presentatn',
+ 'erx_local_loopback_inter' => 'ERX-Local-Loopback-Interface',
+ 'x_ascend_fr_direct' => 'X-Ascend-FR-Direct',
+ 'nas_ip_address' => 'NAS-IP-Address',
+ 'usr_call_end_time' => 'USR-Call-End-Time',
+ 'acct_mcast_out_packett' => 'Acct_Mcast_Out_Packets',
+ 'tunnel_algorithm' => 'Tunnel-Algorithm',
+ 'usr_vpn_encrypter' => 'USR-VPN-Encrypter',
+ 'tunnel_grouq' => 'Tunnel_Group',
+ 'ascend_atm_connect_group' => 'Ascend-ATM-Connect-Group',
+ 'x_ascend_ft1_caller' => 'X-Ascend-FT1-Caller',
+ 'usr_dnis_reauthenticatio' => 'USR-DNIS-ReAuthentication',
+ 'login_callback_number' => 'Login-Callback-Number',
+ 'usr_ip_rip_input_filter' => 'USR-IP-RIP-Input-Filter',
+ 'usr_rmmie_rcv_pwrlvl_330' => 'USR-RMMIE-Rcv-PwrLvl-3300Hz',
+ 'h323_disconnect_cause' => 'h323-disconnect-cause',
+ 'x_ascend_handle_ipx' => 'X-Ascend-Handle-IPX',
+ 'usr_igmp_version' => 'USR-IGMP-Version',
+ 'usr_imsi' => 'USR-IMSI',
+ 'group_name' => 'Group-Name',
+ 'usr_nas_type' => 'USR-NAS-Type',
+ 'context_namf' => 'Context-Name',
+ 'ascend_ip_tos' => 'Ascend-IP-TOS',
+ 'x_ascend_token_immediate' => 'X-Ascend-Token-Immediate',
+ 'tunnel_session_auth_serw' => 'Tunnel_Session_Auth_Service_Grp',
+ 'ms_chap2_cpw' => 'MS-CHAP2-CPW',
+ 'tunnel_session_auth_ctx' => 'Tunnel-Session-Auth-Ctx',
+ 'usr_mobile_numbytes_rxed' => 'USR-Mobile-NumBytes-Rxed',
+ 'usr_mbi_ct_tdm_time_slot' => 'USR-Mbi_Ct_TDM_Time_Slot',
+ 'ascend_x25_nui' => 'Ascend-X25-Nui',
+ 'x_ascend_first_dest' => 'X-Ascend-First-Dest',
+ 'usr_send_password' => 'USR-Send-Password',
+ 'x_ascend_fr_direct_profi' => 'X-Ascend-FR-Direct-Profile',
+ 'x_ascend_fr_t391' => 'X-Ascend-FR-T391',
+ 'altiga_ipsec_sec_associa' => 'Altiga-IPSec-Sec-Association-G/U',
+ 'ip_address_pool_namf' => 'Ip_Address_Pool_Name',
+ 'acct_input_octets' => 'Acct-Input-Octets',
+ 'cvx_modem_begin_modulati' => 'CVX-Modem-Begin-Modulation',
+ 'wispr_session_terminatea' => 'WISPr-Session-Terminate-End-Of-Day',
+ 'cvpn3000_use_client_addr' => 'CVPN3000-Use-Client-Address',
+ 'bridge_group' => 'Bridge-Group',
+ 'annex_sec_profile_index' => 'Annex-Sec-Profile-Index',
+ 'acc_dns_server_pri' => 'Acc-Dns-Server-Pri',
+ 'ms_acct_auth_type' => 'MS-Acct-Auth-Type',
+ 'x_ascend_maximum_call_du' => 'X-Ascend-Maximum-Call-Duration',
+ 'tunnel_password' => 'Tunnel-Password',
+ 'framed_ipv6_prefix' => 'Framed-IPv6-Prefix',
+ 'usr_reply_script5' => 'USR-Reply-Script5',
+ 'shiva_links_in_bundle' => 'Shiva-Links-In-Bundle',
+ 'ascend_fr_profile_name' => 'Ascend-FR-Profile-Name',
+ 'ascend_mtu' => 'Ascend-MTU',
+ 'nokia_charging_id' => 'Nokia-Charging-Id',
+ 'cvpn3000_ms_client_subne' => 'CVPN3000-MS-Client-Subnet-Mask',
+ 'cvpn3000_ipsec_sec_assoc' => 'CVPN3000-IPSec-Sec-Association',
+ 'cisco_ppp_async_map' => 'Cisco-PPP-Async-Map',
+ 'cvpn3000_user_auth_servf' => 'CVPN3000-User-Auth-Server-Port',
+ 'cisco_num_in_multilink' => 'Cisco-Num-In-Multilink',
+ 'wispr_logoff_url' => 'WISPr-Logoff-URL',
+ 'usr_mobile_ip_address' => 'USR-Mobile-IP-Address',
+ 'usr_final_tx_link_data_r' => 'USR-Final-Tx-Link-Data-Rate',
+ 'itk_ppp_compression_prot' => 'ITK-PPP-Compression-Prot',
+ 'ascend_bridge' => 'Ascend-Bridge',
+ 'x_ascend_presession_time' => 'X-Ascend-PreSession-Time',
+ 'aat_client_primary_dns' => 'AAT-Client-Primary-DNS',
+ 'cvpn3000_strip_realm' => 'CVPN3000-Strip-Realm',
+ 'tunnel_cmd_timeout' => 'Tunnel-Cmd-Timeout',
+ 'ascend_multicast_client' => 'Ascend-Multicast-Client',
+ 'cvx_modem_remote_rate_ne' => 'CVX-Modem-Remote-Rate-Negs',
+ 'tunnel_private_group_id' => 'Tunnel-Private-Group-Id',
+ 'usr_rmmie_rcv_tot_pwrlvl' => 'USR-RMMIE-Rcv-Tot-PwrLvl',
+ 'calling_station_id' => 'Calling-Station-Id',
+ 'tunnel_rate_limit_burst' => 'Tunnel-Rate-Limit-Burst',
+ 'usr_device_connected_to' => 'USR-Device-Connected-To',
+ 'aat_source_ip_check' => 'AAT-Source-IP-Check',
+ 'login_lat_service' => 'Login-LAT-Service',
+ 'ascend_h323_fegw_address' => 'Ascend-H323-Fegw-Address',
+ 'usr_called_party_number' => 'USR-Called-Party-Number',
+ 'bintec_ipnatpresettable' => 'BinTec-ipNatPresetTable',
+ 'ascend_remove_seconds' => 'Ascend-Remove-Seconds',
+ 'shiva_user_attributes' => 'Shiva-User-Attributes',
+ 'cisco_fax_dsn_flag' => 'Cisco-Fax-Dsn-Flag',
+ 'x_ascend_route_ipx' => 'X-Ascend-Route-IPX',
+ 'acc_route_policy' => 'Acc-Route-Policy',
+ 'bind_l2tp_flow_controm' => 'Bind_L2TP_Flow_Control',
+ 'erx_qos_profile_name' => 'ERX-Qos-Profile-Name',
+ 'x_ascend_client_gateway' => 'X-Ascend-Client-Gateway',
+ 'pre_proxy_type' => 'Pre-Proxy-Type',
+ 'smb_account_ctrl_text' => 'SMB-Account-CTRL-TEXT',
+ 'x_ascend_data_filter' => 'X-Ascend-Data-Filter',
+ 'usr_rmmie_last_update_ti' => 'USR-RMMIE-Last-Update-Time',
+ 'ascend_atm_direct' => 'Ascend-ATM-Direct',
+ 'ascend_session_type' => 'Ascend-Session-Type',
+ 'x_ascend_fr_linkup' => 'X-Ascend-FR-LinkUp',
+ 'ascend_metric' => 'Ascend-Metric',
+ 'x_ascend_assign_ip_clien' => 'X-Ascend-Assign-IP-Client',
+ 'usr_speed_of_connection' => 'USR-Speed-Of-Connection',
+ 'cvpn3000_require_hw_clie' => 'CVPN3000-Require-HW-Client-Auth',
+ 'session_type' => 'Session-Type',
+ 'acct_input_octets_65' => 'Acct_Input_Octets_64',
+ 'le_nat_outsource_outmap' => 'LE-NAT-Outsource-Outmap',
+ 'cvx_modem_local_rate_neg' => 'CVX-Modem-Local-Rate-Negs',
+ 'mcast_sene' => 'Mcast_Send',
+ 'pppoe_url' => 'PPPOE-URL',
+ 'erx_service_bundle' => 'ERX-Service-Bundle',
+ 'altiga_secondary_dns_g' => 'Altiga-Secondary-DNS-G',
+ 'bg_trans_bpdv' => 'BG_Trans_BPDU',
+ 'cvx_data_filter' => 'CVX-Data-Filter',
+ 'acct_mcast_out_octets' => 'Acct-Mcast-Out-Octets',
+ 'ascend_callback' => 'Ascend-Callback',
+ 'tunnel_client_auth_id' => 'Tunnel-Client-Auth-Id',
+ 'acct_unique_session_id' => 'Acct-Unique-Session-Id',
+ 'usr_port_tap_format' => 'USR-Port-Tap-Format',
+ 'ascend_ckt_type' => 'Ascend-Ckt-Type',
+ 'ascend_ppp_async_map' => 'Ascend-PPP-Async-Map',
+ 'usr_rmmie_rcv_pwrlvl_375' => 'USR-RMMIE-Rcv-PwrLvl-3750Hz',
+ 'usr_acct_reason_code' => 'USR-Acct-Reason-Code',
+ 'ascend_filter' => 'Ascend-Filter',
+ 'h323_redirect_number' => 'h323-redirect-number',
+ 'port_limit' => 'Port-Limit',
+ 'rewrite_rule' => 'Rewrite-Rule',
+ 'tunnel_police_rate' => 'Tunnel-Police-Rate',
+ 'usr_multicast_proxy' => 'USR-Multicast-Proxy',
+ 'ascend_max_shared_users' => 'Ascend-Max-Shared-Users',
+ 'usr_bridging' => 'USR-Bridging',
+ 'cvx_presession_time' => 'CVX-PreSession-Time',
+ 'cvpn5000_vpn_groupinfo' => 'CVPN5000-VPN-GroupInfo',
+ 'autz_type' => 'Autz-Type',
+ 'x_ascend_fr_dlci' => 'X-Ascend-FR-DLCI',
+ 'usr_request_type' => 'USR-Request-Type',
+ 'acc_igmp_admin_state' => 'Acc-Igmp-Admin-State',
+ 'ascend_host_info' => 'Ascend-Host-Info',
'ascend_dhcp_maximum_leas' => 'Ascend-DHCP-Maximum-Leases',
- 'ascend_dhcp_pool_number' => 'Ascend-DHCP-Pool-Number',
- 'ascend_dhcp_reply' => 'Ascend-DHCP-Reply',
- 'ascend_dial_number' => 'Ascend-Dial-Number',
- 'ascend_dialed_number' => 'Ascend-Dialed-Number',
- 'ascend_dialout_allowed' => 'Ascend-Dialout-Allowed',
- 'ascend_disconnect_cause' => 'Ascend-Disconnect-Cause',
- 'ascend_dropped_octets' => 'Ascend-Dropped-Octets',
- 'ascend_dropped_packets' => 'Ascend-Dropped-Packets',
- 'ascend_dsl_cir_recv_limi' => 'Ascend-Dsl-CIR-Recv-Limit',
- 'ascend_dsl_cir_xmit_limi' => 'Ascend-Dsl-CIR-Xmit-Limit',
- 'ascend_dsl_downstream_li' => 'Ascend-Dsl-Downstream-Limit',
- 'ascend_dsl_rate_mode' => 'Ascend-Dsl-Rate-Mode',
- 'ascend_dsl_rate_type' => 'Ascend-Dsl-Rate-Type',
- 'ascend_dsl_upstream_limi' => 'Ascend-Dsl-Upstream-Limit',
- 'ascend_egress_enabled' => 'Ascend-Egress-Enabled',
- 'ascend_endpoint_disc' => 'Ascend-Endpoint-Disc',
- 'ascend_event_type' => 'Ascend-Event-Type',
- 'ascend_expect_callback' => 'Ascend-Expect-Callback',
- 'ascend_fcp_parameter' => 'Ascend-FCP-Parameter',
- 'ascend_filter' => 'Ascend-Filter',
- 'ascend_filter_required' => 'Ascend-Filter-Required',
- 'ascend_first_dest' => 'Ascend-First-Dest',
- 'ascend_force_56' => 'Ascend-Force-56',
- 'ascend_fr_08_mode' => 'Ascend-FR-08-Mode',
- 'ascend_fr_circuit_name' => 'Ascend-FR-Circuit-Name',
- 'ascend_fr_dce_n392' => 'Ascend-FR-DCE-N392',
- 'ascend_fr_dce_n393' => 'Ascend-FR-DCE-N393',
- 'ascend_fr_direct' => 'Ascend-FR-Direct',
- 'ascend_fr_direct_dlci' => 'Ascend-FR-Direct-DLCI',
+ 'usr_rmmie_num_of_updates' => 'USR-RMMIE-Num-Of-Updates',
+ 'x_ascend_fr_profile_name' => 'X-Ascend-FR-Profile-Name',
'ascend_fr_direct_profile' => 'Ascend-FR-Direct-Profile',
- 'ascend_fr_dlci' => 'Ascend-FR-DLCI',
- 'ascend_fr_dte_n392' => 'Ascend-FR-DTE-N392',
- 'ascend_fr_dte_n393' => 'Ascend-FR-DTE-N393',
- 'ascend_fr_link_mgt' => 'Ascend-FR-Link-Mgt',
- 'ascend_fr_link_status_dl' => 'Ascend-FR-Link-Status-DLCI',
- 'ascend_fr_linkup' => 'Ascend-FR-LinkUp',
- 'ascend_fr_n391' => 'Ascend-FR-N391',
- 'ascend_fr_nailed_grp' => 'Ascend-FR-Nailed-Grp',
- 'ascend_fr_profile_name' => 'Ascend-FR-Profile-Name',
- 'ascend_fr_svc_addr' => 'Ascend-FR-SVC-Addr',
- 'ascend_fr_t391' => 'Ascend-FR-T391',
- 'ascend_fr_t392' => 'Ascend-FR-T392',
- 'ascend_fr_type' => 'Ascend-FR-Type',
- 'ascend_ft1_caller' => 'Ascend-FT1-Caller',
- 'ascend_global_call_id' => 'Ascend-Global-Call-Id',
- 'ascend_group' => 'Ascend-Group',
- 'ascend_h323_conference_i' => 'Ascend-H323-Conference-Id',
- 'ascend_h323_dialed_time' => 'Ascend-H323-Dialed-Time',
- 'ascend_h323_fegw_address' => 'Ascend-H323-Fegw-Address',
- 'ascend_h323_gatekeeper' => 'Ascend-H323-Gatekeeper',
- 'ascend_handle_ipx' => 'Ascend-Handle-IPX',
- 'ascend_history_weigh_typ' => 'Ascend-History-Weigh-Type',
- 'ascend_home_agent_ip_add' => 'Ascend-Home-Agent-IP-Addr',
- 'ascend_home_agent_passwo' => 'Ascend-Home-Agent-Password',
- 'ascend_home_agent_udp_po' => 'Ascend-Home-Agent-UDP-Port',
- 'ascend_home_network_name' => 'Ascend-Home-Network-Name',
- 'ascend_host_info' => 'Ascend-Host-Info',
- 'ascend_idle_limit' => 'Ascend-Idle-Limit',
- 'ascend_if_netmask' => 'Ascend-IF-Netmask',
- 'ascend_inc_channel_count' => 'Ascend-Inc-Channel-Count',
- 'ascend_inter_arrival_jit' => 'Ascend-Inter-Arrival-Jitter',
- 'ascend_ip_direct' => 'Ascend-IP-Direct',
- 'ascend_ip_pool_chaining' => 'Ascend-IP-Pool-Chaining',
- 'ascend_ip_pool_definitio' => 'Ascend-IP-Pool-Definition',
- 'ascend_ip_tos' => 'Ascend-IP-TOS',
- 'ascend_ip_tos_apply_to' => 'Ascend-IP-TOS-Apply-To',
- 'ascend_ip_tos_precedence' => 'Ascend-IP-TOS-Precedence',
- 'ascend_ipsec_profile' => 'Ascend-IPSEC-Profile',
- 'ascend_ipx_alias' => 'Ascend-IPX-Alias',
- 'ascend_ipx_header_compre' => 'Ascend-IPX-Header-Compression',
- 'ascend_ipx_node_addr' => 'Ascend-IPX-Node-Addr',
- 'ascend_ipx_peer_mode' => 'Ascend-IPX-Peer-Mode',
- 'ascend_ipx_route' => 'Ascend-IPX-Route',
- 'ascend_link_compression' => 'Ascend-Link-Compression',
- 'ascend_max_shared_users' => 'Ascend-Max-Shared-Users',
- 'ascend_maximum_call_dura' => 'Ascend-Maximum-Call-Duration',
- 'ascend_maximum_channels' => 'Ascend-Maximum-Channels',
- 'ascend_maximum_time' => 'Ascend-Maximum-Time',
- 'ascend_menu_item' => 'Ascend-Menu-Item',
- 'ascend_menu_selector' => 'Ascend-Menu-Selector',
- 'ascend_metric' => 'Ascend-Metric',
- 'ascend_minimum_channels' => 'Ascend-Minimum-Channels',
- 'ascend_modem_portno' => 'Ascend-Modem-PortNo',
- 'ascend_modem_shelfno' => 'Ascend-Modem-ShelfNo',
- 'ascend_modem_slotno' => 'Ascend-Modem-SlotNo',
- 'ascend_mpp_idle_percent' => 'Ascend-MPP-Idle-Percent',
- 'ascend_mtu' => 'Ascend-MTU',
- 'ascend_multicast_client' => 'Ascend-Multicast-Client',
- 'ascend_multicast_gleave_' => 'Ascend-Multicast-GLeave-Delay',
- 'ascend_multicast_rate_li' => 'Ascend-Multicast-Rate-Limit',
- 'ascend_multilink_id' => 'Ascend-Multilink-ID',
- 'ascend_nas_port_format' => 'Ascend-NAS-Port-Format',
- 'ascend_netware_timeout' => 'Ascend-Netware-timeout',
- 'ascend_num_in_multilink' => 'Ascend-Num-In-Multilink',
- 'ascend_number_sessions' => 'Ascend-Number-Sessions',
- 'ascend_numbering_plan_id' => 'Ascend-Numbering-Plan-ID',
- 'ascend_owner_ip_addr' => 'Ascend-Owner-IP-Addr',
- 'ascend_port_redir_portnu' => 'Ascend-Port-Redir-Portnum',
- 'ascend_port_redir_protoc' => 'Ascend-Port-Redir-Protocol',
- 'ascend_port_redir_server' => 'Ascend-Port-Redir-Server',
- 'ascend_ppp_address' => 'Ascend-PPP-Address',
- 'ascend_ppp_async_map' => 'Ascend-PPP-Async-Map',
- 'ascend_ppp_vj_1172' => 'Ascend-PPP-VJ-1172',
- 'ascend_ppp_vj_slot_comp' => 'Ascend-PPP-VJ-Slot-Comp',
- 'ascend_pppoe_enable' => 'Ascend-PPPoE-Enable',
- 'ascend_pre_input_octets' => 'Ascend-Pre-Input-Octets',
- 'ascend_pre_input_packets' => 'Ascend-Pre-Input-Packets',
+ 'x_ascend_bridge' => 'X-Ascend-Bridge',
+ 'tunnel_deadtime' => 'Tunnel-Deadtime',
+ 'ms_chap_error' => 'MS-CHAP-Error',
+ 'framed_route' => 'Framed-Route',
+ 'sip_from' => 'Sip-From',
+ 'expiration' => 'Expiration',
+ 'ascend_backup' => 'Ascend-Backup',
'ascend_pre_output_octets' => 'Ascend-Pre-Output-Octets',
- 'ascend_pre_output_packet' => 'Ascend-Pre-Output-Packets',
- 'ascend_preempt_limit' => 'Ascend-Preempt-Limit',
- 'ascend_presession_time' => 'Ascend-PreSession-Time',
- 'ascend_pri_number_type' => 'Ascend-PRI-Number-Type',
+ 'ascend_calling_id_number' => 'Ascend-Calling-Id-Number-Plan',
+ 'framed_appletalk_zone' => 'Framed-AppleTalk-Zone',
+ 'annex_audit_level' => 'Annex-Audit-Level',
+ 'digest_algorithm' => 'Digest-Algorithm',
+ 'bind_auth_context' => 'Bind-Auth-Context',
+ 'ascend_user_acct_base' => 'Ascend-User-Acct-Base',
+ 'st_secondary_dns_server' => 'ST-Secondary-DNS-Server',
+ 'mcast_receive' => 'Mcast-Receive',
+ 'usr_ds0' => 'USR-DS0',
+ 'aat_atm_traffic_profile' => 'AAT-ATM-Traffic-Profile',
+ 'ms_ras_vendor' => 'MS-RAS-Vendor',
+ 'tunnel_domain' => 'Tunnel-Domain',
+ 'tunnel_max_sessions' => 'Tunnel-Max-Sessions',
+ 'ascend_ip_direct' => 'Ascend-IP-Direct',
+ 'xedia_address_pool' => 'Xedia-Address-Pool',
+ 'idle_timeout' => 'Idle-Timeout',
+ 'tunnel_rate_limit_ratf' => 'Tunnel_Rate_Limit_Rate',
+ 'annex_rate_reneg_req_sen' => 'Annex-Rate-Reneg-Req-Sent',
+ 'usr_initial_tx_link_data' => 'USR-Initial-Tx-Link-Data-Rate',
+ 'tunnel_server_auth_id' => 'Tunnel-Server-Auth-Id',
+ 'cvpn3000_ipsec_banner1' => 'CVPN3000-IPSec-Banner1',
+ 'usr_start_time' => 'USR-Start-Time',
+ 'usr_ip' => 'USR-IP',
+ 'cvpn3000_reqrd_client_fw' => 'CVPN3000-Reqrd-Client-Fw-Vendor-Code',
+ 'altiga_ipsec_secondary_d' => 'Altiga-IPSec-Secondary-Domains-G',
+ 'usr_gateway_ip_address' => 'USR-Gateway-IP-Address',
+ 'ascend_dba_monitor' => 'Ascend-DBA-Monitor',
+ 'ms_link_utilization_thre' => 'MS-Link-Utilization-Threshold',
+ 'st_primary_dns_server' => 'ST-Primary-DNS-Server',
+ 'acc_ace_token_ttl' => 'Acc-Ace-Token-Ttl',
+ 'ms_chap_domain' => 'MS-CHAP-Domain',
+ 'cisco_pre_input_octets' => 'Cisco-Pre-Input-Octets',
'ascend_primary_home_agen' => 'Ascend-Primary-Home-Agent',
- 'ascend_private_route' => 'Ascend-Private-Route',
- 'ascend_private_route_req' => 'Ascend-Private-Route-Required',
- 'ascend_private_route_tab' => 'Ascend-Private-Route-Table-ID',
- 'ascend_pw_lifetime' => 'Ascend-PW-Lifetime',
- 'ascend_pw_warntime' => 'Ascend-PW-Warntime',
- 'ascend_qos_downstream' => 'Ascend-QOS-Downstream',
- 'ascend_qos_upstream' => 'Ascend-QOS-Upstream',
- 'ascend_receive_secret' => 'Ascend-Receive-Secret',
- 'ascend_recv_name' => 'Ascend-Recv-Name',
- 'ascend_redirect_number' => 'Ascend-Redirect-Number',
- 'ascend_remote_addr' => 'Ascend-Remote-Addr',
- 'ascend_remote_fw' => 'Ascend-Remote-FW',
- 'ascend_remove_seconds' => 'Ascend-Remove-Seconds',
- 'ascend_require_auth' => 'Ascend-Require-Auth',
- 'ascend_route_appletalk' => 'Ascend-Route-Appletalk',
- 'ascend_route_ip' => 'Ascend-Route-IP',
- 'ascend_route_ipx' => 'Ascend-Route-IPX',
+ 'acct_session_time' => 'Acct-Session-Time',
+ 'framed_ip_address' => 'Framed-IP-Address',
+ 'ns_admin_privilege' => 'NS-Admin-Privilege',
+ 'medium_type' => 'Medium-Type',
+ 'acct_output_octets_64' => 'Acct-Output-Octets-64',
+ 'ascend_cir_timer' => 'Ascend-CIR-Timer',
+ 'police_rate' => 'Police-Rate',
+ 'tunnel_functioo' => 'Tunnel_Function',
+ 'quintum_h323_time_and_da' => 'Quintum-h323-time-and-day',
+ 'ip_tos_fiele' => 'IP_TOS_Field',
+ 'erx_framed_ip_route_tag' => 'ERX-Framed-Ip-Route-Tag',
+ 'ms_mppe_send_key' => 'MS-MPPE-Send-Key',
+ 'ascend_maximum_call_dura' => 'Ascend-Maximum-Call-Duration',
+ 'pppoe_motn' => 'PPPOE_MOTM',
+ 'lac_poru' => 'LAC_Port',
+ 'bind_dot1q_slou' => 'Bind_Dot1q_Slot',
'ascend_secondary_home_ag' => 'Ascend-Secondary-Home-Agent',
- 'ascend_seconds_of_histor' => 'Ascend-Seconds-Of-History',
- 'ascend_send_auth' => 'Ascend-Send-Auth',
- 'ascend_send_passwd' => 'Ascend-Send-Passwd',
- 'ascend_send_secret' => 'Ascend-Send-Secret',
- 'ascend_service_type' => 'Ascend-Service-Type',
- 'ascend_session_svr_key' => 'Ascend-Session-Svr-Key',
- 'ascend_session_type' => 'Ascend-Session-Type',
- 'ascend_shared_profile_en' => 'Ascend-Shared-Profile-Enable',
- 'ascend_source_auth' => 'Ascend-Source-Auth',
- 'ascend_source_ip_check' => 'Ascend-Source-IP-Check',
- 'ascend_svc_enabled' => 'Ascend-SVC-Enabled',
- 'ascend_target_util' => 'Ascend-Target-Util',
- 'ascend_telnet_profile' => 'Ascend-Telnet-Profile',
- 'ascend_temporary_rtes' => 'Ascend-Temporary-Rtes',
- 'ascend_third_prompt' => 'Ascend-Third-Prompt',
- 'ascend_token_expiry' => 'Ascend-Token-Expiry',
- 'ascend_token_idle' => 'Ascend-Token-Idle',
- 'ascend_token_immediate' => 'Ascend-Token-Immediate',
- 'ascend_traffic_shaper' => 'Ascend-Traffic-Shaper',
- 'ascend_transit_number' => 'Ascend-Transit-Number',
- 'ascend_ts_idle_limit' => 'Ascend-TS-Idle-Limit',
- 'ascend_ts_idle_mode' => 'Ascend-TS-Idle-Mode',
- 'ascend_tunnel_vrouter_na' => 'Ascend-Tunnel-VRouter-Name',
- 'ascend_tunneling_protoco' => 'Ascend-Tunneling-Protocol',
- 'ascend_user_acct_base' => 'Ascend-User-Acct-Base',
- 'ascend_user_acct_host' => 'Ascend-User-Acct-Host',
- 'ascend_user_acct_key' => 'Ascend-User-Acct-Key',
- 'ascend_user_acct_port' => 'Ascend-User-Acct-Port',
- 'ascend_user_acct_time' => 'Ascend-User-Acct-Time',
- 'ascend_user_acct_type' => 'Ascend-User-Acct-Type',
- 'ascend_uu_info' => 'Ascend-UU-Info',
- 'ascend_vrouter_name' => 'Ascend-VRouter-Name',
- 'ascend_x25_cug' => 'Ascend-X25-Cug',
- 'ascend_x25_nui' => 'Ascend-X25-Nui',
- 'ascend_x25_nui_password_' => 'Ascend-X25-Nui-Password-Prompt',
- 'ascend_x25_nui_prompt' => 'Ascend-X25-Nui-Prompt',
- 'ascend_x25_pad_alias_1' => 'Ascend-X25-Pad-Alias-1',
- 'ascend_x25_pad_alias_2' => 'Ascend-X25-Pad-Alias-2',
- 'ascend_x25_pad_alias_3' => 'Ascend-X25-Pad-Alias-3',
- 'ascend_x25_pad_banner' => 'Ascend-X25-Pad-Banner',
- 'ascend_x25_pad_prompt' => 'Ascend-X25-Pad-Prompt',
- 'ascend_x25_pad_x3_parame' => 'Ascend-X25-Pad-X3-Parameters',
- 'ascend_x25_pad_x3_profil' => 'Ascend-X25-Pad-X3-Profile',
- 'ascend_x25_profile_name' => 'Ascend-X25-Profile-Name',
- 'ascend_x25_reverse_charg' => 'Ascend-X25-Reverse-Charging',
- 'ascend_x25_rpoa' => 'Ascend-X25-Rpoa',
- 'ascend_x25_x121_address' => 'Ascend-X25-X121-Address',
- 'ascend_xmit_rate' => 'Ascend-Xmit-Rate',
- 'assigned_ip_address' => 'Assigned_IP_Address',
- 'assigned_ip_addrest' => 'Assigned-IP-Address',
- 'auth_type' => 'Auth-Type',
- 'autz_type' => 'Autz-Type',
- 'bg_aging_time' => 'BG_Aging_Time',
- 'bg_aging_timf' => 'BG-Aging-Time',
- 'bg_path_cost' => 'BG_Path_Cost',
- 'bg_path_cosu' => 'BG-Path-Cost',
- 'bg_span_dis' => 'BG_Span_Dis',
- 'bg_span_dit' => 'BG-Span-Dis',
- 'bg_trans_bpdu' => 'BG_Trans_BPDU',
- 'bg_trans_bpdv' => 'BG-Trans-BPDU',
- 'bind_auth_context' => 'Bind_Auth_Context',
- 'bind_auth_contexu' => 'Bind-Auth-Context',
- 'bind_auth_max_sessions' => 'Bind_Auth_Max_Sessions',
- 'bind_auth_max_sessiont' => 'Bind-Auth-Max-Sessions',
- 'bind_auth_protocol' => 'Bind_Auth_Protocol',
- 'bind_auth_protocom' => 'Bind-Auth-Protocol',
- 'bind_auth_service_grp' => 'Bind_Auth_Service_Grp',
- 'bind_auth_service_grq' => 'Bind-Auth-Service-Grp',
- 'bind_bypass_bypass' => 'Bind_Bypass_Bypass',
- 'bind_bypass_bypast' => 'Bind-Bypass-Bypass',
- 'bind_bypass_context' => 'Bind_Bypass_Context',
- 'bind_bypass_contexu' => 'Bind-Bypass-Context',
- 'bind_dot1q_port' => 'Bind_Dot1q_Port',
- 'bind_dot1q_poru' => 'Bind-Dot1q-Port',
- 'bind_dot1q_slot' => 'Bind_Dot1q_Slot',
- 'bind_dot1q_slou' => 'Bind-Dot1q-Slot',
- 'bind_dot1q_vlan_tag_id' => 'Bind_Dot1q_Vlan_Tag_Id',
- 'bind_dot1q_vlan_tag_ie' => 'Bind-Dot1q-Vlan-Tag-Id',
- 'bind_int_context' => 'Bind_Int_Context',
- 'bind_int_contexu' => 'Bind-Int-Context',
- 'bind_int_interface_name' => 'Bind_Int_Interface_Name',
- 'bind_int_interface_namf' => 'Bind-Int-Interface-Name',
- 'bind_l2tp_flow_control' => 'Bind_L2TP_Flow_Control',
- 'bind_l2tp_flow_controm' => 'Bind-L2TP-Flow-Control',
- 'bind_l2tp_tunnel_name' => 'Bind_L2TP_Tunnel_Name',
- 'bind_l2tp_tunnel_namf' => 'Bind-L2TP-Tunnel-Name',
- 'bind_ses_context' => 'Bind_Ses_Context',
- 'bind_ses_contexu' => 'Bind-Ses-Context',
- 'bind_sub_password' => 'Bind_Sub_Password',
- 'bind_sub_passwore' => 'Bind-Sub-Password',
- 'bind_sub_user_at_context' => 'Bind_Sub_User_At_Context',
- 'bind_sub_user_at_contexu' => 'Bind-Sub-User-At-Context',
- 'bind_tun_context' => 'Bind_Tun_Context',
- 'bind_tun_contexu' => 'Bind-Tun-Context',
- 'bind_type' => 'Bind_Type',
- 'bind_typf' => 'Bind-Type',
- 'bintec_bibodialtable' => 'BinTec-biboDialTable',
- 'bintec_biboppptable' => 'BinTec-biboPPPTable',
- 'bintec_ipextiftable' => 'BinTec-ipExtIfTable',
- 'bintec_ipextrttable' => 'BinTec-ipExtRtTable',
- 'bintec_ipfiltertable' => 'BinTec-ipFilterTable',
- 'bintec_ipnatpresettable' => 'BinTec-ipNatPresetTable',
- 'bintec_ipqostable' => 'BinTec-ipQoSTable',
- 'bintec_iproutetable' => 'BinTec-ipRouteTable',
- 'bintec_ipxcirctable' => 'BinTec-ipxCircTable',
- 'bintec_ipxstaticroutetab' => 'BinTec-ipxStaticRouteTable',
- 'bintec_ipxstaticservtabl' => 'BinTec-ipxStaticServTable',
- 'bintec_ospfiftable' => 'BinTec-ospfIfTable',
- 'bintec_pppextiftable' => 'BinTec-pppExtIfTable',
- 'bintec_qosiftable' => 'BinTec-qosIfTable',
- 'bintec_qospolicytable' => 'BinTec-qosPolicyTable',
- 'bintec_ripcirctable' => 'BinTec-ripCircTable',
- 'bintec_sapcirctable' => 'BinTec-sapCircTable',
- 'bridge_group' => 'Bridge_Group',
- 'bridge_grouq' => 'Bridge-Group',
- 'cabletron_protocol_calla' => 'Cabletron-Protocol-Callable',
- 'cabletron_protocol_enabl' => 'Cabletron-Protocol-Enable',
- 'call_id' => 'call-id',
- 'callback_id' => 'Callback-Id',
- 'callback_number' => 'Callback-Number',
- 'called_station_id' => 'Called-Station-Id',
- 'caller_id' => 'Caller-ID',
- 'calling_station_id' => 'Calling-Station-Id',
- 'cbbsm_bandwidth' => 'CBBSM-Bandwidth',
- 'challenge_state' => 'Challenge-State',
- 'chap_challenge' => 'CHAP-Challenge',
- 'chap_password' => 'CHAP-Password',
- 'char_noecho' => 'Char-Noecho',
- 'cisco_abort_cause' => 'Cisco-Abort-Cause',
- 'cisco_account_info' => 'Cisco-Account-Info',
- 'cisco_assign_ip_pool' => 'Cisco-Assign-IP-Pool',
- 'cisco_avpair' => 'Cisco-AVPair',
- 'cisco_call_filter' => 'Cisco-Call-Filter',
- 'cisco_call_type' => 'Cisco-Call-Type',
- 'cisco_command_code' => 'Cisco-Command-Code',
- 'cisco_control_info' => 'Cisco-Control-Info',
- 'cisco_data_filter' => 'Cisco-Data-Filter',
- 'cisco_data_rate' => 'Cisco-Data-Rate',
- 'cisco_disconnect_cause' => 'Cisco-Disconnect-Cause',
- 'cisco_email_server_ack_f' => 'Cisco-Email-Server-Ack-Flag',
- 'cisco_email_server_addre' => 'Cisco-Email-Server-Address',
- 'cisco_fax_account_id_ori' => 'Cisco-Fax-Account-Id-Origin',
- 'cisco_fax_auth_status' => 'Cisco-Fax-Auth-Status',
- 'cisco_fax_connect_speed' => 'Cisco-Fax-Connect-Speed',
- 'cisco_fax_coverpage_flag' => 'Cisco-Fax-Coverpage-Flag',
- 'cisco_fax_dsn_address' => 'Cisco-Fax-Dsn-Address',
- 'cisco_fax_dsn_flag' => 'Cisco-Fax-Dsn-Flag',
- 'cisco_fax_mdn_address' => 'Cisco-Fax-Mdn-Address',
- 'cisco_fax_mdn_flag' => 'Cisco-Fax-Mdn-Flag',
- 'cisco_fax_modem_time' => 'Cisco-Fax-Modem-Time',
- 'cisco_fax_msg_id' => 'Cisco-Fax-Msg-Id',
- 'cisco_fax_pages' => 'Cisco-Fax-Pages',
- 'cisco_fax_process_abort_' => 'Cisco-Fax-Process-Abort-Flag',
- 'cisco_fax_recipient_coun' => 'Cisco-Fax-Recipient-Count',
- 'cisco_gateway_id' => 'Cisco-Gateway-Id',
- 'cisco_idle_limit' => 'Cisco-Idle-Limit',
- 'cisco_ip_direct' => 'Cisco-IP-Direct',
- 'cisco_ip_pool_definition' => 'Cisco-IP-Pool-Definition',
- 'cisco_link_compression' => 'Cisco-Link-Compression',
- 'cisco_maximum_channels' => 'Cisco-Maximum-Channels',
- 'cisco_maximum_time' => 'Cisco-Maximum-Time',
- 'cisco_multilink_id' => 'Cisco-Multilink-ID',
- 'cisco_nas_port' => 'Cisco-NAS-Port',
- 'cisco_num_in_multilink' => 'Cisco-Num-In-Multilink',
- 'cisco_port_used' => 'Cisco-Port-Used',
- 'cisco_ppp_async_map' => 'Cisco-PPP-Async-Map',
- 'cisco_ppp_vj_slot_comp' => 'Cisco-PPP-VJ-Slot-Comp',
- 'cisco_pre_input_octets' => 'Cisco-Pre-Input-Octets',
- 'cisco_pre_input_packets' => 'Cisco-Pre-Input-Packets',
- 'cisco_pre_output_octets' => 'Cisco-Pre-Output-Octets',
- 'cisco_pre_output_packets' => 'Cisco-Pre-Output-Packets',
- 'cisco_presession_time' => 'Cisco-PreSession-Time',
- 'cisco_pw_lifetime' => 'Cisco-PW-Lifetime',
- 'cisco_route_ip' => 'Cisco-Route-IP',
- 'cisco_service_info' => 'Cisco-Service-Info',
- 'cisco_target_util' => 'Cisco-Target-Util',
- 'cisco_xmit_rate' => 'Cisco-Xmit-Rate',
- 'class' => 'Class',
- 'client_dns_pri' => 'Client_DNS_Pri',
- 'client_dns_prj' => 'Client-DNS-Pri',
- 'client_dns_sec' => 'Client_DNS_Sec',
- 'client_dns_sed' => 'Client-DNS-Sec',
- 'client_id' => 'Client-Id',
- 'client_ip_address' => 'Client-IP-Address',
- 'client_port_dnis' => 'Client-Port-DNIS',
- 'client_port_id' => 'Client-Port-Id',
- 'colubris_avpair' => 'Colubris-AVPair',
- 'configuration_token' => 'Configuration-Token',
- 'connect_info' => 'Connect-Info',
- 'connect_rate' => 'Connect-Rate',
- 'context_name' => 'Context_Name',
- 'context_namf' => 'Context-Name',
- 'crypt_password' => 'Crypt-Password',
- 'current_time' => 'Current-Time',
- 'cvpn3000_access_hours' => 'CVPN3000-Access-Hours',
- 'cvpn3000_allow_network_e' => 'CVPN3000-Allow-Network-Extension-Mode',
- 'cvpn3000_auth_server_pas' => 'CVPN3000-Auth-Server-Password',
- 'cvpn3000_auth_server_pri' => 'CVPN3000-Auth-Server-Priority',
- 'cvpn3000_auth_server_typ' => 'CVPN3000-Auth-Server-Type',
- 'cvpn3000_authd_user_idle' => 'CVPN3000-Authd-User-Idle-Timeout',
- 'cvpn3000_cisco_ip_phone_' => 'CVPN3000-Cisco-IP-Phone-Bypass',
- 'cvpn3000_dhcp_network_sc' => 'CVPN3000-DHCP-Network-Scope',
- 'cvpn3000_ike_keep_alives' => 'CVPN3000-IKE-Keep-Alives',
+ 'usr_ip_call_output_filte' => 'USR-IP-Call-Output-Filter',
+ 'x_ascend_host_info' => 'X-Ascend-Host-Info',
+ 'erx_egress_policy_name' => 'ERX-Egress-Policy-Name',
+ 'erx_ppp_password' => 'ERX-PPP-Password',
+ 'user_name' => 'User-Name',
+ 'usr_number_of_characters' => 'USR-Number-Of-Characters-Lost',
+ 'bind_bypass_bypass' => 'Bind-Bypass-Bypass',
+ 'usr_rad_multicast_routip' => 'USR-Rad-Multicast-Routing-Proto',
+ 'annex_acct_servers' => 'Annex-Acct-Servers',
+ 'cvpn5000_tunnel_throughp' => 'CVPN5000-Tunnel-Throughput',
+ 'usr_chassis_call_channel' => 'USR-Chassis-Call-Channel',
+ 'annex_input_filter' => 'Annex-Input-Filter',
+ 'wispr_billing_class_of_s' => 'WISPr-Billing-Class-Of-Service',
+ 'nas_port_type' => 'NAS-Port-Type',
+ 'cvx_client_assign_dns' => 'CVX-Client-Assign-DNS',
+ 'nomadix_maxbytesdown' => 'Nomadix-MaxBytesDown',
+ 'ascend_endpoint_disc' => 'Ascend-Endpoint-Disc',
+ 'tunnel_police_burst' => 'Tunnel-Police-Burst',
+ 'bind_auth_max_sessions' => 'Bind-Auth-Max-Sessions',
+ 'cvx_identification' => 'CVX-Identification',
'cvpn3000_ipsec_allow_pas' => 'CVPN3000-IPSec-Allow-Passwd-Store',
- 'cvpn3000_ipsec_auth_on_r' => 'CVPN3000-IPSec-Auth-On-Rekey',
- 'cvpn3000_ipsec_authentic' => 'CVPN3000-IPSec-Authentication',
- 'cvpn3000_ipsec_authoriza' => 'CVPN3000-IPSec-Authorization-Type',
- 'cvpn3000_ipsec_authorizb' => 'CVPN3000-IPSec-Authorization-Required',
- 'cvpn3000_ipsec_backup_se' => 'CVPN3000-IPSec-Backup-Servers',
- 'cvpn3000_ipsec_backup_sf' => 'CVPN3000-IPSec-Backup-Server-List',
- 'cvpn3000_ipsec_banner1' => 'CVPN3000-IPSec-Banner1',
- 'cvpn3000_ipsec_banner2' => 'CVPN3000-IPSec-Banner2',
- 'cvpn3000_ipsec_client_fw' => 'CVPN3000-IPSec-Client-Fw-Filter-Name',
- 'cvpn3000_ipsec_client_fx' => 'CVPN3000-IPSec-Client-Fw-Filter-Opt',
- 'cvpn3000_ipsec_confidenc' => 'CVPN3000-IPSec-Confidence-Level',
- 'cvpn3000_ipsec_default_d' => 'CVPN3000-IPSec-Default-Domain',
- 'cvpn3000_ipsec_dn_field' => 'CVPN3000-IPSec-DN-Field',
- 'cvpn3000_ipsec_group_nam' => 'CVPN3000-IPSec-Group-Name',
- 'cvpn3000_ipsec_ike_peer_' => 'CVPN3000-IPSec-IKE-Peer-ID-Check',
- 'cvpn3000_ipsec_ip_compre' => 'CVPN3000-IPSec-IP-Compression',
- 'cvpn3000_ipsec_ltl_keepa' => 'CVPN3000-IPSec-LTL-Keepalives',
- 'cvpn3000_ipsec_mode_conf' => 'CVPN3000-IPSec-Mode-Config',
- 'cvpn3000_ipsec_over_udp' => 'CVPN3000-IPSec-Over-UDP',
- 'cvpn3000_ipsec_over_udp_' => 'CVPN3000-IPSec-Over-UDP-Port',
+ 'ascend_calling_id_type_o' => 'Ascend-Calling-Id-Type-Of-Num',
+ 'x_ascend_fr_dce_n392' => 'X-Ascend-FR-DCE-N392',
+ 'usr_connect_term_reason' => 'USR-Connect-Term-Reason',
+ 'erx_egress_statistics' => 'ERX-Egress-Statistics',
+ 'ascend_fr_dte_n392' => 'Ascend-FR-DTE-N392',
+ 'usr_esn' => 'USR-ESN',
+ 'x_ascend_fr_dte_n392' => 'X-Ascend-FR-DTE-N392',
+ 'itk_modem_init_string' => 'ITK-Modem-Init-String',
+ 'x_ascend_fr_nailed_grp' => 'X-Ascend-FR-Nailed-Grp',
+ 'ascend_bridge_non_pppoe' => 'Ascend-Bridge-Non-PPPoE',
'cvpn3000_ipsec_reqrd_cli' => 'CVPN3000-IPSec-Reqrd-Client-Fw-Cap',
- 'cvpn3000_ipsec_sec_assoc' => 'CVPN3000-IPSec-Sec-Association',
- 'cvpn3000_ipsec_split_dns' => 'CVPN3000-IPSec-Split-DNS-Names',
- 'cvpn3000_ipsec_split_tun' => 'CVPN3000-IPSec-Split-Tunnel-List',
- 'cvpn3000_ipsec_split_tuo' => 'CVPN3000-IPSec-Split-Tunneling-Policy',
- 'cvpn3000_ipsec_tunnel_ty' => 'CVPN3000-IPSec-Tunnel-Type',
- 'cvpn3000_ipsec_user_grou' => 'CVPN3000-IPSec-User-Group-Lock',
+ 'ascend_ipx_alias' => 'Ascend-IPX-Alias',
+ 'acc_tunnel_port' => 'Acc-Tunnel-Port',
+ 'quintum_h323_return_code' => 'Quintum-h323-return-code',
'cvpn3000_l2tp_encryption' => 'CVPN3000-L2TP-Encryption',
- 'cvpn3000_l2tp_min_auth_p' => 'CVPN3000-L2TP-Min-Auth-Protocol',
- 'cvpn3000_l2tp_mppc_compr' => 'CVPN3000-L2TP-MPPC-Compression',
- 'cvpn3000_leap_bypass' => 'CVPN3000-LEAP-Bypass',
- 'cvpn3000_ms_client_icpt_' => 'CVPN3000-MS-Client-Icpt-DHCP-Conf-Msg',
- 'cvpn3000_ms_client_subne' => 'CVPN3000-MS-Client-Subnet-Mask',
- 'cvpn3000_partition_max_s' => 'CVPN3000-Partition-Max-Sessions',
- 'cvpn3000_partition_mobil' => 'CVPN3000-Partition-Mobile-IP-Key',
- 'cvpn3000_partition_mobim' => 'CVPN3000-Partition-Mobile-IP-Address',
- 'cvpn3000_partition_mobin' => 'CVPN3000-Partition-Mobile-IP-SPI',
- 'cvpn3000_partition_premi' => 'CVPN3000-Partition-Premise-Router',
- 'cvpn3000_partition_prima' => 'CVPN3000-Partition-Primary-DHCP',
- 'cvpn3000_partition_secon' => 'CVPN3000-Partition-Secondary-DHCP',
- 'cvpn3000_pptp_encryption' => 'CVPN3000-PPTP-Encryption',
- 'cvpn3000_pptp_min_auth_p' => 'CVPN3000-PPTP-Min-Auth-Protocol',
- 'cvpn3000_pptp_mppc_compr' => 'CVPN3000-PPTP-MPPC-Compression',
- 'cvpn3000_primary_dns' => 'CVPN3000-Primary-DNS',
- 'cvpn3000_primary_wins' => 'CVPN3000-Primary-WINS',
- 'cvpn3000_priority_on_sep' => 'CVPN3000-Priority-On-SEP',
- 'cvpn3000_reqrd_client_fw' => 'CVPN3000-Reqrd-Client-Fw-Vendor-Code',
- 'cvpn3000_reqrd_client_fx' => 'CVPN3000-Reqrd-Client-Fw-Product-Code',
+ 'acct_input_gigawords' => 'Acct-Input-Gigawords',
+ 'bind_dot1q_poru' => 'Bind_Dot1q_Port',
+ 'altiga_primary_wins_g' => 'Altiga-Primary-WINS-G',
+ 'ascend_maximum_channels' => 'Ascend-Maximum-Channels',
+ 'x_ascend_home_agent_pass' => 'X-Ascend-Home-Agent-Password',
+ 'x_ascend_ppp_async_map' => 'X-Ascend-PPP-Async-Map',
+ 'usr_rmmie_manufacturer_i' => 'USR-RMMIE-Manufacturer-ID',
+ 'usr_retrains_requested' => 'USR-Retrains-Requested',
+ 'x_ascend_metric' => 'X-Ascend-Metric',
+ 'acc_apsm_oversubscribed' => 'Acc-Apsm-Oversubscribed',
+ 'usr_originate_answer_mod' => 'USR-Originate-Answer-Mode',
+ 'erx_atm_pcr' => 'ERX-Atm-PCR',
+ 'itk_nas_name' => 'ITK-NAS-Name',
+ 'usr_ipx_routing' => 'USR-IPX-Routing',
+ 'usr_tunneled_mlpp' => 'USR-Tunneled-MLPP',
+ 'usr_send_script5' => 'USR-Send-Script5',
+ 'ascend_traffic_shaper' => 'Ascend-Traffic-Shaper',
+ 'ascend_client_secondarya' => 'Ascend-Client-Secondary-DNS',
+ 'ascend_bacp_enable' => 'Ascend-BACP-Enable',
+ 'usr_call_terminate_in_gm' => 'USR-Call-Terminate-in-GMT',
+ 'login_time' => 'Login-Time',
+ 'bg_path_cosu' => 'BG_Path_Cost',
+ 'aat_require_auth' => 'AAT-Require-Auth',
'cvpn3000_reqrd_client_fy' => 'CVPN3000-Reqrd-Client-Fw-Description',
- 'cvpn3000_request_auth_ve' => 'CVPN3000-Request-Auth-Vector',
- 'cvpn3000_require_hw_clie' => 'CVPN3000-Require-HW-Client-Auth',
- 'cvpn3000_require_individ' => 'CVPN3000-Require-Individual-User-Auth',
- 'cvpn3000_secondary_dns' => 'CVPN3000-Secondary-DNS',
- 'cvpn3000_secondary_wins' => 'CVPN3000-Secondary-WINS',
- 'cvpn3000_sep_card_assign' => 'CVPN3000-SEP-Card-Assignment',
- 'cvpn3000_simultaneous_lo' => 'CVPN3000-Simultaneous-Logins',
- 'cvpn3000_strip_realm' => 'CVPN3000-Strip-Realm',
- 'cvpn3000_tunneling_proto' => 'CVPN3000-Tunneling-Protocols',
- 'cvpn3000_use_client_addr' => 'CVPN3000-Use-Client-Address',
- 'cvpn3000_user_auth_serve' => 'CVPN3000-User-Auth-Server-Name',
- 'cvpn3000_user_auth_servf' => 'CVPN3000-User-Auth-Server-Port',
- 'cvpn3000_user_auth_servg' => 'CVPN3000-User-Auth-Server-Secret',
- 'cvpn5000_client_assigned' => 'CVPN5000-Client-Assigned-IP',
- 'cvpn5000_client_assignee' => 'CVPN5000-Client-Assigned-IPX',
- 'cvpn5000_client_real_ip' => 'CVPN5000-Client-Real-IP',
- 'cvpn5000_echo' => 'CVPN5000-Echo',
- 'cvpn5000_tunnel_throughp' => 'CVPN5000-Tunnel-Throughput',
- 'cvpn5000_vpn_groupinfo' => 'CVPN5000-VPN-GroupInfo',
- 'cvpn5000_vpn_password' => 'CVPN5000-VPN-Password',
- 'cvx_assign_ip_pool' => 'CVX-Assign-IP-Pool',
- 'cvx_client_assign_dns' => 'CVX-Client-Assign-DNS',
- 'cvx_data_filter' => 'CVX-Data-Filter',
- 'cvx_data_rate' => 'CVX-Data-Rate',
- 'cvx_disconnect_cause' => 'CVX-Disconnect-Cause',
- 'cvx_identification' => 'CVX-Identification',
- 'cvx_idle_limit' => 'CVX-Idle-Limit',
- 'cvx_ipsvc_aznlvl' => 'CVX-IPSVC-AZNLVL',
- 'cvx_ipsvc_mask' => 'CVX-IPSVC-Mask',
- 'cvx_maximum_channels' => 'CVX-Maximum-Channels',
- 'cvx_modem_begin_modulati' => 'CVX-Modem-Begin-Modulation',
- 'cvx_modem_begin_recv_lin' => 'CVX-Modem-Begin-Recv-Line-Lvl',
- 'cvx_modem_data_compressi' => 'CVX-Modem-Data-Compression',
+ 'ascend_call_type' => 'Ascend-Call-Type',
+ 'erx_address_pool_name' => 'ERX-Address-Pool-Name',
+ 'cvpn3000_ipsec_backup_sf' => 'CVPN3000-IPSec-Backup-Server-List',
+ 'h323_incoming_conf_id' => 'h323-incoming-conf-id',
+ 'user_profile' => 'User-Profile',
+ 'ip_host_adds' => 'Ip_Host_Addr',
+ 'ns_primary_wins' => 'NS-Primary-WINS',
+ 'packet_type' => 'Packet-Type',
+ 'bind_auth_max_sessiont' => 'Bind_Auth_Max_Sessions',
+ 'altiga_allow_alpha_only_' => 'Altiga-Allow-Alpha-Only-Passwords-G',
+ 'usr_security_resp_limit' => 'USR-Security-Resp-Limit',
+ 'ip_address_pool_name' => 'Ip-Address-Pool-Name',
+ 'ascend_ipx_node_addr' => 'Ascend-IPX-Node-Addr',
+ 'ascend_cbcp_trunk_group' => 'Ascend-CBCP-Trunk-Group',
+ 'ascend_menu_selector' => 'Ascend-Menu-Selector',
+ 'ascend_assign_ip_global_' => 'Ascend-Assign-IP-Global-Pool',
+ 'usr_ds0s' => 'USR-DS0s',
+ 'usr_actual_voltage' => 'USR-Actual-Voltage',
+ 'quintum_h323_call_type' => 'Quintum-h323-call-type',
+ 'annex_sw_version' => 'Annex-SW-Version',
+ 'ascend_receive_secret' => 'Ascend-Receive-Secret',
+ 'bintec_qospolicytable' => 'BinTec-qosPolicyTable',
+ 'usr_ip_rip_policies' => 'USR-IP-RIP-Policies',
+ 'redcreek_tunneled_ip_add' => 'RedCreek-Tunneled-IP-Addr',
+ 'ascend_pw_warntime' => 'Ascend-PW-Warntime',
+ 'x_ascend_inc_channel_cou' => 'X-Ascend-Inc-Channel-Count',
+ 'usr_blocks_resent' => 'USR-Blocks-Resent',
+ 'usr_fallback_enabled' => 'USR-Fallback-Enabled',
+ 'arap_challenge_response' => 'ARAP-Challenge-Response',
+ 'tunnel_session_auth' => 'Tunnel-Session-Auth',
+ 'usr_sync_async_mode' => 'USR-Sync-Async-Mode',
+ 'itk_dialout_type' => 'ITK-Dialout-Type',
+ 'extreme_netlogin_url' => 'Extreme-Netlogin-Url',
+ 'client_port_dnis' => 'Client-Port-DNIS',
+ 'digest_realm' => 'Digest-Realm',
+ 'ascend_ppp_vj_1172' => 'Ascend-PPP-VJ-1172',
+ 'ascend_fr_n391' => 'Ascend-FR-N391',
+ 'ascend_remote_addr' => 'Ascend-Remote-Addr',
+ 'client_port_id' => 'Client-Port-Id',
+ 'digest_body_digest' => 'Digest-Body-Digest',
+ 'le_ipsec_active_profile' => 'LE-IPSec-Active-Profile',
+ 'digest_cnonce' => 'Digest-CNonce',
+ 'usr_port_tap_facility' => 'USR-Port-Tap-Facility',
+ 'usr_callback_type' => 'USR-Callback-Type',
+ 'client_dns_prj' => 'Client_DNS_Pri',
+ 'digest_response' => 'Digest-Response',
+ 'login_lat_group' => 'Login-LAT-Group',
+ 'x_ascend_call_type' => 'X-Ascend-Call-Type',
+ 'ascend_route_ip' => 'Ascend-Route-IP',
+ 'usr_rad_multicast_routio' => 'USR-Rad-Multicast-Routing-RtLim',
+ 'usr_pw_vpn_id' => 'USR-PW_VPN_ID',
'cvx_modem_end_modulation' => 'CVX-Modem-End-Modulation',
- 'cvx_modem_end_recv_line_' => 'CVX-Modem-End-Recv-Line-Lvl',
- 'cvx_modem_error_correcti' => 'CVX-Modem-Error-Correction',
- 'cvx_modem_local_rate_neg' => 'CVX-Modem-Local-Rate-Negs',
- 'cvx_modem_local_retrains' => 'CVX-Modem-Local-Retrains',
- 'cvx_modem_remote_rate_ne' => 'CVX-Modem-Remote-Rate-Negs',
- 'cvx_modem_remote_retrain' => 'CVX-Modem-Remote-Retrains',
- 'cvx_modem_retx_packets' => 'CVX-Modem-ReTx-Packets',
- 'cvx_modem_snr' => 'CVX-Modem-SNR',
- 'cvx_modem_tx_packets' => 'CVX-Modem-Tx-Packets',
- 'cvx_multicast_client' => 'CVX-Multicast-Client',
- 'cvx_multicast_rate_limit' => 'CVX-Multicast-Rate-Limit',
- 'cvx_multilink_group_numb' => 'CVX-Multilink-Group-Number',
- 'cvx_multilink_match_info' => 'CVX-Multilink-Match-Info',
- 'cvx_ppp_address' => 'CVX-PPP-Address',
- 'cvx_ppp_log_mask' => 'CVX-PPP-Log-Mask',
- 'cvx_presession_time' => 'CVX-PreSession-Time',
- 'cvx_primary_dns' => 'CVX-Primary-DNS',
- 'cvx_radius_redirect' => 'CVX-Radius-Redirect',
- 'cvx_secondary_dns' => 'CVX-Secondary-DNS',
- 'cvx_ss7_session_id_type' => 'CVX-SS7-Session-ID-Type',
- 'cvx_vpop_id' => 'CVX-VPOP-ID',
- 'cvx_xmit_rate' => 'CVX-Xmit-Rate',
- 'dhcp_max_leases' => 'DHCP_Max_Leases',
- 'dhcp_max_leaset' => 'DHCP-Max-Leases',
- 'dialback_name' => 'Dialback-Name',
- 'dialback_no' => 'Dialback-No',
- 'digest_algorithm' => 'Digest-Algorithm',
- 'digest_attributes' => 'Digest-Attributes',
- 'digest_body_digest' => 'Digest-Body-Digest',
- 'digest_cnonce' => 'Digest-CNonce',
- 'digest_method' => 'Digest-Method',
- 'digest_nonce' => 'Digest-Nonce',
- 'digest_nonce_count' => 'Digest-Nonce-Count',
- 'digest_qop' => 'Digest-QOP',
- 'digest_realm' => 'Digest-Realm',
- 'digest_response' => 'Digest-Response',
- 'digest_uri' => 'Digest-URI',
- 'digest_user_name' => 'Digest-User-Name',
- 'eap_code' => 'EAP-Code',
- 'eap_id' => 'EAP-Id',
- 'eap_md5_password' => 'EAP-MD5-Password',
- 'eap_message' => 'EAP-Message',
- 'eap_sim_any_id_req' => 'EAP-Sim-ANY_ID_REQ',
- 'eap_sim_checkcode' => 'EAP-Sim-CHECKCODE',
- 'eap_sim_counter' => 'EAP-Sim-COUNTER',
- 'eap_sim_counter_too_smal' => 'EAP-Sim-COUNTER_TOO_SMALL',
- 'eap_sim_encr_data' => 'EAP-Sim-ENCR_DATA',
- 'eap_sim_extra' => 'EAP-Sim-EXTRA',
- 'eap_sim_fullauth_id_req' => 'EAP-Sim-FULLAUTH_ID_REQ',
- 'eap_sim_hmac' => 'EAP-Sim-HMAC',
- 'eap_sim_identity' => 'EAP-Sim-IDENTITY',
- 'eap_sim_imsi' => 'EAP-Sim-IMSI',
- 'eap_sim_iv' => 'EAP-Sim-IV',
- 'eap_sim_kc1' => 'EAP-Sim-KC1',
- 'eap_sim_kc2' => 'EAP-Sim-KC2',
- 'eap_sim_kc3' => 'EAP-Sim-KC3',
- 'eap_sim_key' => 'EAP-Sim-KEY',
- 'eap_sim_mac' => 'EAP-Sim-MAC',
- 'eap_sim_next_pseudonum' => 'EAP-Sim-NEXT_PSEUDONUM',
- 'eap_sim_next_reauth_id' => 'EAP-Sim-NEXT_REAUTH_ID',
- 'eap_sim_nonce_mt' => 'EAP-Sim-NONCE_MT',
- 'eap_sim_nonce_s' => 'EAP-Sim-NONCE_S',
- 'eap_sim_notification' => 'EAP-Sim-NOTIFICATION',
- 'eap_sim_padding' => 'EAP-Sim-PADDING',
- 'eap_sim_permanent_id_req' => 'EAP-Sim-PERMANENT_ID_REQ',
- 'eap_sim_rand' => 'EAP-Sim-RAND',
- 'eap_sim_rand1' => 'EAP-Sim-Rand1',
- 'eap_sim_rand2' => 'EAP-Sim-Rand2',
- 'eap_sim_rand3' => 'EAP-Sim-Rand3',
- 'eap_sim_selected_version' => 'EAP-Sim-SELECTED_VERSION',
- 'eap_sim_sres1' => 'EAP-Sim-SRES1',
- 'eap_sim_sres2' => 'EAP-Sim-SRES2',
- 'eap_sim_sres3' => 'EAP-Sim-SRES3',
- 'eap_sim_state' => 'EAP-Sim-State',
- 'eap_sim_subtype' => 'EAP-Sim-Subtype',
- 'eap_sim_version_list' => 'EAP-Sim-VERSION_LIST',
- 'eap_tls_require_client_c' => 'EAP-TLS-Require-Client-Cert',
- 'eap_type' => 'EAP-Type',
- 'eap_type_gtc' => 'EAP-Type-GTC',
- 'eap_type_identity' => 'EAP-Type-Identity',
- 'eap_type_leap' => 'EAP-Type-LEAP',
- 'eap_type_md5' => 'EAP-Type-MD5',
- 'eap_type_nak' => 'EAP-Type-NAK',
- 'eap_type_notification' => 'EAP-Type-Notification',
- 'eap_type_otp' => 'EAP-Type-OTP',
- 'eap_type_peap' => 'EAP-Type-PEAP',
- 'eap_type_sim' => 'EAP-Type-SIM',
- 'eap_type_sim2' => 'EAP-Type-SIM2',
- 'eap_type_tls' => 'EAP-Type-TLS',
- 'eap_type_ttls' => 'EAP-Type-TTLS',
- 'error_cause' => 'Error-Cause',
- 'erx_address_pool_name' => 'ERX-Address-Pool-Name',
- 'erx_alternate_cli_access' => 'ERX-Alternate-Cli-Access-Level',
- 'erx_alternate_cli_vroute' => 'ERX-Alternate-Cli-Vrouter-Name',
- 'erx_atm_mbs' => 'ERX-Atm-MBS',
- 'erx_atm_pcr' => 'ERX-Atm-PCR',
- 'erx_atm_scr' => 'ERX-Atm-SCR',
- 'erx_atm_service_category' => 'ERX-Atm-Service-Category',
- 'erx_bearer_type' => 'ERX-Bearer-Type',
- 'erx_cli_allow_all_vr_acc' => 'ERX-Cli-Allow-All-VR-Access',
- 'erx_cli_initial_access_l' => 'ERX-Cli-Initial-Access-Level',
- 'erx_dial_out_number' => 'ERX-Dial-Out-Number',
- 'erx_egress_policy_name' => 'ERX-Egress-Policy-Name',
- 'erx_egress_statistics' => 'ERX-Egress-Statistics',
- 'erx_framed_ip_route_tag' => 'ERX-Framed-Ip-Route-Tag',
- 'erx_igmp_enable' => 'ERX-Igmp-Enable',
- 'erx_ingress_policy_name' => 'ERX-Ingress-Policy-Name',
- 'erx_ingress_statistics' => 'ERX-Ingress-Statistics',
- 'erx_input_gigapkts' => 'ERX-Input-Gigapkts',
- 'erx_ipv6_local_interface' => 'ERX-IpV6-Local-Interface',
- 'erx_ipv6_primary_dns' => 'ERX-Ipv6-Primary-Dns',
- 'erx_ipv6_secondary_dns' => 'ERX-Ipv6-Secondary-Dns',
- 'erx_ipv6_virtual_router' => 'ERX-IpV6-Virtual-Router',
- 'erx_local_loopback_inter' => 'ERX-Local-Loopback-Interface',
- 'erx_maximum_bps' => 'ERX-Maximum-BPS',
- 'erx_minimum_bps' => 'ERX-Minimum-BPS',
- 'erx_output_gigapkts' => 'ERX-Output-Gigapkts',
- 'erx_ppp_auth_protocol' => 'ERX-PPP-Auth-Protocol',
- 'erx_ppp_password' => 'ERX-PPP-Password',
- 'erx_ppp_username' => 'ERX-PPP-Username',
- 'erx_pppoe_description' => 'ERX-Pppoe-Description',
- 'erx_pppoe_max_sessions' => 'ERX-Pppoe-Max-Sessions',
- 'erx_pppoe_url' => 'ERX-Pppoe-Url',
- 'erx_primary_dns' => 'ERX-Primary-Dns',
- 'erx_primary_wins' => 'ERX-Primary-Wins',
- 'erx_qos_profile_interfac' => 'ERX-Qos-Profile-Interface-Type',
- 'erx_qos_profile_name' => 'ERX-Qos-Profile-Name',
- 'erx_redirect_vr_name' => 'ERX-Redirect-VR-Name',
- 'erx_sa_validate' => 'ERX-Sa-Validate',
- 'erx_secondary_dns' => 'ERX-Secondary-Dns',
- 'erx_secondary_wins' => 'ERX-Secondary-Wins',
- 'erx_service_bundle' => 'ERX-Service-Bundle',
- 'erx_tunnel_interface_id' => 'ERX-Tunnel-Interface-Id',
- 'erx_tunnel_maximum_sessi' => 'ERX-Tunnel-Maximum-Sessions',
+ 'cvpn3000_pptp_mppc_compr' => 'CVPN3000-PPTP-MPPC-Compression',
+ 'cisco_pre_output_octets' => 'Cisco-Pre-Output-Octets',
+ 'h323_billing_model' => 'h323-billing-model',
+ 'usr_equalization_type' => 'USR-Equalization-Type',
+ 'acc_clearing_cause' => 'Acc-Clearing-Cause',
+ 'altiga_access_hours_g_u' => 'Altiga-Access-Hours-G/U',
+ 'cvpn3000_ipsec_user_grou' => 'CVPN3000-IPSec-User-Group-Lock',
+ 'x_ascend_menu_selector' => 'X-Ascend-Menu-Selector',
+ 'x_ascend_netware_timeout' => 'X-Ascend-Netware-timeout',
+ 'ascend_fr_linkup' => 'Ascend-FR-LinkUp',
+ 'annex_num_in_multilink' => 'Annex-Num-In-Multilink',
+ 'police_burst' => 'Police-Burst',
+ 'altiga_l2tp_min_authenti' => 'Altiga-L2TP-Min-Authentication-G/U',
+ 'ascend_filter_required' => 'Ascend-Filter-Required',
+ 'x_ascend_idle_limit' => 'X-Ascend-Idle-Limit',
+ 'nomadix_logoff_url' => 'Nomadix-Logoff-URL',
+ 'cvpn3000_ms_client_icpt_' => 'CVPN3000-MS-Client-Icpt-DHCP-Conf-Msg',
+ 'ip_tos_field' => 'IP-TOS-Field',
+ 'ascend_ip_tos_apply_to' => 'Ascend-IP-TOS-Apply-To',
+ 'usr_call_event_code' => 'USR-Call-Event-Code',
+ 'usr_et_bridge_output_fil' => 'USR-ET-Bridge-Output-Filter',
+ 'le_nat_sess_dir_fail_act' => 'LE-NAT-Sess-Dir-Fail-Action',
+ 'usr_rmmie_product_code' => 'USR-RMMIE-Product-Code',
+ 'usr_host_type' => 'USR-Host-Type',
+ 'erx_tunnel_interface_id' => 'ERX-Tunnel-Interface-Id',
+ 'ascend_send_auth' => 'Ascend-Send-Auth',
+ 'shiva_compression_type' => 'Shiva-Compression-Type',
+ 'itk_banner' => 'ITK-Banner',
+ 'ascend_ft1_caller' => 'Ascend-FT1-Caller',
+ 'filter_id' => 'Filter-Id',
+ 'annex_pre_output_octets' => 'Annex-Pre-Output-Octets',
+ 'acct_mcast_in_octett' => 'Acct_Mcast_In_Octets',
+ 'usr_log_filter_packets' => 'USR-Log-Filter-Packets',
+ 'ascend_fr_nailed_grp' => 'Ascend-FR-Nailed-Grp',
+ 'ascend_atm_loopback_cell' => 'Ascend-ATM-Loopback-Cell-Loss',
+ 'usr_at_rtmp_output_filte' => 'USR-AT-RTMP-Output-Filter',
+ 'acc_input_errors' => 'Acc-Input-Errors',
+ 'x_ascend_user_acct_port' => 'X-Ascend-User-Acct-Port',
+ 'erx_secondary_wins' => 'ERX-Secondary-Wins',
+ 'usr_rmmie_serial_number' => 'USR-RMMIE-Serial-Number',
+ 'usr_et_bridge_input_filt' => 'USR-ET-Bridge-Input-Filter',
+ 'ns_primary_dns' => 'NS-Primary-DNS',
+ 'usr_slot_connected_to' => 'USR-Slot-Connected-To',
+ 'shiva_disconnect_reason' => 'Shiva-Disconnect-Reason',
+ 'cvpn5000_client_assignee' => 'CVPN5000-Client-Assigned-IPX',
+ 'cvx_radius_redirect' => 'CVX-Radius-Redirect',
+ 'usr_receive_acc_map' => 'USR-Receive-Acc-Map',
+ 'x_ascend_tunneling_proto' => 'X-Ascend-Tunneling-Protocol',
+ 'itk_acct_serv_ip' => 'ITK-Acct-Serv-IP',
+ 'ascend_fr_type' => 'Ascend-FR-Type',
+ 'ascend_client_assign_dns' => 'Ascend-Client-Assign-DNS',
+ 'annex_retrain_requests_r' => 'Annex-Retrain-Requests-Rcvd',
+ 'x_ascend_assign_ip_globa' => 'X-Ascend-Assign-IP-Global-Pool',
+ 'tunnel_client_endpoint' => 'Tunnel-Client-Endpoint',
+ 'alteon_service_type' => 'Alteon-Service-Type',
+ 'x_ascend_send_secret' => 'X-Ascend-Send-Secret',
+ 'x_ascend_call_filter' => 'X-Ascend-Call-Filter',
+ 'usr_ipx_rip_input_filter' => 'USR-IPX-RIP-Input-Filter',
+ 'x_ascend_maximum_time' => 'X-Ascend-Maximum-Time',
+ 'pvc_profile_name' => 'PVC-Profile-Name',
+ 'usr_framed_ip_address_po' => 'USR-Framed_IP_Address_Pool_Name',
+ 'cvpn3000_ipsec_split_dns' => 'CVPN3000-IPSec-Split-DNS-Names',
+ 'ascend_global_call_id' => 'Ascend-Global-Call-Id',
+ 'usr_initial_rx_link_data' => 'USR-Initial-Rx-Link-Data-Rate',
+ 'st_primary_nbns_server' => 'ST-Primary-NBNS-Server',
+ 'usr_number_of_rings_limi' => 'USR-Number-of-Rings-Limit',
+ 'tunnel_local_name' => 'Tunnel-Local-Name',
+ 'ascend_fr_t392' => 'Ascend-FR-T392',
+ 'annex_pool_id' => 'Annex-Pool-Id',
+ 'ascend_token_immediate' => 'Ascend-Token-Immediate',
+ 'usr_rmmie_firmware_build' => 'USR-RMMIE-Firmware-Build-Date',
+ 'wispr_bandwidth_min_down' => 'WISPr-Bandwidth-Min-Down',
+ 'usr_chassis_call_slot' => 'USR-Chassis-Call-Slot',
+ 'rate_limit_burst' => 'Rate-Limit-Burst',
+ 'cisco_route_ip' => 'Cisco-Route-IP',
+ 'xedia_netbios_server' => 'Xedia-NetBios-Server',
+ 'session_error_msg' => 'Session-Error-Msg',
+ 'dhcp_max_leases' => 'DHCP-Max-Leases',
+ 'acc_vpsm_reject_cause' => 'Acc-Vpsm-Reject-Cause',
+ 'user_category' => 'User-Category',
+ 'x_ascend_multicast_rate_' => 'X-Ascend-Multicast-Rate-Limit',
+ 'cvpn3000_ipsec_auth_on_r' => 'CVPN3000-IPSec-Auth-On-Rekey',
+ 'altiga_min_password_leng' => 'Altiga-Min-Password-Length-G',
+ 'bind_type' => 'Bind-Type',
+ 'ascend_tunneling_protoco' => 'Ascend-Tunneling-Protocol',
+ 'cvx_modem_retx_packets' => 'CVX-Modem-ReTx-Packets',
+ 'usr_framed_ipx_route' => 'USR-Framed-IPX-Route',
+ 'rate_limit_rate' => 'Rate-Limit-Rate',
+ 'ascend_atm_connect_vpi' => 'Ascend-ATM-Connect-Vpi',
+ 'connect_info' => 'Connect-Info',
+ 'usr_port_tap_address' => 'USR-Port-Tap-Address',
+ 'usr_simplified_mnp_level' => 'USR-Simplified-MNP-Levels',
+ 'mcast_receivf' => 'Mcast_Receive',
+ 'annex_begin_modulation' => 'Annex-Begin-Modulation',
+ 'usr_pw_usr_ifilter_ip' => 'USR-PW_USR_IFilter_IP',
+ 'ascend_route_appletalk' => 'Ascend-Route-Appletalk',
+ 'ms_chap_lm_enc_pw' => 'MS-CHAP-LM-Enc-PW',
+ 'altiga_ipsec_over_nat_po' => 'Altiga-IPSec-Over-NAT-Port-Num-G',
+ 'itk_isdn_prot' => 'ITK-ISDN-Prot',
+ 'ascend_callback_delay' => 'Ascend-Callback-Delay',
+ 'session_error_code' => 'Session-Error-Code',
+ 'nomadix_endofsession' => 'Nomadix-EndofSession',
+ 'x_ascend_bacp_enable' => 'X-Ascend-BACP-Enable',
+ 'bg_trans_bpdu' => 'BG-Trans-BPDU',
+ 'bind_int_interface_namf' => 'Bind_Int_Interface_Name',
+ 'foundry_privilege_level' => 'Foundry-Privilege-Level',
+ 'huntgroup_name' => 'Huntgroup-Name',
+ 'x_ascend_ipx_alias' => 'X-Ascend-IPX-Alias',
+ 'tunnel_l2f_second_passwp' => 'Tunnel_L2F_Second_Password',
+ 'xedia_dns_server' => 'Xedia-DNS-Server',
+ 'usr_ipx_wan' => 'USR-IPX-WAN',
+ 'annex_addr_resolution_se' => 'Annex-Addr-Resolution-Servers',
+ 'acct_output_octets_65' => 'Acct_Output_Octets_64',
+ 'menu' => 'Menu',
'erx_tunnel_nas_port_meth' => 'ERX-Tunnel-Nas-Port-Method',
- 'erx_tunnel_password' => 'ERX-Tunnel-Password',
- 'erx_tunnel_tos' => 'ERX-Tunnel-Tos',
+ 'aat_output_octets_diff' => 'AAT-Output-Octets-Diff',
+ 'x_ascend_fr_direct_dlci' => 'X-Ascend-FR-Direct-DLCI',
+ 'acct_status_type' => 'Acct-Status-Type',
+ 'ascend_port_redir_server' => 'Ascend-Port-Redir-Server',
+ 'telebit_port_name' => 'Telebit-Port-Name',
+ 'acc_dns_server_sec' => 'Acc-Dns-Server-Sec',
+ 'cvx_modem_remote_retrain' => 'CVX-Modem-Remote-Retrains',
+ 'ascend_minimum_channels' => 'Ascend-Minimum-Channels',
+ 'ascend_ipx_route' => 'Ascend-IPX-Route',
+ 'ascend_telnet_profile' => 'Ascend-Telnet-Profile',
+ 'usr_call_connect_in_gmt' => 'USR-Call-Connect-in-GMT',
+ 'usr_cusr_hat_script_rule' => 'USR-CUSR-hat-Script-Rules',
+ 'x_ascend_dba_monitor' => 'X-Ascend-DBA-Monitor',
+ 'response_packet_type' => 'Response-Packet-Type',
+ 'usr_event_id' => 'USR-Event-Id',
+ 'cvpn3000_ipsec_over_udp_' => 'CVPN3000-IPSec-Over-UDP-Port',
+ 'ascend_inc_channel_count' => 'Ascend-Inc-Channel-Count',
+ 'usr_send_script3' => 'USR-Send-Script3',
+ 'annex_pre_input_packets' => 'Annex-Pre-Input-Packets',
+ 'framed_callback_id' => 'Framed-Callback-Id',
+ 'xedia_client_access_netw' => 'Xedia-Client-Access-Network',
+ 'arap_zone_access' => 'ARAP-Zone-Access',
+ 'ascend_port_redir_portnu' => 'Ascend-Port-Redir-Portnum',
+ 'service_type' => 'Service-Type',
+ 'usr_nfas_id' => 'USR-NFAS-ID',
+ 'shiva_calling_number' => 'Shiva-Calling-Number',
+ 'ascend_user_acct_host' => 'Ascend-User-Acct-Host',
+ 'tunnel_session_auth_serv' => 'Tunnel-Session-Auth-Service-Grp',
+ 'juniper_deny_commands' => 'Juniper-Deny-Commands',
+ 'ascend_fr_link_mgt' => 'Ascend-FR-Link-Mgt',
+ 'nokia_imsi' => 'Nokia-IMSI',
+ 'quintum_h323_prompt_id' => 'Quintum-h323-prompt-id',
+ 'cvpn3000_require_individ' => 'CVPN3000-Require-Individual-User-Auth',
+ 'tunnel_retransmiu' => 'Tunnel_Retransmit',
+ 'source_validatioo' => 'Source_Validation',
+ 'sip_to' => 'Sip-To',
+ 'ms_primary_nbns_server' => 'MS-Primary-NBNS-Server',
+ 'quintum_avpair' => 'Quintum-AVPair',
+ 'ascend_transit_number' => 'Ascend-Transit-Number',
+ 'ascend_cache_refresh' => 'Ascend-Cache-Refresh',
+ 'ascend_user_acct_type' => 'Ascend-User-Acct-Type',
+ 'usr_num_fax_pages_proces' => 'USR-Num-Fax-Pages-Processed',
+ 'usr_mic' => 'USR-MIC',
+ 'usr_failure_to_connect_r' => 'USR-Failure-to-Connect-Reason',
+ 'cisco_fax_auth_status' => 'Cisco-Fax-Auth-Status',
+ 'bind_dot1q_vlan_tag_ie' => 'Bind_Dot1q_Vlan_Tag_Id',
+ 'ms_chap2_success' => 'MS-CHAP2-Success',
'erx_tunnel_virtual_route' => 'ERX-Tunnel-Virtual-Router',
- 'erx_virtual_router_name' => 'ERX-Virtual-Router-Name',
- 'event_timestamp' => 'Event-Timestamp',
- 'exec_program' => 'Exec-Program',
- 'exec_program_wait' => 'Exec-Program-Wait',
- 'expiration' => 'Expiration',
- 'extreme_netlogin_only' => 'Extreme-Netlogin-Only',
- 'extreme_netlogin_url' => 'Extreme-Netlogin-Url',
+ 'cisco_idle_limit' => 'Cisco-Idle-Limit',
+ 'ascend_pw_lifetime' => 'Ascend-PW-Lifetime',
+ 'cvpn3000_access_hours' => 'CVPN3000-Access-Hours',
+ 'bintec_sapcirctable' => 'BinTec-sapCircTable',
+ 'usr_packet_bus_session' => 'USR-Packet-Bus-Session',
+ 'acct_input_packets_64' => 'Acct-Input-Packets-64',
+ 'ascend_x25_pad_x3_parame' => 'Ascend-X25-Pad-X3-Parameters',
+ 'usr_secondary_nbns_serve' => 'USR-Secondary_NBNS_Server',
+ 'ascend_modem_slotno' => 'Ascend-Modem-SlotNo',
+ 'digest_qop' => 'Digest-QOP',
+ 'usr_characters_received' => 'USR-Characters-Received',
+ 'rate_limit_ratf' => 'Rate_Limit_Rate',
+ 'ms_bap_usage' => 'MS-BAP-Usage',
+ 'cisco_data_filter' => 'Cisco-Data-Filter',
+ 'usr_simplified_v42bis_us' => 'USR-Simplified-V42bis-Usage',
+ 'h323_setup_time' => 'h323-setup-time',
+ 'annex_wan_number' => 'Annex-Wan-Number',
+ 'cvx_vpop_id' => 'CVX-VPOP-ID',
+ 'usr_pw_tunnel_authentica' => 'USR-PW_Tunnel_Authentication',
+ 'le_nat_outsource_inmap' => 'LE-NAT-Outsource-Inmap',
+ 'cvx_modem_begin_recv_lin' => 'CVX-Modem-Begin-Recv-Line-Lvl',
+ 'telebit_login_command' => 'Telebit-Login-Command',
+ 'cisco_command_code' => 'Cisco-Command-Code',
+ 'itk_ppp_auth_type' => 'ITK-PPP-Auth-Type',
+ 'bintec_qosiftable' => 'BinTec-qosIfTable',
+ 'x_ascend_mpp_idle_percen' => 'X-Ascend-MPP-Idle-Percent',
+ 'usr_sap_filter_in' => 'USR-SAP-Filter-In',
+ 'framed_appletalk_link' => 'Framed-AppleTalk-Link',
+ 'tunnel_domaio' => 'Tunnel_Domain',
+ 'usr_ipx' => 'USR-IPX',
+ 'nas_real_poru' => 'NAS_Real_Port',
+ 'shiva_connect_reason' => 'Shiva-Connect-Reason',
+ 'x_ascend_pre_output_octe' => 'X-Ascend-Pre-Output-Octets',
+ 'cisco_ppp_vj_slot_comp' => 'Cisco-PPP-VJ-Slot-Comp',
+ 'freeradius_proxied_to' => 'Freeradius-Proxied-To',
+ 'ascend_atm_vpi' => 'Ascend-ATM-Vpi',
+ 'acc_ml_mlx_admin_state' => 'Acc-ML-MLX-Admin-State',
+ 'cvx_modem_snr' => 'CVX-Modem-SNR',
+ 'usr_igmp_robustness' => 'USR-IGMP-Robustness',
+ 'annex_rate_reneg_req_rcv' => 'Annex-Rate-Reneg-Req-Rcvd',
+ 'add_prefix' => 'Add-Prefix',
+ 'x_ascend_call_by_call' => 'X-Ascend-Call-By-Call',
+ 'usr_last_callers_number_' => 'USR-Last-Callers-Number-ANI',
+ 'postauth_type' => 'PostAuth-Type',
+ 'pvc_circuit_paddinh' => 'PVC_Circuit_Padding',
+ 'usr_at_rtmp_input_filter' => 'USR-AT-RTMP-Input-Filter',
+ 'erx_igmp_enable' => 'ERX-Igmp-Enable',
+ 'bind_bypass_contexu' => 'Bind_Bypass_Context',
+ 'x_ascend_num_in_multilin' => 'X-Ascend-Num-In-Multilink',
+ 'usr_pw_packet' => 'USR-PW_Packet',
+ 'dialback_no' => 'Dialback-No',
+ 'ascend_ip_tos_precedence' => 'Ascend-IP-TOS-Precedence',
+ 'cvpn5000_vpn_password' => 'CVPN5000-VPN-Password',
+ 'annex_cli_filter' => 'Annex-CLI-Filter',
+ 'x_ascend_dial_number' => 'X-Ascend-Dial-Number',
+ 'usr_iwf_call_identifier' => 'USR-IWF-Call-Identifier',
+ 'ms_secondary_dns_server' => 'MS-Secondary-DNS-Server',
+ 'shiva_type_of_service' => 'Shiva-Type-Of-Service',
+ 'bind_ses_context' => 'Bind-Ses-Context',
+ 'acc_reason_code' => 'Acc-Reason-Code',
+ 'ms_chap_cpw_1' => 'MS-CHAP-CPW-1',
+ 'wispr_bandwidth_max_down' => 'WISPr-Bandwidth-Max-Down',
+ 'h323_call_type' => 'h323-call-type',
+ 'bind_bypass_bypast' => 'Bind_Bypass_Bypass',
+ 'usr_number_of_link_timeo' => 'USR-Number-of-Link-Timeouts',
+ 'ascend_fr_08_mode' => 'Ascend-FR-08-Mode',
+ 'usr_calling_party_number' => 'USR-Calling-Party-Number',
+ 'usr_reply_script2' => 'USR-Reply-Script2',
+ 'usr_security_login_limit' => 'USR-Security-Login-Limit',
+ 'cisco_link_compression' => 'Cisco-Link-Compression',
+ 'ascend_vrouter_name' => 'Ascend-VRouter-Name',
+ 'erx_ppp_auth_protocol' => 'ERX-PPP-Auth-Protocol',
+ 'x_ascend_call_block_dura' => 'X-Ascend-Call-Block-Duration',
+ 'usr_modem_setup_time' => 'USR-Modem-Setup-Time',
+ 'pppoe_urm' => 'PPPOE_URL',
+ 'cisco_ip_direct' => 'Cisco-IP-Direct',
+ 'x_ascend_temporary_rtes' => 'X-Ascend-Temporary-Rtes',
+ 'ascend_x25_pad_alias_3' => 'Ascend-X25-Pad-Alias-3',
+ 'annex_multilink_id' => 'Annex-Multilink-Id',
+ 'mcast_maxgroupt' => 'Mcast_MaxGroups',
+ 'configuration_token' => 'Configuration-Token',
+ 'ascend_h323_conference_i' => 'Ascend-H323-Conference-Id',
+ 'ascend_ipx_header_compre' => 'Ascend-IPX-Header-Compression',
+ 'stripped_user_name' => 'Stripped-User-Name',
+ 'usr_ipx_rip_output_filte' => 'USR-IPX-RIP-Output-Filter',
+ 'cisco_call_filter' => 'Cisco-Call-Filter',
+ 'nas_ipv6_address' => 'NAS-IPv6-Address',
+ 'termination_menu' => 'Termination-Menu',
+ 'ascend_shared_profile_en' => 'Ascend-Shared-Profile-Enable',
+ 'port_message' => 'Port-Message',
+ 'erx_ingress_policy_name' => 'ERX-Ingress-Policy-Name',
+ 'acc_service_profile' => 'Acc-Service-Profile',
+ 'ascend_bir_proxy' => 'Ascend-BIR-Proxy',
+ 'aat_ppp_address' => 'AAT-PPP-Address',
+ 'usr_mbi_ct_pri_card_span' => 'USR-Mbi_Ct_PRI_Card_Span_Line',
+ 'ascend_x25_nui_prompt' => 'Ascend-X25-Nui-Prompt',
+ 'itk_modem_pool_id' => 'ITK-Modem-Pool-Id',
+ 'usr_compression_reset_mo' => 'USR-Compression-Reset-Mode',
+ 'usr_unauthenticated_time' => 'USR-Unauthenticated-Time',
+ 'ascend_multicast_gleave_' => 'Ascend-Multicast-GLeave-Delay',
+ 'acc_callback_cbcp_type' => 'Acc-Callback-CBCP-Type',
+ 'medium_typf' => 'Medium_Type',
+ 'login_service' => 'Login-Service',
+ 'itk_username_prompt' => 'ITK-Username-Prompt',
+ 'ascend_dial_number' => 'Ascend-Dial-Number',
+ 'framed_ipv6_route' => 'Framed-IPv6-Route',
+ 'x_ascend_remote_addr' => 'X-Ascend-Remote-Addr',
+ 'usr_call_end_date_time' => 'USR-Call-End-Date-Time',
+ 'bind_dot1q_slot' => 'Bind-Dot1q-Slot',
+ 'le_connect_detail' => 'LE-Connect-Detail',
+ 'annex_user_level' => 'Annex-User-Level',
+ 'tunnel_dnis' => 'Tunnel-DNIS',
+ 'assigned_ip_address' => 'Assigned-IP-Address',
+ 'acc_bridging_support' => 'Acc-Bridging-Support',
+ 'usr_channel' => 'USR-Channel',
+ 'arap_security_data' => 'ARAP-Security-Data',
+ 'bind_auth_service_grp' => 'Bind-Auth-Service-Grp',
+ 'cisco_abort_cause' => 'Cisco-Abort-Cause',
+ 'bg_span_dit' => 'BG_Span_Dis',
+ 'h323_voice_quality' => 'h323-voice-quality',
+ 'lac_real_port_typf' => 'LAC_Real_Port_Type',
+ 'usr_channel_connected_to' => 'USR-Channel-Connected-To',
+ 'ascend_client_assign_win' => 'Ascend-Client-Assign-WINS',
+ 'redcreek_tunneled_gatewa' => 'RedCreek-Tunneled-Gateway',
+ 'usr_number_of_fallbacks' => 'USR-Number-of-Fallbacks',
+ 'nokia_prepaid_ind' => 'Nokia-Prepaid-Ind',
+ 'nomadix_maxbytesup' => 'Nomadix-MaxBytesUp',
+ 'login_hosu' => 'Login-Host',
+ 'ascend_bir_enable' => 'Ascend-BIR-Enable',
+ 'usr_connect_time_limit' => 'USR-Connect-Time-Limit',
+ 'ascend_presession_time' => 'Ascend-PreSession-Time',
+ 'altiga_simultaneous_logi' => 'Altiga-Simultaneous-Logins-G/U',
+ 'cvpn3000_ipsec_default_d' => 'CVPN3000-IPSec-Default-Domain',
+ 'aat_atm_vci' => 'AAT-ATM-VCI',
'extreme_netlogin_url_des' => 'Extreme-Netlogin-Url-Desc',
- 'extreme_netlogin_vlan' => 'Extreme-Netlogin-Vlan',
- 'fall_through' => 'Fall-Through',
- 'filter_id' => 'Filter-Id',
- 'foundry_command_exceptio' => 'Foundry-Command-Exception-Flag',
- 'foundry_command_string' => 'Foundry-Command-String',
- 'foundry_inm_privilege' => 'Foundry-INM-Privilege',
- 'foundry_privilege_level' => 'Foundry-Privilege-Level',
- 'framed_address' => 'Framed-Address',
- 'framed_appletalk_link' => 'Framed-AppleTalk-Link',
- 'framed_appletalk_network' => 'Framed-AppleTalk-Network',
- 'framed_appletalk_zone' => 'Framed-AppleTalk-Zone',
- 'framed_callback_id' => 'Framed-Callback-Id',
- 'framed_compression' => 'Framed-Compression',
- 'framed_filter_id' => 'Framed-Filter-Id',
- 'framed_interface_id' => 'Framed-Interface-Id',
- 'framed_ip_address' => 'Framed-IP-Address',
- 'framed_ip_netmask' => 'Framed-IP-Netmask',
- 'framed_ipv6_pool' => 'Framed-IPv6-Pool',
- 'framed_ipv6_prefix' => 'Framed-IPv6-Prefix',
- 'framed_ipv6_route' => 'Framed-IPv6-Route',
- 'framed_ipx_network' => 'Framed-IPX-Network',
- 'framed_mtu' => 'Framed-MTU',
- 'framed_netmask' => 'Framed-Netmask',
- 'framed_pool' => 'Framed-Pool',
- 'framed_protocol' => 'Framed-Protocol',
- 'framed_route' => 'Framed-Route',
- 'framed_routing' => 'Framed-Routing',
- 'freeradius_proxied_to' => 'FreeRADIUS-Proxied-To',
- 'gandalf_around_the_corne' => 'Gandalf-Around-The-Corner',
- 'gandalf_authentication_s' => 'Gandalf-Authentication-String',
- 'gandalf_calling_line_id_' => 'Gandalf-Calling-Line-ID-1',
- 'gandalf_calling_line_ida' => 'Gandalf-Calling-Line-ID-2',
- 'gandalf_channel_group_na' => 'Gandalf-Channel-Group-Name-1',
- 'gandalf_channel_group_nb' => 'Gandalf-Channel-Group-Name-2',
- 'gandalf_compression_stat' => 'Gandalf-Compression-Status',
- 'gandalf_dial_prefix_name' => 'Gandalf-Dial-Prefix-Name-1',
- 'gandalf_dial_prefix_namf' => 'Gandalf-Dial-Prefix-Name-2',
- 'gandalf_fwd_broadcast_in' => 'Gandalf-Fwd-Broadcast-In',
- 'gandalf_fwd_broadcast_ou' => 'Gandalf-Fwd-Broadcast-Out',
- 'gandalf_fwd_multicast_in' => 'Gandalf-Fwd-Multicast-In',
- 'gandalf_fwd_multicast_ou' => 'Gandalf-Fwd-Multicast-Out',
- 'gandalf_fwd_unicast_in' => 'Gandalf-Fwd-Unicast-In',
- 'gandalf_fwd_unicast_out' => 'Gandalf-Fwd-Unicast-Out',
- 'gandalf_hunt_group' => 'Gandalf-Hunt-Group',
- 'gandalf_ipx_spoofing_sta' => 'Gandalf-IPX-Spoofing-State',
- 'gandalf_ipx_watchdog_spo' => 'Gandalf-IPX-Watchdog-Spoof',
- 'gandalf_min_outgoing_bea' => 'Gandalf-Min-Outgoing-Bearer',
- 'gandalf_modem_mode' => 'Gandalf-Modem-Mode',
- 'gandalf_modem_required_1' => 'Gandalf-Modem-Required-1',
- 'gandalf_modem_required_2' => 'Gandalf-Modem-Required-2',
- 'gandalf_operational_mode' => 'Gandalf-Operational-Modes',
- 'gandalf_phone_number_1' => 'Gandalf-Phone-Number-1',
- 'gandalf_phone_number_2' => 'Gandalf-Phone-Number-2',
- 'gandalf_ppp_authenticati' => 'Gandalf-PPP-Authentication',
- 'gandalf_ppp_ncp_type' => 'Gandalf-PPP-NCP-Type',
- 'gandalf_remote_lan_name' => 'Gandalf-Remote-LAN-Name',
- 'gandalf_sap_group_name_1' => 'Gandalf-SAP-Group-Name-1',
- 'gandalf_sap_group_name_2' => 'Gandalf-SAP-Group-Name-2',
- 'gandalf_sap_group_name_3' => 'Gandalf-SAP-Group-Name-3',
- 'gandalf_sap_group_name_4' => 'Gandalf-SAP-Group-Name-4',
- 'gandalf_sap_group_name_5' => 'Gandalf-SAP-Group-Name-5',
- 'garderos_location_name' => 'Garderos-Location-Name',
- 'garderos_service_name' => 'Garderos-Service-Name',
- 'group' => 'Group',
- 'group_name' => 'Group-Name',
- 'gw_final_xlated_cdn' => 'gw-final-xlated-cdn',
- 'gw_rxd_cdn' => 'gw-rxd-cdn',
- 'h323_billing_model' => 'h323-billing-model',
- 'h323_call_origin' => 'h323-call-origin',
- 'h323_call_type' => 'h323-call-type',
- 'h323_conf_id' => 'h323-conf-id',
- 'h323_connect_time' => 'h323-connect-time',
- 'h323_credit_amount' => 'h323-credit-amount',
- 'h323_credit_time' => 'h323-credit-time',
- 'h323_currency' => 'h323-currency',
- 'h323_disconnect_cause' => 'h323-disconnect-cause',
- 'h323_disconnect_time' => 'h323-disconnect-time',
- 'h323_gw_id' => 'h323-gw-id',
- 'h323_incoming_conf_id' => 'h323-incoming-conf-id',
- 'h323_preferred_lang' => 'h323-preferred-lang',
- 'h323_prompt_id' => 'h323-prompt-id',
+ 'itk_auth_serv_ip' => 'ITK-Auth-Serv-IP',
+ 'erx_alternate_cli_vroute' => 'ERX-Alternate-Cli-Vrouter-Name',
+ 'framed_compression' => 'Framed-Compression',
+ 'ascend_svc_enabled' => 'Ascend-SVC-Enabled',
+ 'proxy_state' => 'Proxy-State',
+ 'aat_vrouter_name' => 'AAT-Vrouter-Name',
+ 'usr_rmmie_pwrlvl_farecho' => 'USR-RMMIE-PwrLvl-FarEcho-Canc',
+ 'nas_poru' => 'NAS-Port',
+ 'wispr_location_name' => 'WISPr-Location-Name',
+ 'digest_user_name' => 'Digest-User-Name',
+ 'ascend_modem_shelfno' => 'Ascend-Modem-ShelfNo',
+ 'shasta_user_privilege' => 'Shasta-User-Privilege',
+ 'bind_auth_protocol' => 'Bind-Auth-Protocol',
+ 'ascend_home_agent_passwo' => 'Ascend-Home-Agent-Password',
+ 'acct_interim_interval' => 'Acct-Interim-Interval',
+ 'ascend_history_weigh_typ' => 'Ascend-History-Weigh-Type',
+ 'ms_link_drop_time_limit' => 'MS-Link-Drop-Time-Limit',
+ 'hint' => 'Hint',
+ 'x_ascend_target_util' => 'X-Ascend-Target-Util',
+ 'acc_access_partition' => 'Acc-Access-Partition',
+ 'usr_power_supply_number' => 'USR-Power-Supply-Number',
+ 'x_ascend_multilink_id' => 'X-Ascend-Multilink-ID',
+ 'redcreek_tunneled_domain' => 'RedCreek-Tunneled-DomainName',
+ 'nomadix_bw_down' => 'Nomadix-Bw-Down',
+ 'acc_ipx_compression' => 'Acc-Ipx-Compression',
+ 'quintum_h323_setup_time' => 'Quintum-h323-setup-time',
+ 'cisco_target_util' => 'Cisco-Target-Util',
+ 'acc_ip_gateway_sec' => 'Acc-Ip-Gateway-Sec',
+ 'ascend_dsl_cir_xmit_limi' => 'Ascend-Dsl-CIR-Xmit-Limit',
+ 'ascend_ip_pool_definitio' => 'Ascend-IP-Pool-Definition',
+ 'bind_sub_user_at_contexu' => 'Bind_Sub_User_At_Context',
+ 'itk_dest_no' => 'ITK-Dest-No',
+ 'usr_connect_time' => 'USR-Connect-Time',
+ 'usr_call_start_date_time' => 'USR-Call-Start-Date-Time',
+ 'altiga_l2tp_encryption_g' => 'Altiga-L2TP-Encryption-G',
+ 'ascend_auth_delay' => 'Ascend-Auth-Delay',
+ 'ascend_x25_pad_x3_profil' => 'Ascend-X25-Pad-X3-Profile',
+ 'ascend_access_intercepta' => 'Ascend-Access-Intercept-Log',
+ 'ascend_home_agent_udp_po' => 'Ascend-Home-Agent-UDP-Port',
+ 'bind_tun_context' => 'Bind-Tun-Context',
+ 'dialback_name' => 'Dialback-Name',
'h323_redirect_ip_address' => 'h323-redirect-ip-address',
- 'h323_redirect_number' => 'h323-redirect-number',
- 'h323_remote_address' => 'h323-remote-address',
- 'h323_return_code' => 'h323-return-code',
- 'h323_setup_time' => 'h323-setup-time',
- 'h323_time_and_day' => 'h323-time-and-day',
- 'h323_voice_quality' => 'h323-voice-quality',
- 'hint' => 'Hint',
- 'huntgroup_name' => 'Huntgroup-Name',
- 'idle_timeout' => 'Idle-Timeout',
- 'incoming_req_uri' => 'incoming-req-uri',
- 'initial_modulation_type' => 'Initial-Modulation-Type',
- 'ip3_ip_option' => 'IP3-IP-Option',
- 'ip3_rdata_rate' => 'IP3-RData-Rate',
- 'ip3_xdata_rate' => 'IP3-XData-Rate',
- 'ip_address_pool_name' => 'Ip_Address_Pool_Name',
- 'ip_address_pool_namf' => 'Ip-Address-Pool-Name',
- 'ip_host_addr' => 'Ip_Host_Addr',
- 'ip_host_adds' => 'Ip-Host-Addr',
- 'ip_tos_field' => 'IP_TOS_Field',
- 'ip_tos_fiele' => 'IP-TOS-Field',
- 'itk_acct_serv_ip' => 'ITK-Acct-Serv-IP',
- 'itk_acct_serv_prot' => 'ITK-Acct-Serv-Prot',
- 'itk_auth_req_type' => 'ITK-Auth-Req-Type',
- 'itk_auth_serv_ip' => 'ITK-Auth-Serv-IP',
- 'itk_auth_serv_prot' => 'ITK-Auth-Serv-Prot',
- 'itk_banner' => 'ITK-Banner',
- 'itk_channel_binding' => 'ITK-Channel-Binding',
- 'itk_ddi' => 'ITK-DDI',
- 'itk_dest_no' => 'ITK-Dest-No',
- 'itk_dialout_type' => 'ITK-Dialout-Type',
- 'itk_filter_rule' => 'ITK-Filter-Rule',
- 'itk_ftp_auth_ip' => 'ITK-Ftp-Auth-IP',
- 'itk_ip_pool' => 'ITK-IP-Pool',
- 'itk_isdn_prot' => 'ITK-ISDN-Prot',
- 'itk_modem_init_string' => 'ITK-Modem-Init-String',
- 'itk_modem_pool_id' => 'ITK-Modem-Pool-Id',
- 'itk_nas_name' => 'ITK-NAS-Name',
- 'itk_password_prompt' => 'ITK-Password-Prompt',
- 'itk_ppp_auth_type' => 'ITK-PPP-Auth-Type',
- 'itk_ppp_client_server_mo' => 'ITK-PPP-Client-Server-Mode',
- 'itk_ppp_compression_prot' => 'ITK-PPP-Compression-Prot',
- 'itk_prompt' => 'ITK-Prompt',
- 'itk_provider_id' => 'ITK-Provider-Id',
- 'itk_start_delay' => 'ITK-Start-Delay',
- 'itk_tunnel_ip' => 'ITK-Tunnel-IP',
- 'itk_tunnel_prot' => 'ITK-Tunnel-Prot',
- 'itk_usergroup' => 'ITK-Usergroup',
- 'itk_username' => 'ITK-Username',
- 'itk_username_prompt' => 'ITK-Username-Prompt',
- 'itk_users_default_entry' => 'ITK-Users-Default-Entry',
- 'itk_users_default_pw' => 'ITK-Users-Default-Pw',
- 'itk_welcome_message' => 'ITK-Welcome-Message',
- 'juniper_allow_commands' => 'Juniper-Allow-Commands',
- 'juniper_allow_configurat' => 'Juniper-Allow-Configuration',
- 'juniper_deny_commands' => 'Juniper-Deny-Commands',
- 'juniper_deny_configurati' => 'Juniper-Deny-Configuration',
- 'juniper_local_user_name' => 'Juniper-Local-User-Name',
- 'karlnet_turbocell_name' => 'KarlNet-TurboCell-Name',
- 'karlnet_turbocell_opmode' => 'KarlNet-TurboCell-OpMode',
- 'karlnet_turbocell_opstat' => 'KarlNet-TurboCell-OpState',
- 'karlnet_turbocell_txrate' => 'KarlNet-TurboCell-TxRate',
- 'lac_port' => 'LAC_Port',
- 'lac_port_type' => 'LAC_Port_Type',
- 'lac_port_typf' => 'LAC-Port-Type',
- 'lac_poru' => 'LAC-Port',
- 'lac_real_port' => 'LAC_Real_Port',
- 'lac_real_port_type' => 'LAC_Real_Port_Type',
- 'lac_real_port_typf' => 'LAC-Real-Port-Type',
- 'lac_real_poru' => 'LAC-Real-Port',
- 'ldap_group' => 'Ldap-Group',
- 'ldap_userdn' => 'Ldap-UserDn',
- 'le_admin_group' => 'LE-Admin-Group',
- 'le_advice_of_charge' => 'LE-Advice-of-Charge',
- 'le_connect_detail' => 'LE-Connect-Detail',
- 'le_ip_gateway' => 'LE-IP-Gateway',
- 'le_ip_pool' => 'LE-IP-Pool',
- 'le_ipsec_active_profile' => 'LE-IPSec-Active-Profile',
- 'le_ipsec_deny_action' => 'LE-IPSec-Deny-Action',
- 'le_ipsec_log_options' => 'LE-IPSec-Log-Options',
- 'le_ipsec_outsource_profi' => 'LE-IPSec-Outsource-Profile',
- 'le_ipsec_passive_profile' => 'LE-IPSec-Passive-Profile',
- 'le_modem_info' => 'LE-Modem-Info',
- 'le_multicast_client' => 'LE-Multicast-Client',
- 'le_nat_inmap' => 'LE-NAT-Inmap',
- 'le_nat_log_options' => 'LE-NAT-Log-Options',
- 'le_nat_other_session_tim' => 'LE-NAT-Other-Session-Timeout',
- 'le_nat_outmap' => 'LE-NAT-Outmap',
- 'le_nat_outsource_inmap' => 'LE-NAT-Outsource-Inmap',
- 'le_nat_outsource_outmap' => 'LE-NAT-Outsource-Outmap',
- 'le_nat_sess_dir_fail_act' => 'LE-NAT-Sess-Dir-Fail-Action',
- 'le_nat_tcp_session_timeo' => 'LE-NAT-TCP-Session-Timeout',
- 'le_terminate_detail' => 'LE-Terminate-Detail',
- 'lm_password' => 'LM-Password',
- 'local_web_acct_duration' => 'Local-Web-Acct-Duration',
- 'local_web_acct_interim_r' => 'Local-Web-Acct-Interim-Rx-Bytes',
- 'local_web_acct_interim_s' => 'Local-Web-Acct-Interim-Rx-Gigawords',
- 'local_web_acct_interim_t' => 'Local-Web-Acct-Interim-Tx-Bytes',
- 'local_web_acct_interim_u' => 'Local-Web-Acct-Interim-Tx-Gigawords',
- 'local_web_acct_interim_v' => 'Local-Web-Acct-Interim-Tx-Mgmt',
- 'local_web_acct_interim_w' => 'Local-Web-Acct-Interim-Rx-Mgmt',
- 'local_web_acct_rx_mgmt' => 'Local-Web-Acct-Rx-Mgmt',
- 'local_web_acct_time' => 'Local-Web-Acct-Time',
- 'local_web_acct_tx_mgmt' => 'Local-Web-Acct-Tx-Mgmt',
- 'local_web_border_router' => 'Local-Web-Border-Router',
- 'local_web_client_ip' => 'Local-Web-Client-Ip',
- 'local_web_reauth_counter' => 'Local-Web-Reauth-Counter',
- 'local_web_rx_limit' => 'Local-Web-Rx-Limit',
- 'local_web_tx_limit' => 'Local-Web-Tx-Limit',
- 'login_callback_number' => 'Login-Callback-Number',
- 'login_host' => 'Login-Host',
- 'login_ip_host' => 'Login-IP-Host',
- 'login_ipv6_host' => 'Login-IPv6-Host',
- 'login_lat_group' => 'Login-LAT-Group',
- 'login_lat_node' => 'Login-LAT-Node',
- 'login_lat_port' => 'Login-LAT-Port',
- 'login_lat_service' => 'Login-LAT-Service',
- 'login_port' => 'Login-Port',
- 'login_service' => 'Login-Service',
- 'login_tcp_port' => 'Login-TCP-Port',
- 'login_time' => 'Login-Time',
- 'mcast_maxgroups' => 'Mcast_MaxGroups',
- 'mcast_maxgroupt' => 'Mcast-MaxGroups',
- 'mcast_receive' => 'Mcast_Receive',
- 'mcast_receivf' => 'Mcast-Receive',
- 'mcast_send' => 'Mcast_Send',
- 'mcast_sene' => 'Mcast-Send',
- 'medium_type' => 'Medium_Type',
- 'medium_typf' => 'Medium-Type',
- 'menu' => 'Menu',
- 'merit_proxy_action' => 'Merit-Proxy-Action',
- 'merit_user_id' => 'Merit-User-Id',
- 'merit_user_realm' => 'Merit-User-Realm',
- 'message_authenticator' => 'Message-Authenticator',
- 'method' => 'method',
- 'mikrotik_group' => 'Mikrotik-Group',
- 'mikrotik_recv_limit' => 'Mikrotik-Recv-Limit',
- 'mikrotik_xmit_limit' => 'Mikrotik-Xmit-Limit',
- 'module_failure_message' => 'Module-Failure-Message',
- 'module_success_message' => 'Module-Success-Message',
- 'motorola_canopy_cirenabl' => 'Motorola-Canopy-CIRENABLE',
- 'motorola_canopy_dlba' => 'Motorola-Canopy-DLBA',
- 'motorola_canopy_enable' => 'Motorola-Canopy-Enable',
- 'motorola_canopy_higherbw' => 'Motorola-Canopy-HIGHERBW',
- 'motorola_canopy_hpcenabl' => 'Motorola-Canopy-HPCENABLE',
- 'motorola_canopy_hpsdldr' => 'Motorola-Canopy-HPSDLDR',
- 'motorola_canopy_hpsuldr' => 'Motorola-Canopy-HPSULDR',
- 'motorola_canopy_lpsdldr' => 'Motorola-Canopy-LPSDLDR',
- 'motorola_canopy_lpsuldr' => 'Motorola-Canopy-LPSULDR',
- 'motorola_canopy_sdldr' => 'Motorola-Canopy-SDLDR',
- 'motorola_canopy_shared_s' => 'Motorola-Canopy-Shared-Secret',
- 'motorola_canopy_suldr' => 'Motorola-Canopy-SULDR',
- 'motorola_canopy_ulba' => 'Motorola-Canopy-ULBA',
- 'ms_acct_auth_type' => 'MS-Acct-Auth-Type',
- 'ms_acct_eap_type' => 'MS-Acct-EAP-Type',
+ 'annex_keypress_timeout' => 'Annex-Keypress-Timeout',
+ 'x_ascend_home_network_na' => 'X-Ascend-Home-Network-Name',
+ 'ascend_x25_pad_alias_1' => 'Ascend-X25-Pad-Alias-1',
+ 'ascend_call_attempt_limi' => 'Ascend-Call-Attempt-Limit',
+ 'quintum_h323_currency_ty' => 'Quintum-h323-currency-type',
+ 'ms_chap_response' => 'MS-CHAP-Response',
+ 'st_secondary_nbns_server' => 'ST-Secondary-NBNS-Server',
+ 'x_ascend_history_weigh_t' => 'X-Ascend-History-Weigh-Type',
+ 'usr_max_channels' => 'USR-Max-Channels',
+ 'ascend_fr_dte_n393' => 'Ascend-FR-DTE-N393',
+ 'ascend_pre_input_octets' => 'Ascend-Pre-Input-Octets',
+ 'erx_atm_mbs' => 'ERX-Atm-MBS',
+ 'cvpn3000_simultaneous_lo' => 'CVPN3000-Simultaneous-Logins',
+ 'juniper_allow_commands' => 'Juniper-Allow-Commands',
+ 'usr_line_reversals' => 'USR-Line-Reversals',
+ 'itk_users_default_pw' => 'ITK-Users-Default-Pw',
+ 'x_ascend_third_prompt' => 'X-Ascend-Third-Prompt',
+ 'cisco_fax_msg_id' => 'Cisco-Fax-Msg-Id',
+ 'x_ascend_pw_warntime' => 'X-Ascend-PW-Warntime',
+ 'ascend_data_filter' => 'Ascend-Data-Filter',
+ 'framed_address' => 'Framed-Address',
+ 'context_name' => 'Context-Name',
+ 'usr_send_script2' => 'USR-Send-Script2',
'ms_arap_pw_change_reason' => 'MS-ARAP-PW-Change-Reason',
- 'ms_bap_usage' => 'MS-BAP-Usage',
- 'ms_chap2_cpw' => 'MS-CHAP2-CPW',
- 'ms_chap2_response' => 'MS-CHAP2-Response',
- 'ms_chap2_success' => 'MS-CHAP2-Success',
- 'ms_chap_challenge' => 'MS-CHAP-Challenge',
- 'ms_chap_cpw_1' => 'MS-CHAP-CPW-1',
- 'ms_chap_cpw_2' => 'MS-CHAP-CPW-2',
- 'ms_chap_domain' => 'MS-CHAP-Domain',
- 'ms_chap_error' => 'MS-CHAP-Error',
- 'ms_chap_lm_enc_pw' => 'MS-CHAP-LM-Enc-PW',
- 'ms_chap_mppe_keys' => 'MS-CHAP-MPPE-Keys',
- 'ms_chap_nt_enc_pw' => 'MS-CHAP-NT-Enc-PW',
- 'ms_chap_response' => 'MS-CHAP-Response',
- 'ms_chap_use_ntlm_auth' => 'MS-CHAP-Use-NTLM-Auth',
- 'ms_filter' => 'MS-Filter',
- 'ms_link_drop_time_limit' => 'MS-Link-Drop-Time-Limit',
- 'ms_link_utilization_thre' => 'MS-Link-Utilization-Threshold',
- 'ms_mppe_encryption_polic' => 'MS-MPPE-Encryption-Policy',
- 'ms_mppe_encryption_type' => 'MS-MPPE-Encryption-Type',
- 'ms_mppe_encryption_types' => 'MS-MPPE-Encryption-Types',
- 'ms_mppe_recv_key' => 'MS-MPPE-Recv-Key',
- 'ms_mppe_send_key' => 'MS-MPPE-Send-Key',
- 'ms_new_arap_password' => 'MS-New-ARAP-Password',
- 'ms_old_arap_password' => 'MS-Old-ARAP-Password',
- 'ms_primary_dns_server' => 'MS-Primary-DNS-Server',
- 'ms_primary_nbns_server' => 'MS-Primary-NBNS-Server',
- 'ms_ras_vendor' => 'MS-RAS-Vendor',
- 'ms_ras_version' => 'MS-RAS-Version',
- 'ms_secondary_dns_server' => 'MS-Secondary-DNS-Server',
- 'ms_secondary_nbns_server' => 'MS-Secondary-NBNS-Server',
- 'multi_link_flag' => 'Multi-Link-Flag',
- 'nas_identifier' => 'NAS-Identifier',
- 'nas_ip_address' => 'NAS-IP-Address',
- 'nas_ipv6_address' => 'NAS-IPv6-Address',
- 'nas_port' => 'NAS-Port',
- 'nas_port_id' => 'NAS-Port-Id',
- 'nas_port_type' => 'NAS-Port-Type',
- 'nas_real_port' => 'NAS_Real_Port',
- 'nas_real_poru' => 'NAS-Real-Port',
- 'navini_avpair' => 'Navini-AVPair',
- 'next_hop_dn' => 'next-hop-dn',
- 'next_hop_ip' => 'next-hop-ip',
- 'nn_data_rate' => 'NN-Data-Rate',
- 'nn_data_rate_ceiling' => 'NN-Data-Rate-Ceiling',
- 'nn_homenode' => 'NN-Homenode',
- 'nn_homeservice' => 'NN-Homeservice',
- 'nn_homeservice_name' => 'NN-Homeservice-Name',
- 'no_such_attribute' => 'No-Such-Attribute',
- 'nokia_charging_id' => 'Nokia-Charging-Id',
- 'nokia_ggsn_ip_address' => 'Nokia-GGSN-IP-Address',
- 'nokia_imsi' => 'Nokia-IMSI',
- 'nokia_prepaid_ind' => 'Nokia-Prepaid-Ind',
- 'nokia_sgsn_ip_address' => 'Nokia-SGSN-IP-Address',
- 'nomadix_bw_down' => 'Nomadix-Bw-Down',
- 'nomadix_bw_up' => 'Nomadix-Bw-Up',
- 'nomadix_config_url' => 'Nomadix-Config-URL',
- 'nomadix_endofsession' => 'Nomadix-EndofSession',
- 'nomadix_expiration' => 'Nomadix-Expiration',
- 'nomadix_goodbye_url' => 'Nomadix-Goodbye-URL',
- 'nomadix_ip_upsell' => 'Nomadix-IP-Upsell',
- 'nomadix_logoff_url' => 'Nomadix-Logoff-URL',
- 'nomadix_maxbytesdown' => 'Nomadix-MaxBytesDown',
- 'nomadix_maxbytesup' => 'Nomadix-MaxBytesUp',
- 'nomadix_net_vlan' => 'Nomadix-Net-VLAN',
- 'nomadix_subnet' => 'Nomadix-Subnet',
- 'nomadix_url_redirection' => 'Nomadix-URL-Redirection',
- 'ns_admin_privilege' => 'NS-Admin-Privilege',
- 'ns_mta_md5_password' => 'NS-MTA-MD5-Password',
- 'ns_primary_dns' => 'NS-Primary-DNS',
- 'ns_primary_wins' => 'NS-Primary-WINS',
- 'ns_secondary_dns' => 'NS-Secondary-DNS',
- 'ns_secondary_wins' => 'NS-Secondary-WINS',
- 'ns_user_group' => 'NS-User-Group',
- 'ns_vsys_name' => 'NS-VSYS-Name',
- 'nt_password' => 'NT-Password',
- 'ntlm_user_name' => 'NTLM-User-Name',
- 'old_password' => 'Old-Password',
- 'outgoing_req_uri' => 'outgoing-req-uri',
- 'packet_dst_port' => 'Packet-Dst-Port',
- 'packet_type' => 'Packet-Type',
- 'pam_auth' => 'Pam-Auth',
- 'password' => 'Password',
- 'password_retry' => 'Password-Retry',
- 'police_burst' => 'Police_Burst',
- 'police_bursu' => 'Police-Burst',
- 'police_rate' => 'Police_Rate',
- 'police_ratf' => 'Police-Rate',
- 'pool_name' => 'Pool-Name',
- 'port_limit' => 'Port-Limit',
- 'port_message' => 'Port-Message',
- 'post_auth_type' => 'Post-Auth-Type',
- 'post_proxy_type' => 'Post-Proxy-Type',
- 'postauth_type' => 'PostAuth-Type',
- 'pppoe_motm' => 'PPPOE_MOTM',
- 'pppoe_motn' => 'PPPOE-MOTM',
- 'pppoe_url' => 'PPPOE_URL',
- 'pppoe_urm' => 'PPPOE-URL',
- 'pre_acct_type' => 'Pre-Acct-Type',
- 'pre_proxy_type' => 'Pre-Proxy-Type',
- 'prefix' => 'Prefix',
- 'prev_hop_ip' => 'prev-hop-ip',
- 'prev_hop_via' => 'prev-hop-via',
- 'prompt' => 'Prompt',
- 'propel_accelerate' => 'Propel-Accelerate',
- 'propel_client_ip_address' => 'Propel-Client-IP-Address',
- 'propel_client_nas_ip_add' => 'Propel-Client-NAS-IP-Address',
- 'propel_client_source_id' => 'Propel-Client-Source-ID',
- 'propel_dialed_digits' => 'Propel-Dialed-Digits',
- 'proxy_state' => 'Proxy-State',
- 'proxy_to_realm' => 'Proxy-To-Realm',
- 'pvc_circuit_padding' => 'PVC_Circuit_Padding',
- 'pvc_circuit_paddinh' => 'PVC-Circuit-Padding',
- 'pvc_encapsulation_type' => 'PVC_Encapsulation_Type',
- 'pvc_encapsulation_typf' => 'PVC-Encapsulation-Type',
- 'pvc_profile_name' => 'PVC_Profile_Name',
- 'pvc_profile_namf' => 'PVC-Profile-Name',
- 'quintum_avpair' => 'Quintum-AVPair',
- 'quintum_h323_billing_mod' => 'Quintum-h323-billing-model',
+ 'tunnel_session_auth_cty' => 'Tunnel_Session_Auth_Ctx',
+ 'acct_session_id' => 'Acct-Session-Id',
+ 'annex_port' => 'Annex-Port',
'quintum_h323_call_origin' => 'Quintum-h323-call-origin',
- 'quintum_h323_call_type' => 'Quintum-h323-call-type',
- 'quintum_h323_conf_id' => 'Quintum-h323-conf-id',
- 'quintum_h323_connect_tim' => 'Quintum-h323-connect-time',
+ 'erx_cli_initial_access_l' => 'ERX-Cli-Initial-Access-Level',
+ 'x_ascend_shared_profile_' => 'X-Ascend-Shared-Profile-Enable',
+ 'tunnel_cmd_timeouu' => 'Tunnel_Cmd_Timeout',
+ 'initial_modulation_type' => 'Initial-Modulation-Type',
+ 'ascend_h323_gatekeeper' => 'Ascend-H323-Gatekeeper',
+ 'x_ascend_fcp_parameter' => 'X-Ascend-FCP-Parameter',
+ 'multi_link_flag' => 'Multi-Link-Flag',
+ 'tunnel_type' => 'Tunnel-Type',
+ 'erx_output_gigapkts' => 'ERX-Output-Gigapkts',
+ 'ascend_idle_limit' => 'Ascend-Idle-Limit',
+ 'ns_user_group' => 'NS-User-Group',
+ 'password_retry' => 'Password-Retry',
+ 'h323_remote_address' => 'h323-remote-address',
+ 'erx_atm_service_category' => 'ERX-Atm-Service-Category',
+ 'acct_input_packets' => 'Acct-Input-Packets',
+ 'h323_disconnect_time' => 'h323-disconnect-time',
+ 'usr_syslog_tap' => 'USR-Syslog-Tap',
+ 'telebit_accounting_info' => 'Telebit-Accounting-Info',
+ 'ascend_billing_number' => 'Ascend-Billing-Number',
+ 'ascend_tunnel_vrouter_na' => 'Ascend-Tunnel-VRouter-Name',
+ 'ms_mppe_encryption_type' => 'MS-MPPE-Encryption-Type',
'quintum_h323_credit_amou' => 'Quintum-h323-credit-amount',
- 'quintum_h323_credit_time' => 'Quintum-h323-credit-time',
- 'quintum_h323_currency_ty' => 'Quintum-h323-currency-type',
- 'quintum_h323_disconnect_' => 'Quintum-h323-disconnect-time',
- 'quintum_h323_disconnecta' => 'Quintum-h323-disconnect-cause',
- 'quintum_h323_gw_id' => 'Quintum-h323-gw-id',
- 'quintum_h323_incoming_co' => 'Quintum-h323-incoming-conf-id',
- 'quintum_h323_preferred_l' => 'Quintum-h323-preferred-lang',
- 'quintum_h323_prompt_id' => 'Quintum-h323-prompt-id',
+ 'acc_ace_token' => 'Acc-Ace-Token',
+ 'ascend_assign_ip_pool' => 'Ascend-Assign-IP-Pool',
+ 'annex_end_modulation' => 'Annex-End-Modulation',
+ 'usr_routing_protocol' => 'USR-Routing-Protocol',
+ 'cvx_assign_ip_pool' => 'CVX-Assign-IP-Pool',
+ 'usr_rad_location_type' => 'USR-Rad-Location-Type',
+ 'usr_rmmie_pwrlvl_noise_l' => 'USR-RMMIE-PwrLvl-Noise-Lvl',
+ 'usr_characters_sent' => 'USR-Characters-Sent',
+ 'usr_mp_edo_hiper' => 'USR-MP-EDO-HIPER',
+ 'ascend_x25_nui_password_' => 'Ascend-X25-Nui-Password-Prompt',
+ 'annex_host_restrict' => 'Annex-Host-Restrict',
+ 'user_service_type' => 'User-Service-Type',
+ 'acct_multi_session_id' => 'Acct-Multi-Session-Id',
+ 'ms_chap_cpw_2' => 'MS-CHAP-CPW-2',
+ 'x_ascend_secondary_home_' => 'X-Ascend-Secondary-Home-Agent',
+ 'x_ascend_dialout_allowed' => 'X-Ascend-Dialout-Allowed',
+ 'ascend_connect_progress' => 'Ascend-Connect-Progress',
+ 'x_ascend_ara_pw' => 'X-Ascend-Ara-PW',
+ 'cisco_fax_modem_time' => 'Cisco-Fax-Modem-Time',
+ 'sql_group' => 'Sql-Group',
+ 'annex_multicast_rate_lim' => 'Annex-Multicast-Rate-Limit',
+ 'cvpn3000_user_auth_servg' => 'CVPN3000-User-Auth-Server-Secret',
+ 'ns_mta_md5_password' => 'NS-MTA-MD5-Password',
+ 'annex_addr_resolution_pr' => 'Annex-Addr-Resolution-Protocol',
+ 'callback_number' => 'Callback-Number',
+ 'cvx_multilink_match_info' => 'CVX-Multilink-Match-Info',
+ 'tunnel_max_tunnelt' => 'Tunnel_Max_Tunnels',
+ 'tunnel_local_namf' => 'Tunnel_Local_Name',
+ 'quintum_h323_conf_id' => 'Quintum-h323-conf-id',
+ 'acct_output_packets_64' => 'Acct-Output-Packets-64',
+ 'annex_signal_to_noise_ra' => 'Annex-Signal-to-Noise-Ratio',
+ 'acct_output_packets_65' => 'Acct_Output_Packets_64',
+ 'x_ascend_user_acct_key' => 'X-Ascend-User-Acct-Key',
+ 'erx_dial_out_number' => 'ERX-Dial-Out-Number',
+ 'ascend_modem_portno' => 'Ascend-Modem-PortNo',
+ 'ascend_assign_ip_server' => 'Ascend-Assign-IP-Server',
+ 'ascend_fcp_parameter' => 'Ascend-FCP-Parameter',
+ 'usr_chassis_temp_thresho' => 'USR-Chassis-Temp-Threshold',
+ 'usr_mpip_tunnel_originat' => 'USR-MPIP-Tunnel-Originator',
+ 'tunnel_rate_limit_bursu' => 'Tunnel_Rate_Limit_Burst',
+ 'client_ip_address' => 'Client-IP-Address',
+ 'le_nat_tcp_session_timeo' => 'LE-NAT-TCP-Session-Timeout',
'quintum_h323_redirect_ip' => 'Quintum-h323-redirect-ip-address',
- 'quintum_h323_redirect_nu' => 'Quintum-h323-redirect-number',
+ 'ms_acct_eap_type' => 'MS-Acct-EAP-Type',
+ 'usr_rmmie_x2_status' => 'USR-RMMIE-x2-Status',
+ 'x_ascend_user_acct_type' => 'X-Ascend-User-Acct-Type',
+ 'shiva_customer_id' => 'Shiva-Customer-Id',
+ 'pvc_encapsulation_typf' => 'PVC_Encapsulation_Type',
+ 'st_acct_vc_connection_id' => 'ST-Acct-VC-Connection-Id',
+ 'lac_real_port' => 'LAC-Real-Port',
+ 'h323_connect_time' => 'h323-connect-time',
+ 'usr_vpn_gw_location_id' => 'USR-VPN-GW-Location-Id',
+ 'old_password' => 'Old-Password',
+ 'x_ascend_if_netmask' => 'X-Ascend-IF-Netmask',
+ 'add_suffix' => 'Add-Suffix',
+ 'lac_port_typf' => 'LAC_Port_Type',
+ 'acc_ip_pool_name' => 'Acc-Ip-Pool-Name',
+ 'usr_terminal_type' => 'USR-Terminal-Type',
+ 'usr_spoofing' => 'USR-Spoofing',
+ 'erx_tunnel_password' => 'ERX-Tunnel-Password',
+ 'ascend_inter_arrival_jit' => 'Ascend-Inter-Arrival-Jitter',
+ 'ascend_call_block_durati' => 'Ascend-Call-Block-Duration',
+ 'itk_channel_binding' => 'ITK-Channel-Binding',
+ 'usr_server_time' => 'USR-Server-Time',
+ 'ascend_assign_ip_client' => 'Ascend-Assign-IP-Client',
+ 'erx_pppoe_max_sessions' => 'ERX-Pppoe-Max-Sessions',
+ 'cvx_multilink_group_numb' => 'CVX-Multilink-Group-Number',
+ 'x_ascend_client_assign_d' => 'X-Ascend-Client-Assign-DNS',
+ 'erx_pppoe_url' => 'ERX-Pppoe-Url',
+ 'police_ratf' => 'Police_Rate',
+ 'ascend_data_svc' => 'Ascend-Data-Svc',
+ 'annex_authen_servers' => 'Annex-Authen-Servers',
+ 'nomadix_bw_up' => 'Nomadix-Bw-Up',
+ 'cvx_modem_data_compressi' => 'CVX-Modem-Data-Compression',
+ 'shiva_link_speed' => 'Shiva-Link-Speed',
+ 'usr_reply_script6' => 'USR-Reply-Script6',
+ 'usr_expansion_algorithm' => 'USR-Expansion-Algorithm',
+ 'cabletron_protocol_calla' => 'Cabletron-Protocol-Callable',
+ 'cisco_data_rate' => 'Cisco-Data-Rate',
+ 'usr_primary_dns_server' => 'USR-Primary_DNS_Server',
+ 'juniper_deny_configurati' => 'Juniper-Deny-Configuration',
+ 'ascend_target_util' => 'Ascend-Target-Util',
+ 'digest_method' => 'Digest-Method',
+ 'altiga_ipsec_split_tunne' => 'Altiga-IPSec-Split-Tunnel-List-G',
+ 'erx_alternate_cli_access' => 'ERX-Alternate-Cli-Access-Level',
+ 'x_ascend_event_type' => 'X-Ascend-Event-Type',
+ 'usr_q931_call_reference_' => 'USR-Q931-Call-Reference-Value',
+ 'usr_mp_mrru' => 'USR-MP-MRRU',
+ 'cvx_ipsvc_mask' => 'CVX-IPSVC-Mask',
+ 'bind_bypass_context' => 'Bind-Bypass-Context',
+ 'usr_rmmie_last_update_ev' => 'USR-RMMIE-Last-Update-Event',
+ 'no_such_attribute' => 'No-Such-Attribute',
+ 'acct_mcast_out_packets' => 'Acct-Mcast-Out-Packets',
+ 'tunnel_medium_type' => 'Tunnel-Medium-Type',
'quintum_h323_remote_addr' => 'Quintum-h323-remote-address',
- 'quintum_h323_return_code' => 'Quintum-h323-return-code',
- 'quintum_h323_setup_time' => 'Quintum-h323-setup-time',
- 'quintum_h323_time_and_da' => 'Quintum-h323-time-and-day',
- 'quintum_h323_voice_quali' => 'Quintum-h323-voice-quality',
- 'quintum_nas_port' => 'Quintum-NAS-Port',
- 'rate_limit_burst' => 'Rate_Limit_Burst',
- 'rate_limit_bursu' => 'Rate-Limit-Burst',
- 'rate_limit_rate' => 'Rate_Limit_Rate',
- 'rate_limit_ratf' => 'Rate-Limit-Rate',
- 'realm' => 'Realm',
- 'redcreek_tunneled_dns_se' => 'RedCreek-Tunneled-DNS-Server',
- 'redcreek_tunneled_domain' => 'RedCreek-Tunneled-DomainName',
- 'redcreek_tunneled_gatewa' => 'RedCreek-Tunneled-Gateway',
- 'redcreek_tunneled_hostna' => 'RedCreek-Tunneled-HostName',
- 'redcreek_tunneled_ip_add' => 'RedCreek-Tunneled-IP-Addr',
- 'redcreek_tunneled_ip_net' => 'RedCreek-Tunneled-IP-Netmask',
- 'redcreek_tunneled_search' => 'RedCreek-Tunneled-Search-List',
+ 'acc_callback_delay' => 'Acc-Callback-Delay',
+ 'acct_input_octets_64' => 'Acct-Input-Octets-64',
+ 'ascend_base_channel_coun' => 'Ascend-Base-Channel-Count',
+ 'ascend_atm_connect_vci' => 'Ascend-ATM-Connect-Vci',
+ 'erx_primary_dns' => 'ERX-Primary-Dns',
+ 'altiga_ipsec_over_nat_g' => 'Altiga-IPSec-Over-NAT-G',
+ 'cvx_multicast_rate_limit' => 'CVX-Multicast-Rate-Limit',
+ 'ascend_xmit_rate' => 'Ascend-Xmit-Rate',
+ 'ms_new_arap_password' => 'MS-New-ARAP-Password',
+ 'usr_call_error_code' => 'USR-Call-Error-Code',
+ 'acct_output_octets' => 'Acct-Output-Octets',
+ 'ascend_client_primary_wi' => 'Ascend-Client-Primary-WINS',
+ 'cvpn3000_primary_wins' => 'CVPN3000-Primary-WINS',
+ 'bintec_ipextrttable' => 'BinTec-ipExtRtTable',
+ 'cisco_fax_mdn_flag' => 'Cisco-Fax-Mdn-Flag',
+ 'ascend_destination_nas_p' => 'Ascend-Destination-Nas-Port',
+ 'ascend_num_in_multilink' => 'Ascend-Num-In-Multilink',
+ 'digest_attributes' => 'Digest-Attributes',
+ 'cvpn3000_ipsec_tunnel_ty' => 'CVPN3000-IPSec-Tunnel-Type',
+ 'x_ascend_number_sessions' => 'X-Ascend-Number-Sessions',
+ 'usr_ip_rip_output_filter' => 'USR-IP-RIP-Output-Filter',
+ 'tunnel_police_bursu' => 'Tunnel_Police_Burst',
'redcreek_tunneled_wins_s' => 'RedCreek-Tunneled-WINS-Server1',
- 'redcreek_tunneled_wins_t' => 'RedCreek-Tunneled-WINS-Server2',
- 'replicate_to_realm' => 'Replicate-To-Realm',
- 'reply_message' => 'Reply-Message',
- 'response_packet_type' => 'Response-Packet-Type',
- 'rewrite_rule' => 'Rewrite-Rule',
- 'sdx_service_name' => 'Sdx-Service-Name',
- 'sdx_session_volume_quota' => 'Sdx-Session-Volume-Quota',
- 'sdx_tunnel_disconnect_ca' => 'Sdx-Tunnel-Disconnect-Cause-Info',
- 'service_type' => 'Service-Type',
- 'session' => 'Session',
- 'session_error_code' => 'Session_Error_Code',
- 'session_error_codf' => 'Session-Error-Code',
- 'session_error_msg' => 'Session_Error_Msg',
- 'session_error_msh' => 'Session-Error-Msg',
- 'session_protocol' => 'session-protocol',
- 'session_timeout' => 'Session-Timeout',
- 'session_type' => 'Session-Type',
- 'shasta_service_profile' => 'Shasta-Service-Profile',
- 'shasta_user_privilege' => 'Shasta-User-Privilege',
- 'shasta_vpn_name' => 'Shasta-VPN-Name',
- 'shiva_acct_serv_switch' => 'Shiva-Acct-Serv-Switch',
- 'shiva_called_number' => 'Shiva-Called-Number',
- 'shiva_calling_number' => 'Shiva-Calling-Number',
- 'shiva_compression_type' => 'Shiva-Compression-Type',
- 'shiva_connect_reason' => 'Shiva-Connect-Reason',
- 'shiva_customer_id' => 'Shiva-Customer-Id',
- 'shiva_disconnect_reason' => 'Shiva-Disconnect-Reason',
- 'shiva_event_flags' => 'Shiva-Event-Flags',
- 'shiva_function' => 'Shiva-Function',
- 'shiva_link_protocol' => 'Shiva-Link-Protocol',
- 'shiva_link_speed' => 'Shiva-Link-Speed',
- 'shiva_links_in_bundle' => 'Shiva-Links-In-Bundle',
- 'shiva_network_protocols' => 'Shiva-Network-Protocols',
- 'shiva_session_id' => 'Shiva-Session-Id',
- 'shiva_type_of_service' => 'Shiva-Type-Of-Service',
- 'shiva_user_attributes' => 'Shiva-User-Attributes',
- 'simultaneous_use' => 'Simultaneous-Use',
- 'sip_from' => 'Sip-From',
- 'sip_hdr' => 'sip-hdr',
- 'sip_method' => 'Sip-Method',
- 'sip_to' => 'Sip-To',
- 'sip_translated_request_u' => 'Sip-Translated-Request-URI',
- 'smb_account_ctrl' => 'SMB-Account-CTRL',
- 'smb_account_ctrl_text' => 'SMB-Account-CTRL-TEXT',
- 'sonicwall_user_group' => 'SonicWall-User-Group',
- 'sonicwall_user_privilege' => 'SonicWall-User-Privilege',
- 'source_validation' => 'Source_Validation',
- 'source_validatioo' => 'Source-Validation',
- 'sql_group' => 'Sql-Group',
- 'sql_user_name' => 'SQL-User-Name',
- 'ss3_firewall_user_privil' => 'SS3-Firewall-User-Privilege',
- 'st_acct_vc_connection_id' => 'ST-Acct-VC-Connection-Id',
- 'st_policy_name' => 'ST-Policy-Name',
- 'st_primary_dns_server' => 'ST-Primary-DNS-Server',
- 'st_primary_nbns_server' => 'ST-Primary-NBNS-Server',
- 'st_secondary_dns_server' => 'ST-Secondary-DNS-Server',
- 'st_secondary_nbns_server' => 'ST-Secondary-NBNS-Server',
- 'st_service_domain' => 'ST-Service-Domain',
- 'st_service_name' => 'ST-Service-Name',
- 'state' => 'State',
- 'strip_user_name' => 'Strip-User-Name',
- 'stripped_user_name' => 'Stripped-User-Name',
- 'subscriber' => 'subscriber',
- 'suffix' => 'Suffix',
- 'telebit_accounting_info' => 'Telebit-Accounting-Info',
- 'telebit_activate_command' => 'Telebit-Activate-Command',
- 'telebit_login_command' => 'Telebit-Login-Command',
- 'telebit_port_name' => 'Telebit-Port-Name',
- 'termination_action' => 'Termination-Action',
- 'termination_menu' => 'Termination-Menu',
- 'trapeze_encryption_type' => 'Trapeze-Encryption-Type',
- 'trapeze_end_date' => 'Trapeze-End-Date',
- 'trapeze_mobility_profile' => 'Trapeze-Mobility-Profile',
- 'trapeze_ssid' => 'Trapeze-SSID',
- 'trapeze_start_date' => 'Trapeze-Start-Date',
- 'trapeze_time_of_day' => 'Trapeze-Time-Of-Day',
- 'trapeze_url' => 'Trapeze-URL',
- 'trapeze_vlan_name' => 'Trapeze-VLAN-Name',
- 'tty_level_max' => 'TTY_Level_Max',
- 'tty_level_may' => 'TTY-Level-Max',
- 'tty_level_start' => 'TTY_Level_Start',
- 'tty_level_staru' => 'TTY-Level-Start',
- 'tunnel_algorithm' => 'Tunnel_Algorithm',
- 'tunnel_algorithn' => 'Tunnel-Algorithm',
- 'tunnel_assignment_id' => 'Tunnel-Assignment-Id',
- 'tunnel_client_auth_id' => 'Tunnel-Client-Auth-Id',
- 'tunnel_client_endpoint' => 'Tunnel-Client-Endpoint',
- 'tunnel_cmd_timeout' => 'Tunnel_Cmd_Timeout',
- 'tunnel_cmd_timeouu' => 'Tunnel-Cmd-Timeout',
- 'tunnel_connection_id' => 'Tunnel-Connection-Id',
- 'tunnel_context' => 'Tunnel_Context',
- 'tunnel_contexu' => 'Tunnel-Context',
- 'tunnel_deadtime' => 'Tunnel_Deadtime',
- 'tunnel_deadtimf' => 'Tunnel-Deadtime',
- 'tunnel_dnis' => 'Tunnel_DNIS',
- 'tunnel_dnit' => 'Tunnel-DNIS',
- 'tunnel_domain' => 'Tunnel_Domain',
- 'tunnel_domaio' => 'Tunnel-Domain',
- 'tunnel_function' => 'Tunnel_Function',
- 'tunnel_functioo' => 'Tunnel-Function',
- 'tunnel_group' => 'Tunnel_Group',
- 'tunnel_grouq' => 'Tunnel-Group',
- 'tunnel_l2f_second_passwo' => 'Tunnel_L2F_Second_Password',
- 'tunnel_l2f_second_passwp' => 'Tunnel-L2F-Second-Password',
- 'tunnel_local_name' => 'Tunnel_Local_Name',
- 'tunnel_local_namf' => 'Tunnel-Local-Name',
- 'tunnel_max_sessions' => 'Tunnel_Max_Sessions',
- 'tunnel_max_sessiont' => 'Tunnel-Max-Sessions',
- 'tunnel_max_tunnels' => 'Tunnel_Max_Tunnels',
- 'tunnel_max_tunnelt' => 'Tunnel-Max-Tunnels',
- 'tunnel_medium_type' => 'Tunnel-Medium-Type',
- 'tunnel_password' => 'Tunnel-Password',
- 'tunnel_police_burst' => 'Tunnel_Police_Burst',
- 'tunnel_police_bursu' => 'Tunnel-Police-Burst',
- 'tunnel_police_rate' => 'Tunnel_Police_Rate',
- 'tunnel_police_ratf' => 'Tunnel-Police-Rate',
- 'tunnel_preference' => 'Tunnel-Preference',
- 'tunnel_private_group_id' => 'Tunnel-Private-Group-Id',
- 'tunnel_rate_limit_burst' => 'Tunnel_Rate_Limit_Burst',
- 'tunnel_rate_limit_bursu' => 'Tunnel-Rate-Limit-Burst',
- 'tunnel_rate_limit_rate' => 'Tunnel_Rate_Limit_Rate',
- 'tunnel_rate_limit_ratf' => 'Tunnel-Rate-Limit-Rate',
- 'tunnel_remote_name' => 'Tunnel_Remote_Name',
- 'tunnel_remote_namf' => 'Tunnel-Remote-Name',
- 'tunnel_retransmit' => 'Tunnel_Retransmit',
- 'tunnel_retransmiu' => 'Tunnel-Retransmit',
- 'tunnel_server_auth_id' => 'Tunnel-Server-Auth-Id',
- 'tunnel_server_endpoint' => 'Tunnel-Server-Endpoint',
- 'tunnel_session_auth' => 'Tunnel_Session_Auth',
- 'tunnel_session_auth_ctx' => 'Tunnel_Session_Auth_Ctx',
- 'tunnel_session_auth_cty' => 'Tunnel-Session-Auth-Ctx',
- 'tunnel_session_auth_serv' => 'Tunnel_Session_Auth_Service_Grp',
- 'tunnel_session_auth_serw' => 'Tunnel-Session-Auth-Service-Grp',
- 'tunnel_session_auti' => 'Tunnel-Session-Auth',
- 'tunnel_type' => 'Tunnel-Type',
- 'tunnel_window' => 'Tunnel_Window',
- 'tunnel_windox' => 'Tunnel-Window',
- 'unix_ftp_gid' => 'Unix-FTP-GID',
- 'unix_ftp_group_ids' => 'Unix-FTP-Group-Ids',
- 'unix_ftp_group_names' => 'Unix-FTP-Group-Names',
- 'unix_ftp_home' => 'Unix-FTP-Home',
- 'unix_ftp_shell' => 'Unix-FTP-Shell',
- 'unix_ftp_uid' => 'Unix-FTP-UID',
- 'user_category' => 'User-Category',
- 'user_name' => 'User-Name',
- 'user_name_is_star' => 'User-Name-Is-Star',
- 'user_password' => 'User-Password',
- 'user_profile' => 'User-Profile',
- 'user_service_type' => 'User-Service-Type',
- 'usr_accm_type' => 'USR-ACCM-Type',
- 'usr_acct_reason_code' => 'USR-Acct-Reason-Code',
- 'usr_actual_voltage' => 'USR-Actual-Voltage',
- 'usr_appletalk' => 'USR-Appletalk',
- 'usr_appletalk_network_ra' => 'USR-Appletalk-Network-Range',
+ 'usr_blocks_sent' => 'USR-Blocks-Sent',
+ 'erx_cli_allow_all_vr_acc' => 'ERX-Cli-Allow-All-VR-Access',
+ 'tunnel_police_ratf' => 'Tunnel_Police_Rate',
+ 'usr_ids0_call_type' => 'USR-IDS0-Call-Type',
+ 'acc_ccp_option' => 'Acc-Ccp-Option',
+ 'ascend_client_gateway' => 'Ascend-Client-Gateway',
+ 'cvx_maximum_channels' => 'CVX-Maximum-Channels',
+ 'bg_aging_timf' => 'BG_Aging_Time',
+ 'annex_secondary_dns_serv' => 'Annex-Secondary-DNS-Server',
+ 'le_ipsec_passive_profile' => 'LE-IPSec-Passive-Profile',
+ 'usr_chassis_call_span' => 'USR-Chassis-Call-Span',
+ 'aat_client_primary_wins_' => 'AAT-Client-Primary-WINS-NBNS',
+ 'h323_currency' => 'h323-currency',
+ 'password' => 'Password',
+ 'le_nat_log_options' => 'LE-NAT-Log-Options',
+ 'usr_fallback_limit' => 'USR-Fallback-Limit',
+ 'x_ascend_ppp_address' => 'X-Ascend-PPP-Address',
+ 'suffix' => 'Suffix',
+ 'usr_multicast_receive' => 'USR-Multicast-Receive',
+ 'client_dns_sec' => 'Client-DNS-Sec',
+ 'annex_product_name' => 'Annex-Product-Name',
+ 'cisco_pw_lifetime' => 'Cisco-PW-Lifetime',
+ 'x_ascend_fr_dce_n393' => 'X-Ascend-FR-DCE-N393',
+ 'x_ascend_ts_idle_limit' => 'X-Ascend-TS-Idle-Limit',
+ 'mcast_send' => 'Mcast-Send',
+ 'x_ascend_primary_home_ag' => 'X-Ascend-Primary-Home-Agent',
+ 'tunnel_max_sessiont' => 'Tunnel_Max_Sessions',
+ 'pppoe_motm' => 'PPPOE-MOTM',
+ 'usr_pw_usr_ifilter_ipx' => 'USR-PW_USR_IFilter_IPX',
+ 'ms_ras_version' => 'MS-RAS-Version',
+ 'ascend_source_ip_check' => 'Ascend-Source-IP-Check',
+ 'bintec_ospfiftable' => 'BinTec-ospfIfTable',
+ 'acc_ml_call_threshold' => 'Acc-ML-Call-Threshold',
+ 'x_ascend_modem_slotno' => 'X-Ascend-Modem-SlotNo',
+ 'ascend_menu_item' => 'Ascend-Menu-Item',
+ 'callback_id' => 'Callback-Id',
+ 'framed_ipx_network' => 'Framed-IPX-Network',
+ 'altiga_pptp_encryption_g' => 'Altiga-PPTP-Encryption-G',
+ 'ascend_x25_reverse_charg' => 'Ascend-X25-Reverse-Charging',
+ 'ascend_user_acct_key' => 'Ascend-User-Acct-Key',
+ 'x_ascend_pw_lifetime' => 'X-Ascend-PW-Lifetime',
+ 'user_name_is_star' => 'User-Name-Is-Star',
+ 'nomadix_url_redirection' => 'Nomadix-URL-Redirection',
+ 'framed_pool' => 'Framed-Pool',
+ 'x_ascend_authen_alias' => 'X-Ascend-Authen-Alias',
+ 'cisco_fax_dsn_address' => 'Cisco-Fax-Dsn-Address',
+ 'ms_primary_dns_server' => 'MS-Primary-DNS-Server',
+ 'acc_dialout_auth_usernam' => 'Acc-Dialout-Auth-Username',
+ 'realm' => 'Realm',
+ 'arap_features' => 'ARAP-Features',
+ 'bind_auth_protocom' => 'Bind_Auth_Protocol',
+ 'acc_connect_tx_speed' => 'Acc-Connect-Tx-Speed',
+ 'usr_chassis_temperature' => 'USR-Chassis-Temperature',
+ 'altiga_ipsec_mode_config' => 'Altiga-IPSec-Mode-Config-G',
+ 'ascend_home_agent_ip_add' => 'Ascend-Home-Agent-IP-Addr',
+ 'x_ascend_xmit_rate' => 'X-Ascend-Xmit-Rate',
+ 'cvpn3000_secondary_dns' => 'CVPN3000-Secondary-DNS',
+ 'x_ascend_send_passwd' => 'X-Ascend-Send-Passwd',
+ 'bind_int_contexu' => 'Bind_Int_Context',
+ 'cisco_fax_account_id_ori' => 'Cisco-Fax-Account-Id-Origin',
+ 'le_modem_info' => 'LE-Modem-Info',
+ 'ascend_ipx_peer_mode' => 'Ascend-IPX-Peer-Mode',
+ 'juniper_local_user_name' => 'Juniper-Local-User-Name',
+ 'tunnel_rate_limit_rate' => 'Tunnel-Rate-Limit-Rate',
+ 'quintum_h323_credit_time' => 'Quintum-h323-credit-time',
+ 'acc_modem_modulation_typ' => 'Acc-Modem-Modulation-Type',
+ 'x_ascend_seconds_of_hist' => 'X-Ascend-Seconds-Of-History',
+ 'ascend_dhcp_pool_number' => 'Ascend-DHCP-Pool-Number',
+ 'redcreek_tunneled_ip_net' => 'RedCreek-Tunneled-IP-Netmask',
+ 'x_ascend_callback' => 'X-Ascend-Callback',
+ 'usr_iwf_ip_address' => 'USR-IWF-IP-Address',
+ 'aat_input_octets_diff' => 'AAT-Input-Octets-Diff',
+ 'nas_port_id' => 'NAS-Port-Id',
+ 'le_advice_of_charge' => 'LE-Advice-of-Charge',
+ 'x_ascend_dhcp_pool_numbe' => 'X-Ascend-DHCP-Pool-Number',
+ 'ascend_add_seconds' => 'Ascend-Add-Seconds',
+ 'annex_transmit_speed' => 'Annex-Transmit-Speed',
+ 'usr_port_tap' => 'USR-Port-Tap',
'usr_at_call_input_filter' => 'USR-AT-Call-Input-Filter',
- 'usr_at_call_output_filte' => 'USR-AT-Call-Output-Filter',
- 'usr_at_input_filter' => 'USR-AT-Input-Filter',
- 'usr_at_output_filter' => 'USR-AT-Output-Filter',
- 'usr_at_rtmp_input_filter' => 'USR-AT-RTMP-Input-Filter',
- 'usr_at_rtmp_output_filte' => 'USR-AT-RTMP-Output-Filter',
- 'usr_at_zip_input_filter' => 'USR-AT-Zip-Input-Filter',
- 'usr_at_zip_output_filter' => 'USR-AT-Zip-Output-Filter',
- 'usr_auth_mode' => 'USR-Auth-Mode',
- 'usr_back_channel_data_ra' => 'USR-Back-Channel-Data-Rate',
- 'usr_bearer_capabilities' => 'USR-Bearer-Capabilities',
- 'usr_block_error_count_li' => 'USR-Block-Error-Count-Limit',
- 'usr_blocks_received' => 'USR-Blocks-Received',
- 'usr_blocks_resent' => 'USR-Blocks-Resent',
- 'usr_blocks_sent' => 'USR-Blocks-Sent',
- 'usr_bridging' => 'USR-Bridging',
- 'usr_call_arrival_in_gmt' => 'USR-Call-Arrival-in-GMT',
- 'usr_call_arrival_time' => 'USR-Call-Arrival-Time',
- 'usr_call_connect_in_gmt' => 'USR-Call-Connect-in-GMT',
- 'usr_call_connecting_time' => 'USR-Call-Connecting-Time',
- 'usr_call_end_date_time' => 'USR-Call-End-Date-Time',
- 'usr_call_end_time' => 'USR-Call-End-Time',
- 'usr_call_error_code' => 'USR-Call-Error-Code',
- 'usr_call_event_code' => 'USR-Call-Event-Code',
- 'usr_call_reference_numbe' => 'USR-Call-Reference-Number',
- 'usr_call_start_date_time' => 'USR-Call-Start-Date-Time',
- 'usr_call_terminate_in_gm' => 'USR-Call-Terminate-in-GMT',
- 'usr_call_type' => 'USR-Call-Type',
- 'usr_callback_type' => 'USR-Callback-Type',
- 'usr_called_party_number' => 'USR-Called-Party-Number',
- 'usr_calling_party_number' => 'USR-Calling-Party-Number',
- 'usr_card_type' => 'USR-Card-Type',
- 'usr_ccp_algorithm' => 'USR-CCP-Algorithm',
- 'usr_cdma_call_reference_' => 'USR-CDMA-Call-Reference-Number',
- 'usr_channel' => 'USR-Channel',
- 'usr_channel_connected_to' => 'USR-Channel-Connected-To',
- 'usr_channel_decrement' => 'USR-Channel-Decrement',
- 'usr_channel_expansion' => 'USR-Channel-Expansion',
- 'usr_characters_received' => 'USR-Characters-Received',
- 'usr_characters_sent' => 'USR-Characters-Sent',
- 'usr_chassis_call_channel' => 'USR-Chassis-Call-Channel',
- 'usr_chassis_call_slot' => 'USR-Chassis-Call-Slot',
- 'usr_chassis_call_span' => 'USR-Chassis-Call-Span',
- 'usr_chassis_slot' => 'USR-Chassis-Slot',
- 'usr_chassis_temp_thresho' => 'USR-Chassis-Temp-Threshold',
- 'usr_chassis_temperature' => 'USR-Chassis-Temperature',
- 'usr_chat_script_name' => 'USR-Chat-Script-Name',
- 'usr_compression_algorith' => 'USR-Compression-Algorithm',
- 'usr_compression_reset_mo' => 'USR-Compression-Reset-Mode',
- 'usr_compression_type' => 'USR-Compression-Type',
- 'usr_connect_speed' => 'USR-Connect-Speed',
- 'usr_connect_term_reason' => 'USR-Connect-Term-Reason',
- 'usr_connect_time' => 'USR-Connect-Time',
- 'usr_connect_time_limit' => 'USR-Connect-Time-Limit',
- 'usr_cusr_hat_script_rule' => 'USR-CUSR-hat-Script-Rules',
- 'usr_default_dte_data_rat' => 'USR-Default-DTE-Data-Rate',
- 'usr_device_connected_to' => 'USR-Device-Connected-To',
- 'usr_disconnect_cause_ind' => 'USR-Disconnect-Cause-Indicator',
- 'usr_dnis_reauthenticatio' => 'USR-DNIS-ReAuthentication',
- 'usr_ds0' => 'USR-DS0',
- 'usr_ds0s' => 'USR-DS0s',
- 'usr_dte_data_idle_timout' => 'USR-DTE-Data-Idle-Timout',
- 'usr_dte_ring_no_answer_l' => 'USR-DTE-Ring-No-Answer-Limit',
- 'usr_dtr_false_timeout' => 'USR-DTR-False-Timeout',
- 'usr_dtr_true_timeout' => 'USR-DTR-True-Timeout',
- 'usr_end_time' => 'USR-End-Time',
- 'usr_equalization_type' => 'USR-Equalization-Type',
- 'usr_esn' => 'USR-ESN',
- 'usr_et_bridge_call_outpu' => 'USR-ET-Bridge-Call-Output-Filte',
- 'usr_et_bridge_input_filt' => 'USR-ET-Bridge-Input-Filter',
- 'usr_et_bridge_output_fil' => 'USR-ET-Bridge-Output-Filter',
- 'usr_event_date_time' => 'USR-Event-Date-Time',
- 'usr_event_id' => 'USR-Event-Id',
- 'usr_expansion_algorithm' => 'USR-Expansion-Algorithm',
- 'usr_expected_voltage' => 'USR-Expected-Voltage',
- 'usr_failure_to_connect_r' => 'USR-Failure-to-Connect-Reason',
- 'usr_fallback_enabled' => 'USR-Fallback-Enabled',
- 'usr_fallback_limit' => 'USR-Fallback-Limit',
- 'usr_filter_zones' => 'USR-Filter-Zones',
- 'usr_final_rx_link_data_r' => 'USR-Final-Rx-Link-Data-Rate',
- 'usr_final_tx_link_data_r' => 'USR-Final-Tx-Link-Data-Rate',
- 'usr_framed_ip_address_po' => 'USR-Framed_IP_Address_Pool_Name',
- 'usr_framed_ipx_route' => 'USR-Framed-IPX-Route',
- 'usr_gateway_ip_address' => 'USR-Gateway-IP-Address',
- 'usr_harc_disconnect_code' => 'USR-HARC-Disconnect-Code',
- 'usr_host_type' => 'USR-Host-Type',
- 'usr_ids0_call_type' => 'USR-IDS0-Call-Type',
- 'usr_igmp_maximum_respons' => 'USR-IGMP-Maximum-Response-Time',
- 'usr_igmp_query_interval' => 'USR-IGMP-Query-Interval',
- 'usr_igmp_robustness' => 'USR-IGMP-Robustness',
- 'usr_igmp_routing' => 'USR-IGMP-Routing',
- 'usr_igmp_version' => 'USR-IGMP-Version',
- 'usr_imsi' => 'USR-IMSI',
- 'usr_initial_rx_link_data' => 'USR-Initial-Rx-Link-Data-Rate',
- 'usr_initial_tx_link_data' => 'USR-Initial-Tx-Link-Data-Rate',
- 'usr_interface_index' => 'USR-Interface-Index',
- 'usr_ip' => 'USR-IP',
- 'usr_ip_call_input_filter' => 'USR-IP-Call-Input-Filter',
- 'usr_ip_call_output_filte' => 'USR-IP-Call-Output-Filter',
- 'usr_ip_default_route_opt' => 'USR-IP-Default-Route-Option',
- 'usr_ip_rip_input_filter' => 'USR-IP-RIP-Input-Filter',
- 'usr_ip_rip_output_filter' => 'USR-IP-RIP-Output-Filter',
- 'usr_ip_rip_policies' => 'USR-IP-RIP-Policies',
- 'usr_ip_rip_simple_auth_p' => 'USR-IP-RIP-Simple-Auth-Password',
- 'usr_ip_saa_filter' => 'USR-IP-SAA-Filter',
- 'usr_ipx' => 'USR-IPX',
- 'usr_ipx_call_input_filte' => 'USR-IPX-Call-Input-Filter',
- 'usr_ipx_call_output_filt' => 'USR-IPX-Call-Output-Filter',
- 'usr_ipx_rip_input_filter' => 'USR-IPX-RIP-Input-Filter',
- 'usr_ipx_rip_output_filte' => 'USR-IPX-RIP-Output-Filter',
- 'usr_ipx_routing' => 'USR-IPX-Routing',
- 'usr_ipx_wan' => 'USR-IPX-WAN',
- 'usr_iwf_call_identifier' => 'USR-IWF-Call-Identifier',
- 'usr_iwf_ip_address' => 'USR-IWF-IP-Address',
- 'usr_keypress_timeout' => 'USR-Keypress-Timeout',
- 'usr_last_callers_number_' => 'USR-Last-Callers-Number-ANI',
- 'usr_last_number_dialed_i' => 'USR-Last-Number-Dialed-In-DNIS',
- 'usr_last_number_dialed_o' => 'USR-Last-Number-Dialed-Out',
- 'usr_line_reversals' => 'USR-Line-Reversals',
- 'usr_local_framed_ip_addr' => 'USR-Local-Framed-IP-Addr',
- 'usr_local_ip_address' => 'USR-Local-IP-Address',
- 'usr_log_filter_packets' => 'USR-Log-Filter-Packets',
- 'usr_max_channels' => 'USR-Max-Channels',
- 'usr_mbi_ct_bchannel_used' => 'USR-Mbi_Ct_BChannel_Used',
- 'usr_mbi_ct_pri_card_slot' => 'USR-Mbi_Ct_PRI_Card_Slot',
- 'usr_mbi_ct_pri_card_span' => 'USR-Mbi_Ct_PRI_Card_Span_Line',
- 'usr_mbi_ct_tdm_time_slot' => 'USR-Mbi_Ct_TDM_Time_Slot',
- 'usr_mic' => 'USR-MIC',
- 'usr_min_compression_size' => 'USR-Min-Compression-Size',
- 'usr_mobile_ip_address' => 'USR-Mobile-IP-Address',
- 'usr_mobile_numbytes_rxed' => 'USR-Mobile-NumBytes-Rxed',
- 'usr_mobile_numbytes_txed' => 'USR-Mobile-NumBytes-Txed',
- 'usr_mobileip_home_agent_' => 'USR-MobileIP-Home-Agent-Address',
- 'usr_modem_group' => 'USR-Modem-Group',
- 'usr_modem_setup_time' => 'USR-Modem-Setup-Time',
- 'usr_modem_training_time' => 'USR-Modem-Training-Time',
- 'usr_modulation_type' => 'USR-Modulation-Type',
- 'usr_mp_edo' => 'USR-MP-EDO',
- 'usr_mp_edo_hiper' => 'USR-MP-EDO-HIPER',
- 'usr_mp_mrru' => 'USR-MP-MRRU',
- 'usr_mpip_tunnel_originat' => 'USR-MPIP-Tunnel-Originator',
- 'usr_multicast_forwarding' => 'USR-Multicast-Forwarding',
- 'usr_multicast_proxy' => 'USR-Multicast-Proxy',
- 'usr_multicast_receive' => 'USR-Multicast-Receive',
- 'usr_nas_type' => 'USR-NAS-Type',
- 'usr_nfas_id' => 'USR-NFAS-ID',
- 'usr_num_fax_pages_proces' => 'USR-Num-Fax-Pages-Processed',
- 'usr_number_of_blers' => 'USR-Number-of-Blers',
- 'usr_number_of_characters' => 'USR-Number-Of-Characters-Lost',
- 'usr_number_of_fallbacks' => 'USR-Number-of-Fallbacks',
- 'usr_number_of_link_naks' => 'USR-Number-of-Link-NAKs',
- 'usr_number_of_link_timeo' => 'USR-Number-of-Link-Timeouts',
- 'usr_number_of_rings_limi' => 'USR-Number-of-Rings-Limit',
- 'usr_number_of_upshifts' => 'USR-Number-of-Upshifts',
- 'usr_orig_nas_type' => 'USR-Orig-NAS-Type',
- 'usr_originate_answer_mod' => 'USR-Originate-Answer-Mode',
- 'usr_ospf_addressless_ind' => 'USR-OSPF-Addressless-Index',
- 'usr_packet_bus_session' => 'USR-Packet-Bus-Session',
- 'usr_physical_state' => 'USR-Physical-State',
- 'usr_port_tap' => 'USR-Port-Tap',
- 'usr_port_tap_address' => 'USR-Port-Tap-Address',
- 'usr_port_tap_facility' => 'USR-Port-Tap-Facility',
- 'usr_port_tap_format' => 'USR-Port-Tap-Format',
- 'usr_port_tap_output' => 'USR-Port-Tap-Output',
- 'usr_port_tap_priority' => 'USR-Port-Tap-Priority',
- 'usr_power_supply_number' => 'USR-Power-Supply-Number',
- 'usr_primary_dns_server' => 'USR-Primary_DNS_Server',
- 'usr_primary_nbns_server' => 'USR-Primary_NBNS_Server',
- 'usr_pw_cutoff' => 'USR-PW_Cutoff',
- 'usr_pw_framed_routing_v2' => 'USR-PW_Framed_Routing_V2',
- 'usr_pw_index' => 'USR-PW_Index',
- 'usr_pw_packet' => 'USR-PW_Packet',
- 'usr_pw_tunnel_authentica' => 'USR-PW_Tunnel_Authentication',
- 'usr_pw_usr_ifilter_ip' => 'USR-PW_USR_IFilter_IP',
- 'usr_pw_usr_ifilter_ipx' => 'USR-PW_USR_IFilter_IPX',
- 'usr_pw_usr_ofilter_ip' => 'USR-PW_USR_OFilter_IP',
- 'usr_pw_usr_ofilter_ipx' => 'USR-PW_USR_OFilter_IPX',
- 'usr_pw_usr_ofilter_sap' => 'USR-PW_USR_OFilter_SAP',
- 'usr_pw_vpn_gateway' => 'USR-PW_VPN_Gateway',
- 'usr_pw_vpn_id' => 'USR-PW_VPN_ID',
- 'usr_pw_vpn_name' => 'USR-PW_VPN_Name',
- 'usr_pw_vpn_neighbor' => 'USR-PW_VPN_Neighbor',
- 'usr_q931_call_reference_' => 'USR-Q931-Call-Reference-Value',
- 'usr_rad_dvmrp_metric' => 'USR-Rad-Dvmrp-Metric',
- 'usr_rad_location_type' => 'USR-Rad-Location-Type',
- 'usr_rad_multicast_routin' => 'USR-Rad-Multicast-Routing-Ttl',
- 'usr_rad_multicast_routio' => 'USR-Rad-Multicast-Routing-RtLim',
- 'usr_rad_multicast_routip' => 'USR-Rad-Multicast-Routing-Proto',
+ 'framed_ipv6_pool' => 'Framed-IPv6-Pool',
+ 'ascend_qos_downstream' => 'Ascend-QOS-Downstream',
+ 'lac_port' => 'LAC-Port',
+ 'tunnel_assignment_id' => 'Tunnel-Assignment-Id',
+ 'acct_mcast_out_octett' => 'Acct_Mcast_Out_Octets',
+ 'ascend_bi_directional_au' => 'Ascend-Bi-Directional-Auth',
+ 'fall_through' => 'Fall-Through',
+ 'cvpn3000_ipsec_ip_compre' => 'CVPN3000-IPSec-IP-Compression',
+ 'cisco_disconnect_cause' => 'Cisco-Disconnect-Cause',
'usr_rad_multicast_routiq' => 'USR-Rad-Multicast-Routing-Bound',
- 'usr_re_chap_timeout' => 'USR-Re-Chap-Timeout',
- 'usr_receive_acc_map' => 'USR-Receive-Acc-Map',
- 'usr_reply_script1' => 'USR-Reply-Script1',
- 'usr_reply_script2' => 'USR-Reply-Script2',
- 'usr_reply_script3' => 'USR-Reply-Script3',
- 'usr_reply_script4' => 'USR-Reply-Script4',
- 'usr_reply_script5' => 'USR-Reply-Script5',
- 'usr_reply_script6' => 'USR-Reply-Script6',
- 'usr_request_type' => 'USR-Request-Type',
- 'usr_retrains_granted' => 'USR-Retrains-Granted',
- 'usr_retrains_requested' => 'USR-Retrains-Requested',
- 'usr_rmmie_firmware_build' => 'USR-RMMIE-Firmware-Build-Date',
- 'usr_rmmie_firmware_versi' => 'USR-RMMIE-Firmware-Version',
- 'usr_rmmie_last_update_ev' => 'USR-RMMIE-Last-Update-Event',
- 'usr_rmmie_last_update_ti' => 'USR-RMMIE-Last-Update-Time',
- 'usr_rmmie_manufacturer_i' => 'USR-RMMIE-Manufacturer-ID',
- 'usr_rmmie_num_of_updates' => 'USR-RMMIE-Num-Of-Updates',
- 'usr_rmmie_planned_discon' => 'USR-RMMIE-Planned-Disconnect',
- 'usr_rmmie_product_code' => 'USR-RMMIE-Product-Code',
- 'usr_rmmie_pwrlvl_farecho' => 'USR-RMMIE-PwrLvl-FarEcho-Canc',
- 'usr_rmmie_pwrlvl_nearech' => 'USR-RMMIE-PwrLvl-NearEcho-Canc',
- 'usr_rmmie_pwrlvl_noise_l' => 'USR-RMMIE-PwrLvl-Noise-Lvl',
- 'usr_rmmie_pwrlvl_xmit_lv' => 'USR-RMMIE-PwrLvl-Xmit-Lvl',
- 'usr_rmmie_rcv_pwrlvl_330' => 'USR-RMMIE-Rcv-PwrLvl-3300Hz',
- 'usr_rmmie_rcv_pwrlvl_375' => 'USR-RMMIE-Rcv-PwrLvl-3750Hz',
- 'usr_rmmie_rcv_tot_pwrlvl' => 'USR-RMMIE-Rcv-Tot-PwrLvl',
- 'usr_rmmie_serial_number' => 'USR-RMMIE-Serial-Number',
- 'usr_rmmie_status' => 'USR-RMMIE-Status',
- 'usr_rmmie_x2_status' => 'USR-RMMIE-x2-Status',
- 'usr_routing_protocol' => 'USR-Routing-Protocol',
- 'usr_sap_filter_in' => 'USR-SAP-Filter-In',
- 'usr_secondary_dns_server' => 'USR-Secondary_DNS_Server',
- 'usr_secondary_nbns_serve' => 'USR-Secondary_NBNS_Server',
- 'usr_security_login_limit' => 'USR-Security-Login-Limit',
- 'usr_security_resp_limit' => 'USR-Security-Resp-Limit',
- 'usr_send_name' => 'USR-Send-Name',
- 'usr_send_password' => 'USR-Send-Password',
- 'usr_send_script1' => 'USR-Send-Script1',
- 'usr_send_script2' => 'USR-Send-Script2',
- 'usr_send_script3' => 'USR-Send-Script3',
- 'usr_send_script4' => 'USR-Send-Script4',
- 'usr_send_script5' => 'USR-Send-Script5',
- 'usr_send_script6' => 'USR-Send-Script6',
- 'usr_server_time' => 'USR-Server-Time',
- 'usr_service_option' => 'USR-Service-Option',
- 'usr_simplified_mnp_level' => 'USR-Simplified-MNP-Levels',
- 'usr_simplified_v42bis_us' => 'USR-Simplified-V42bis-Usage',
- 'usr_slot_connected_to' => 'USR-Slot-Connected-To',
- 'usr_speed_of_connection' => 'USR-Speed-Of-Connection',
- 'usr_spoofing' => 'USR-Spoofing',
- 'usr_start_time' => 'USR-Start-Time',
- 'usr_supports_tags' => 'USR-Supports-Tags',
- 'usr_sync_async_mode' => 'USR-Sync-Async-Mode',
- 'usr_syslog_tap' => 'USR-Syslog-Tap',
- 'usr_terminal_type' => 'USR-Terminal-Type',
- 'usr_transmit_acc_map' => 'USR-Transmit-Acc-Map',
- 'usr_tunnel_auth_hostname' => 'USR-Tunnel-Auth-Hostname',
- 'usr_tunnel_security' => 'USR-Tunnel-Security',
- 'usr_tunnel_switch_endpoi' => 'USR-Tunnel-Switch-Endpoint',
- 'usr_tunneled_mlpp' => 'USR-Tunneled-MLPP',
- 'usr_unauthenticated_time' => 'USR-Unauthenticated-Time',
- 'usr_vpn_encrypter' => 'USR-VPN-Encrypter',
- 'usr_vpn_gw_location_id' => 'USR-VPN-GW-Location-Id',
- 'usr_vts_session_key' => 'USR-VTS-Session-Key',
- 'vendor_specific' => 'Vendor-Specific',
- 'versanet_termination_cau' => 'Versanet-Termination-Cause',
- 'vnc_pppoe_cbq_rx' => 'VNC-PPPoE-CBQ-RX',
- 'vnc_pppoe_cbq_rx_fallbac' => 'VNC-PPPoE-CBQ-RX-Fallback',
- 'vnc_pppoe_cbq_tx' => 'VNC-PPPoE-CBQ-TX',
- 'vnc_pppoe_cbq_tx_fallbac' => 'VNC-PPPoE-CBQ-TX-Fallback',
- 'vnc_splash' => 'VNC-Splash',
- 'wispr_bandwidth_max_down' => 'WISPr-Bandwidth-Max-Down',
- 'wispr_bandwidth_max_up' => 'WISPr-Bandwidth-Max-Up',
- 'wispr_bandwidth_min_down' => 'WISPr-Bandwidth-Min-Down',
- 'wispr_bandwidth_min_up' => 'WISPr-Bandwidth-Min-Up',
- 'wispr_billing_class_of_s' => 'WISPr-Billing-Class-Of-Service',
- 'wispr_location_id' => 'WISPr-Location-ID',
- 'wispr_location_name' => 'WISPr-Location-Name',
- 'wispr_logoff_url' => 'WISPr-Logoff-URL',
- 'wispr_redirection_url' => 'WISPr-Redirection-URL',
- 'wispr_session_terminate_' => 'WISPr-Session-Terminate-Time',
- 'wispr_session_terminatea' => 'WISPr-Session-Terminate-End-Of-Day',
- 'x_ascend_add_seconds' => 'X-Ascend-Add-Seconds',
- 'x_ascend_ara_pw' => 'X-Ascend-Ara-PW',
- 'x_ascend_assign_ip_clien' => 'X-Ascend-Assign-IP-Client',
- 'x_ascend_assign_ip_globa' => 'X-Ascend-Assign-IP-Global-Pool',
- 'x_ascend_assign_ip_pool' => 'X-Ascend-Assign-IP-Pool',
- 'x_ascend_assign_ip_serve' => 'X-Ascend-Assign-IP-Server',
- 'x_ascend_authen_alias' => 'X-Ascend-Authen-Alias',
- 'x_ascend_backup' => 'X-Ascend-Backup',
- 'x_ascend_bacp_enable' => 'X-Ascend-BACP-Enable',
+ 'altiga_tunneling_protoco' => 'Altiga-Tunneling-Protocols-G/U',
+ 'itk_tunnel_prot' => 'ITK-Tunnel-Prot',
+ 'client_dns_sed' => 'Client_DNS_Sec',
+ 'framed_ip_netmask' => 'Framed-IP-Netmask',
+ 'usr_call_reference_numbe' => 'USR-Call-Reference-Number',
+ 'ascend_egress_enabled' => 'Ascend-Egress-Enabled',
+ 'ascend_dsl_rate_mode' => 'Ascend-Dsl-Rate-Mode',
+ 'usr_pw_usr_ofilter_sap' => 'USR-PW_USR_OFilter_SAP',
+ 'bintec_iproutetable' => 'BinTec-ipRouteTable',
+ 'acct_terminate_cause' => 'Acct-Terminate-Cause',
+ 'x_ascend_fr_dte_n393' => 'X-Ascend-FR-DTE-N393',
+ 'ascend_ppp_address' => 'Ascend-PPP-Address',
+ 'erx_maximum_bps' => 'ERX-Maximum-BPS',
+ 'caller_id' => 'Caller-ID',
+ 'bintec_ipfiltertable' => 'BinTec-ipFilterTable',
'x_ascend_base_channel_co' => 'X-Ascend-Base-Channel-Count',
- 'x_ascend_billing_number' => 'X-Ascend-Billing-Number',
- 'x_ascend_bridge' => 'X-Ascend-Bridge',
- 'x_ascend_bridge_address' => 'X-Ascend-Bridge-Address',
- 'x_ascend_call_attempt_li' => 'X-Ascend-Call-Attempt-Limit',
- 'x_ascend_call_block_dura' => 'X-Ascend-Call-Block-Duration',
- 'x_ascend_call_by_call' => 'X-Ascend-Call-By-Call',
- 'x_ascend_call_filter' => 'X-Ascend-Call-Filter',
- 'x_ascend_call_type' => 'X-Ascend-Call-Type',
- 'x_ascend_callback' => 'X-Ascend-Callback',
- 'x_ascend_client_assign_d' => 'X-Ascend-Client-Assign-DNS',
- 'x_ascend_client_gateway' => 'X-Ascend-Client-Gateway',
+ 'bind_int_interface_name' => 'Bind-Int-Interface-Name',
+ 'usr_modem_group' => 'USR-Modem-Group',
+ 'cisco_maximum_channels' => 'Cisco-Maximum-Channels',
+ 'erx_ppp_username' => 'ERX-PPP-Username',
+ 'ascend_link_compression' => 'Ascend-Link-Compression',
+ 'annex_retransmitted_pack' => 'Annex-Retransmitted-Packets',
+ 'usr_retrains_granted' => 'USR-Retrains-Granted',
+ 'ascend_dropped_packets' => 'Ascend-Dropped-Packets',
+ 'erx_bearer_type' => 'ERX-Bearer-Type',
+ 'usr_pw_usr_ofilter_ip' => 'USR-PW_USR_OFilter_IP',
+ 'quintum_nas_port' => 'Quintum-NAS-Port',
+ 'x_ascend_pre_output_pack' => 'X-Ascend-Pre-Output-Packets',
+ 'usr_cdma_call_reference_' => 'USR-CDMA-Call-Reference-Number',
+ 'tunnel_function' => 'Tunnel-Function',
+ 'annex_tunnel_authen_mode' => 'Annex-Tunnel-Authen-Mode',
+ 'usr_mp_edo' => 'USR-MP-EDO',
+ 'le_nat_outmap' => 'LE-NAT-Outmap',
+ 'cvpn3000_primary_dns' => 'CVPN3000-Primary-DNS',
+ 'usr_modulation_type' => 'USR-Modulation-Type',
+ 'ascend_calling_id_screen' => 'Ascend-Calling-Id-Screening',
+ 'ascend_maximum_time' => 'Ascend-Maximum-Time',
+ 'user_password' => 'User-Password',
+ 'annex_callback_portlist' => 'Annex-Callback-Portlist',
+ 'cvpn3000_ipsec_split_tun' => 'CVPN3000-IPSec-Split-Tunnel-List',
+ 'annex_pre_output_packets' => 'Annex-Pre-Output-Packets',
+ 'usr_at_call_output_filte' => 'USR-AT-Call-Output-Filter',
'x_ascend_client_primary_' => 'X-Ascend-Client-Primary-DNS',
+ 'tunnel_server_endpoint' => 'Tunnel-Server-Endpoint',
+ 'x_ascend_remove_seconds' => 'X-Ascend-Remove-Seconds',
+ 'cvpn3000_user_auth_serve' => 'CVPN3000-User-Auth-Server-Name',
+ 'arap_password' => 'ARAP-Password',
+ 'x_ascend_assign_ip_serve' => 'X-Ascend-Assign-IP-Server',
+ 'cisco_fax_pages' => 'Cisco-Fax-Pages',
+ 'ms_chap_mppe_keys' => 'MS-CHAP-MPPE-Keys',
+ 'ascend_source_auth' => 'Ascend-Source-Auth',
+ 'group' => 'Group',
+ 'usr_send_script6' => 'USR-Send-Script6',
+ 'le_nat_inmap' => 'LE-NAT-Inmap',
+ 'chap_password' => 'CHAP-Password',
+ 'annex_receive_speed' => 'Annex-Receive-Speed',
+ 'usr_mobileip_home_agent_' => 'USR-MobileIP-Home-Agent-Address',
+ 'bind_l2tp_flow_control' => 'Bind-L2TP-Flow-Control',
+ 'smb_account_ctrl' => 'SMB-Account-CTRL',
+ 'ascend_ip_pool_chaining' => 'Ascend-IP-Pool-Chaining',
+ 'le_admin_group' => 'LE-Admin-Group',
+ 'tunnel_connection_id' => 'Tunnel-Connection-Id',
+ 'tunnel_windox' => 'Tunnel_Window',
+ 'nas_identifier' => 'NAS-Identifier',
+ 'dhcp_max_leaset' => 'DHCP_Max_Leases',
+ 'digest_nonce_count' => 'Digest-Nonce-Count',
+ 'nas_real_port' => 'NAS-Real-Port',
+ 'ms_old_arap_password' => 'MS-Old-ARAP-Password',
+ 'usr_pw_index' => 'USR-PW_Index',
+ 'erx_primary_wins' => 'ERX-Primary-Wins',
+ 'ascend_appletalk_peer_mo' => 'Ascend-Appletalk-Peer-Mode',
+ 'le_ipsec_log_options' => 'LE-IPSec-Log-Options',
+ 'x_ascend_maximum_channel' => 'X-Ascend-Maximum-Channels',
+ 'cvx_ipsvc_aznlvl' => 'CVX-IPSVC-AZNLVL',
'x_ascend_client_secondar' => 'X-Ascend-Client-Secondary-DNS',
+ 'annex_re_chap_timeout' => 'Annex-Re-CHAP-Timeout',
+ 'aat_ip_pool_definition' => 'AAT-IP-Pool-Definition',
+ 'client_dns_pri' => 'Client-DNS-Pri',
+ 'cisco_service_info' => 'Cisco-Service-Info',
+ 'usr_primary_nbns_server' => 'USR-Primary_NBNS_Server',
+ 'aat_atm_direct' => 'AAT-ATM-Direct',
+ 'bind_ses_contexu' => 'Bind_Ses_Context',
+ 'sip_translated_request_u' => 'Sip-Translated-Request-URI',
+ 'acc_acct_on_off_reason' => 'Acc-Acct-On-Off-Reason',
+ 'le_multicast_client' => 'LE-Multicast-Client',
+ 'bind_sub_passwore' => 'Bind_Sub_Password',
+ 'cvpn3000_cisco_ip_phone_' => 'CVPN3000-Cisco-IP-Phone-Bypass',
+ 'ascend_send_passwd' => 'Ascend-Send-Passwd',
+ 'tunnel_remote_namf' => 'Tunnel_Remote_Name',
+ 'cvx_disconnect_cause' => 'CVX-Disconnect-Cause',
+ 'itk_auth_serv_prot' => 'ITK-Auth-Serv-Prot',
+ 'tunnel_context' => 'Tunnel-Context',
+ 'digest_uri' => 'Digest-URI',
+ 'usr_channel_decrement' => 'USR-Channel-Decrement',
+ 'acc_nbns_server_sec' => 'Acc-Nbns-Server-Sec',
+ 'ms_chap_challenge' => 'MS-CHAP-Challenge',
+ 'cisco_assign_ip_pool' => 'Cisco-Assign-IP-Pool',
+ 'ascend_cbcp_mode' => 'Ascend-CBCP-Mode',
+ 'ascend_x25_rpoa' => 'Ascend-X25-Rpoa',
+ 'usr_dtr_false_timeout' => 'USR-DTR-False-Timeout',
+ 'acct_dyn_ac_enu' => 'Acct_Dyn_Ac_Ent',
+ 'usr_physical_state' => 'USR-Physical-State',
+ 'x_ascend_ppp_vj_slot_com' => 'X-Ascend-PPP-VJ-Slot-Comp',
+ 'x_ascend_link_compressio' => 'X-Ascend-Link-Compression',
+ 'ascend_fr_t391' => 'Ascend-FR-T391',
+ 'bind_dot1q_port' => 'Bind-Dot1q-Port',
+ 'ns_secondary_dns' => 'NS-Secondary-DNS',
+ 'altiga_ipsec_tunnel_type' => 'Altiga-IPSec-Tunnel-Type-G',
+ 'lac_port_type' => 'LAC-Port-Type',
+ 'bg_aging_time' => 'BG-Aging-Time',
+ 'erx_atm_scr' => 'ERX-Atm-SCR',
+ 'x_ascend_pre_input_octet' => 'X-Ascend-Pre-Input-Octets',
+ 'cisco_fax_connect_speed' => 'Cisco-Fax-Connect-Speed',
+ 'x_ascend_menu_item' => 'X-Ascend-Menu-Item',
+ 'quintum_h323_voice_quali' => 'Quintum-h323-voice-quality',
+ 'ascend_x25_pad_banner' => 'Ascend-X25-Pad-Banner',
+ 'module_failure_message' => 'Module-Failure-Message',
+ 'h323_gw_id' => 'h323-gw-id',
+ 'h323_preferred_lang' => 'h323-preferred-lang',
+ 'usr_min_compression_size' => 'USR-Min-Compression-Size',
+ 'usr_compression_type' => 'USR-Compression-Type',
+ 'bintec_ipxstaticroutetab' => 'BinTec-ipxStaticRouteTable',
+ 'ascend_dialout_allowed' => 'Ascend-Dialout-Allowed',
+ 'annex_local_username' => 'Annex-Local-Username',
+ 'cisco_pre_input_packets' => 'Cisco-Pre-Input-Packets',
+ 'shiva_function' => 'Shiva-Function',
+ 'ascend_send_secret' => 'Ascend-Send-Secret',
+ 'usr_number_of_blers' => 'USR-Number-of-Blers',
+ 'usr_dte_data_idle_timout' => 'USR-DTE-Data-Idle-Timout',
+ 'usr_card_type' => 'USR-Card-Type',
'x_ascend_connect_progres' => 'X-Ascend-Connect-Progress',
- 'x_ascend_data_filter' => 'X-Ascend-Data-Filter',
- 'x_ascend_data_rate' => 'X-Ascend-Data-Rate',
- 'x_ascend_data_svc' => 'X-Ascend-Data-Svc',
- 'x_ascend_dba_monitor' => 'X-Ascend-DBA-Monitor',
- 'x_ascend_dec_channel_cou' => 'X-Ascend-Dec-Channel-Count',
- 'x_ascend_dhcp_maximum_le' => 'X-Ascend-DHCP-Maximum-Leases',
- 'x_ascend_dhcp_pool_numbe' => 'X-Ascend-DHCP-Pool-Number',
- 'x_ascend_dhcp_reply' => 'X-Ascend-DHCP-Reply',
- 'x_ascend_dial_number' => 'X-Ascend-Dial-Number',
- 'x_ascend_dialout_allowed' => 'X-Ascend-Dialout-Allowed',
- 'x_ascend_disconnect_caus' => 'X-Ascend-Disconnect-Cause',
- 'x_ascend_event_type' => 'X-Ascend-Event-Type',
+ 'x_ascend_group' => 'X-Ascend-Group',
+ 'ascend_token_idle' => 'Ascend-Token-Idle',
+ 'erx_qos_profile_interfac' => 'ERX-Qos-Profile-Interface-Type',
+ 'ascend_private_route_tab' => 'Ascend-Private-Route-Table-ID',
+ 'nt_password' => 'NT-Password',
+ 'acct_mcast_in_packets' => 'Acct-Mcast-In-Packets',
+ 'x_ascend_multicast_clien' => 'X-Ascend-Multicast-Client',
+ 'usr_supports_tags' => 'USR-Supports-Tags',
+ 'cvpn3000_authd_user_idle' => 'CVPN3000-Authd-User-Idle-Timeout',
+ 'ascend_number_sessions' => 'Ascend-Number-Sessions',
+ 'x_ascend_add_seconds' => 'X-Ascend-Add-Seconds',
+ 'usr_number_of_upshifts' => 'USR-Number-of-Upshifts',
+ 'proxy_to_realm' => 'Proxy-To-Realm',
+ 'aat_client_secondary_win' => 'AAT-Client-Secondary-WINS-NBNS',
+ 'aat_ip_tos_precedence' => 'AAT-IP-TOS-Precedence',
+ 'acc_callback_num_valid' => 'Acc-Callback-Num-Valid',
+ 'nokia_ggsn_ip_address' => 'Nokia-GGSN-IP-Address',
+ 'acc_access_community' => 'Acc-Access-Community',
+ 'ascend_multicast_rate_li' => 'Ascend-Multicast-Rate-Limit',
+ 'usr_default_dte_data_rat' => 'USR-Default-DTE-Data-Rate',
+ 'usr_rmmie_pwrlvl_nearech' => 'USR-RMMIE-PwrLvl-NearEcho-Canc',
+ 'usr_send_name' => 'USR-Send-Name',
+ 'usr_chassis_slot' => 'USR-Chassis-Slot',
+ 'login_ip_host' => 'Login-IP-Host',
+ 'ascend_netware_timeout' => 'Ascend-Netware-timeout',
+ 'bind_sub_user_at_context' => 'Bind-Sub-User-At-Context',
+ 'vendor_specific' => 'Vendor-Specific',
+ 'ascend_fr_direct_dlci' => 'Ascend-FR-Direct-DLCI',
+ 'ascend_qos_upstream' => 'Ascend-QOS-Upstream',
+ 'aat_user_mac_address' => 'AAT-User-MAC-Address',
+ 'source_validation' => 'Source-Validation',
+ 'x_ascend_token_expiry' => 'X-Ascend-Token-Expiry',
+ 'altiga_ipsec_user_group_' => 'Altiga-IPSec-User-Group-Lock-G',
+ 'ascend_dec_channel_count' => 'Ascend-Dec-Channel-Count',
+ 'assigned_ip_addrest' => 'Assigned_IP_Address',
+ 'usr_local_framed_ip_addr' => 'USR-Local-Framed-IP-Addr',
+ 'usr_service_option' => 'USR-Service-Option',
+ 'usr_transmit_acc_map' => 'USR-Transmit-Acc-Map',
+ 'ascend_fr_direct' => 'Ascend-FR-Direct',
+ 'usr_final_rx_link_data_r' => 'USR-Final-Rx-Link-Data-Rate',
'x_ascend_expect_callback' => 'X-Ascend-Expect-Callback',
- 'x_ascend_fcp_parameter' => 'X-Ascend-FCP-Parameter',
- 'x_ascend_first_dest' => 'X-Ascend-First-Dest',
- 'x_ascend_force_56' => 'X-Ascend-Force-56',
- 'x_ascend_fr_circuit_name' => 'X-Ascend-FR-Circuit-Name',
- 'x_ascend_fr_dce_n392' => 'X-Ascend-FR-DCE-N392',
- 'x_ascend_fr_dce_n393' => 'X-Ascend-FR-DCE-N393',
- 'x_ascend_fr_direct' => 'X-Ascend-FR-Direct',
- 'x_ascend_fr_direct_dlci' => 'X-Ascend-FR-Direct-DLCI',
- 'x_ascend_fr_direct_profi' => 'X-Ascend-FR-Direct-Profile',
- 'x_ascend_fr_dlci' => 'X-Ascend-FR-DLCI',
- 'x_ascend_fr_dte_n392' => 'X-Ascend-FR-DTE-N392',
- 'x_ascend_fr_dte_n393' => 'X-Ascend-FR-DTE-N393',
- 'x_ascend_fr_link_mgt' => 'X-Ascend-FR-Link-Mgt',
- 'x_ascend_fr_linkup' => 'X-Ascend-FR-LinkUp',
- 'x_ascend_fr_n391' => 'X-Ascend-FR-N391',
- 'x_ascend_fr_nailed_grp' => 'X-Ascend-FR-Nailed-Grp',
- 'x_ascend_fr_profile_name' => 'X-Ascend-FR-Profile-Name',
- 'x_ascend_fr_t391' => 'X-Ascend-FR-T391',
- 'x_ascend_fr_t392' => 'X-Ascend-FR-T392',
- 'x_ascend_fr_type' => 'X-Ascend-FR-Type',
- 'x_ascend_ft1_caller' => 'X-Ascend-FT1-Caller',
- 'x_ascend_group' => 'X-Ascend-Group',
- 'x_ascend_handle_ipx' => 'X-Ascend-Handle-IPX',
- 'x_ascend_history_weigh_t' => 'X-Ascend-History-Weigh-Type',
+ 'x_ascend_disconnect_caus' => 'X-Ascend-Disconnect-Cause',
+ 'acc_ml_damping_factor' => 'Acc-ML-Damping-Factor',
+ 'framed_netmask' => 'Framed-Netmask',
+ 'usr_connect_speed' => 'USR-Connect-Speed',
'x_ascend_home_agent_ip_a' => 'X-Ascend-Home-Agent-IP-Addr',
- 'x_ascend_home_agent_pass' => 'X-Ascend-Home-Agent-Password',
+ 'usr_disconnect_cause_ind' => 'USR-Disconnect-Cause-Indicator',
+ 'bg_span_dis' => 'BG-Span-Dis',
+ 'cisco_multilink_id' => 'Cisco-Multilink-ID',
+ 'tunnel_max_tunnels' => 'Tunnel-Max-Tunnels',
+ 'ascend_dsl_downstream_li' => 'Ascend-Dsl-Downstream-Limit',
+ 'ascend_multilink_id' => 'Ascend-Multilink-ID',
+ 'altiga_ipsec_default_dom' => 'Altiga-IPSec-Default-Domain-G',
+ 'ascend_dhcp_reply' => 'Ascend-DHCP-Reply',
+ 'login_ipv6_host' => 'Login-IPv6-Host',
+ 'ascend_x25_cug' => 'Ascend-X25-Cug',
+ 'shiva_network_protocols' => 'Shiva-Network-Protocols',
+ 'cvpn3000_ipsec_mode_conf' => 'CVPN3000-IPSec-Mode-Config',
+ 'extreme_netlogin_vlan' => 'Extreme-Netlogin-Vlan',
+ 'ascend_ara_pw' => 'Ascend-Ara-PW',
+ 'tunnel_l2f_second_passwo' => 'Tunnel-L2F-Second-Password',
+ 'altiga_sep_card_assignme' => 'Altiga-SEP-Card-Assignment-G/U',
+ 'ip_host_addr' => 'Ip-Host-Addr',
+ 'le_ip_gateway' => 'LE-IP-Gateway',
+ 'usr_mobile_numbytes_txed' => 'USR-Mobile-NumBytes-Txed',
+ 'altiga_ipsec_allow_passw' => 'Altiga-IPSec-Allow-Passwd-Store-G/U',
+ 'itk_users_default_entry' => 'ITK-Users-Default-Entry',
+ 'quintum_h323_redirect_nu' => 'Quintum-h323-redirect-number',
+ 'x_ascend_fr_t392' => 'X-Ascend-FR-T392',
+ 'acc_igmp_version' => 'Acc-Igmp-Version',
+ 'cisco_pre_output_packets' => 'Cisco-Pre-Output-Packets',
+ 'tunnel_group' => 'Tunnel-Group',
'x_ascend_home_agent_udp_' => 'X-Ascend-Home-Agent-UDP-Port',
- 'x_ascend_home_network_na' => 'X-Ascend-Home-Network-Name',
- 'x_ascend_host_info' => 'X-Ascend-Host-Info',
- 'x_ascend_idle_limit' => 'X-Ascend-Idle-Limit',
- 'x_ascend_if_netmask' => 'X-Ascend-IF-Netmask',
- 'x_ascend_inc_channel_cou' => 'X-Ascend-Inc-Channel-Count',
- 'x_ascend_ip_direct' => 'X-Ascend-IP-Direct',
+ 'cvpn3000_tunneling_proto' => 'CVPN3000-Tunneling-Protocols',
+ 'usr_igmp_maximum_respons' => 'USR-IGMP-Maximum-Response-Time',
+ 'bind_sub_password' => 'Bind-Sub-Password',
+ 'eap_message' => 'EAP-Message',
+ 'exec_program' => 'Exec-Program',
+ 'cvpn3000_reqrd_client_fx' => 'CVPN3000-Reqrd-Client-Fw-Product-Code',
+ 'bg_path_cost' => 'BG-Path-Cost',
+ 'usr_modem_training_time' => 'USR-Modem-Training-Time',
+ 'auth_type' => 'Auth-Type',
+ 'itk_acct_serv_prot' => 'ITK-Acct-Serv-Prot',
+ 'x_ascend_ipx_route' => 'X-Ascend-IPX-Route',
+ 'altiga_primary_dns_g' => 'Altiga-Primary-DNS-G',
+ 'ascend_cbcp_enable' => 'Ascend-CBCP-Enable',
+ 'ms_mppe_encryption_polic' => 'MS-MPPE-Encryption-Policy',
+ 'annex_unauthenticated_ti' => 'Annex-Unauthenticated-Time',
+ 'annex_begin_receive_line' => 'Annex-Begin-Receive-Line-Level',
+ 'ascend_atm_direct_profil' => 'Ascend-ATM-Direct-Profile',
+ 'redcreek_tunneled_dns_se' => 'RedCreek-Tunneled-DNS-Server',
+ 'ascend_redirect_number' => 'Ascend-Redirect-Number',
+ 'h323_credit_time' => 'h323-credit-time',
+ 'cvx_idle_limit' => 'CVX-Idle-Limit',
+ 'ascend_appletalk_route' => 'Ascend-Appletalk-Route',
+ 'aat_ip_tos' => 'AAT-IP-TOS',
+ 'cvx_ppp_address' => 'CVX-PPP-Address',
+ 'aat_data_filter' => 'AAT-Data-Filter',
+ 'cvx_primary_dns' => 'CVX-Primary-DNS',
+ 'shiva_link_protocol' => 'Shiva-Link-Protocol',
+ 'x_ascend_fr_circuit_name' => 'X-Ascend-FR-Circuit-Name',
+ 'usr_appletalk' => 'USR-Appletalk',
+ 'client_id' => 'Client-Id',
+ 'tunnel_algorithn' => 'Tunnel_Algorithm',
+ 'aat_assign_ip_pool' => 'AAT-Assign-IP-Pool',
+ 'quintum_h323_incoming_co' => 'Quintum-h323-incoming-conf-id',
+ 'aat_atm_vpi' => 'AAT-ATM-VPI',
+ 'annex_output_filter' => 'Annex-Output-Filter',
+ 'pvc_circuit_padding' => 'PVC-Circuit-Padding',
+ 'usr_ipx_call_output_filt' => 'USR-IPX-Call-Output-Filter',
+ 'usr_rmmie_planned_discon' => 'USR-RMMIE-Planned-Disconnect',
+ 'session_error_msh' => 'Session_Error_Msg',
+ 'usr_rad_multicast_routin' => 'USR-Rad-Multicast-Routing-Ttl',
+ 'h323_time_and_day' => 'h323-time-and-day',
+ 'cvpn3000_ipsec_backup_se' => 'CVPN3000-IPSec-Backup-Servers',
+ 'termination_action' => 'Termination-Action',
+ 'cvpn3000_ipsec_client_fx' => 'CVPN3000-IPSec-Client-Fw-Filter-Opt',
+ 'aat_client_primary_dnt' => 'AAT-Client-Primary-DNS',
+ 'acct_tunnel_packets_lost' => 'Acct-Tunnel-Packets-Lost',
+ 'x_ascend_modem_portno' => 'X-Ascend-Modem-PortNo',
+ 'framed_filter_id' => 'Framed-Filter-Id',
+ 'usr_ccp_algorithm' => 'USR-CCP-Algorithm',
+ 'quintum_h323_preferred_l' => 'Quintum-h323-preferred-lang',
+ 'ascend_fr_link_status_dl' => 'Ascend-FR-Link-Status-DLCI',
+ 'ascend_token_expiry' => 'Ascend-Token-Expiry',
+ 'itk_auth_req_type' => 'ITK-Auth-Req-Type',
+ 'acc_modem_error_protocol' => 'Acc-Modem-Error-Protocol',
+ 'acc_request_type' => 'Acc-Request-Type',
+ 'usr_last_number_dialed_i' => 'USR-Last-Number-Dialed-In-DNIS',
+ 'x_ascend_ipx_peer_mode' => 'X-Ascend-IPX-Peer-Mode',
+ 'ascend_ppp_vj_slot_comp' => 'Ascend-PPP-VJ-Slot-Comp',
+ 'cisco_presession_time' => 'Cisco-PreSession-Time',
+ 'usr_chat_script_name' => 'USR-Chat-Script-Name',
+ 'tunnel_session_auti' => 'Tunnel_Session_Auth',
+ 'ascend_fr_circuit_name' => 'Ascend-FR-Circuit-Name',
+ 'ascend_expect_callback' => 'Ascend-Expect-Callback',
+ 'framed_mtu' => 'Framed-MTU',
+ 'usr_pw_vpn_name' => 'USR-PW_VPN_Name',
+ 'nomadix_ip_upsell' => 'Nomadix-IP-Upsell',
+ 'ascend_nas_port_format' => 'Ascend-NAS-Port-Format',
+ 'usr_dtr_true_timeout' => 'USR-DTR-True-Timeout',
+ 'shasta_vpn_name' => 'Shasta-VPN-Name',
+ 'connect_rate' => 'Connect-Rate',
+ 'ascend_third_prompt' => 'Ascend-Third-Prompt',
+ 'cabletron_protocol_enabl' => 'Cabletron-Protocol-Enable',
+ 'annex_pre_input_octets' => 'Annex-Pre-Input-Octets',
+ 'cvx_modem_error_correcti' => 'CVX-Modem-Error-Correction',
+ 'cvx_ss7_session_id_type' => 'CVX-SS7-Session-ID-Type',
+ 'called_station_id' => 'Called-Station-Id',
+ 'itk_ddi' => 'ITK-DDI',
+ 'usr_pw_cutoff' => 'USR-PW_Cutoff',
+ 'ascend_data_rate' => 'Ascend-Data-Rate',
+ 'acct_input_packets_65' => 'Acct_Input_Packets_64',
+ 'x_ascend_ts_idle_mode' => 'X-Ascend-TS-Idle-Mode',
+ 'ascend_x25_pad_prompt' => 'Ascend-X25-Pad-Prompt',
+ 'x_ascend_dhcp_reply' => 'X-Ascend-DHCP-Reply',
+ 'acc_nbns_server_pri' => 'Acc-Nbns-Server-Pri',
+ 'post_auth_type' => 'Post-Auth-Type',
+ 'ascend_call_filter' => 'Ascend-Call-Filter',
+ 'acc_tunnel_secret' => 'Acc-Tunnel-Secret',
+ 'colubris_avpair' => 'Colubris-AVPair',
+ 'bind_int_context' => 'Bind-Int-Context',
+ 'annex_logical_channel_nu' => 'Annex-Logical-Channel-Number',
+ 'erx_virtual_router_name' => 'ERX-Virtual-Router-Name',
+ 'wispr_redirection_url' => 'WISPr-Redirection-URL',
+ 'bintec_ipextiftable' => 'BinTec-ipExtIfTable',
+ 'crypt_password' => 'Crypt-Password',
+ 'challenge_state' => 'Challenge-State',
+ 'x_ascend_pre_input_packe' => 'X-Ascend-Pre-Input-Packets',
+ 'altiga_ipsec_l2l_keepali' => 'Altiga-IPSec-L2L-Keepalives-G',
+ 'x_ascend_dhcp_maximum_le' => 'X-Ascend-DHCP-Maximum-Leases',
+ 'acc_dialout_auth_passwor' => 'Acc-Dialout-Auth-Password',
+ 'itk_ip_pool' => 'ITK-IP-Pool',
+ 'pvc_profile_namf' => 'PVC_Profile_Name',
+ 'x_ascend_user_acct_host' => 'X-Ascend-User-Acct-Host',
+ 'strip_user_name' => 'Strip-User-Name',
+ 'itk_ppp_client_server_mo' => 'ITK-PPP-Client-Server-Mode',
+ 'usr_mbi_ct_bchannel_used' => 'USR-Mbi_Ct_BChannel_Used',
+ 'x_ascend_route_ip' => 'X-Ascend-Route-IP',
+ 'ascend_seconds_of_histor' => 'Ascend-Seconds-Of-History',
+ 'cvx_data_rate' => 'CVX-Data-Rate',
+ 'ascend_x25_profile_name' => 'Ascend-X25-Profile-Name',
+ 'itk_ftp_auth_ip' => 'ITK-Ftp-Auth-IP',
+ 'cisco_control_info' => 'Cisco-Control-Info',
+ 'cvpn3000_secondary_wins' => 'CVPN3000-Secondary-WINS',
+ 'usr_call_type' => 'USR-Call-Type',
+ 'x_ascend_user_acct_base' => 'X-Ascend-User-Acct-Base',
+ 'acct_mcast_in_packett' => 'Acct_Mcast_In_Packets',
+ 'ns_vsys_name' => 'NS-VSYS-Name',
+ 'acct_output_gigawords' => 'Acct-Output-Gigawords',
+ 'bind_typf' => 'Bind_Type',
+ 'bintec_ipqostable' => 'BinTec-ipQoSTable',
+ 'bintec_ipxstaticservtabl' => 'BinTec-ipxStaticServTable',
+ 'cvpn3000_l2tp_mppc_compr' => 'CVPN3000-L2TP-MPPC-Compression',
+ 'login_lat_port' => 'Login-LAT-Port',
+ 'usr_call_arrival_in_gmt' => 'USR-Call-Arrival-in-GMT',
+ 'acct_mcast_in_octets' => 'Acct-Mcast-In-Octets',
+ 'erx_sa_validate' => 'ERX-Sa-Validate',
+ 'ascend_service_type' => 'Ascend-Service-Type',
+ 'usr_pw_vpn_gateway' => 'USR-PW_VPN_Gateway',
+ 'acc_ip_compression' => 'Acc-Ip-Compression',
+ 'ascend_fr_dce_n392' => 'Ascend-FR-DCE-N392',
+ 'bintec_ipxcirctable' => 'BinTec-ipxCircTable',
+ 'lac_real_port_type' => 'LAC-Real-Port-Type',
+ 'ascend_client_primary_dn' => 'Ascend-Client-Primary-DNS',
+ 'acct_session_start_time' => 'Acct-Session-Start-Time',
+ 'ascend_if_netmask' => 'Ascend-IF-Netmask',
+ 'ms_chap_nt_enc_pw' => 'MS-CHAP-NT-Enc-PW',
+ 'ms_mppe_encryption_types' => 'MS-MPPE-Encryption-Types',
+ 'cisco_fax_process_abort_' => 'Cisco-Fax-Process-Abort-Flag',
+ 'mcast_maxgroups' => 'Mcast-MaxGroups',
+ 'annex_end_receive_line_l' => 'Annex-End-Receive-Line-Level',
+ 'usr_ipx_call_input_filte' => 'USR-IPX-Call-Input-Filter',
+ 'usr_back_channel_data_ra' => 'USR-Back-Channel-Data-Rate',
+ 'ascend_cache_time' => 'Ascend-Cache-Time',
+ 'x_ascend_data_svc' => 'X-Ascend-Data-Svc',
+ 'usr_re_chap_timeout' => 'USR-Re-Chap-Timeout',
+ 'bintec_bibodialtable' => 'BinTec-biboDialTable',
+ 'annex_connect_progress' => 'Annex-Connect-Progress',
+ 'x_ascend_ppp_vj_1172' => 'X-Ascend-PPP-VJ-1172',
+ 'usr_igmp_routing' => 'USR-IGMP-Routing',
'x_ascend_ip_pool_definit' => 'X-Ascend-IP-Pool-Definition',
- 'x_ascend_ipx_alias' => 'X-Ascend-IPX-Alias',
- 'x_ascend_ipx_node_addr' => 'X-Ascend-IPX-Node-Addr',
- 'x_ascend_ipx_peer_mode' => 'X-Ascend-IPX-Peer-Mode',
- 'x_ascend_ipx_route' => 'X-Ascend-IPX-Route',
- 'x_ascend_link_compressio' => 'X-Ascend-Link-Compression',
- 'x_ascend_maximum_call_du' => 'X-Ascend-Maximum-Call-Duration',
- 'x_ascend_maximum_channel' => 'X-Ascend-Maximum-Channels',
- 'x_ascend_maximum_time' => 'X-Ascend-Maximum-Time',
- 'x_ascend_menu_item' => 'X-Ascend-Menu-Item',
- 'x_ascend_menu_selector' => 'X-Ascend-Menu-Selector',
- 'x_ascend_metric' => 'X-Ascend-Metric',
+ 'h323_prompt_id' => 'h323-prompt-id',
+ 'foundry_command_string' => 'Foundry-Command-String',
+ 'le_terminate_detail' => 'LE-Terminate-Detail',
+ 'cvpn3000_pptp_encryption' => 'CVPN3000-PPTP-Encryption',
+ 'quintum_h323_disconnect_' => 'Quintum-h323-disconnect-time',
+ 'acc_ml_clear_threshold' => 'Acc-ML-Clear-Threshold',
+ 'x_ascend_ip_direct' => 'X-Ascend-IP-Direct',
+ 'usr_ip_call_input_filter' => 'USR-IP-Call-Input-Filter',
+ 'x_ascend_data_rate' => 'X-Ascend-Data-Rate',
+ 'nas_port' => 'NAS-Port',
+ 'ascend_client_secondary_' => 'Ascend-Client-Secondary-WINS',
+ 'ascend_auth_type' => 'Ascend-Auth-Type',
+ 'x_ascend_preempt_limit' => 'X-Ascend-Preempt-Limit',
+ 'cvx_xmit_rate' => 'CVX-Xmit-Rate',
+ 'annex_transmitted_packet' => 'Annex-Transmitted-Packets',
+ 'h323_credit_amount' => 'h323-credit-amount',
+ 'usr_reply_script1' => 'USR-Reply-Script1',
+ 'current_time' => 'Current-Time',
+ 'cisco_xmit_rate' => 'Cisco-Xmit-Rate',
+ 'x_ascend_session_svr_key' => 'X-Ascend-Session-Svr-Key',
+ 'ascend_authen_alias' => 'Ascend-Authen-Alias',
+ 'erx_redirect_vr_name' => 'ERX-Redirect-VR-Name',
+ 'module_success_message' => 'Module-Success-Message',
+ 'acc_dialout_auth_mode' => 'Acc-Dialout-Auth-Mode',
+ 'bind_auth_contexu' => 'Bind_Auth_Context',
'x_ascend_minimum_channel' => 'X-Ascend-Minimum-Channels',
- 'x_ascend_modem_portno' => 'X-Ascend-Modem-PortNo',
- 'x_ascend_modem_shelfno' => 'X-Ascend-Modem-ShelfNo',
- 'x_ascend_modem_slotno' => 'X-Ascend-Modem-SlotNo',
- 'x_ascend_mpp_idle_percen' => 'X-Ascend-MPP-Idle-Percent',
- 'x_ascend_multicast_clien' => 'X-Ascend-Multicast-Client',
- 'x_ascend_multicast_rate_' => 'X-Ascend-Multicast-Rate-Limit',
- 'x_ascend_multilink_id' => 'X-Ascend-Multilink-ID',
- 'x_ascend_netware_timeout' => 'X-Ascend-Netware-timeout',
- 'x_ascend_num_in_multilin' => 'X-Ascend-Num-In-Multilink',
- 'x_ascend_number_sessions' => 'X-Ascend-Number-Sessions',
- 'x_ascend_ppp_address' => 'X-Ascend-PPP-Address',
- 'x_ascend_ppp_async_map' => 'X-Ascend-PPP-Async-Map',
- 'x_ascend_ppp_vj_1172' => 'X-Ascend-PPP-VJ-1172',
- 'x_ascend_ppp_vj_slot_com' => 'X-Ascend-PPP-VJ-Slot-Comp',
- 'x_ascend_pre_input_octet' => 'X-Ascend-Pre-Input-Octets',
- 'x_ascend_pre_input_packe' => 'X-Ascend-Pre-Input-Packets',
- 'x_ascend_pre_output_octe' => 'X-Ascend-Pre-Output-Octets',
- 'x_ascend_pre_output_pack' => 'X-Ascend-Pre-Output-Packets',
- 'x_ascend_preempt_limit' => 'X-Ascend-Preempt-Limit',
- 'x_ascend_presession_time' => 'X-Ascend-PreSession-Time',
+ 'usr_event_date_time' => 'USR-Event-Date-Time',
+ 'x_ascend_ipx_node_addr' => 'X-Ascend-IPX-Node-Addr',
+ 'cvpn3000_ipsec_over_udp' => 'CVPN3000-IPSec-Over-UDP',
+ 'x_ascend_user_acct_time' => 'X-Ascend-User-Acct-Time',
+ 'cisco_email_server_ack_f' => 'Cisco-Email-Server-Ack-Flag',
+ 'telebit_activate_command' => 'Telebit-Activate-Command',
+ 'acc_output_errors' => 'Acc-Output-Errors',
+ 'juniper_allow_configurat' => 'Juniper-Allow-Configuration',
+ 'bind_l2tp_tunnel_name' => 'Bind-L2TP-Tunnel-Name',
'x_ascend_pri_number_type' => 'X-Ascend-PRI-Number-Type',
- 'x_ascend_primary_home_ag' => 'X-Ascend-Primary-Home-Agent',
- 'x_ascend_pw_lifetime' => 'X-Ascend-PW-Lifetime',
- 'x_ascend_pw_warntime' => 'X-Ascend-PW-Warntime',
- 'x_ascend_receive_secret' => 'X-Ascend-Receive-Secret',
- 'x_ascend_remote_addr' => 'X-Ascend-Remote-Addr',
- 'x_ascend_remove_seconds' => 'X-Ascend-Remove-Seconds',
- 'x_ascend_require_auth' => 'X-Ascend-Require-Auth',
- 'x_ascend_route_ip' => 'X-Ascend-Route-IP',
- 'x_ascend_route_ipx' => 'X-Ascend-Route-IPX',
- 'x_ascend_secondary_home_' => 'X-Ascend-Secondary-Home-Agent',
- 'x_ascend_seconds_of_hist' => 'X-Ascend-Seconds-Of-History',
- 'x_ascend_send_auth' => 'X-Ascend-Send-Auth',
- 'x_ascend_send_passwd' => 'X-Ascend-Send-Passwd',
- 'x_ascend_send_secret' => 'X-Ascend-Send-Secret',
- 'x_ascend_session_svr_key' => 'X-Ascend-Session-Svr-Key',
- 'x_ascend_shared_profile_' => 'X-Ascend-Shared-Profile-Enable',
- 'x_ascend_target_util' => 'X-Ascend-Target-Util',
- 'x_ascend_temporary_rtes' => 'X-Ascend-Temporary-Rtes',
- 'x_ascend_third_prompt' => 'X-Ascend-Third-Prompt',
- 'x_ascend_token_expiry' => 'X-Ascend-Token-Expiry',
- 'x_ascend_token_idle' => 'X-Ascend-Token-Idle',
- 'x_ascend_token_immediate' => 'X-Ascend-Token-Immediate',
- 'x_ascend_transit_number' => 'X-Ascend-Transit-Number',
- 'x_ascend_ts_idle_limit' => 'X-Ascend-TS-Idle-Limit',
- 'x_ascend_ts_idle_mode' => 'X-Ascend-TS-Idle-Mode',
- 'x_ascend_tunneling_proto' => 'X-Ascend-Tunneling-Protocol',
- 'x_ascend_user_acct_base' => 'X-Ascend-User-Acct-Base',
- 'x_ascend_user_acct_host' => 'X-Ascend-User-Acct-Host',
- 'x_ascend_user_acct_key' => 'X-Ascend-User-Acct-Key',
- 'x_ascend_user_acct_port' => 'X-Ascend-User-Acct-Port',
- 'x_ascend_user_acct_time' => 'X-Ascend-User-Acct-Time',
- 'x_ascend_user_acct_type' => 'X-Ascend-User-Acct-Type',
- 'x_ascend_xmit_rate' => 'X-Ascend-Xmit-Rate',
- 'xedia_address_pool' => 'Xedia-Address-Pool',
- 'xedia_client_access_netw' => 'Xedia-Client-Access-Network',
- 'xedia_dns_server' => 'Xedia-DNS-Server',
- 'xedia_netbios_server' => 'Xedia-NetBios-Server',
- 'xedia_ppp_echo_interval' => 'Xedia-PPP-Echo-Interval',
- 'xedia_ssh_privileges' => 'Xedia-SSH-Privileges',
+ 'bintec_biboppptable' => 'BinTec-biboPPPTable',
+ 'le_ipsec_outsource_profi' => 'LE-IPSec-Outsource-Profile',
+ 'usr_at_zip_input_filter' => 'USR-AT-Zip-Input-Filter',
+ 'replicate_to_realm' => 'Replicate-To-Realm',
+ 'annex_mrru' => 'Annex-MRRU',
+ 'event_timestamp' => 'Event-Timestamp',
+ 'nokia_sgsn_ip_address' => 'Nokia-SGSN-IP-Address',
+ 'ascend_pre_input_packets' => 'Ascend-Pre-Input-Packets',
+ 'cvpn5000_client_assigned' => 'CVPN5000-Client-Assigned-IP',
+ 'tunnel_dnit' => 'Tunnel_DNIS',
+ 'h323_call_origin' => 'h323-call-origin',
+ 'x_ascend_fr_type' => 'X-Ascend-FR-Type',
+ 'itk_provider_id' => 'ITK-Provider-Id',
+ 'cvx_ppp_log_mask' => 'CVX-PPP-Log-Mask',
+ 'x_ascend_token_idle' => 'X-Ascend-Token-Idle',
+ 'usr_rmmie_pwrlvl_xmit_lv' => 'USR-RMMIE-PwrLvl-Xmit-Lvl',
+ 'usr_igmp_query_interval' => 'USR-IGMP-Query-Interval',
+ 'quintum_h323_billing_mod' => 'Quintum-h323-billing-model',
+ 'ascend_atm_vci' => 'Ascend-ATM-Vci',
+ 'usr_port_tap_output' => 'USR-Port-Tap-Output',
+ 'session' => 'Session',
+ 'itk_welcome_message' => 'ITK-Welcome-Message',
+ 'cvpn3000_ike_keep_alives' => 'CVPN3000-IKE-Keep-Alives',
+ 'ascend_uu_info' => 'Ascend-UU-Info',
+ 'usr_et_bridge_call_outpu' => 'USR-ET-Bridge-Call-Output-Filte',
+ 'usr_secondary_dns_server' => 'USR-Secondary_DNS_Server',
+ 'ms_mppe_recv_key' => 'MS-MPPE-Recv-Key',
+ 'bintec_ripcirctable' => 'BinTec-ripCircTable',
+ 'acc_dial_port_index' => 'Acc-Dial-Port-Index',
+ 'cisco_nas_port' => 'Cisco-NAS-Port',
+ 'itk_username' => 'ITK-Username',
+ 'usr_send_script1' => 'USR-Send-Script1',
+ 'cvpn3000_ipsec_ike_peer_' => 'CVPN3000-IPSec-IKE-Peer-ID-Check',
+ 'ascend_dsl_upstream_limi' => 'Ascend-Dsl-Upstream-Limit',
+ 'x_ascend_dec_channel_cou' => 'X-Ascend-Dec-Channel-Count',
+ 'usr_tunnel_security' => 'USR-Tunnel-Security',
+ 'arap_security' => 'ARAP-Security',
+ 'tunnel_preference' => 'Tunnel-Preference',
+ 'cisco_port_used' => 'Cisco-Port-Used',
+ 'usr_reply_script4' => 'USR-Reply-Script4',
+ 'cvpn5000_client_real_ip' => 'CVPN5000-Client-Real-IP',
+ 'usr_rmmie_status' => 'USR-RMMIE-Status',
+ 'usr_send_script4' => 'USR-Send-Script4',
+ 'quintum_h323_connect_tim' => 'Quintum-h323-connect-time',
+ 'annex_syslog_tap' => 'Annex-Syslog-Tap',
+ 'redcreek_tunneled_hostna' => 'RedCreek-Tunneled-HostName',
+ 'acc_clearing_location' => 'Acc-Clearing-Location',
+ 'ascend_access_intercept_' => 'Ascend-Access-Intercept-LEA',
+ 'annex_disconnect_reason' => 'Annex-Disconnect-Reason',
+ 'usr_at_input_filter' => 'USR-AT-Input-Filter',
+ 'usr_auth_mode' => 'USR-Auth-Mode',
+ 'usr_expected_voltage' => 'USR-Expected-Voltage',
+ 'shiva_session_id' => 'Shiva-Session-Id',
+ 'annex_maximum_call_durat' => 'Annex-Maximum-Call-Duration',
+ 'usr_block_error_count_li' => 'USR-Block-Error-Count-Limit',
+ 'ascend_owner_ip_addr' => 'Ascend-Owner-IP-Addr',
+ 'bind_tun_contexu' => 'Bind_Tun_Context',
+ 'usr_pw_usr_ofilter_ipx' => 'USR-PW_USR_OFilter_IPX',
+ 'framed_routing' => 'Framed-Routing',
+ 'annex_primary_nbns_serve' => 'Annex-Primary-NBNS-Server',
+ 'usr_interface_index' => 'USR-Interface-Index',
+ 'pam_auth' => 'Pam-Auth',
+ 'usr_end_time' => 'USR-End-Time',
+ 'rate_limit_bursu' => 'Rate_Limit_Burst',
+ 'nomadix_expiration' => 'Nomadix-Expiration',
+ 'x_ascend_transit_number' => 'X-Ascend-Transit-Number',
+ 'itk_usergroup' => 'ITK-Usergroup',
+ 'x_ascend_assign_ip_pool' => 'X-Ascend-Assign-IP-Pool',
+ 'annex_secondary_nbns_ser' => 'Annex-Secondary-NBNS-Server',
+ 'bind_dot1q_vlan_tag_id' => 'Bind-Dot1q-Vlan-Tag-Id',
+ 'ms_secondary_nbns_server' => 'MS-Secondary-NBNS-Server',
+ 'tunnel_retransmit' => 'Tunnel-Retransmit',
+ 'acct_tunnel_connection' => 'Acct-Tunnel-Connection',
+ 'x_ascend_backup' => 'X-Ascend-Backup',
+ 'xedia_ppp_echo_interval' => 'Xedia-PPP-Echo-Interval',
+ 'usr_bearer_capabilities' => 'USR-Bearer-Capabilities',
+ 'shiva_acct_serv_switch' => 'Shiva-Acct-Serv-Switch',
+ 'acct_authentic' => 'Acct-Authentic',
+ 'le_nat_other_session_tim' => 'LE-NAT-Other-Session-Timeout',
+ 'cvpn3000_ipsec_banner2' => 'CVPN3000-IPSec-Banner2',
+ 'x_ascend_force_56' => 'X-Ascend-Force-56',
+ 'framed_appletalk_network' => 'Framed-AppleTalk-Network',
+ 'reply_message' => 'Reply-Message',
+ 'class' => 'Class',
+ 'h323_conf_id' => 'h323-conf-id',
+ 'quintum_h323_disconnecta' => 'Quintum-h323-disconnect-cause',
+ 'itk_filter_rule' => 'ITK-Filter-Rule',
+ 'wispr_bandwidth_max_up' => 'WISPr-Bandwidth-Max-Up',
+ 'usr_appletalk_network_ra' => 'USR-Appletalk-Network-Range',
+ 'ascend_cbcp_delay' => 'Ascend-CBCP-Delay',
+ 'usr_dte_ring_no_answer_l' => 'USR-DTE-Ring-No-Answer-Limit',
+ 'pre_acct_type' => 'Pre-Acct-Type',
+ 'usr_local_ip_address' => 'USR-Local-IP-Address',
+ 'ascend_dropped_octets' => 'Ascend-Dropped-Octets',
+ 'ascend_h323_dialed_time' => 'Ascend-H323-Dialed-Time',
+ 'cisco_email_server_addre' => 'Cisco-Email-Server-Address',
+ 'ascend_x25_x121_address' => 'Ascend-X25-X121-Address',
+ 'cvx_multicast_client' => 'CVX-Multicast-Client',
+ 'wispr_bandwidth_min_up' => 'WISPr-Bandwidth-Min-Up',
+ 'usr_at_output_filter' => 'USR-AT-Output-Filter',
+ 'annex_local_ip_address' => 'Annex-Local-IP-Address',
+ 'cisco_ip_pool_definition' => 'Cisco-IP-Pool-Definition',
+ 'cisco_gateway_id' => 'Cisco-Gateway-Id',
+ 'itk_password_prompt' => 'ITK-Password-Prompt',
+ 'annex_domain_name' => 'Annex-Domain-Name',
+ 'foundry_command_exceptio' => 'Foundry-Command-Exception-Flag',
+ 'ascend_preempt_limit' => 'Ascend-Preempt-Limit',
+ 'erx_minimum_bps' => 'ERX-Minimum-BPS',
+ 'aat_mcast_client' => 'AAT-MCast-Client',
+ 'ascend_atm_fault_managem' => 'Ascend-ATM-Fault-Management',
+ 'ascend_event_type' => 'Ascend-Event-Type',
+ 'exec_program_wait' => 'Exec-Program-Wait',
+ 'framed_interface_id' => 'Framed-Interface-Id',
#NETC.NET.AU (RADIATOR?)
- 'authentication_type' => 'Authentication-Type',
+ 'authentication_type' => 'Authentication-Type',
#wtxs (dunno)
- #'radius_operator' => 'Radius-Operator',
+ 'radius_operator' => 'Radius-Operator',
);
diff --git a/FS/FS/rate.pm b/FS/FS/rate.pm
index a471e2ea4..f19ebf002 100644
--- a/FS/FS/rate.pm
+++ b/FS/FS/rate.pm
@@ -363,7 +363,7 @@ sub process {
#$ratenum = $rate->getfield('ratenum');
}
- die "$error\n" if $error;
+ die $error if $error;
}
diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm
index 962e36a07..80d5e21a6 100644
--- a/FS/FS/svc_Common.pm
+++ b/FS/FS/svc_Common.pm
@@ -2,17 +2,16 @@ package FS::svc_Common;
use strict;
use vars qw( @ISA $noexport_hack $DEBUG );
-use Carp;
use FS::Record qw( qsearch qsearchs fields dbh );
-use FS::cust_main_Mixin;
use FS::cust_svc;
use FS::part_svc;
use FS::queue;
use FS::cust_main;
-@ISA = qw( FS::cust_main_Mixin FS::Record );
+@ISA = qw( FS::Record );
$DEBUG = 0;
+#$DEBUG = 1;
=head1 NAME
@@ -35,38 +34,6 @@ inherit from, i.e. FS::svc_acct. FS::svc_Common inherits from FS::Record.
=cut
-sub new {
- my $proto = shift;
- my $class = ref($proto) || $proto;
- my $self = {};
- bless ($self, $class);
-
- unless ( defined ( $self->table ) ) {
- $self->{'Table'} = shift;
- carp "warning: FS::Record::new called with table name ". $self->{'Table'};
- }
-
- #$self->{'Hash'} = shift;
- my $newhash = shift;
- $self->{'Hash'} = { map { $_ => $newhash->{$_} } qw(svcnum svcpart) };
- $self->setdefault;
- $self->{'Hash'}{$_} = $newhash->{$_}
- foreach grep { defined($newhash->{$_}) && length($newhash->{$_}) }
- keys %$newhash;
-
- foreach my $field ( grep !defined($self->{'Hash'}{$_}), $self->fields ) {
- $self->{'Hash'}{$field}='';
- }
-
- $self->_rebless if $self->can('_rebless');
-
- $self->{'modified'} = 0;
-
- $self->_cache($self->{'Hash'}, shift) if $self->can('_cache') && @_;
-
- $self;
-}
-
sub virtual_fields {
# This restricts the fields based on part_svc_column and the svcpart of
@@ -580,6 +547,20 @@ sub clone_kludge_unsuspend {
shift;
}
+=item cust_name
+
+Given a svc_ object that contains fields from cust_main (say, from a
+JOINed search. See httemplate/search/svc_* for examples), returns the
+equivalent of "$svc_x->cust_svc->cust_pkg->name" (but much more efficient),
+or "(unlinked)" if this service is not linked to a customer.
+
+=cut
+
+sub cust_name {
+ my $svc_x = shift;
+ $svc_x->custnum ? FS::cust_main::name($svc_x) : '(unlinked)';
+}
+
=back
=head1 BUGS
diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm
index c1851d3ce..1ec5429e9 100644
--- a/FS/FS/svc_acct.pm
+++ b/FS/FS/svc_acct.pm
@@ -15,7 +15,6 @@ use vars qw( @ISA $DEBUG $me $conf $skip_fuzzyfiles
@saltset @pw_set );
use Carp;
use Fcntl qw(:flock);
-use Date::Format;
use Crypt::PasswdMD5 1.2;
use FS::UID qw( datasrc );
use FS::Conf;
@@ -467,15 +466,7 @@ sub replace {
{
#no warnings 'numeric'; #alas, a 5.006-ism
local($^W) = 0;
-
- foreach my $xid (qw( uid gid )) {
-
- return "Can't change $xid!"
- if ! $conf->exists("svc_acct-edit_$xid")
- && $old->$xid() != $new->$xid()
- && $new->cust_svc->part_svc->part_svc_column($xid)->columnflag ne 'F'
- }
-
+ return "Can't change uid!" if $old->uid != $new->uid;
}
#change homdir when we change username
@@ -497,10 +488,8 @@ sub replace {
return $error if $error;
$old->usergroup( [ $old->radius_groups ] );
- if ( $DEBUG ) {
- warn $old->email. " old groups: ". join(' ',@{$old->usergroup}). "\n";
- warn $new->email. "new groups: ". join(' ',@{$new->usergroup}). "\n";
- }
+ warn "old groups: ". join(' ',@{$old->usergroup}). "\n" if $DEBUG;
+ warn "new groups: ". join(' ',@{$new->usergroup}). "\n" if $DEBUG;
if ( $new->usergroup ) {
#(sorta) false laziness with FS::part_export::sqlradius::_export_replace
my @newgroups = @{$new->usergroup};
@@ -755,28 +744,6 @@ sub check {
if $recref->{uid} == 0
&& $recref->{username} !~ /^(root|toor|smtp)$/;
- unless ( $recref->{username} eq 'sync' ) {
- if ( grep $_ eq $recref->{shell}, @shells ) {
- $recref->{shell} = (grep $_ eq $recref->{shell}, @shells)[0];
- } else {
- return "Illegal shell \`". $self->shell. "\'; ".
- $conf->dir. "/shells contains: @shells";
- }
- } else {
- $recref->{shell} = '/bin/sync';
- }
-
- } else {
- $recref->{gid} ne '' ?
- return "Can't have gid without uid" : ( $recref->{gid}='' );
- #$recref->{dir} ne '' ?
- # return "Can't have directory without uid" : ( $recref->{dir}='' );
- $recref->{shell} ne '' ?
- return "Can't have shell without uid" : ( $recref->{shell}='' );
- }
-
- unless ( $part_svc->part_svc_column('dir')->columnflag eq 'F' ) {
-
$recref->{dir} =~ /^([\/\w\-\.\&]*)$/
or return "Illegal directory: ". $recref->{dir};
$recref->{dir} = $1;
@@ -799,6 +766,24 @@ sub check {
;
}
+ unless ( $recref->{username} eq 'sync' ) {
+ if ( grep $_ eq $recref->{shell}, @shells ) {
+ $recref->{shell} = (grep $_ eq $recref->{shell}, @shells)[0];
+ } else {
+ return "Illegal shell \`". $self->shell. "\'; ".
+ $conf->dir. "/shells contains: @shells";
+ }
+ } else {
+ $recref->{shell} = '/bin/sync';
+ }
+
+ } else {
+ $recref->{gid} ne '' ?
+ return "Can't have gid without uid" : ( $recref->{gid}='' );
+ $recref->{dir} ne '' ?
+ return "Can't have directory without uid" : ( $recref->{dir}='' );
+ $recref->{shell} ne '' ?
+ return "Can't have shell without uid" : ( $recref->{shell}='' );
}
# $error = $self->ut_textn('finger');
@@ -1026,10 +1011,6 @@ expected to change in the future.
sub radius_reply {
my $self = shift;
-
- return %{ $self->{'radius_reply'} }
- if exists $self->{'radius_reply'};
-
my %reply =
map {
/^(radius_(.*))$/;
@@ -1037,15 +1018,12 @@ sub radius_reply {
#$attrib =~ s/_/\-/g;
( $FS::raddb::attrib{lc($attrib)}, $self->getfield($column) );
} grep { /^radius_/ && $self->getfield($_) } fields( $self->table );
-
if ( $self->slipip && $self->slipip ne '0e0' ) {
$reply{$radius_ip} = $self->slipip;
}
-
if ( $self->seconds !~ /^$/ ) {
$reply{'Session-Timeout'} = $self->seconds;
}
-
%reply;
}
@@ -1062,63 +1040,16 @@ expected to change in the future.
sub radius_check {
my $self = shift;
-
- return %{ $self->{'radius_check'} }
- if exists $self->{'radius_check'};
-
- my %check =
+ my $password = $self->_password;
+ my $pw_attrib = length($password) <= 12 ? $radius_password : 'Crypt-Password';
+ ( $pw_attrib => $password,
map {
/^(rc_(.*))$/;
my($column, $attrib) = ($1, $2);
#$attrib =~ s/_/\-/g;
( $FS::raddb::attrib{lc($attrib)}, $self->getfield($column) );
- } grep { /^rc_/ && $self->getfield($_) } fields( $self->table );
-
- my $password = $self->_password;
- my $pw_attrib = length($password) <= 12 ? $radius_password : 'Crypt-Password'; $check{$pw_attrib} = $password;
-
- my $cust_pkg = $self->cust_svc->cust_pkg;
- if ( $cust_pkg && $cust_pkg->part_pkg->is_prepaid && $cust_pkg->bill ) {
- $check{'Expiration'} = time2str('%B %e %Y %T', $cust_pkg->bill ); #http://lists.cistron.nl/pipermail/freeradius-users/2005-January/040184.html
- }
-
- %check;
-
-}
-
-=item snapshot
-
-This method instructs the object to "snapshot" or freeze RADIUS check and
-reply attributes to the current values.
-
-=cut
-
-#bah, my english is too broken this morning
-#Of note is the "Expiration" attribute, which, for accounts in prepaid packages, is typically defined on-the-fly as the associated packages cust_pkg.bill. (This is used by
-#the FS::cust_pkg's replace method to trigger the correct export updates when
-#package dates change)
-
-sub snapshot {
- my $self = shift;
-
- $self->{$_} = { $self->$_() }
- foreach qw( radius_reply radius_check );
-
-}
-
-=item forget_snapshot
-
-This methos instructs the object to forget any previously snapshotted
-RADIUS check and reply attributes.
-
-=cut
-
-sub forget_snapshot {
- my $self = shift;
-
- delete $self->{$_}
- foreach qw( radius_reply radius_check );
-
+ } grep { /^rc_/ && $self->getfield($_) } fields( $self->table )
+ );
}
=item domain
@@ -1155,7 +1086,10 @@ Returns the FS::cust_svc record for this account (see L<FS::cust_svc>).
=cut
-#inherited from svc_Common
+sub cust_svc {
+ my $self = shift;
+ qsearchs( 'cust_svc', { 'svcnum' => $self->svcnum } );
+}
=item email
diff --git a/FS/MANIFEST b/FS/MANIFEST
index e7d9dea34..971fe403e 100644
--- a/FS/MANIFEST
+++ b/FS/MANIFEST
@@ -52,7 +52,6 @@ FS/cust_bill_pkg_detail.pm
FS/cust_credit.pm
FS/cust_credit_bill.pm
FS/cust_main.pm
-FS/cust_main_Mixin.pm
FS/cust_main_county.pm
FS/cust_main_invoice.pm
FS/cust_pay.pm
@@ -92,8 +91,6 @@ FS/part_export/http.pm
FS/part_export/infostreet.pm
FS/part_export/ldap.pm
FS/part_export/null.pm
-FS/part_export/radiator.pm
-FS/part_export/router.pm
FS/part_export/shellcommands.pm
FS/part_export/shellcommands_withdomain.pm
FS/part_export/sqlmail.pm
@@ -180,7 +177,6 @@ t/cust_credit.t
t/cust_credit_bill.t
t/cust_credit_refund.t
t/cust_main.t
-t/cust_main_Mixin.t
t/cust_main_county.t
t/cust_main_invoice.t
t/cust_pay.t
@@ -223,7 +219,6 @@ t/part_export-ldap.t
t/part_export-null.t
t/part_export-passwdfile.t
t/part_export-postfix.t
-t/part_export-radiator.t
t/part_export-router.t
t/part_export-shellcommands.t
t/part_export-shellcommands_withdomain.t
@@ -279,16 +274,3 @@ t/msgcat.t
t/raddb.t
t/clientapi_session.t
t/clientapi_session_field.t
-FS/payment_gateway.pm
-t/payment_gateway.t
-FS/payment_gateway_option.pm
-t/payment_gateway_option.t
-FS/option_Common.pm
-t/option_Common.t
-FS/agent_payment_gateway.pm
-t/agent_payment_gateway.t
-FS/banned_pay.pm
-t/banned_pay.t
-FS/cancel_reason.pm
-t/cancel_reason.t
-bin/freeside-prepaidd
diff --git a/FS/bin/freeside-daily b/FS/bin/freeside-daily
index 603da12b8..589af8998 100755
--- a/FS/bin/freeside-daily
+++ b/FS/bin/freeside-daily
@@ -89,19 +89,6 @@ foreach $cust_main ( @cust_main ) {
$cust_main->custnum. ": $error"
if $error;
}
- # $^T not $time because -d is for pre-printing invoices
- foreach my $cust_pkg (
- grep { $_->part_pkg->is_prepaid
- && $_->bill && $_->bill < $^T && ! $_->susp
- }
- $cust_main->ncancelled_pkgs
- ) {
- my $error = $cust_pkg->suspend;
- warn "Error suspending package ". $cust_pkg->pkgnum.
- " for custnum ". $cust_main->custnum.
- ": $error"
- if $error;
- }
my $error = $cust_main->bill( 'time' => $time,
'resetup' => $opt_s, );
diff --git a/FS/bin/freeside-prepaidd b/FS/bin/freeside-prepaidd
deleted file mode 100644
index e51a56350..000000000
--- a/FS/bin/freeside-prepaidd
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/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( "/usr/local/etc/freeside/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 $error = $cust_pkg->suspend;
- warn "Error suspended package ". $cust_pkg->pkgnum.
- " for custnum ". $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 suspendes any prepaid customer packages which have
-passed their renewal date (next bill date).
-
-=head1 SEE ALSO
-
-=cut
-
-1;
diff --git a/FS/bin/freeside-setup b/FS/bin/freeside-setup
index a16e51749..a2ef31eb1 100755
--- a/FS/bin/freeside-setup
+++ b/FS/bin/freeside-setup
@@ -1,24 +1,29 @@
#!/usr/bin/perl -Tw
#to delay loading dbdef until we're ready
-BEGIN { $FS::Schema::setup_hack = 1; }
+BEGIN { $FS::Record::setup_hack = 1; }
use strict;
use vars qw($opt_s);
use Getopt::Std;
use Locale::Country;
use Locale::SubCountry;
+use DBI;
+use DBIx::DBSchema 0.25;
+use DBIx::DBSchema::Table;
+use DBIx::DBSchema::Column;
+use DBIx::DBSchema::ColGroup::Unique;
+use DBIx::DBSchema::ColGroup::Index;
use FS::UID qw(adminsuidsetup datasrc checkeuid getsecrets);
-use FS::Schema qw( dbdef_dist reload_dbdef );
use FS::Record;
use FS::cust_main_county;
-#use FS::raddb;
+use FS::raddb;
use FS::part_bill_event;
die "Not running uid freeside!" unless checkeuid();
-#my %attrib2db =
-# map { lc($FS::raddb::attrib{$_}) => $_ } keys %FS::raddb::attrib;
+my %attrib2db =
+ map { lc($FS::raddb::attrib{$_}) => $_ } keys %FS::raddb::attrib;
getopts("s");
my $user = shift or die &usage;
@@ -70,25 +75,158 @@ my $username_len = 32; #usernamemax config file
# $x =~ /^y/i;
#}
-#my @check_attributes = (); #add later
-#my @attributes = (); #add later
-#my $ship = $opt_s;
+my @check_attributes = (); #add later
+my @attributes = (); #add later
+my $ship = $opt_s;
+
+###
+
+my($char_d) = 80; #default maxlength for text fields
+
+#my(@date_type) = ( 'timestamp', '', '' );
+my(@date_type) = ( 'int', 'NULL', '' );
+my(@perl_type) = ( 'text', 'NULL', '' );
+my @money_type = ( 'decimal', '', '10,2' );
###
# create a dbdef object from the old data structure
###
-my $dbdef = dbdef_dist;
+my(%tables)=&tables_hash_hack;
+
+#turn it into objects
+my($dbdef) = new DBIx::DBSchema ( map {
+ my(@columns);
+ while (@{$tables{$_}{'columns'}}) {
+ my($name,$type,$null,$length)=splice @{$tables{$_}{'columns'}}, 0, 4;
+ push @columns, new DBIx::DBSchema::Column ( $name,$type,$null,$length );
+ }
+ DBIx::DBSchema::Table->new(
+ $_,
+ $tables{$_}{'primary_key'},
+ DBIx::DBSchema::ColGroup::Unique->new($tables{$_}{'unique'}),
+ DBIx::DBSchema::ColGroup::Index->new($tables{$_}{'index'}),
+ @columns,
+ );
+} (keys %tables) );
+
+my $cust_main = $dbdef->table('cust_main');
+unless ($ship) { #remove ship_ from cust_main
+ $cust_main->delcolumn($_) foreach ( grep /^ship_/, $cust_main->columns );
+} else { #add indices
+ push @{$cust_main->index->lol_ref},
+ map { [ "ship_$_" ] } qw( last company daytime night fax );
+}
+
+#add radius attributes to svc_acct
+
+my($svc_acct)=$dbdef->table('svc_acct');
+
+my($attribute);
+foreach $attribute (@attributes) {
+ $svc_acct->addcolumn ( new DBIx::DBSchema::Column (
+ 'radius_'. $attribute,
+ 'varchar',
+ 'NULL',
+ $char_d,
+ ));
+}
+
+foreach $attribute (@check_attributes) {
+ $svc_acct->addcolumn( new DBIx::DBSchema::Column (
+ 'rc_'. $attribute,
+ 'varchar',
+ 'NULL',
+ $char_d,
+ ));
+}
+
+#create history tables (false laziness w/create-history-tables)
+foreach my $table (
+ grep { ! /^clientapi_session/ }
+ grep { ! /^h_/ }
+ $dbdef->tables
+) {
+ my $tableobj = $dbdef->table($table)
+ or die "unknown table $table";
+
+ die "unique->lol_ref undefined for $table"
+ unless defined $tableobj->unique->lol_ref;
+ die "index->lol_ref undefined for $table"
+ unless defined $tableobj->index->lol_ref;
+
+ my $h_tableobj = DBIx::DBSchema::Table->new( {
+ name => "h_$table",
+ primary_key => 'historynum',
+ unique => DBIx::DBSchema::ColGroup::Unique->new( [] ),
+ 'index' => DBIx::DBSchema::ColGroup::Index->new( [
+ @{$tableobj->unique->lol_ref},
+ @{$tableobj->index->lol_ref}
+ ] ),
+ columns => [
+ DBIx::DBSchema::Column->new( {
+ 'name' => 'historynum',
+ 'type' => 'serial',
+ 'null' => 'NOT NULL',
+ 'length' => '',
+ 'default' => '',
+ 'local' => '',
+ } ),
+ DBIx::DBSchema::Column->new( {
+ 'name' => 'history_date',
+ 'type' => 'int',
+ 'null' => 'NULL',
+ 'length' => '',
+ 'default' => '',
+ 'local' => '',
+ } ),
+ DBIx::DBSchema::Column->new( {
+ 'name' => 'history_user',
+ 'type' => 'varchar',
+ 'null' => 'NOT NULL',
+ 'length' => '80',
+ 'default' => '',
+ 'local' => '',
+ } ),
+ DBIx::DBSchema::Column->new( {
+ 'name' => 'history_action',
+ 'type' => 'varchar',
+ 'null' => 'NOT NULL',
+ 'length' => '80',
+ 'default' => '',
+ 'local' => '',
+ } ),
+ map {
+ my $column = $tableobj->column($_);
+
+ #clone so as to not disturb the original
+ $column = DBIx::DBSchema::Column->new( {
+ map { $_ => $column->$_() }
+ qw( name type null length default local )
+ } );
+
+ $column->type('int')
+ if $column->type eq 'serial';
+ #$column->default('')
+ # if $column->default =~ /^nextval\(/i;
+ #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i;
+ #$column->local($local);
+ $column;
+ } $tableobj->columns
+ ],
+ } );
+ $dbdef->addtable($h_tableobj);
+}
#important
$dbdef->save($dbdef_file);
-&FS::Schema::reload_dbdef($dbdef_file);
+&FS::Record::reload_dbdef($dbdef_file);
###
# create 'em
###
-my $dbh = adminsuidsetup $user;
+my($dbh)=adminsuidsetup $user;
#create tables
$|=1;
@@ -98,12 +236,6 @@ foreach my $statement ( $dbdef->sql($dbh) ) {
or die "CREATE error: ". $dbh->errstr. "\ndoing statement: $statement";
}
-#now go back and reverse engineer the db
-#so we pick up the correct column DEFAULTs for #oidless inserts
-dbdef_create($dbh, $dbdef_file);
-delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
-reload_dbdef($dbdef_file);
-
#cust_main_county
foreach my $country ( sort map uc($_), all_country_codes ) {
@@ -168,15 +300,975 @@ $dbh->disconnect or die $dbh->errstr;
#print "Freeside database initialized sucessfully\n";
-sub dbdef_create { # reverse engineer the schema from the DB and save to file
- my( $dbh, $file ) = @_;
- my $dbdef = new_native DBIx::DBSchema $dbh;
- $dbdef->save($file);
-}
-
sub usage {
- die "Usage:\n freeside-setup user\n";
+ die "Usage:\n freeside-setup [ -s ] user\n";
}
-1;
+###
+# Now it becomes an object. much better.
+###
+sub tables_hash_hack {
+
+ #note that s/(date|change)/_$1/; to avoid keyword conflict.
+ #put a kludge in FS::Record to catch this or? (pry need some date-handling
+ #stuff anyway also)
+
+ my(%tables)=( #yech.}
+
+ 'agent' => {
+ 'columns' => [
+ 'agentnum', 'serial', '', '',
+ 'agent', 'varchar', '', $char_d,
+ 'typenum', 'int', '', '',
+ 'freq', 'int', 'NULL', '',
+ 'prog', @perl_type,
+ 'disabled', 'char', 'NULL', 1,
+ 'username', 'varchar', 'NULL', $char_d,
+ '_password','varchar', 'NULL', $char_d,
+ ],
+ 'primary_key' => 'agentnum',
+ 'unique' => [],
+ 'index' => [ ['typenum'], ['disabled'] ],
+ },
+
+ 'agent_type' => {
+ 'columns' => [
+ 'typenum', 'serial', '', '',
+ 'atype', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'typenum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'type_pkgs' => {
+ 'columns' => [
+ 'typepkgnum', 'serial', '', '',
+ 'typenum', 'int', '', '',
+ 'pkgpart', 'int', '', '',
+ ],
+ 'primary_key' => 'typepkgnum',
+ 'unique' => [ ['typenum', 'pkgpart'] ],
+ 'index' => [ ['typenum'] ],
+ },
+
+ 'cust_bill' => {
+ 'columns' => [
+ 'invnum', 'serial', '', '',
+ 'custnum', 'int', '', '',
+ '_date', @date_type,
+ 'charged', @money_type,
+ 'printed', 'int', '', '',
+ 'closed', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'invnum',
+ 'unique' => [],
+ 'index' => [ ['custnum'], ['_date'] ],
+ },
+
+ 'cust_bill_event' => {
+ 'columns' => [
+ 'eventnum', 'serial', '', '',
+ 'invnum', 'int', '', '',
+ 'eventpart', 'int', '', '',
+ '_date', @date_type,
+ 'status', 'varchar', '', $char_d,
+ 'statustext', 'text', 'NULL', '',
+ ],
+ 'primary_key' => 'eventnum',
+ #no... there are retries now #'unique' => [ [ 'eventpart', 'invnum' ] ],
+ 'unique' => [],
+ 'index' => [ ['invnum'], ['status'] ],
+ },
+
+ 'part_bill_event' => {
+ 'columns' => [
+ 'eventpart', 'serial', '', '',
+ 'payby', 'char', '', 4,
+ 'event', 'varchar', '', $char_d,
+ 'eventcode', @perl_type,
+ 'seconds', 'int', 'NULL', '',
+ 'weight', 'int', '', '',
+ 'plan', 'varchar', 'NULL', $char_d,
+ 'plandata', 'text', 'NULL', '',
+ 'disabled', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'eventpart',
+ 'unique' => [],
+ 'index' => [ ['payby'], ['disabled'], ],
+ },
+
+ 'cust_bill_pkg' => {
+ 'columns' => [
+ 'billpkgnum', 'serial', '', '',
+ 'pkgnum', 'int', '', '',
+ 'invnum', 'int', '', '',
+ 'setup', @money_type,
+ 'recur', @money_type,
+ 'sdate', @date_type,
+ 'edate', @date_type,
+ 'itemdesc', 'varchar', 'NULL', $char_d,
+ ],
+ 'primary_key' => 'billpkgnum',
+ 'unique' => [],
+ 'index' => [ ['invnum'] ],
+ },
+
+ 'cust_bill_pkg_detail' => {
+ 'columns' => [
+ 'detailnum', 'serial', '', '',
+ 'pkgnum', 'int', '', '',
+ 'invnum', 'int', '', '',
+ 'detail', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'detailnum',
+ 'unique' => [],
+ 'index' => [ [ 'pkgnum', 'invnum' ] ],
+ },
+
+ 'cust_credit' => {
+ 'columns' => [
+ 'crednum', 'serial', '', '',
+ 'custnum', 'int', '', '',
+ '_date', @date_type,
+ 'amount', @money_type,
+ 'otaker', 'varchar', '', 32,
+ 'reason', 'text', 'NULL', '',
+ 'closed', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'crednum',
+ 'unique' => [],
+ 'index' => [ ['custnum'] ],
+ },
+
+ 'cust_credit_bill' => {
+ 'columns' => [
+ 'creditbillnum', 'serial', '', '',
+ 'crednum', 'int', '', '',
+ 'invnum', 'int', '', '',
+ '_date', @date_type,
+ 'amount', @money_type,
+ ],
+ 'primary_key' => 'creditbillnum',
+ 'unique' => [],
+ 'index' => [ ['crednum'], ['invnum'] ],
+ },
+
+ 'cust_main' => {
+ 'columns' => [
+ 'custnum', 'serial', '', '',
+ 'agentnum', 'int', '', '',
+# 'titlenum', 'int', 'NULL', '',
+ 'last', 'varchar', '', $char_d,
+# 'middle', 'varchar', 'NULL', $char_d,
+ 'first', 'varchar', '', $char_d,
+ 'ss', 'varchar', 'NULL', 11,
+ 'company', 'varchar', 'NULL', $char_d,
+ 'address1', 'varchar', '', $char_d,
+ 'address2', 'varchar', 'NULL', $char_d,
+ 'city', 'varchar', '', $char_d,
+ 'county', 'varchar', 'NULL', $char_d,
+ 'state', 'varchar', 'NULL', $char_d,
+ 'zip', 'varchar', 'NULL', 10,
+ 'country', 'char', '', 2,
+ 'daytime', 'varchar', 'NULL', 20,
+ 'night', 'varchar', 'NULL', 20,
+ 'fax', 'varchar', 'NULL', 12,
+ 'ship_last', 'varchar', 'NULL', $char_d,
+# 'ship_middle', 'varchar', 'NULL', $char_d,
+ 'ship_first', 'varchar', 'NULL', $char_d,
+ 'ship_company', 'varchar', 'NULL', $char_d,
+ 'ship_address1', 'varchar', 'NULL', $char_d,
+ 'ship_address2', 'varchar', 'NULL', $char_d,
+ 'ship_city', 'varchar', 'NULL', $char_d,
+ 'ship_county', 'varchar', 'NULL', $char_d,
+ 'ship_state', 'varchar', 'NULL', $char_d,
+ 'ship_zip', 'varchar', 'NULL', 10,
+ 'ship_country', 'char', 'NULL', 2,
+ 'ship_daytime', 'varchar', 'NULL', 20,
+ 'ship_night', 'varchar', 'NULL', 20,
+ 'ship_fax', 'varchar', 'NULL', 12,
+ 'payby', 'char', '', 4,
+ 'payinfo', 'varchar', 'NULL', 512,
+ 'paycvv', 'varchar', 'NULL', 512,
+ 'paymask', 'varchar', 'NULL', $char_d,
+ #'paydate', @date_type,
+ 'paydate', 'varchar', 'NULL', 10,
+ 'payname', 'varchar', 'NULL', $char_d,
+ 'tax', 'char', 'NULL', 1,
+ 'otaker', 'varchar', '', 32,
+ 'refnum', 'int', '', '',
+ 'referral_custnum', 'int', 'NULL', '',
+ 'comments', 'text', 'NULL', '',
+ ],
+ 'primary_key' => 'custnum',
+ 'unique' => [],
+ #'index' => [ ['last'], ['company'] ],
+ 'index' => [ ['last'], [ 'company' ], [ 'referral_custnum' ],
+ [ 'daytime' ], [ 'night' ], [ 'fax' ], [ 'refnum' ],
+ ],
+ },
+
+ 'cust_main_invoice' => {
+ 'columns' => [
+ 'destnum', 'serial', '', '',
+ 'custnum', 'int', '', '',
+ 'dest', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'destnum',
+ 'unique' => [],
+ 'index' => [ ['custnum'], ],
+ },
+
+ 'cust_main_county' => { #county+state+country are checked off the
+ #cust_main_county for validation and to provide
+ # a tax rate.
+ 'columns' => [
+ 'taxnum', 'serial', '', '',
+ 'state', 'varchar', 'NULL', $char_d,
+ 'county', 'varchar', 'NULL', $char_d,
+ 'country', 'char', '', 2,
+ 'taxclass', 'varchar', 'NULL', $char_d,
+ 'exempt_amount', @money_type,
+ 'tax', 'real', '', '', #tax %
+ 'taxname', 'varchar', 'NULL', $char_d,
+ 'setuptax', 'char', 'NULL', 1, # Y = setup tax exempt
+ 'recurtax', 'char', 'NULL', 1, # Y = recur tax exempt
+ ],
+ 'primary_key' => 'taxnum',
+ 'unique' => [],
+ # 'unique' => [ ['taxnum'], ['state', 'county'] ],
+ 'index' => [],
+ },
+
+ 'cust_pay' => {
+ 'columns' => [
+ 'paynum', 'serial', '', '',
+ #now cust_bill_pay #'invnum', 'int', '', '',
+ 'custnum', 'int', '', '',
+ 'paid', @money_type,
+ '_date', @date_type,
+ 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index into
+ # payment type table.
+ 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
+ 'paybatch', 'varchar', 'NULL', $char_d, #for auditing purposes.
+ 'closed', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'paynum',
+ 'unique' => [],
+ 'index' => [ [ 'custnum' ], [ 'paybatch' ], [ 'payby' ], [ '_date' ] ],
+ },
+
+ 'cust_pay_void' => {
+ 'columns' => [
+ 'paynum', 'int', '', '',
+ 'custnum', 'int', '', '',
+ 'paid', @money_type,
+ '_date', @date_type,
+ 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index into
+ # payment type table.
+ 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
+ 'paybatch', 'varchar', 'NULL', $char_d, #for auditing purposes.
+ 'closed', 'char', 'NULL', 1,
+ 'void_date', @date_type,
+ 'reason', 'varchar', 'NULL', $char_d,
+ 'otaker', 'varchar', '', 32,
+ ],
+ 'primary_key' => 'paynum',
+ 'unique' => [],
+ 'index' => [ [ 'custnum' ] ],
+ },
+
+ 'cust_bill_pay' => {
+ 'columns' => [
+ 'billpaynum', 'serial', '', '',
+ 'invnum', 'int', '', '',
+ 'paynum', 'int', '', '',
+ 'amount', @money_type,
+ '_date', @date_type
+ ],
+ 'primary_key' => 'billpaynum',
+ 'unique' => [],
+ 'index' => [ [ 'paynum' ], [ 'invnum' ] ],
+ },
+
+ 'cust_pay_batch' => { #what's this used for again? list of customers
+ #in current CARD batch? (necessarily CARD?)
+ 'columns' => [
+ 'paybatchnum', 'serial', '', '',
+ 'invnum', 'int', '', '',
+ 'custnum', 'int', '', '',
+ 'last', 'varchar', '', $char_d,
+ 'first', 'varchar', '', $char_d,
+ 'address1', 'varchar', '', $char_d,
+ 'address2', 'varchar', 'NULL', $char_d,
+ 'city', 'varchar', '', $char_d,
+ 'state', 'varchar', 'NULL', $char_d,
+ 'zip', 'varchar', 'NULL', 10,
+ 'country', 'char', '', 2,
+# 'trancode', 'int', '', '',
+ 'cardnum', 'varchar', '', 16,
+ #'exp', @date_type,
+ 'exp', 'varchar', '', 11,
+ 'payname', 'varchar', 'NULL', $char_d,
+ 'amount', @money_type,
+ ],
+ 'primary_key' => 'paybatchnum',
+ 'unique' => [],
+ 'index' => [ ['invnum'], ['custnum'] ],
+ },
+
+ 'cust_pkg' => {
+ 'columns' => [
+ 'pkgnum', 'serial', '', '',
+ 'custnum', 'int', '', '',
+ 'pkgpart', 'int', '', '',
+ 'otaker', 'varchar', '', 32,
+ 'setup', @date_type,
+ 'bill', @date_type,
+ 'last_bill', @date_type,
+ 'susp', @date_type,
+ 'cancel', @date_type,
+ 'expire', @date_type,
+ 'manual_flag', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'pkgnum',
+ 'unique' => [],
+ 'index' => [ ['custnum'] ],
+ },
+
+ 'cust_refund' => {
+ 'columns' => [
+ 'refundnum', 'serial', '', '',
+ #now cust_credit_refund #'crednum', 'int', '', '',
+ 'custnum', 'int', '', '',
+ '_date', @date_type,
+ 'refund', @money_type,
+ 'otaker', 'varchar', '', 32,
+ 'reason', 'varchar', '', $char_d,
+ 'payby', 'char', '', 4, # CARD/BILL/COMP, should be index
+ # into payment type table.
+ 'payinfo', 'varchar', 'NULL', $char_d, #see cust_main above
+ 'paybatch', 'varchar', 'NULL', $char_d,
+ 'closed', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'refundnum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'cust_credit_refund' => {
+ 'columns' => [
+ 'creditrefundnum', 'serial', '', '',
+ 'crednum', 'int', '', '',
+ 'refundnum', 'int', '', '',
+ 'amount', @money_type,
+ '_date', @date_type
+ ],
+ 'primary_key' => 'creditrefundnum',
+ 'unique' => [],
+ 'index' => [ [ 'crednum', 'refundnum' ] ],
+ },
+
+
+ 'cust_svc' => {
+ 'columns' => [
+ 'svcnum', 'serial', '', '',
+ 'pkgnum', 'int', 'NULL', '',
+ 'svcpart', 'int', '', '',
+ ],
+ 'primary_key' => 'svcnum',
+ 'unique' => [],
+ 'index' => [ ['svcnum'], ['pkgnum'], ['svcpart'] ],
+ },
+
+ 'part_pkg' => {
+ 'columns' => [
+ 'pkgpart', 'serial', '', '',
+ 'pkg', 'varchar', '', $char_d,
+ 'comment', 'varchar', '', $char_d,
+ 'promo_code', 'varchar', 'NULL', $char_d,
+ 'setup', @perl_type,
+ 'freq', 'varchar', '', $char_d, #billing frequency
+ 'recur', @perl_type,
+ 'setuptax', 'char', 'NULL', 1,
+ 'recurtax', 'char', 'NULL', 1,
+ 'plan', 'varchar', 'NULL', $char_d,
+ 'plandata', 'text', 'NULL', '',
+ 'disabled', 'char', 'NULL', 1,
+ 'taxclass', 'varchar', 'NULL', $char_d,
+ ],
+ 'primary_key' => 'pkgpart',
+ 'unique' => [],
+ 'index' => [ [ 'promo_code' ], [ 'disabled' ] ],
+ },
+
+# 'part_title' => {
+# 'columns' => [
+# 'titlenum', 'int', '', '',
+# 'title', 'varchar', '', $char_d,
+# ],
+# 'primary_key' => 'titlenum',
+# 'unique' => [ [] ],
+# 'index' => [ [] ],
+# },
+
+ 'pkg_svc' => {
+ 'columns' => [
+ 'pkgsvcnum', 'serial', '', '',
+ 'pkgpart', 'int', '', '',
+ 'svcpart', 'int', '', '',
+ 'quantity', 'int', '', '',
+ 'primary_svc','char', 'NULL', 1,
+ ],
+ 'primary_key' => 'pkgsvcnum',
+ 'unique' => [ ['pkgpart', 'svcpart'] ],
+ 'index' => [ ['pkgpart'] ],
+ },
+
+ 'part_referral' => {
+ 'columns' => [
+ 'refnum', 'serial', '', '',
+ 'referral', 'varchar', '', $char_d,
+ 'disabled', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'refnum',
+ 'unique' => [],
+ 'index' => [ ['disabled'] ],
+ },
+
+ 'part_svc' => {
+ 'columns' => [
+ 'svcpart', 'serial', '', '',
+ 'svc', 'varchar', '', $char_d,
+ 'svcdb', 'varchar', '', $char_d,
+ 'disabled', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'svcpart',
+ 'unique' => [],
+ 'index' => [ [ 'disabled' ] ],
+ },
+
+ 'part_svc_column' => {
+ 'columns' => [
+ 'columnnum', 'serial', '', '',
+ 'svcpart', 'int', '', '',
+ 'columnname', 'varchar', '', 64,
+ 'columnvalue', 'varchar', 'NULL', $char_d,
+ 'columnflag', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'columnnum',
+ 'unique' => [ [ 'svcpart', 'columnname' ] ],
+ 'index' => [ [ 'svcpart' ] ],
+ },
+
+ #(this should be renamed to part_pop)
+ 'svc_acct_pop' => {
+ 'columns' => [
+ 'popnum', 'serial', '', '',
+ 'city', 'varchar', '', $char_d,
+ 'state', 'varchar', '', $char_d,
+ 'ac', 'char', '', 3,
+ 'exch', 'char', '', 3,
+ 'loc', 'char', 'NULL', 4, #NULL for legacy purposes
+ ],
+ 'primary_key' => 'popnum',
+ 'unique' => [],
+ 'index' => [ [ 'state' ] ],
+ },
+
+ 'part_pop_local' => {
+ 'columns' => [
+ 'localnum', 'serial', '', '',
+ 'popnum', 'int', '', '',
+ 'city', 'varchar', 'NULL', $char_d,
+ 'state', 'char', 'NULL', 2,
+ 'npa', 'char', '', 3,
+ 'nxx', 'char', '', 3,
+ ],
+ 'primary_key' => 'localnum',
+ 'unique' => [],
+ 'index' => [ [ 'npa', 'nxx' ], [ 'popnum' ] ],
+ },
+
+ 'svc_acct' => {
+ 'columns' => [
+ 'svcnum', 'int', '', '',
+ 'username', 'varchar', '', $username_len, #unique (& remove dup code)
+ '_password', 'varchar', '', 72, #13 for encryped pw's plus ' *SUSPENDED* (md5 passwords can be 34, blowfish 60)
+ 'sec_phrase', 'varchar', 'NULL', $char_d,
+ 'popnum', 'int', 'NULL', '',
+ 'uid', 'int', 'NULL', '',
+ 'gid', 'int', 'NULL', '',
+ 'finger', 'varchar', 'NULL', $char_d,
+ 'dir', 'varchar', 'NULL', $char_d,
+ 'shell', 'varchar', 'NULL', $char_d,
+ 'quota', 'varchar', 'NULL', $char_d,
+ 'slipip', 'varchar', 'NULL', 15, #four TINYINTs, bah.
+ 'seconds', 'int', 'NULL', '', #uhhhh
+ 'domsvc', 'int', '', '',
+ ],
+ 'primary_key' => 'svcnum',
+ #'unique' => [ [ 'username', 'domsvc' ] ],
+ 'unique' => [],
+ 'index' => [ ['username'], ['domsvc'] ],
+ },
+
+ #'svc_charge' => {
+ # 'columns' => [
+ # 'svcnum', 'int', '', '',
+ # 'amount', @money_type,
+ # ],
+ # 'primary_key' => 'svcnum',
+ # 'unique' => [ [] ],
+ # 'index' => [ [] ],
+ #},
+
+ 'svc_domain' => {
+ 'columns' => [
+ 'svcnum', 'int', '', '',
+ 'domain', 'varchar', '', $char_d,
+ 'catchall', 'int', 'NULL', '',
+ ],
+ 'primary_key' => 'svcnum',
+ 'unique' => [ ['domain'] ],
+ 'index' => [],
+ },
+
+ 'domain_record' => {
+ 'columns' => [
+ 'recnum', 'serial', '', '',
+ 'svcnum', 'int', '', '',
+ #'reczone', 'varchar', '', $char_d,
+ 'reczone', 'varchar', '', 255,
+ 'recaf', 'char', '', 2,
+ 'rectype', 'varchar', '', 5,
+ #'recdata', 'varchar', '', $char_d,
+ 'recdata', 'varchar', '', 255,
+ ],
+ 'primary_key' => 'recnum',
+ 'unique' => [],
+ 'index' => [ ['svcnum'] ],
+ },
+
+ 'svc_forward' => {
+ 'columns' => [
+ 'svcnum', 'int', '', '',
+ 'srcsvc', 'int', 'NULL', '',
+ 'src', 'varchar', 'NULL', 255,
+ 'dstsvc', 'int', 'NULL', '',
+ 'dst', 'varchar', 'NULL', 255,
+ ],
+ 'primary_key' => 'svcnum',
+ 'unique' => [],
+ 'index' => [ ['srcsvc'], ['dstsvc'] ],
+ },
+
+ 'svc_www' => {
+ 'columns' => [
+ 'svcnum', 'int', '', '',
+ 'recnum', 'int', '', '',
+ 'usersvc', 'int', '', '',
+ ],
+ 'primary_key' => 'svcnum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ #'svc_wo' => {
+ # 'columns' => [
+ # 'svcnum', 'int', '', '',
+ # 'svcnum', 'int', '', '',
+ # 'svcnum', 'int', '', '',
+ # 'worker', 'varchar', '', $char_d,
+ # '_date', @date_type,
+ # ],
+ # 'primary_key' => 'svcnum',
+ # 'unique' => [ [] ],
+ # 'index' => [ [] ],
+ #},
+
+ 'prepay_credit' => {
+ 'columns' => [
+ 'prepaynum', 'serial', '', '',
+ 'identifier', 'varchar', '', $char_d,
+ 'amount', @money_type,
+ 'seconds', 'int', 'NULL', '',
+ 'agentnum', 'int', 'NULL', '',
+ ],
+ 'primary_key' => 'prepaynum',
+ 'unique' => [ ['identifier'] ],
+ 'index' => [],
+ },
+
+ 'port' => {
+ 'columns' => [
+ 'portnum', 'serial', '', '',
+ 'ip', 'varchar', 'NULL', 15,
+ 'nasport', 'int', 'NULL', '',
+ 'nasnum', 'int', '', '',
+ ],
+ 'primary_key' => 'portnum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'nas' => {
+ 'columns' => [
+ 'nasnum', 'serial', '', '',
+ 'nas', 'varchar', '', $char_d,
+ 'nasip', 'varchar', '', 15,
+ 'nasfqdn', 'varchar', '', $char_d,
+ 'last', 'int', '', '',
+ ],
+ 'primary_key' => 'nasnum',
+ 'unique' => [ [ 'nas' ], [ 'nasip' ] ],
+ 'index' => [ [ 'last' ] ],
+ },
+
+ 'session' => {
+ 'columns' => [
+ 'sessionnum', 'serial', '', '',
+ 'portnum', 'int', '', '',
+ 'svcnum', 'int', '', '',
+ 'login', @date_type,
+ 'logout', @date_type,
+ ],
+ 'primary_key' => 'sessionnum',
+ 'unique' => [],
+ 'index' => [ [ 'portnum' ] ],
+ },
+
+ 'queue' => {
+ 'columns' => [
+ 'jobnum', 'serial', '', '',
+ 'job', 'text', '', '',
+ '_date', 'int', '', '',
+ 'status', 'varchar', '', $char_d,
+ 'statustext', 'text', 'NULL', '',
+ 'svcnum', 'int', 'NULL', '',
+ ],
+ 'primary_key' => 'jobnum',
+ 'unique' => [],
+ 'index' => [ [ 'svcnum' ], [ 'status' ] ],
+ },
+
+ 'queue_arg' => {
+ 'columns' => [
+ 'argnum', 'serial', '', '',
+ 'jobnum', 'int', '', '',
+ 'arg', 'text', 'NULL', '',
+ ],
+ 'primary_key' => 'argnum',
+ 'unique' => [],
+ 'index' => [ [ 'jobnum' ] ],
+ },
+
+ 'queue_depend' => {
+ 'columns' => [
+ 'dependnum', 'serial', '', '',
+ 'jobnum', 'int', '', '',
+ 'depend_jobnum', 'int', '', '',
+ ],
+ 'primary_key' => 'dependnum',
+ 'unique' => [],
+ 'index' => [ [ 'jobnum' ], [ 'depend_jobnum' ] ],
+ },
+
+ 'export_svc' => {
+ 'columns' => [
+ 'exportsvcnum' => 'serial', '', '',
+ 'exportnum' => 'int', '', '',
+ 'svcpart' => 'int', '', '',
+ ],
+ 'primary_key' => 'exportsvcnum',
+ 'unique' => [ [ 'exportnum', 'svcpart' ] ],
+ 'index' => [ [ 'exportnum' ], [ 'svcpart' ] ],
+ },
+
+ 'part_export' => {
+ 'columns' => [
+ 'exportnum', 'serial', '', '',
+ #'svcpart', 'int', '', '',
+ 'machine', 'varchar', '', $char_d,
+ 'exporttype', 'varchar', '', $char_d,
+ 'nodomain', 'char', 'NULL', 1,
+ ],
+ 'primary_key' => 'exportnum',
+ 'unique' => [],
+ 'index' => [ [ 'machine' ], [ 'exporttype' ] ],
+ },
+
+ 'part_export_option' => {
+ 'columns' => [
+ 'optionnum', 'serial', '', '',
+ 'exportnum', 'int', '', '',
+ 'optionname', 'varchar', '', $char_d,
+ 'optionvalue', 'text', 'NULL', '',
+ ],
+ 'primary_key' => 'optionnum',
+ 'unique' => [],
+ 'index' => [ [ 'exportnum' ], [ 'optionname' ] ],
+ },
+
+ 'radius_usergroup' => {
+ 'columns' => [
+ 'usergroupnum', 'serial', '', '',
+ 'svcnum', 'int', '', '',
+ 'groupname', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'usergroupnum',
+ 'unique' => [],
+ 'index' => [ [ 'svcnum' ], [ 'groupname' ] ],
+ },
+
+ 'msgcat' => {
+ 'columns' => [
+ 'msgnum', 'serial', '', '',
+ 'msgcode', 'varchar', '', $char_d,
+ 'locale', 'varchar', '', 16,
+ 'msg', 'text', '', '',
+ ],
+ 'primary_key' => 'msgnum',
+ 'unique' => [ [ 'msgcode', 'locale' ] ],
+ 'index' => [],
+ },
+
+ 'cust_tax_exempt' => {
+ 'columns' => [
+ 'exemptnum', 'serial', '', '',
+ 'custnum', 'int', '', '',
+ 'taxnum', 'int', '', '',
+ 'year', 'int', '', '',
+ 'month', 'int', '', '',
+ 'amount', @money_type,
+ ],
+ 'primary_key' => 'exemptnum',
+ 'unique' => [ [ 'custnum', 'taxnum', 'year', 'month' ] ],
+ 'index' => [],
+ },
+
+ 'router' => {
+ 'columns' => [
+ 'routernum', 'serial', '', '',
+ 'routername', 'varchar', '', $char_d,
+ 'svcnum', 'int', 'NULL', '',
+ ],
+ 'primary_key' => 'routernum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'part_svc_router' => {
+ 'columns' => [
+ 'svcrouternum', 'serial', '', '',
+ 'svcpart', 'int', '', '',
+ 'routernum', 'int', '', '',
+ ],
+ 'primary_key' => 'svcrouternum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'addr_block' => {
+ 'columns' => [
+ 'blocknum', 'serial', '', '',
+ 'routernum', 'int', '', '',
+ 'ip_gateway', 'varchar', '', 15,
+ 'ip_netmask', 'int', '', '',
+ ],
+ 'primary_key' => 'blocknum',
+ 'unique' => [ [ 'blocknum', 'routernum' ] ],
+ 'index' => [],
+ },
+
+ 'svc_broadband' => {
+ 'columns' => [
+ 'svcnum', 'int', '', '',
+ 'blocknum', 'int', '', '',
+ 'speed_up', 'int', '', '',
+ 'speed_down', 'int', '', '',
+ 'ip_addr', 'varchar', '', 15,
+ ],
+ 'primary_key' => 'svcnum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'part_virtual_field' => {
+ 'columns' => [
+ 'vfieldpart', 'int', '', '',
+ 'dbtable', 'varchar', '', 32,
+ 'name', 'varchar', '', 32,
+ 'check_block', 'text', 'NULL', '',
+ 'length', 'int', 'NULL', '',
+ 'list_source', 'text', 'NULL', '',
+ 'label', 'varchar', 'NULL', 80,
+ ],
+ 'primary_key' => 'vfieldpart',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'virtual_field' => {
+ 'columns' => [
+ 'vfieldnum', 'serial', '', '',
+ 'recnum', 'int', '', '',
+ 'vfieldpart', 'int', '', '',
+ 'value', 'varchar', '', 128,
+ ],
+ 'primary_key' => 'vfieldnum',
+ 'unique' => [ [ 'vfieldpart', 'recnum' ] ],
+ 'index' => [],
+ },
+
+ 'acct_snarf' => {
+ 'columns' => [
+ 'snarfnum', 'int', '', '',
+ 'svcnum', 'int', '', '',
+ 'machine', 'varchar', '', 255,
+ 'protocol', 'varchar', '', $char_d,
+ 'username', 'varchar', '', $char_d,
+ '_password', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'snarfnum',
+ 'unique' => [],
+ 'index' => [ [ 'svcnum' ] ],
+ },
+
+ 'svc_external' => {
+ 'columns' => [
+ 'svcnum', 'int', '', '',
+ 'id', 'int', 'NULL', '',
+ 'title', 'varchar', 'NULL', $char_d,
+ ],
+ 'primary_key' => 'svcnum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'cust_pay_refund' => {
+ 'columns' => [
+ 'payrefundnum', 'serial', '', '',
+ 'paynum', 'int', '', '',
+ 'refundnum', 'int', '', '',
+ '_date', @date_type,
+ 'amount', @money_type,
+ ],
+ 'primary_key' => 'payrefundnum',
+ 'unique' => [],
+ 'index' => [ ['paynum'], ['refundnum'] ],
+ },
+
+ 'part_pkg_option' => {
+ 'columns' => [
+ 'optionnum', 'serial', '', '',
+ 'pkgpart', 'int', '', '',
+ 'optionname', 'varchar', '', $char_d,
+ 'optionvalue', 'text', 'NULL', '',
+ ],
+ 'primary_key' => 'optionnum',
+ 'unique' => [],
+ 'index' => [ [ 'pkgpart' ], [ 'optionname' ] ],
+ },
+
+ 'rate' => {
+ 'columns' => [
+ 'ratenum', 'serial', '', '',
+ 'ratename', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'ratenum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'rate_detail' => {
+ 'columns' => [
+ 'ratedetailnum', 'serial', '', '',
+ 'ratenum', 'int', '', '',
+ 'orig_regionnum', 'int', 'NULL', '',
+ 'dest_regionnum', 'int', '', '',
+ 'min_included', 'int', '', '',
+ 'min_charge', @money_type,
+ 'sec_granularity', 'int', '', '',
+ #time period (link to table of periods)?
+ ],
+ 'primary_key' => 'ratedetailnum',
+ 'unique' => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
+ 'index' => [],
+ },
+
+ 'rate_region' => {
+ 'columns' => [
+ 'regionnum', 'serial', '', '',
+ 'regionname', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'regionnum',
+ 'unique' => [],
+ 'index' => [],
+ },
+
+ 'rate_prefix' => {
+ 'columns' => [
+ 'prefixnum', 'serial', '', '',
+ 'regionnum', 'int', '', '',,
+ 'countrycode', 'varchar', '', 3,
+ 'npa', 'varchar', 'NULL', 6,
+ 'nxx', 'varchar', 'NULL', 3,
+ ],
+ 'primary_key' => 'prefixnum',
+ 'unique' => [],
+ 'index' => [ [ 'countrycode' ], [ 'regionnum' ] ],
+ },
+
+ 'reg_code' => {
+ 'columns' => [
+ 'codenum', 'serial', '', '',
+ 'code', 'varchar', '', $char_d,
+ 'agentnum', 'int', '', '',
+ ],
+ 'primary_key' => 'codenum',
+ 'unique' => [ [ 'agentnum', 'code' ] ],
+ 'index' => [ [ 'agentnum' ] ],
+ },
+
+ 'reg_code_pkg' => {
+ 'columns' => [
+ 'codepkgnum', 'serial', '', '',
+ 'codenum', 'int', '', '',
+ 'pkgpart', 'int', '', '',
+ ],
+ 'primary_key' => 'codepkgnum',
+ 'unique' => [ [ 'codenum', 'pkgpart' ] ],
+ 'index' => [ [ 'codenum' ] ],
+ },
+
+ 'clientapi_session' => {
+ 'columns' => [
+ 'sessionnum', 'serial', '', '',
+ 'sessionid', 'varchar', '', $char_d,
+ 'namespace', 'varchar', '', $char_d,
+ ],
+ 'primary_key' => 'sessionnum',
+ 'unique' => [ [ 'sessionid', 'namespace' ] ],
+ 'index' => [],
+ },
+
+ 'clientapi_session_field' => {
+ 'columns' => [
+ 'fieldnum', 'serial', '', '',
+ 'sessionnum', 'int', '', '',
+ 'fieldname', 'varchar', '', $char_d,
+ 'fieldvalue', 'text', 'NULL', '',
+ ],
+ 'primary_key' => 'fieldnum',
+ 'unique' => [ [ 'sessionnum', 'fieldname' ] ],
+ 'index' => [],
+ },
+
+ );
+
+ %tables;
+
+}
diff --git a/FS/bin/freeside-sqlradius-radacctd b/FS/bin/freeside-sqlradius-radacctd
index e98eaa015..d66c875b9 100644
--- a/FS/bin/freeside-sqlradius-radacctd
+++ b/FS/bin/freeside-sqlradius-radacctd
@@ -4,7 +4,7 @@ use strict;
use vars qw( @part_export );
use subs qw(myshutdown);
use POSIX qw(:sys_wait_h);
-#use IO::File;
+use IO::File;
use FS::Daemon qw(daemonize1 drop_root logfile daemonize2 sigint sigterm);
use FS::UID qw(adminsuidsetup); #forksuidsetup driver_name dbh myconnect);
use FS::Record qw(qsearch); # qsearchs);
@@ -29,20 +29,14 @@ daemonize2();
#--
-#don't just look for ->can('usage_sessions'), we're sqlradius-specific
-# (radiator is supposed to be setup with a radacct table)
-
@part_export =
qsearch('part_export', { 'exporttype' => 'sqlradius' } );
push @part_export,
qsearch('part_export', { 'exporttype' => 'sqlradius_withdomain' } );
-push @part_export,
- qsearch('part_export', { 'exporttype' => 'radiator' } );
@part_export = grep { ! $_->option('ignore_accounting') } @part_export;
-die "no sqlradius, sqlradius_withdomain or radiator exports without".
- " ignore_accounting"
+die "no sqlradius or sqlradius_withdomain exports without ignore_accounting"
unless @part_export;
while (1) {
@@ -127,10 +121,10 @@ freeside-sqlradius-radacctd - Real-time radacct import daemon
=head1 DESCRIPTION
-Imports records from an the SQL radacct tables of all sqlradius,
-sqlradius_withdomain and radiator exports (except those with the
-ignore_accounting flag) and updates the svc_acct.seconds for each account.
-Runs as a daemon and updates the database in real-time.
+Imports records from an the SQL radacct tables of all sqlradius and
+sqlradius_withdomain exports (except those with the ignore_accounting flag) and
+updates the svc_acct.seconds for each account. Runs as a daemon and updates
+the database in real-time.
B<username> is a username added by freeside-adduser.
@@ -140,7 +134,7 @@ ALTER TABLE radacct ADD COLUMN FreesideStatus varchar(32) NULL;
If you want to ignore the existing accountg records, also do:
-UPDATE radacct SET FreesideStatus = 'done' WHERE FreesideStatus IS NULL;
+UPDATE TABLE radacct SET FreesideStatus = 'done' WHERE FreesideStatus IS NULL;
=head1 SEE ALSO
diff --git a/FS/bin/freeside-sqlradius-reset b/FS/bin/freeside-sqlradius-reset
index 2ac5012d4..11cbe9e36 100755
--- a/FS/bin/freeside-sqlradius-reset
+++ b/FS/bin/freeside-sqlradius-reset
@@ -48,9 +48,6 @@ foreach my $export ( @exports ) {
foreach my $svc_acct ( @svc_acct ) {
- $svc_acct->check; #set any fixed usergroup so it'll export even if all
- #svc_acct records don't have the group yet
-
#false laziness with FS::svc_acct::insert (like it matters)
my $error = $export->export_insert($svc_acct);
die $error if $error;
diff --git a/FS/bin/freeside-upgrade b/FS/bin/freeside-upgrade
deleted file mode 100755
index 419384c2a..000000000
--- a/FS/bin/freeside-upgrade
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use vars qw($DEBUG $DRY_RUN);
-use Term::ReadKey;
-use DBIx::DBSchema 0.27;
-use FS::UID qw(adminsuidsetup checkeuid datasrc ); #getsecrets);
-use FS::Schema qw( dbdef dbdef_dist reload_dbdef );
-
-
-$DEBUG = 1;
-$DRY_RUN = 0;
-
-
-die "Not running uid freeside!" unless checkeuid();
-
-my $user = shift or die &usage;
-my $dbh = adminsuidsetup($user);
-
-#needs to match FS::Schema...
-my $dbdef_file = "/usr/local/etc/freeside/dbdef.". datasrc;
-
-dbdef_create($dbh, $dbdef_file);
-
-delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
-reload_dbdef($dbdef_file);
-
-
-foreach my $table ( dbdef_dist->tables ) {
-
- if ( dbdef->table($table) ) {
-
- warn "$table exists\n" if $DEBUG > 1;
-
- foreach my $column ( dbdef_dist->table($table)->columns ) {
- if ( dbdef->table($table)->column($column) ) {
- warn " $table.$column exists\n" if $DEBUG > 2;
- } else {
-
- if ( $DEBUG ) {
- print STDERR "column $table.$column does not exist. create?";
- next unless yesno();
- }
-
- foreach my $statement (
- dbdef_dist->table($table)->column($column)->sql_add_column( $dbh )
- ) {
- warn "$statement\n" if $DEBUG || $DRY_RUN;
- unless ( $DRY_RUN ) {
- $dbh->do( $statement)
- or die "CREATE error: ". $dbh->errstr. "\nexecuting: $statement";
- }
- }
-
- }
-
- }
-
- #should eventually check & create missing indices
-
- #should eventually drop columns not in dbdef_dist...
-
- } else {
-
- if ( $DEBUG ) {
- print STDERR "table $table does not exist. create?";
- next unless yesno();
- }
-
- foreach my $statement (
- dbdef_dist->table($table)->sql_create_table( $dbh )
- ) {
- warn "$statement\n" if $DEBUG || $DRY_RUN;
- unless ( $DRY_RUN ) {
- $dbh->do( $statement)
- or die "CREATE error: ". $dbh->errstr. "\nexecuting: $statement";
- }
- }
-
- }
-
-}
-
-# should eventually drop tables not in dbdef_dist too i guess...
-
-$dbh->commit or die $dbh->errstr;
-
-dbdef_create($dbh, $dbdef_file);
-
-$dbh->disconnect or die $dbh->errstr;
-
-###
-
-my $all = 0;
-sub yesno {
- print STDERR ' [yes/no/all] ';
- if ( $all ) {
- warn "yes\n";
- return 1;
- } else {
- while ( 1 ) {
- ReadMode 4;
- my $x = lc(ReadKey);
- ReadMode 0;
- if ( $x eq 'n' ) {
- warn "no\n";
- return 0;
- } elsif ( $x eq 'y' ) {
- warn "yes\n";
- return 1;
- } elsif ( $x eq 'a' ) {
- warn "yes\n";
- $all = 1;
- return 1;
- }
- }
- }
-}
-
-sub dbdef_create { # reverse engineer the schema from the DB and save to file
- my( $dbh, $file ) = @_;
- my $dbdef = new_native DBIx::DBSchema $dbh;
- $dbdef->save($file);
-}
-
-sub usage {
- die "Usage:\n freeside-upgrade user\n";
-}
-
-1;
-
diff --git a/FS/t/agent_payment_gateway.t b/FS/t/agent_payment_gateway.t
deleted file mode 100644
index af78a9a27..000000000
--- a/FS/t/agent_payment_gateway.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::agent_payment_gateway;
-$loaded=1;
-print "ok 1\n";
diff --git a/FS/t/banned_pay.t b/FS/t/banned_pay.t
deleted file mode 100644
index bef1ff25f..000000000
--- a/FS/t/banned_pay.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::banned_pay;
-$loaded=1;
-print "ok 1\n";
diff --git a/FS/t/cancel_reason.t b/FS/t/cancel_reason.t
deleted file mode 100644
index a5948f657..000000000
--- a/FS/t/cancel_reason.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::cancel_reason;
-$loaded=1;
-print "ok 1\n";
diff --git a/FS/t/cust_main_Mixin.t b/FS/t/cust_main_Mixin.t
deleted file mode 100644
index c8b929117..000000000
--- a/FS/t/cust_main_Mixin.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::cust_main_Mixin;
-$loaded=1;
-print "ok 1\n";
diff --git a/FS/t/option_Common.t b/FS/t/option_Common.t
deleted file mode 100644
index ad261415c..000000000
--- a/FS/t/option_Common.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::option_Common;
-$loaded=1;
-print "ok 1\n";
diff --git a/FS/t/part_export-radiator.t b/FS/t/part_export-radiator.t
deleted file mode 100644
index 546e9de30..000000000
--- a/FS/t/part_export-radiator.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::part_export::radiator;
-$loaded=1;
-print "ok 1\n";
diff --git a/FS/t/payment_gateway.t b/FS/t/payment_gateway.t
deleted file mode 100644
index 4bcc78153..000000000
--- a/FS/t/payment_gateway.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::payment_gateway;
-$loaded=1;
-print "ok 1\n";
diff --git a/FS/t/payment_gateway_option.t b/FS/t/payment_gateway_option.t
deleted file mode 100644
index 19e645121..000000000
--- a/FS/t/payment_gateway_option.t
+++ /dev/null
@@ -1,5 +0,0 @@
-BEGIN { $| = 1; print "1..1\n" }
-END {print "not ok 1\n" unless $loaded;}
-use FS::payment_gateway_option;
-$loaded=1;
-print "ok 1\n";