From: Ivan Kohler Date: Wed, 24 Jul 2013 08:18:35 +0000 (-0700) Subject: omit charging for some services in bulk price plans, RT#24053 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=116ae6107240a49c854de2662678abb4fbb8acab omit charging for some services in bulk price plans, RT#24053 --- diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 0b47065f7..40e104bc6 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -2221,16 +2221,17 @@ sub tables_hashref { 'pkg_svc' => { 'columns' => [ - 'pkgsvcnum', 'serial', '', '', '', '', - 'pkgpart', 'int', '', '', '', '', - 'svcpart', 'int', '', '', '', '', - 'quantity', 'int', '', '', '', '', - 'primary_svc','char', 'NULL', 1, '', '', - 'hidden', 'char', 'NULL', 1, '', '', + 'pkgsvcnum', 'serial', '', '', '', '', + 'pkgpart', 'int', '', '', '', '', + 'svcpart', 'int', '', '', '', '', + 'quantity', 'int', '', '', '', '', + 'primary_svc', 'char', 'NULL', 1, '', '', + 'hidden', 'char', 'NULL', 1, '', '', + 'bulk_skip', 'char', 'NULL', 1, '', '', ], 'primary_key' => 'pkgsvcnum', - 'unique' => [ ['pkgpart', 'svcpart'] ], - 'index' => [ ['pkgpart'], ['quantity'] ], + 'unique' => [ ['pkgpart', 'svcpart'] ], + 'index' => [ ['pkgpart'], ['quantity'] ], }, 'part_referral' => { diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 0722647b4..15c29c4bc 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -367,7 +367,9 @@ and I If I is set to a hashref with svcparts as keys and quantities as values, the appropriate FS::pkg_svc records will be replaced. I can be set to a hashref of svcparts and flag values ('Y' or '') to set the -'hidden' field in these records. +'hidden' field in these records. I can be set to a hashref of +svcparts and flag values ('Y' or '') to set the 'bulk_skip' field in those +records. If I is set to the svcpart of the primary service, the appropriate FS::pkg_svc record will be updated. @@ -504,10 +506,12 @@ sub replace { warn " replacing pkg_svc records" if $DEBUG; my $pkg_svc = $options->{'pkg_svc'}; my $hidden_svc = $options->{'hidden_svc'} || {}; + my $bulk_skip = $options->{'bulk_skip'} || {}; if ( $pkg_svc ) { # if it wasn't passed, don't change existing pkg_svcs foreach my $part_svc ( qsearch('part_svc', {} ) ) { - my $quantity = $pkg_svc->{$part_svc->svcpart} || 0; - my $hidden = $hidden_svc->{$part_svc->svcpart} || ''; + my $quantity = $pkg_svc->{$part_svc->svcpart} || 0; + my $hidden = $hidden_svc->{$part_svc->svcpart} || ''; + my $bulk_skip = $bulk_skip->{$part_svc->svcpart} || ''; my $primary_svc = ( defined($options->{'primary_svc'}) && $options->{'primary_svc'} && $options->{'primary_svc'} == $part_svc->svcpart @@ -523,16 +527,19 @@ sub replace { my $old_quantity = 0; my $old_primary_svc = ''; my $old_hidden = ''; + my $old_bulk_skip = ''; if ( $old_pkg_svc ) { $old_quantity = $old_pkg_svc->quantity; $old_primary_svc = $old_pkg_svc->primary_svc if $old_pkg_svc->dbdef_table->column('primary_svc'); # is this needed? $old_hidden = $old_pkg_svc->hidden; + $old_bulk_skip = $old_pkg_svc->old_bulk_skip; } - next unless $old_quantity != $quantity || - $old_primary_svc ne $primary_svc || - $old_hidden ne $hidden; + next unless $old_quantity != $quantity + || $old_primary_svc ne $primary_svc + || $old_hidden ne $hidden + || $old_bulk_skip ne $bulk_skip; my $new_pkg_svc = new FS::pkg_svc( { 'pkgsvcnum' => ( $old_pkg_svc ? $old_pkg_svc->pkgsvcnum : '' ), @@ -541,6 +548,7 @@ sub replace { 'quantity' => $quantity, 'primary_svc' => $primary_svc, 'hidden' => $hidden, + 'bulk_skip' => $bulk_skip, } ); my $error = $old_pkg_svc ? $new_pkg_svc->replace($old_pkg_svc) diff --git a/FS/FS/part_pkg/bulk_Common.pm b/FS/FS/part_pkg/bulk_Common.pm index 67a683a12..26550df70 100644 --- a/FS/FS/part_pkg/bulk_Common.pm +++ b/FS/FS/part_pkg/bulk_Common.pm @@ -58,11 +58,17 @@ sub calc_recur { my %n_setup = (); my %n_recur = (); my %part_svc_label = (); + my %pkg_svc = (); my $summarize = $self->option('summarize_svcs',1); foreach my $cust_svc ( $self->_bulk_cust_svc( $cust_pkg, $sdate ) ) { + my $pkg_svc = $pkg_svc{ $cust_pkg->pkgpart. '_'. $cust_svc->svcpart } + ||= qsearchs('pkg_svc', { 'pkgpart' => $cust_pkg->pkgpart, + 'svcpart' => $cust_svc->svcpart}); + next if $pkg_svc->bulk_skip; + my @label = $cust_svc->label_long( $$sdate, $last_bill ); die "fatal: no label found, wtf?" unless scalar(@label); #? my $svc_details = $label[0]. ': '. $label[1]. ': '; diff --git a/httemplate/edit/process/part_pkg.cgi b/httemplate/edit/process/part_pkg.cgi index 3b6562f13..db4fcb921 100755 --- a/httemplate/edit/process/part_pkg.cgi +++ b/httemplate/edit/process/part_pkg.cgi @@ -132,10 +132,16 @@ my $args_callback = sub { ### my @svcparts = map { $_->svcpart } qsearch('part_svc', {}); - my %pkg_svc = map { $_ => scalar($cgi->param("pkg_svc$_")) } @svcparts; - my %hidden_svc = map { $_ => scalar($cgi->param("hidden$_")) } @svcparts; - - push @args, 'pkg_svc' => \%pkg_svc, 'hidden_svc' => \%hidden_svc; + my %pkg_svc = map { $_ => scalar($cgi->param("pkg_svc$_" )) } @svcparts; + my %hidden_svc = map { $_ => scalar($cgi->param("hidden$_" )) } @svcparts; + my %bulk_skip = map { $_ => ( $cgi->param("no_bulk_skip$_") eq 'Y' + ? '' : 'Y' + ) + } @svcparts; + + push @args, 'pkg_svc' => \%pkg_svc, + 'hidden_svc' => \%hidden_svc, + 'bulk_skip' => \%bulk_skip; ### # cust_pkg and custnum_ref (inserts only) diff --git a/httemplate/elements/tr-pkg_svc.html b/httemplate/elements/tr-pkg_svc.html index 6d17a376d..1923f12c2 100644 --- a/httemplate/elements/tr-pkg_svc.html +++ b/httemplate/elements/tr-pkg_svc.html @@ -7,12 +7,15 @@ %foreach my $part_svc ( @part_svc ) { % my $svcpart = $part_svc->svcpart; % my $pkg_svc = $pkg_svc{$svcpart} -% || new FS::pkg_svc ( { -% 'pkgpart' => $pkgpart, -% 'svcpart' => $svcpart, -% 'quantity' => 0, -% 'primary_svc' => '', -% 'hidden' => '', +% ||= qsearchs('pkg_svc', { 'pkgpart' => $pkgpart, +% 'svcpart' => $svcpart } ) +% || new FS::pkg_svc ( { +% 'pkgpart' => $pkgpart, +% 'svcpart' => $svcpart, +% 'quantity' => 0, +% 'primary_svc' => '', +% 'hidden' => '', +% 'bulk_skip' => '', % } ); % if ( $cgi->param('error') ) { % my $primary_svc = ( $pkg_svc->primary_svc =~ /^Y/i ); @@ -23,8 +26,6 @@ % if ! $primary_svc && $pkg_svc_primary == $svcpart; % } % -% push @fixups, "pkg_svc$svcpart"; -% % my $quan = 0; % if ( $cgi->param("pkg_svc$svcpart") =~ /^\s*(\d+)\s*$/ ) { % $quan = $1; @@ -32,6 +33,19 @@ % $quan = $pkg_svc->quantity; % } % +% my $hidden = ''; +% if ( grep { $_ eq "hidden_svc$svcpart" } $cgi->param ) { +% $hidden = $cgi->param("hidden_svc$svcpart"); +% } else { +% $hidden = $pkg_svc->hidden; +% } +% my $bulk_skip = ''; +% if ( grep { $_ eq "no_bulk_skip$svcpart" } $cgi->param ) { +% $bulk_skip = $cgi->param("no_bulk_skip$svcpart") eq 'Y' ? '' : 'Y'; +% } else { +% $bulk_skip = $pkg_svc->bulk_skip; +% } +% % my @exports = $pkg_svc->part_svc->part_export; % foreach my $export ( @exports ) { % push @possible_exports, $export if $export->can('external_pkg_map'); @@ -39,7 +53,7 @@ - + @@ -50,9 +64,14 @@ <% $part_svc->svc %> <% $part_svc->disabled =~ /^Y/i ? ' (DISABLED' : '' %> - - hidden =~ /^Y/i ? ' CHECKED' : ''%>> + + > + + + > + + % foreach ( 1 .. $columns-1 ) { % if ( $count == int( $_ * scalar(@part_svc) / $columns ) ) { @@ -102,10 +121,12 @@ my %opt = @_; my $cgi = $opt{'cgi'}; my $thead = "\n\n". ntable('#cccccc', 2). - 'Quan.'. - 'Primary'. + ''. + 'Quan.'. + 'Primary'. 'Service'. - 'Hide'. + 'Hide
from
Invoices
'. + 'Bulk
Charge
'. ''; my $part_pkg = $opt{'object'}; @@ -124,7 +145,6 @@ my @part_svc = qsearch('part_svc', {}, '', $where); #my %pkg_svc = map { $_->svcpart => $_ } $q_part_pkg->pkg_svc; my %pkg_svc = map { $_->svcpart => $_ } $part_pkg->pkg_svc('disable_linked'=>1); -my @fixups = (); my $count = 0; my $columns = 3;