summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/Conf.pm6
-rw-r--r--FS/FS/Schema.pm9
-rw-r--r--FS/FS/cust_class.pm15
-rw-r--r--FS/FS/cust_main/Billing.pm8
4 files changed, 32 insertions, 6 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index edfe3c27a..81443632c 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -4909,6 +4909,12 @@ and customer address. Include units.',
'type' => 'select-agent',
},
+ {
+ 'key' => 'cust_class-tax_exempt',
+ 'section' => 'billing',
+ 'description' => 'Control the tax exemption flag per customer class rather than per indivual customer.',
+ 'type' => 'checkbox',
+ },
{ key => "apacheroot", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
{ key => "apachemachine", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 5b8525c04..3894f65f8 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -1130,10 +1130,11 @@ sub tables_hashref {
'cust_class' => {
'columns' => [
- 'classnum', 'serial', '', '', '', '',
- 'classname', 'varchar', '', $char_d, '', '',
- 'categorynum', 'int', 'NULL', '', '', '',
- 'disabled', 'char', 'NULL', 1, '', '',
+ 'classnum', 'serial', '', '', '', '',
+ 'classname', 'varchar', '', $char_d, '', '',
+ 'categorynum', 'int', 'NULL', '', '', '',
+ 'tax', 'char', 'NULL', 1, '', '',
+ 'disabled', 'char', 'NULL', 1, '', '',
],
'primary_key' => 'classnum',
'unique' => [],
diff --git a/FS/FS/cust_class.pm b/FS/FS/cust_class.pm
index a811be7a7..7cbc9b818 100644
--- a/FS/FS/cust_class.pm
+++ b/FS/FS/cust_class.pm
@@ -44,6 +44,11 @@ Text name of this customer class
Number of associated cust_category (see L<FS::cust_category>)
+=item tax
+
+Tax exempt flag, empty or 'Y'. Used when the cust_class-tax_exempt
+configuration setting is turned on.
+
=item disabled
Disabled flag, empty or 'Y'
@@ -86,6 +91,16 @@ Checks all fields to make sure this is a valid customer class. If there is
an error, returns the error, otherwise returns false. Called by the insert
and replace methods.
+=cut
+
+sub check {
+ my $self = shift;
+
+ $self->ut_enum('tax', [ '', 'Y' ])
+ || $self->SUPER::check;
+
+}
+
=item cust_category
=item category
diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm
index 0a557fca2..ca8d9960c 100644
--- a/FS/FS/cust_main/Billing.pm
+++ b/FS/FS/cust_main/Billing.pm
@@ -877,7 +877,7 @@ sub _make_lines {
my $part_pkg = $params{part_pkg} or die "no part_pkg specified";
my $cust_pkg = $params{cust_pkg} or die "no cust_pkg specified";
- my $precommit_hooks = $params{precommit_hooks} or die "no package specified";
+ my $precommit_hooks = $params{precommit_hooks} or die "no precommit_hooks specified";
my $cust_bill_pkgs = $params{line_items} or die "no line buffer specified";
my $total_setup = $params{setup} or die "no setup accumulator specified";
my $total_recur = $params{recur} or die "no recur accumulator specified";
@@ -1178,7 +1178,11 @@ sub _handle_taxes {
push @classes, 'setup' if ($cust_bill_pkg->setup && !$options->{cancel});
push @classes, 'recur' if ($cust_bill_pkg->recur && !$options->{cancel});
- if ( $self->tax !~ /Y/i && $self->payby ne 'COMP' ) {
+ my $exempt = $conf->exists('cust_class-tax_exempt')
+ ? ( $self->cust_class ? $self->cust_class->tax : '' )
+ : $self->tax;
+
+ if ( $exempt !~ /Y/i && $self->payby ne 'COMP' ) {
if ( $conf->exists('enable_taxproducts')
&& ( scalar($part_pkg->part_pkg_taxoverride)