summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/Conf.pm8
-rw-r--r--FS/FS/Misc.pm44
-rw-r--r--FS/FS/Schema.pm3
-rw-r--r--FS/FS/Template_Mixin.pm5
-rw-r--r--FS/FS/cust_bill.pm10
-rw-r--r--FS/FS/cust_main/Billing_Realtime.pm4
-rw-r--r--FS/FS/cust_pkg.pm18
-rw-r--r--FS/FS/cust_pkg/Import.pm1
-rw-r--r--FS/FS/msg_template/email.pm5
-rw-r--r--FS/FS/part_export/saisei.pm79
-rw-r--r--FS/FS/part_svc.pm4
-rw-r--r--FS/FS/part_svc_column.pm2
-rwxr-xr-xFS/FS/svc_broadband.pm17
13 files changed, 171 insertions, 29 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index bd544c944..302bae72c 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -789,6 +789,14 @@ my $validate_email = sub { $_[0] =~
},
{
+ 'key' => 'credit-card-surcharge-text',
+ 'section' => 'credit_cards',
+ 'description' => 'Text for the credit card surcharge invoice line. If not set, it will default to Credit Card Surcharge.',
+ 'type' => 'text',
+ 'per_agent' => 1,
+ },
+
+ {
'key' => 'discount-show-always',
'section' => 'invoicing',
'description' => 'Generate a line item on an invoice even when a package is discounted 100%',
diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm
index d84aaced5..fd2c32513 100644
--- a/FS/FS/Misc.pm
+++ b/FS/FS/Misc.pm
@@ -1,7 +1,7 @@
package FS::Misc;
use strict;
-use vars qw ( @ISA @EXPORT_OK $DEBUG );
+use vars qw ( @ISA @EXPORT_OK $DEBUG $DISABLE_ALL_NOTICES );
use Exporter;
use Carp;
use Data::Dumper;
@@ -43,6 +43,32 @@ Miscellaneous subroutines. This module contains miscellaneous subroutines
called from multiple other modules. These are not OO or necessarily related,
but are collected here to eliminate code duplication.
+=head1 DISABLE ALL NOTICES
+
+Set $FS::Misc::DISABLE_ALL_NOTICES to suppress:
+
+=over 4
+
+=item FS::cust_bill::send_csv
+
+=item FS::cust_bill::spool_csv
+
+=item FS::msg_template::email::send_prepared
+
+=item FS::Misc::send_email
+
+=item FS::Misc::do_print
+
+=item FS::Misc::send_fax
+
+=item FS::Template_Mixin::postal_mail_fsinc
+
+=back
+
+=cut
+
+$DISABLE_ALL_NOTICES = 0;
+
=head1 SUBROUTINES
=over 4
@@ -118,6 +144,12 @@ FS::UID->install_callback( sub {
sub send_email {
my(%options) = @_;
+
+ if ( $DISABLE_ALL_NOTICES ) {
+ warn 'send_email() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+ return;
+ }
+
if ( $DEBUG ) {
my %doptions = %options;
$doptions{'body'} = '(full body not shown in debug)';
@@ -450,6 +482,11 @@ sub send_fax {
die 'HylaFAX support has not been configured.'
unless $conf->exists('hylafax');
+ if ( $DISABLE_ALL_NOTICES ) {
+ warn 'send_fax() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+ return;
+ }
+
eval {
require Fax::Hylafax::Client;
};
@@ -869,6 +906,11 @@ global value and agentnum).
sub do_print {
my( $data, %opt ) = @_;
+ if ( $DISABLE_ALL_NOTICES ) {
+ warn 'do_print() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+ return;
+ }
+
my $lpr = ( exists($opt{'lpr'}) && $opt{'lpr'} )
? $opt{'lpr'}
: $conf->config('lpr', $opt{'agentnum'} );
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index d47046ff2..59a18c506 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -4891,6 +4891,9 @@ sub tables_hashref {
'suid', 'int', 'NULL', '', '', '',
'shared_svcnum', 'int', 'NULL', '', '', '',
'serviceid', 'varchar', 'NULL', 64, '', '',#srvexport/reportfields
+ 'speed_test_up', 'int', 'NULL', '', '', '',
+ 'speed_test_down', 'int', 'NULL', '', '', '',
+ 'speed_test_latency', 'int', 'NULL', '', '', '',
],
'primary_key' => 'svcnum',
'unique' => [ [ 'ip_addr' ], [ 'mac_addr' ] ],
diff --git a/FS/FS/Template_Mixin.pm b/FS/FS/Template_Mixin.pm
index 1b3df0066..34e9e6ef8 100644
--- a/FS/FS/Template_Mixin.pm
+++ b/FS/FS/Template_Mixin.pm
@@ -2513,6 +2513,11 @@ use MIME::Base64;
sub postal_mail_fsinc {
my ( $self, %opt ) = @_;
+ if ( $FS::Misc::DISABLE_PRINT ) {
+ warn 'postal_mail_fsinc() disabled by $FS::Misc::DISABLE_PRINT' if $DEBUG;
+ return;
+ }
+
my $url = 'https://ws.freeside.biz/print';
my $cust_main = $self->cust_main;
diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm
index 0a735f7ec..47f71c458 100644
--- a/FS/FS/cust_bill.pm
+++ b/FS/FS/cust_bill.pm
@@ -1405,6 +1405,11 @@ See L</print_csv> for a description of the output format.
sub send_csv {
my($self, %opt) = @_;
+ if ( $FS::Misc::DISABLE_ALL_NOTICES ) {
+ warn 'send_csv() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+ return;
+ }
+
#create file(s)
my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/cust_bill";
@@ -1481,6 +1486,11 @@ in the ICS format.
sub spool_csv {
my($self, %opt) = @_;
+ if ( $FS::Misc::DISABLE_ALL_NOTICES ) {
+ warn 'spool_csv() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+ return;
+ }
+
my $time = $opt{'time'} || time;
my $cust_main = $self->cust_main;
diff --git a/FS/FS/cust_main/Billing_Realtime.pm b/FS/FS/cust_main/Billing_Realtime.pm
index f4d87ddd1..d286f635e 100644
--- a/FS/FS/cust_main/Billing_Realtime.pm
+++ b/FS/FS/cust_main/Billing_Realtime.pm
@@ -1078,9 +1078,11 @@ sub _realtime_bop_result {
}
my $cust_pkg;
+ my $cc_surcharge_text = 'Credit Card Surcharge';
+ $cc_surcharge_text = $conf->config('credit-card-surcharge-text', $self->agentnum) if $conf->exists('credit-card-surcharge-text', $self->agentnum);
my $charge_error = $self->charge({
'amount' => $options{'cc_surcharge'},
- 'pkg' => 'Credit Card Surcharge',
+ 'pkg' => $cc_surcharge_text,
'setuptax' => 'Y',
'cust_pkg_ref' => \$cust_pkg,
});
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index d00f0397b..f29ab9fc0 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -5463,6 +5463,24 @@ sub fcc_477_count {
}
+=item fcc_477_record
+
+Returns a fcc_477 record based on option name.
+
+=cut
+
+sub fcc_477_record {
+ my ($self, $option_name) = @_;
+
+ my $fcc_record = qsearchs({
+ 'table' => 'part_pkg_fcc_option',
+ 'hashref' => { 'pkgpart' => $self->{Hash}->{pkgpart}, 'fccoptionname' => $option_name, },
+ });
+
+ return ( $fcc_record );
+
+}
+
=item tax_locationnum_sql
Returns an SQL expression for the tax location for a package, based
diff --git a/FS/FS/cust_pkg/Import.pm b/FS/FS/cust_pkg/Import.pm
index 93bd88d7b..2b1832329 100644
--- a/FS/FS/cust_pkg/Import.pm
+++ b/FS/FS/cust_pkg/Import.pm
@@ -102,6 +102,7 @@ my %formatfields = (
'default' => [],
'all_dates' => [],
'svc_acct' => [qw( username _password domsvc )],
+ 'svc_broadband' => [qw( ip_addr description routernum blocknum sectornum speed_up speed_down )],
'svc_phone' => [qw( countrycode phonenum sip_password pin )],
'svc_external' => [qw( id title )],
'location' => [qw( address1 address2 city state zip country )],
diff --git a/FS/FS/msg_template/email.pm b/FS/FS/msg_template/email.pm
index 37c1fab46..c2c370760 100644
--- a/FS/FS/msg_template/email.pm
+++ b/FS/FS/msg_template/email.pm
@@ -529,6 +529,11 @@ sub send_prepared {
my $self = shift;
my $cust_msg = shift or die "cust_msg required";
+ if ( $FS::Misc::DISABLE_ALL_NOTICES ) {
+ warn 'send_prepared() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+ return;
+ }
+
my $domain = 'example.com';
if ( $cust_msg->env_from =~ /\@([\w\.\-]+)/ ) {
$domain = $1;
diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index 2fc112744..c79f79dac 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -128,9 +128,7 @@ END
sub _export_insert {
my ($self, $svc_broadband) = @_;
- my $service_part = FS::Record::qsearchs( 'part_svc', { 'svcpart' => $svc_broadband->{Hash}->{svcpart} } );
- my $rateplan_name = $service_part->{Hash}->{svc};
- $rateplan_name =~ s/\s/_/g;
+ my $rateplan_name = $self->get_rateplan_name($svc_broadband);
# check for existing rate plan
my $existing_rateplan;
@@ -217,15 +215,15 @@ sub _export_insert {
sub _export_replace {
my ($self, $svc_broadband) = @_;
+ $self->_export_insert($svc_broadband);
return '';
}
sub _export_delete {
my ($self, $svc_broadband) = @_;
- my $service_part = FS::Record::qsearchs( 'part_svc', { 'svcpart' => $svc_broadband->{Hash}->{svcpart} } );
- my $rateplan_name = $service_part->{Hash}->{svc};
- $rateplan_name =~ s/\s/_/g;
+ my $rateplan_name = $self->get_rateplan_name($svc_broadband);
+
my $username = $svc_broadband->{Hash}->{svcnum};
## untie host to user
@@ -247,25 +245,49 @@ sub _export_unsuspend {
sub export_partsvc {
my ($self, $svc_part) = @_;
- my $rateplan_name = $svc_part->{Hash}->{svc};
- $rateplan_name =~ s/\s/_/g;
- my $speeddown = $svc_part->{Hash}->{svc_broadband__speed_down};
- my $speedup = $svc_part->{Hash}->{svc_broadband__speed_up};
+ my $fcc_477_speeds;
+ if ($svc_part->{Hash}->{svc_broadband__speed_down} eq "down" || $svc_part->{Hash}->{svc_broadband__speed_up} eq "up") {
+ for my $type (qw( down up )) {
+ my $speed_type = "broadband_".$type."stream";
+ foreach my $pkg_svc (FS::Record::qsearch({
+ 'table' => 'pkg_svc',
+ 'select' => 'pkg_svc.*, part_pkg_fcc_option.fccoptionname, part_pkg_fcc_option.optionvalue',
+ 'addl_from' => ' LEFT JOIN part_pkg_fcc_option USING (pkgpart) ',
+ 'extra_sql' => " WHERE pkg_svc.svcpart = ".$svc_part->{Hash}->{svcpart}." AND pkg_svc.quantity > 0 AND part_pkg_fcc_option.fccoptionname = '".$speed_type."'",
+ })) { $fcc_477_speeds->{
+ $pkg_svc->{Hash}->{pkgpart}}->{$speed_type} = $pkg_svc->{Hash}->{optionvalue} * 1000 unless !$pkg_svc->{Hash}->{optionvalue}; }
+ }
+ }
+ else {
+ $fcc_477_speeds->{1}->{broadband_downstream} = $svc_part->{Hash}->{"svc_broadband__speed_down"};
+ $fcc_477_speeds->{1}->{broadband_upstream} = $svc_part->{Hash}->{"svc_broadband__speed_up"};
+ }
- my $temp_svc = $svc_part->{Hash};
- my $svc_broadband = {};
- map { if ($_ =~ /^svc_broadband__(.*)$/) { $svc_broadband->{Hash}->{$1} = $temp_svc->{$_}; } } keys %$temp_svc;
+ foreach my $key (keys %$fcc_477_speeds) {
- # check for existing rate plan
- my $existing_rateplan;
- $existing_rateplan = $self->api_get_rateplan($rateplan_name) unless $self->{'__saisei_error'};
+ $svc_part->{Hash}->{speed_down} = $fcc_477_speeds->{$key}->{broadband_downstream};
+ $svc_part->{Hash}->{speed_up} = $fcc_477_speeds->{$key}->{broadband_upstream};
+ $svc_part->{Hash}->{svc_broadband__speed_down} = $fcc_477_speeds->{$key}->{broadband_downstream};
+ $svc_part->{Hash}->{svc_broadband__speed_up} = $fcc_477_speeds->{$key}->{broadband_upstream};
- # Modify the existing rate plan with new service data.
- $self->api_modify_existing_rateplan($svc_broadband, $rateplan_name) unless ($self->{'__saisei_error'} || !$existing_rateplan);
+ my $temp_svc = $svc_part->{Hash};
+ my $svc_broadband = {};
+ map { if ($_ =~ /^svc_broadband__(.*)$/) { $svc_broadband->{Hash}->{$1} = $temp_svc->{$_}; } } keys %$temp_svc;
- # if no existing rate plan create one and modify it.
- $self->api_create_rateplan($svc_broadband, $rateplan_name) unless $existing_rateplan;
- $self->api_modify_rateplan($svc_part, $rateplan_name) unless ($self->{'__saisei_error'} || $existing_rateplan);
+ my $rateplan_name = $self->get_rateplan_name($svc_broadband, $svc_part->{Hash}->{svc});
+
+ # check for existing rate plan
+ my $existing_rateplan;
+ $existing_rateplan = $self->api_get_rateplan($rateplan_name) unless $self->{'__saisei_error'};
+
+ # Modify the existing rate plan with new service data.
+ $self->api_modify_existing_rateplan($svc_broadband, $rateplan_name) unless ($self->{'__saisei_error'} || !$existing_rateplan);
+
+ # if no existing rate plan create one and modify it.
+ $self->api_create_rateplan($svc_broadband, $rateplan_name) unless $existing_rateplan;
+ $self->api_modify_rateplan($svc_part, $rateplan_name) unless ($self->{'__saisei_error'} || $existing_rateplan);
+
+ }
return $self->api_error;
@@ -310,6 +332,19 @@ sub export_tower_sector {
return $self->api_error;
}
+## creates the rateplan name
+sub get_rateplan_name {
+ my ($self, $svc_broadband, $svc_name) = @_;
+
+ my $service_part = FS::Record::qsearchs( 'part_svc', { 'svcpart' => $svc_broadband->{Hash}->{svcpart} } ) unless $svc_name;
+ my $service_name = $svc_name ? $svc_name : $service_part->{Hash}->{svc};
+
+ my $rateplan_name = $service_name . " " . $svc_broadband->{Hash}->{speed_down} . "-" . $svc_broadband->{Hash}->{speed_up};
+ $rateplan_name =~ s/\s/_/g;
+
+ return $rateplan_name;
+}
+
=head1 Saisei API
These methods allow access to the Saisei API using the credentials
@@ -795,7 +830,7 @@ sub export_provisioned_services {
my $svc_count = scalar @svcs;
my %status = {};
- for (my $c=10; $c <=100; $c=$c+10) { $status{int($svc_count * ($c/100))} = $c; }
+ for (my $c=1; $c <=100; $c=$c+1) { $status{int($svc_count * ($c/100))} = $c; }
my $process_count=0;
foreach my $svc (@svcs) {
diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm
index 341559594..b82996e0d 100644
--- a/FS/FS/part_svc.pm
+++ b/FS/FS/part_svc.pm
@@ -873,10 +873,10 @@ sub process {
map {
my $f = $svcdb.'__'.$_;
my $flag = $param->{ $f.'_flag' } || ''; #silence warnings
- if ( $flag =~ /^[MAH]$/ ) {
+ if ( $flag =~ /^[MAHP]$/ ) {
$param->{ $f } = delete( $param->{ $f.'_classnum' } );
}
- if ( ( $flag =~ /^[MAHS]$/ or $_ eq 'usergroup' )
+ if ( ( $flag =~ /^[MAHSP]$/ or $_ eq 'usergroup' )
and ref($param->{ $f }) ) {
$param->{ $f } = join(',', @{ $param->{ $f } });
}
diff --git a/FS/FS/part_svc_column.pm b/FS/FS/part_svc_column.pm
index 75a2dfb1a..e055af35a 100644
--- a/FS/FS/part_svc_column.pm
+++ b/FS/FS/part_svc_column.pm
@@ -97,7 +97,7 @@ sub check {
;
return $error if $error;
- $self->columnflag =~ /^([DFSMAHX]?)$/
+ $self->columnflag =~ /^([DFSMAHXP]?)$/
or return "illegal columnflag ". $self->columnflag;
$self->columnflag(uc($1));
diff --git a/FS/FS/svc_broadband.pm b/FS/FS/svc_broadband.pm
index b8b1a6eab..02136c594 100755
--- a/FS/FS/svc_broadband.pm
+++ b/FS/FS/svc_broadband.pm
@@ -107,8 +107,16 @@ sub table_info {
'fields' => {
'svcnum' => 'Service',
'description' => 'Descriptive label',
- 'speed_down' => 'Download speed (Kbps)',
- 'speed_up' => 'Upload speed (Kbps)',
+ 'speed_up' => {
+ 'label' => 'Upload speed (Kbps)',
+ 'type' => 'fcc_477_speed',
+ 'def_info' => 'both upload and download speed must be set to FCC 477 information if using that modifier',
+ },
+ 'speed_down' => {
+ 'label' => 'Download speed (Kbps)',
+ 'type' => 'fcc_477_speed',
+ 'def_info' => 'both upload and download speed must be set to FCC 477 information if using that modifier',
+ },
'ip_addr' => 'IP address',
'blocknum' => {
'label' => 'Address block',
@@ -148,6 +156,9 @@ sub table_info {
disable_inventory => 1,
},
'serviceid' => 'Torrus serviceid', #but is should be hidden
+ 'speed_test_up' => { 'label' => 'Speed test upload (Kbps)' },
+ 'speed_test_down' => { 'label' => 'Speed test download (Kbps)' },
+ 'speed_test_latency' => 'Speed test latency (ms)',
},
};
}
@@ -353,6 +364,8 @@ sub check {
|| $self->ut_textn('description')
|| $self->ut_numbern('speed_up')
|| $self->ut_numbern('speed_down')
+ || $self->ut_numbern('speed_test_up')
+ || $self->ut_numbern('speed_test_down')
|| $self->ut_ipn('ip_addr')
|| $self->ut_hexn('mac_addr')
|| $self->ut_hexn('auth_key')