summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/Conf.pm10
-rw-r--r--FS/FS/Template_Mixin.pm67
2 files changed, 73 insertions, 4 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 82bd2e30d..d02a02608 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -1713,6 +1713,15 @@ and customer address. Include units.',
'per_agent' => 1,
},
+ {
+ 'key' => 'invoice_sections_multilocation',
+ 'section' => 'invoicing',
+ 'description' => 'Enable invoice_sections for for any bill with at least this many locations on the bill.',
+ 'type' => 'text',
+ 'per_agent' => 1,
+ 'validate' => sub { shift =~ /^\d+$/ ? undef : 'Please enter a number' },
+ },
+
{
'key' => 'invoice_include_aging',
'section' => 'invoicing',
@@ -6323,4 +6332,3 @@ and customer address. Include units.',
);
1;
-
diff --git a/FS/FS/Template_Mixin.pm b/FS/FS/Template_Mixin.pm
index c97e84e83..ea753b7ab 100644
--- a/FS/FS/Template_Mixin.pm
+++ b/FS/FS/Template_Mixin.pm
@@ -19,7 +19,7 @@ use HTML::Entities;
use Cwd;
use FS::UID;
use FS::Misc qw( send_email );
-use FS::Record qw( qsearch qsearchs );
+use FS::Record qw( qsearch qsearchs dbh );
use FS::Conf;
use FS::Misc qw( generate_ps generate_pdf );
use FS::pkg_category;
@@ -936,8 +936,7 @@ sub print_generic {
if $DEBUG > 1;
my $unsquelched = $params{unsquelch_cdr} || $cust_main->squelch_cdr ne 'Y';
- my $multisection = $conf->exists($tc.'sections', $cust_main->agentnum) ||
- $conf->exists($tc.'sections_by_location', $cust_main->agentnum);
+ my $multisection = $self->has_sections;
$invoice_data{'multisection'} = $multisection;
my $late_sections;
my $extra_sections = [];
@@ -3794,4 +3793,66 @@ sub _items_discounts_avail {
}
+=item has_sections AGENTNUM
+
+Return true if invoice_sections should be enabled for this bill.
+ (Inherited by both cust_bill and cust_bill_void)
+
+Determination:
+* False if not an invoice
+* True always if conf invoice_sections is enabled
+* True always if sections_by_location is enabled
+* True if conf invoice_sections_multilocation > 1,
+ and location_count >= invoice_sections_multilocation
+* Else, False
+
+=cut
+
+sub has_sections {
+ my ($self, $agentnum) = @_;
+
+ return 0 unless $self->invnum > 0;
+
+ $agentnum ||= $self->cust_main->agentnum;
+ return 1 if $self->conf->exists('invoice_sections', $agentnum);
+ return 1 if $self->conf->exists('sections_by_location', $agentnum);
+
+ my $location_min = $self->conf->config(
+ 'invoice_sections_multilocation', $agentnum,
+ );
+
+ return 1
+ if $location_min
+ && $self->location_count >= $location_min;
+
+ 0;
+}
+
+
+=item location_count
+
+Return the number of locations billed on this invoice
+
+=cut
+
+sub location_count {
+ my ($self) = @_;
+ return 0 unless $self->invnum;
+
+ # SELECT COUNT( DISTINCT cust_pkg.locationnum )
+ # FROM cust_bill_pkg
+ # LEFT JOIN cust_pkg USING (pkgnum)
+ # WHERE invnum = 278
+ # AND cust_bill_pkg.pkgnum > 0
+
+ my $result = qsearchs({
+ select => 'COUNT(DISTINCT cust_pkg.locationnum) as location_count',
+ table => 'cust_bill_pkg',
+ addl_from => 'LEFT JOIN cust_pkg USING (pkgnum)',
+ extra_sql => 'WHERE invnum = '.dbh->quote( $self->invnum )
+ . ' AND cust_bill_pkg.pkgnum > 0'
+ });
+ ref $result ? $result->location_count : 0;
+}
+
1;