summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2012-05-08 15:34:25 -0700
committerIvan Kohler <ivan@freeside.biz>2012-05-08 15:34:25 -0700
commita68564e6856a7ea63763eeaf7962a5cb2df649af (patch)
tree45022b1dc0208ac6c3fdc5f413e25598c815dab7 /FS/FS
parent52cf6949df47667d9864f5807549aa68789ef2fa (diff)
separate tax exemption numbers for individual exemptions w/tax-cust_exempt-groups, RT#17658
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/Conf.pm7
-rw-r--r--FS/FS/Schema.pm7
-rw-r--r--FS/FS/cust_main.pm39
-rw-r--r--FS/FS/cust_main_exemption.pm10
4 files changed, 49 insertions, 14 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 85e6186..a1fda68 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -4620,6 +4620,13 @@ and customer address. Include units.',
},
{
+ 'key' => 'tax-cust_exempt-groups-require_individual_nums',
+ 'section' => '',
+ 'description' => 'When using tax-cust_exempt-groups, require an individual tax exemption number for each exemption from different taxes.',
+ 'type' => 'checkbox',
+ },
+
+ {
'key' => 'cust_main-default_view',
'section' => 'UI',
'description' => 'Default customer view, for users who have not selected a default view in their preferences.',
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 086f86e..84ab528 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -1180,9 +1180,10 @@ sub tables_hashref {
'cust_main_exemption' => {
'columns' => [
- 'exemptionnum', 'serial', '', '', '', '',
- 'custnum', 'int', '', '', '', '',
- 'taxname', 'varchar', '', $char_d, '', '',
+ 'exemptionnum', 'serial', '', '', '', '',
+ 'custnum', 'int', '', '', '', '',
+ 'taxname', 'varchar', '', $char_d, '', '',
+ 'exempt_number', 'varchar', 'NULL', $char_d, '', '',
#start/end dates? for reporting?
],
'primary_key' => 'exemptionnum',
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index 49b76ce..6f4a4d7 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -399,8 +399,9 @@ The I<noexport> option is deprecated. If I<noexport> is set true, no
provisioning jobs (exports) are scheduled. (You can schedule them later with
the B<reexport> method.)
-The I<tax_exemption> option can be set to an arrayref of tax names.
-FS::cust_main_exemption records will be created and inserted.
+The I<tax_exemption> option can be set to an arrayref of tax names or a hashref
+of tax names and exemption numbers. FS::cust_main_exemption records will be
+created and inserted.
If I<prospectnum> is set, moves contacts and locations from that prospect.
@@ -545,10 +546,15 @@ sub insert {
my $tax_exemption = delete $options{'tax_exemption'};
if ( $tax_exemption ) {
- foreach my $taxname ( @$tax_exemption ) {
+
+ $tax_exemption = { map { $_ => '' } @$tax_exemption }
+ if ref($tax_exemption) eq 'ARRAY';
+
+ foreach my $taxname ( keys %$tax_exemption ) {
my $cust_main_exemption = new FS::cust_main_exemption {
- 'custnum' => $self->custnum,
- 'taxname' => $taxname,
+ 'custnum' => $self->custnum,
+ 'taxname' => $taxname,
+ 'exempt_number' => $tax_exemption->{$taxname},
};
my $error = $cust_main_exemption->insert;
if ( $error ) {
@@ -1461,8 +1467,9 @@ check_invoicing_list first. Here's an example:
Currently available options are: I<tax_exemption>.
-The I<tax_exemption> option can be set to an arrayref of tax names.
-FS::cust_main_exemption records will be deleted and inserted as appropriate.
+The I<tax_exemption> option can be set to an arrayref of tax names or a hashref
+of tax names and exemption numbers. FS::cust_main_exemption records will be
+deleted and inserted as appropriate.
=cut
@@ -1598,17 +1605,27 @@ sub replace {
my $tax_exemption = delete $options{'tax_exemption'};
if ( $tax_exemption ) {
+ $tax_exemption = { map { $_ => '' } @$tax_exemption }
+ if ref($tax_exemption) eq 'ARRAY';
+
my %cust_main_exemption =
map { $_->taxname => $_ }
qsearch('cust_main_exemption', { 'custnum' => $old->custnum } );
- foreach my $taxname ( @$tax_exemption ) {
+ foreach my $taxname ( keys %$tax_exemption ) {
- next if delete $cust_main_exemption{$taxname};
+ if ( $cust_main_exemption{$taxname} &&
+ $cust_main_exemption{$taxname}->exempt_number eq $tax_exemption->{$taxname}
+ )
+ {
+ delete $cust_main_exemption{$taxname};
+ next;
+ }
my $cust_main_exemption = new FS::cust_main_exemption {
- 'custnum' => $self->custnum,
- 'taxname' => $taxname,
+ 'custnum' => $self->custnum,
+ 'taxname' => $taxname,
+ 'exempt_number' => $tax_exemption->{$taxname},
};
my $error = $cust_main_exemption->insert;
if ( $error ) {
diff --git a/FS/FS/cust_main_exemption.pm b/FS/FS/cust_main_exemption.pm
index 06d22b7..c6f3d5e 100644
--- a/FS/FS/cust_main_exemption.pm
+++ b/FS/FS/cust_main_exemption.pm
@@ -3,6 +3,7 @@ package FS::cust_main_exemption;
use strict;
use base qw( FS::Record );
use FS::Record qw( qsearch qsearchs );
+use FS::Conf;
use FS::cust_main;
=head1 NAME
@@ -44,6 +45,9 @@ Customer (see L<FS::cust_main>)
taxname
+=item exempt_number
+
+Exemption number
=back
@@ -108,9 +112,15 @@ sub check {
$self->ut_numbern('exemptionnum')
|| $self->ut_foreign_key('custnum', 'cust_main', 'custnum')
|| $self->ut_text('taxname')
+ || $self->ut_textn('exempt_number')
;
return $error if $error;
+ my $conf = new FS::Conf;
+ if ( ! $self->exempt_number && $conf->exists('tax-cust_exempt-groups-require_individual_nums') ) {
+ return 'Tax exemption number required for '. $self->taxname. ' exemption';
+ }
+
$self->SUPER::check;
}