add a quick bulk tax add tool (eating my own dogfood instead of running a one-off...
authorivan <ivan>
Sun, 12 Oct 2008 00:54:18 +0000 (00:54 +0000)
committerivan <ivan>
Sun, 12 Oct 2008 00:54:18 +0000 (00:54 +0000)
httemplate/browse/cust_main_county.cgi
httemplate/edit/bulk-cust_main_county.html [new file with mode: 0644]
httemplate/edit/process/bulk-cust_main_county.html [new file with mode: 0644]

index 2e43375..fc10226 100755 (executable)
@@ -4,6 +4,8 @@
      'menubar'        => \@menubar,
      'html_init'      => $html_init,
      'html_posttotal' => $html_posttotal,
+     'html_form'      => '<FORM NAME="taxesForm">',
+     'html_foot'      => $html_foot,
      'query'          => {
                            'table'    => 'cust_main_county',
                            'hashref'  => $hashref,
@@ -200,6 +202,77 @@ my $html_posttotal =
       ).
   '</SELECT>)';
 
+my $bulk_popup_link = 
+  include( '/elements/popup_link_onclick.html',
+             'action'      => "${p}edit/bulk_cust_main_county.html?MAGIC_taxnum_MAGIC",
+             'actionlabel' => 'Bulk add new tax',
+             'nofalse'     => 1,
+             'height'      => 420,
+             #default# 'width'  => 540,
+             #default# 'color' => '#333399',
+         );
+
+my $html_foot = <<END;
+<SCRIPT TYPE="text/javascript">
+
+  function setAll(setTo) {
+    theForm = document.taxesForm;
+    for (i=0,n=theForm.elements.length;i<n;i++) {
+      if (theForm.elements[i].name.indexOf("cust_main_county") != -1) {
+        theForm.elements[i].checked = setTo;
+      }
+    }
+  }
+
+  function toggleAll() {
+    theForm = document.taxesForm;
+    for (i=0,n=theForm.elements.length;i<n;i++) {
+      if (theForm.elements[i].name.indexOf("cust_main_county") != -1) {
+        if ( theForm.elements[i].checked == true ) {
+          theForm.elements[i].checked = false;
+        } else {
+          theForm.elements[i].checked = true;
+        }
+      }
+    }
+  }
+
+  function bulkPopup() {
+    var bulk_popup_link = "$bulk_popup_link";
+    var bulkstring = '';
+    theForm = document.taxesForm;
+    for (i=0,n=theForm.elements.length;i<n;i++) {
+      if (    theForm.elements[i].name.indexOf("cust_main_county") != -1
+           && theForm.elements[i].checked == true
+         ) {
+        var name = theForm.elements[i].name;
+        var taxnum = name.replace(/cust_main_county/, '');
+        if ( bulkstring != '' ) {
+          bulkstring = bulkstring + ',';
+        }
+        bulkstring = bulkstring + taxnum;
+       
+      }
+    }
+    if ( bulk_popup_link.length > 1920 ) { // IE 2083 URL limit
+      alert('Too many selections'); // should do some session thing...
+      return false;
+    }
+    bulk_popup_link = bulk_popup_link.replace(/MAGIC_taxnum_MAGIC/, bulkstring);
+    eval(bulk_popup_link);
+  }
+
+</SCRIPT>
+
+<BR>
+<A HREF="javascript:setAll(true)">select all</A> |
+<A HREF="javascript:setAll(false)">unselect all</A> |
+<A HREF="javascript:toggleAll()">toggle all</A>
+<BR><BR>
+<A HREF="javascript:void(0);" onClick="bulkPopup();">Add new tax to selected</A>
+
+END
+
 my $hashref = {};
 my $count_query = 'SELECT COUNT(*) FROM cust_main_county';
 if ( $country ) {
@@ -269,33 +342,68 @@ if ( $conf->exists('enable_taxclasses') ) {
   $align .= 'l';
 }
 
-push @header, 'Tax name',
+push @header,
+              '', #checkbox column
+              'Tax name',
               'Rate', #'Tax',
               'Exemptions',
               ;
 
-push @header2, '(printed on invoices)',
+push @header2,
+               '',
+               '(printed on invoices)',
                '',
                '',
                ;
 
+my $newregion = 1;
+my $cb_oldrow = '';
+my $cb_sub = sub {
+  my $cust_main_county = shift;
+
+  if ( $cb_oldrow ) {
+    if (    $cb_oldrow->country  ne $cust_main_county->country 
+         || $cb_oldrow->state    ne $cust_main_county->state  
+         || $cb_oldrow->county   ne $cust_main_county->county  
+         || $cb_oldrow->taxclass ne $cust_main_county->taxclass )
+    {
+      $newregion = 1;
+    } else {
+      $newregion = 0;
+    }  
+    
+  } else {
+    $newregion = 1;
+  }
+  $cb_oldrow = $cust_main_county;
+
+  if ( $newregion ) {
+    my $taxnum = $cust_main_county->taxnum;
+    qq!<INPUT NAME="cust_main_county$taxnum" TYPE="checkbox" VALUE="1">!;
+  } else {
+    '';
+  }
+};
+
 push @fields, 
+  $cb_sub,
   sub { shift->taxname || 'Tax' },
   sub { shift->tax. '%&nbsp;<FONT SIZE="-1">(edit)</FONT>' },
   $exempt_sub,
 ;
 
 push @color,
+  '000000',
   sub { shift->taxname ? '000000' : '666666' },
   sub { shift->tax     ? '000000' : '666666' },
   '000000',
 ;
 
-$align .= 'lrl';
+$align .= 'clrl';
 
 my @cell_style = map $cell_style_sub, (1..scalar(@header));
 
-push @links,         '', $edit_link,    '';
-push @link_onclicks, '', $edit_onclick, '';
+push @links,         '', '', $edit_link,    '';
+push @link_onclicks, '', '', $edit_onclick, '';
 
 </%init>
diff --git a/httemplate/edit/bulk-cust_main_county.html b/httemplate/edit/bulk-cust_main_county.html
new file mode 100644 (file)
index 0000000..bb57fc5
--- /dev/null
@@ -0,0 +1,130 @@
+<% include('/elements/header-popup.html', 'Bulk Tax rate') %>
+
+<FORM ACTION="<% popurl(1)."process/bulk-cust_main_county.html" %>" METHOD="POST">
+
+<INPUT TYPE="hidden" NAME="taxnum" VALUE="<% join(',', @taxnum) %>">
+
+<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0>
+
+<% include('/elements/tr-td-label.html', 'label' => 'Country' ) %>
+  <TD BGCOLOR="#dddddd"><% $countries %>
+  </TD>
+</TR>
+
+<% include('/elements/tr-td-label.html', 'label' => 'State' ) %>
+  <TD BGCOLOR="#dddddd"><% $states %>
+  </TD>
+</TR>
+
+% if ( $counties ) {
+  <% include('/elements/tr-td-label.html', 'label' => 'County' ) %>
+    <TD BGCOLOR="#dddddd"><% $counties %>
+    </TD>
+  </TR>
+% }
+
+% if ( $conf->exists('enable_taxclasses') && $taxclasses ) {
+  <% include('/elements/tr-td-label.html', 'label' => 'Tax Class' ) %>
+    <TD BGCOLOR="#dddddd"><% $taxclasses %>
+    </TD>
+  </TR>
+% }
+
+<% include('/elements/tr-input-text.html',
+             'field' => 'taxname',
+             'label' => 'Tax name'
+          )
+%>
+
+<% include('/elements/tr-input-percentage.html',
+             'field' => 'tax',
+             'label' => 'Tax rate',
+          )
+%>
+
+<% include('/elements/tablebreak-tr-title.html', value=>'Exemptions' ) %>
+
+<% include('/elements/tr-checkbox.html',
+             'field' => 'setuptax',
+             'value' => 'Y',
+             'label' => 'This tax not applicable to setup fees',
+          )
+%>
+
+<% include('/elements/tr-checkbox.html',
+             'field' => 'recurtax',
+             'value' => 'Y',
+             'label' => 'This tax not applicable to recurring fees',
+          )
+%>
+
+<% include('/elements/tr-input-money.html',
+             'field' => 'exempt_amount',
+             'label' => 'Monthly exemption per customer ($25 "Texas tax")',
+          )
+%>
+
+</TABLE>
+
+<BR>
+
+<INPUT TYPE="submit" VALUE="Bulk add tax">
+
+<%init>
+
+my $conf = new FS::Conf;
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
+
+my @taxnum;
+if ( $cgi->param('error') ) {
+  $cgi->param('taxnum') =~ /^([\d,]+)$/
+    or die "no taxnum, but error: ". $cgi->param('error');
+  @taxnum = split(',', $1);
+} else {
+  my($query) = $cgi->keywords;
+  $query =~ /^([\d,]+)$/
+    or die 'Nothing selected'; #XXX better error when nothing selected
+  @taxnum = split(',', $1);
+}
+
+my @cust_main_county =
+  map {
+        qsearchs('cust_main_county', { 'taxnum' => $_ })
+          or die "unknown taxnum $1";
+      }
+      @taxnum;
+
+my %seen_country = {};
+my @countries = map  code2country($_)."&nbsp;($_)",
+                grep !$seen_country{$_}++,
+                map  $_->country,
+                     @cust_main_county;
+my $countries = join(', ', @countries);
+
+my %seen_state = {};
+my @states = map state_label($_->[0], $_->[1]),
+            grep !$seen_state{$_->[0]}++,
+             map [ $_->state, $_->country ],
+                 @cust_main_county;
+my $states = join(', ', @states);
+
+my %seen_county = {};
+my @counties = grep !$seen_county{$_}++, map $_->county, @cust_main_county;
+my $counties = join(', ', @counties);
+
+my %seen_taxclass = {};
+my @taxclasses = grep !$seen_taxclass{$_}++, map $_->taxclass, @cust_main_county;
+my $taxclasses = join(', ', @taxclasses);
+
+#my @fields = (
+#  { field=>'country',  type=>'fixed-country', },
+#  { field=>'state',    type=>'fixed-state', },
+#  { field=>'county',   type=>'fixed', },
+#);
+
+#push @fields, { field=>'taxclass', type=>'fixed', }
+#  if $conf->exists('enable_taxclasses');
+
+</%init>
diff --git a/httemplate/edit/process/bulk-cust_main_county.html b/httemplate/edit/process/bulk-cust_main_county.html
new file mode 100644 (file)
index 0000000..e05192e
--- /dev/null
@@ -0,0 +1,63 @@
+% if ( $error ) { #better to redirect back to 
+%# <% $cgi->redirect("$url?". $cgi->query_string ) %>
+  <% include('/elements/header-popup.html', 'Error adding taxes' ) %>
+
+  <FONT SIZE="+1" COLOR="#ff0000">Error: <% $error |h %></FONT>
+  <BR><BR>
+
+  </BODY>
+  </HTML>
+
+% } else {
+  <% include('/elements/header-popup.html', 'Taxes added') %>
+
+  <SCRIPT TYPE="text/javascript">
+    window.top.location.reload();
+  </SCRIPT>
+
+  </BODY>
+  </HTML>
+% }
+<%init>
+
+$cgi->param('taxnum') =~ /^([\d,]+)$/
+  or die 'Guru Meditation #69'; #??? should have been passed in
+my @taxnum = split(',', $1);
+
+my $error = '';
+foreach my $taxnum ( @taxnum ) {
+
+  my $cust_main_county = qsearchs('cust_main_county', { 'taxnum' => $taxnum } )
+    or die "unknown taxnum: $taxnum";
+
+  if ( $cust_main_county->tax == 0 ) { #let's replace
+
+    foreach (qw( taxname tax exempt_amount setuptax recurtax )) {
+      $cust_main_county->set( $_ => scalar($cgi->param($_)) )
+    }
+
+    $error = $cust_main_county->replace and last;
+
+  } else { #let's insert a new record
+
+    my $new =
+      new FS::cust_main_county {
+        ( map { $_ => scalar($cgi->param($_)) }
+              qw( taxname tax exempt_amount setuptax recurtax )
+        ),
+        ( map { $_ => $cust_main_county->get($_) }
+              qw( country state county taxclass ) 
+        )
+      };
+
+    $error = $new->insert and last;
+    
+  }
+
+}
+
+if ( $error ) {
+  $cgi->param('error', $error);
+}
+
+</%init>