RT# 82949 - added the ability to bulk increase package fees (setup and/or recurring...
authorChristopher Burger <burgerc@freeside.biz>
Thu, 9 May 2019 17:22:09 +0000 (13:22 -0400)
committerChristopher Burger <burgerc@freeside.biz>
Thu, 9 May 2019 17:22:09 +0000 (13:22 -0400)
httemplate/browse/part_pkg.cgi
httemplate/edit/bulk-part_pkg.html
httemplate/edit/process/bulk-part_pkg.html
httemplate/elements/header-full.html

index cb74bed..cda1897 100755 (executable)
@@ -38,6 +38,9 @@
 $().ready(function() {
   $('.taxproduct_desc').tooltip({});
 });
 $().ready(function() {
   $('.taxproduct_desc').tooltip({});
 });
+$(document).ready(function(){
+    $(this).scrollTop(0);
+});
 </SCRIPT>
 </%def>
 <%init>
 </SCRIPT>
 </%def>
 <%init>
@@ -801,8 +804,18 @@ if ( $acl_edit_bulk ) {
   $html_form = qq!<FORM ACTION="${p}edit/bulk-part_pkg.html" METHOD="POST">!;
   $html_foot = include('/search/elements/checkbox-foot.html',
                  actions => [
   $html_form = qq!<FORM ACTION="${p}edit/bulk-part_pkg.html" METHOD="POST">!;
   $html_foot = include('/search/elements/checkbox-foot.html',
                  actions => [
-                   { submit => 'edit report classes', },
-                   { label  => 'change customer packages',
+                   { label  => 'edit packages',
+                     onclick=> include('/elements/popup_link_onclick.html',
+                                 'label'       => 'edit',
+                                 'js_action'   => qq{
+                                   '${p}edit/bulk-part_pkg.html?' + \$('input[name=pkgpart]').serialize()
+                                 },
+                                 'actionlabel' => 'Bulk edit packages',
+                                 'width'       => 960,
+                                 'height'      => 420,
+                               )
+                   },
+                   { label  => 'change customers packages',
                      onclick=> include('/elements/popup_link_onclick.html',
                                  'label'       => 'change',
                                  'js_action'   => qq{
                      onclick=> include('/elements/popup_link_onclick.html',
                                  'label'       => 'change',
                                  'js_action'   => qq{
index 4665c9f..3225392 100644 (file)
@@ -1,5 +1,4 @@
-<& /elements/header.html, 'Edit package report classes' &>
-%# change that title if we add any other editing controls
+<% include('/elements/header-popup.html', 'Bulk edit packages') %>
 
 %# this should be centralized somewhere
 <STYLE TYPE="text/css">
 
 %# this should be centralized somewhere
 <STYLE TYPE="text/css">
@@ -8,36 +7,83 @@
 </STYLE>
 <& /elements/error.html &>
 
 </STYLE>
 <& /elements/error.html &>
 
+<SCRIPT>
+  function areyousure() {
+    var warning = 'Edit these packages?';
+    if(confirm(warning)) { process(); }
+  }
+
+  function toggle_section(what) {
+    var id = what.id;
+    var isDisabled;
+    if (document.getElementById(id).checked == true)  { isDisabled = false; }
+    else { isDisabled = true; }
+
+    var whatDiv = document.getElementById(id+'_div');
+    if (isDisabled) { whatDiv.style.display = "none"; }
+    else { whatDiv.style.display = "block"; }
+
+  }
+</SCRIPT>
+
 <FORM ACTION="process/bulk-part_pkg.html" METHOD="POST">
 <FORM ACTION="process/bulk-part_pkg.html" METHOD="POST">
-<DIV>
-The following packages will be changed:<BR>
-% foreach my $pkgpart (sort keys(%part_pkg)) {
-<INPUT TYPE="hidden" NAME="pkgpart" VALUE="<% $pkgpart %>">
-<% $part_pkg{$pkgpart}->pkg_comment |h %><BR>
-% }
-</DIV>
+<TABLE>
+  <TR>
+    <TD VALIGN="top">
+<B>Select the package information to change</B><BR>
+<INPUT TYPE="checkbox" ID="report_class" NAME="report_class" VALUE="1" onChange='toggle_section(this);'>
+Edit report classes
 <BR>
 <BR>
-<& /elements/table-grid.html &>\
-<& /elements/tr-justtitle.html, value => mt('Report classes') &>
+<DIV ID="report_class_div" STYLE="display: none;">
+ <& /elements/table-grid.html &>\
+  <& /elements/tr-justtitle.html, value => mt('Report classes') &>
 % my $row = 0;
 % foreach my $num (sort keys %report_class) {
 % my $row = 0;
 % foreach my $num (sort keys %report_class) {
-  <TR CLASS="row<%$row % 2%>">
-    <TD>
+    <TR CLASS="row<%$row % 2%>">
+     <TD>
 %   if ( $initial_state{$num} == -1 ) {
 %     # needs to be a tristate so that you can say "don't change it"
       <& /elements/checkbox-tristate.html, field => 'report_option_'.$num &>
 %   } else {
 %# for visual consistency
 %   if ( $initial_state{$num} == -1 ) {
 %     # needs to be a tristate so that you can say "don't change it"
       <& /elements/checkbox-tristate.html, field => 'report_option_'.$num &>
 %   } else {
 %# for visual consistency
-      <INPUT TYPE="checkbox" CLASS="partial" NAME="report_option_<%$num%>" VALUE="1" <% $initial_state{$num} ? 'CHECKED':'' %>><LABEL />
+      <INPUT TYPE="checkbox" CLASS="partial" ID="report_option_<%$num%>" NAME="report_option_<%$num%>" VALUE="1" <% $initial_state{$num} ? 'CHECKED':'' %>><LABEL />
 %   }
 %   }
-    </TD>
-    <TD><% $report_class{$num}->name %></TD>
-  </TR>
+     </TD>
+      <TD><% $report_class{$num}->name %></TD>
+    </TR>
 %   $row++;
 % }
 %   $row++;
 % }
-</TABLE>
+  </TABLE>
+</DIV>
+<BR>
+<INPUT TYPE="checkbox" ID="package_fees" NAME="package_fees" VALUE="1" onChange='toggle_section(this);'>
+Edit package fees.
+<BR>
+<DIV ID="package_fees_div" STYLE="display: none;">
+ <& /elements/table-grid.html &>\
+  <& /elements/tr-justtitle.html, value => mt('Package fees') &>
+  <TR>
+    <TD>Percentage of setup fee increase </TD>
+    <TD><INPUT TYPE="text" ID="setup_fee_increase" NAME="setup_fee_increase">%</TD>
+  </TR>
+    <TD>Percentage of recurring fee increase </TD>
+    <TD><INPUT TYPE="text" ID="recurring_fee_increase" NAME="recurring_fee_increase">%</TD>
+  </TR>
+ </TABLE>
+</DIV>
 <BR>
 <BR>
-<INPUT TYPE="submit">
+<INPUT TYPE="submit" VALUE="Bulk change packages" onclick="areyousure()">
+    </TD>
+    <TD WIDTH="5">&nbsp;</TD>
+    <TD VALIGN="top">
+      <B>The following packages will be changed:</B><BR>
+%     foreach my $pkgpart (sort keys(%part_pkg)) {
+        <INPUT TYPE="hidden" NAME="pkgpart" VALUE="<% $pkgpart %>">
+        <% $part_pkg{$pkgpart}->pkg_comment |h %><BR>
+%     }
+    </TD>
+  </TR>
+</TABLE>
 </FORM>
 <& /elements/footer.html &>
 <%init>
 </FORM>
 <& /elements/footer.html &>
 <%init>
index 59c914a..ac542cc 100644 (file)
@@ -1,35 +1,54 @@
-% if ( $error ) {
-%  $cgi->param('error', $error);
-<% $cgi->redirect(popurl(3).'/edit/bulk-part_pkg.html?'.$cgi->query_string) %>
-% } else {
-<% $cgi->redirect(popurl(3).'/browse/part_pkg.cgi') %>
-% }
+<& /elements/popup-topreload.html, emt($message) &>
+
 <%init>
 die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Bulk edit package definitions');
 
 my @pkgparts = $cgi->param('pkgpart')
   or die "no package definitions selected";
 
 <%init>
 die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Bulk edit package definitions');
 
 my @pkgparts = $cgi->param('pkgpart')
   or die "no package definitions selected";
 
-my %delete = map { 'report_option_'.($_->num) => 1 }
-  qsearch('part_pkg_report_option', {});
-my %insert;
-
-foreach my $param (grep { /^report_option_\d+$/ } $cgi->param) {
-  if ( $cgi->param($param) == 1 ) {
-    $insert{$param} = 1;
-    delete $delete{$param};
-  } elsif ( $cgi->param($param) == -1 ) {
-    # leave it alone
-    delete $delete{$param};
-  } # else it's empty, so leave it on the delete list
+my $error;
+
+if ($cgi->param('report_class')) {
+  my %delete = map { 'report_option_'.($_->num) => 1 }
+    qsearch('part_pkg_report_option', {});
+  my %insert;
+
+  foreach my $param (grep { /^report_option_\d+$/ } $cgi->param) {
+    if ( $cgi->param($param) == 1 ) {
+      $insert{$param} = 1;
+      delete $delete{$param};
+    } elsif ( $cgi->param($param) == -1 ) {
+      # leave it alone
+      delete $delete{$param};
+    } # else it's empty, so leave it on the delete list
+  }
+
+  foreach my $pkgpart (@pkgparts) {
+    my $part_pkg = FS::part_pkg->by_key($pkgpart);
+    my %options = ( $part_pkg->options, %insert );
+    delete $options{$_} foreach keys(%delete);
+    $error ||= $part_pkg->replace( options => \%options );
+  }
 }
 
 }
 
+if ($cgi->param('package_fees')) {
+  my $setup_fee_increase = $cgi->param('setup_fee_increase');
+  my $recurring_fee_increase = $cgi->param('recurring_fee_increase');
 
 
-my $error;
-foreach my $pkgpart (@pkgparts) {
-  my $part_pkg = FS::part_pkg->by_key($pkgpart);
-  my %options = ( $part_pkg->options, %insert );
-  delete $options{$_} foreach keys(%delete);
-  $error ||= $part_pkg->replace( options => \%options );
+  foreach my $pkgpart (@pkgparts) {
+    my $part_pkg = FS::part_pkg->by_key($pkgpart);
+    my %options = $part_pkg->options;
+    if ($recurring_fee_increase) {
+      $options{'recur_fee'} = $options{'recur_fee'} + ($options{'recur_fee'} * ($recurring_fee_increase / 100));
+    }
+    if ($setup_fee_increase) {
+      $options{'setup_fee'} = $options{'setup_fee'} + ($options{'setup_fee'} * ($setup_fee_increase / 100));
+    }
+    $error ||= $part_pkg->replace( options => \%options );
+  }
 }
 }
+
+my $message = "Packages updated successfully";
+$message = $error."=error" if $error;
+
 </%init>
 </%init>
index c73cf04..5a5db96 100644 (file)
@@ -207,7 +207,7 @@ Example:
 %     my ($message, $type) = split /=/, $status_msg;
 %     $type ||= 'status';
       <TABLE CLASS="fsinnerbox" STYLE="background-color:<% $status_color{$type} %>"><TR>
 %     my ($message, $type) = split /=/, $status_msg;
 %     $type ||= 'status';
       <TABLE CLASS="fsinnerbox" STYLE="background-color:<% $status_color{$type} %>"><TR>
-        <TD><IMG SRC="<% $fsurl %>images/tick.png"> <% $message |h %></TD>
+        <TD><IMG SRC="<% $fsurl %><% $status_image{$type} %>"> <% $message |h %></TD>
       </TR></TABLE>
 %   }
     <script src="<% $fsurl %>elements/js.cookie.js"></script>
       </TR></TABLE>
 %   }
     <script src="<% $fsurl %>elements/js.cookie.js"></script>
@@ -274,5 +274,6 @@ if ( scalar(@agentnums) == 1 ) {
 
 ## status->green(#eeffee), warning->yellow(#fdfd96), error->red(#f97c7c)
 my %status_color = ( 'status' => '#eeffee', 'warning' => '#fefbd0', 'error' => '#f97c7c', );
 
 ## status->green(#eeffee), warning->yellow(#fdfd96), error->red(#f97c7c)
 my %status_color = ( 'status' => '#eeffee', 'warning' => '#fefbd0', 'error' => '#f97c7c', );
+my %status_image = ( 'status' => 'images/tick.png', 'warning' => 'images/tick.png', 'error' => 'images/error.png', );
 
 </%init>
 
 </%init>