summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/Mason.pm3
-rw-r--r--FS/FS/Report/Tax/All.pm110
-rw-r--r--FS/FS/Report/Tax/ByName.pm (renamed from FS/FS/Report/Tax.pm)21
-rw-r--r--FS/MANIFEST2
4 files changed, 126 insertions, 10 deletions
diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm
index aa9d3bebf..7b4db9932 100644
--- a/FS/FS/Mason.pm
+++ b/FS/FS/Mason.pm
@@ -146,7 +146,8 @@ if ( -e $addl_handler_use_file ) {
use FS::Report::Table;
use FS::Report::Table::Monthly;
use FS::Report::Table::Daily;
- use FS::Report::Tax;
+ use FS::Report::Tax::ByName;
+ use FS::Report::Tax::All;
use FS::TicketSystem;
use FS::NetworkMonitoringSystem;
use FS::Tron qw( tron_lint );
diff --git a/FS/FS/Report/Tax/All.pm b/FS/FS/Report/Tax/All.pm
new file mode 100644
index 000000000..26dbf5f0f
--- /dev/null
+++ b/FS/FS/Report/Tax/All.pm
@@ -0,0 +1,110 @@
+package FS::Report::Tax::All;
+
+use strict;
+use vars qw($DEBUG);
+use FS::Record qw(dbh qsearch qsearchs group_concat_sql);
+use FS::Report::Tax::ByName;
+use Date::Format qw( time2str );
+
+use Data::Dumper;
+
+$DEBUG = 0;
+
+=item report OPTIONS
+
+Constructor. Generates a tax report using the internal tax rate system,
+showing all taxes, broken down by tax name and country.
+
+Required parameters:
+- beginning, ending: the date range as Unix timestamps.
+
+Optional parameters:
+- debug: sets the debug level. 1 will warn the data collected for the report;
+2 will also warn all of the SQL statements.
+
+=cut
+
+# because there's not yet a "DBIx::DBSchema::View"...
+
+sub report {
+ my $class = shift;
+ my %opt = @_;
+
+ $DEBUG ||= $opt{debug};
+
+ my($beginning, $ending) = @opt{'beginning', 'ending'};
+
+ # figure out which reports we need to run
+ my @taxname_and_country = qsearch({
+ table => 'cust_main_county',
+ select => 'country, taxname',
+ hashref => {
+ tax => { op => '>', value => '0' }
+ },
+ order_by => 'GROUP BY country, taxname ORDER BY country, taxname',
+ });
+ my @table;
+ foreach (@taxname_and_country) {
+ my $taxname = $_->taxname || 'Tax';
+ my $country = $_->country;
+ my $report = FS::Report::Tax::ByName->report(
+ %opt,
+ taxname => $taxname,
+ country => $country,
+ total_only => 1,
+ );
+ # will have only one total row (should be only one row at all)
+ my ($total_row) = grep { $_->{total} } $report->table;
+ $total_row->{total} = 0; # but in this context it's a detail row
+ $total_row->{taxname} = $taxname;
+ $total_row->{country} = $country;
+ $total_row->{label} = "$country - $taxname";
+ push @table, $total_row;
+ }
+ my $self = bless {
+ 'opt' => \%opt,
+ 'table' => \@table,
+ }, $class;
+
+ $self;
+}
+
+sub opt {
+ my $self = shift;
+ $self->{opt};
+}
+
+sub data {
+ my $self = shift;
+ $self->{data};
+}
+
+# sub fetchall_array...
+
+sub table {
+ my $self = shift;
+ @{ $self->{table} };
+}
+
+sub title {
+ my $self = shift;
+ my $string = '';
+ if ( $self->{opt}->{agentnum} ) {
+ my $agent = qsearchs('agent', { agentnum => $self->{opt}->{agentnum} });
+ $string .= $agent->agent . ' ';
+ }
+ $string .= 'Tax Report: '; # XXX localization
+ if ( $self->{opt}->{beginning} ) {
+ $string .= time2str('%h %o %Y ', $self->{opt}->{beginning});
+ }
+ $string .= 'through ';
+ if ( $self->{opt}->{ending} and $self->{opt}->{ending} < 4294967295 ) {
+ $string .= time2str('%h %o %Y', $self->{opt}->{ending});
+ } else {
+ $string .= 'now';
+ }
+ $string .= ' - all taxes';
+ return $string;
+}
+
+1;
diff --git a/FS/FS/Report/Tax.pm b/FS/FS/Report/Tax/ByName.pm
index f1f6be38e..88695b909 100644
--- a/FS/FS/Report/Tax.pm
+++ b/FS/FS/Report/Tax/ByName.pm
@@ -1,4 +1,4 @@
-package FS::Report::Tax;
+package FS::Report::Tax::ByName;
use strict;
use vars qw($DEBUG);
@@ -9,10 +9,12 @@ use Data::Dumper;
$DEBUG = 0;
-=item report_internal OPTIONS
+=item report OPTIONS
Constructor. Generates a tax report using the internal tax rate system
-(L<FS::cust_main_county>).
+(L<FS::cust_main_county>), showing all taxes with a specified tax name,
+broken down by state/county. Optionally, the taxes can be broken down further
+by city/district, tax class, or package class.
Required parameters:
@@ -22,21 +24,22 @@ Required parameters:
Optional parameters:
- agentnum: limit to this agentnum.num.
-- breakdown: hashref of the fields to group by. Keys can be 'city', 'district',
- 'pkgclass', or 'taxclass'; values should be true.
+- breakdown: hashref of the fields to group by. Keys can be 'city',
+'district', 'pkgclass', or 'taxclass'; values should be true.
+- total_only: don't run the tax group queries, only the totals queries.
+Returns one row, except in the unlikely event you're using breakdown by
+package class.
- debug: sets the debug level. 1 will warn the data collected for the report;
- 2 will also warn all of the SQL statements.
+2 will also warn all of the SQL statements.
=cut
-sub report_internal {
+sub report {
my $class = shift;
my %opt = @_;
$DEBUG ||= $opt{debug};
- my $conf = new FS::Conf;
-
my($beginning, $ending) = @opt{'beginning', 'ending'};
my ($taxname, $country, %breakdown);
diff --git a/FS/MANIFEST b/FS/MANIFEST
index d0bf99b85..83359f118 100644
--- a/FS/MANIFEST
+++ b/FS/MANIFEST
@@ -56,6 +56,8 @@ FS/Report.pm
FS/Report/FCC_477.pm
FS/Report/Table.pm
FS/Report/Table/Monthly.pm
+FS/Report/Tax/All.pm
+FS/Report/Tax/ByName.pm
FS/SearchCache.pm
FS/UI/Web.pm
FS/UID.pm