+=head1 SUBROUTINES
+
+=over 4
+
+=item process_batch_import JOB, PARAMS
+
+Starts a batch import given JOB (an L<FS::queue>) and PARAMS (a
+Base64-Storable hash). PARAMS should contain 'format' and 'uploaded_files'.
+
+Currently only usable for Billsoft imports; CCH's agglomeration of update
+files need to be imported through L<FS::tax_rate::process_batch_import>.
+
+=cut
+
+sub process_batch_import {
+ my $job = shift;
+ my $param = shift;
+
+ my $files = $param->{'uploaded_files'};
+
+ my ($file) = ($files =~ /^zipfile:(.*)$/)
+ or die "No files provided.\n";
+
+ my $dir = $FS::UID::cache_dir . '/cache.' . $FS::UID::datasrc;
+ open ( $param->{'filehandle'}, '<', "$dir/$file" )
+ or die "unable to open '$file': $!\n";
+
+ my $error = batch_import($param, $job);
+ die $error if $error;
+}
+
+=back
+
+=head1 QUIRKS
+
+CCH doesn't have a "country" field; for addresses in Canada it uses state
+= 'CN', and zip = the one-letter postal code prefix for the province. Or
+maybe that's just our CCH implementation. This doesn't apply to Billsoft,
+and shouldn't apply to any other tax vendor that may somehow be implemented.
+
+CCH also has two styles of records in this table: cch and cch-zip. cch
+records define a unique
+