=head2 wa_sales_log_customer_without_tax_district
-For any active customers with cust_location records in WA state,
-if a cust_location record has no tax district, find the correct
-district using WA DOR API, or if not possible, generate an error
-message into system log so address can be corrected
+For any cust_location records
+* In WA state
+* Attached to non cancelled packages
+* With no tax district
+
+Classify the tax district for the record using the WA State Dept of
+Revenue API. If this fails, generate an error into system log so
+address can be corrected
=cut
state => 'WA',
district => undef,
},
- addl_from => 'LEFT JOIN cust_main USING (custnum)',
- extra_sql => sprintf 'AND ( %s ) ', FS::cust_main->active_sql,
+ addl_from => '
+ LEFT JOIN cust_main USING (custnum)
+ LEFT JOIN cust_pkg ON cust_location.locationnum = cust_pkg.locationnum
+ ',
+ extra_sql => sprintf(
+ '
+ AND cust_pkg.pkgnum IS NOT NULL
+ AND (
+ cust_pkg.cancel > %s
+ OR cust_pkg.cancel IS NULL
+ )
+ ', time()
+ ),
);
for my $cust_location ( qsearch( \%qsearch_cust_location )) {
local $@;
+ log_info_and_warn(
+ sprintf
+ 'Attempting to classify district for cust_location ' .
+ 'locationnum(%s) address(%s)',
+ $cust_location->locationnum,
+ $cust_location->address1,
+ );
+
eval {
FS::geocode_Mixin::process_district_update(
'FS::cust_location',
};
if ( $@ ) {
+ # Error indicates a crash, not an error looking up district
+ # process_district_udpate will generate log messages for those errors
log_error_and_warn(
- sprintf "Failed to classify district for cust_location(%s): %s",
+ sprintf "Classify district error for cust_location(%s): %s",
$cust_location->locationnum,
$@
);
- } else {
- log_info_and_warn(
- sprintf "Classified district for cust_location(%s)",
- $cust_location->locationnum
- );
}
sleep 1; # Be polite to WA DOR API
Create or update the L<FS::cust_main_county> records with new data
-
-
=cut
sub wa_sales_update_cust_main_county {
if (
$row->tax == ( $district->{tax_combined} * 100 )
- && $row->taxname eq $args->{taxname}
+ && $row->taxname eq $args->{taxname}
+ && uc $row->county eq uc $district->{county}
+ && uc $row->city eq uc $district->{city}
) {
$same_count++;
next;
Expects output of location_hash() as parameter
-Dies on error, or if tax rate cannot be found using given address
+Returns undef on error, or if tax rate cannot be found using given address
Query the WA State Dept of Revenue API with an address, and return
tax district information for that address.
- country US
- exempt_amount 0
+If api returns no district for address, generates system log error
+and returns undef
+
=cut
sub wa_sales {
+
+ #
+ # no die():
+ # freeside-queued will issue dbh->rollback on die() ... this will
+ # also roll back system log messages about errors :/ freeside-queued
+ # doesn't propgate die messages into the system log.
+ #
+
my $location_hash = shift;
- # Return without die() when called with pointless context
+ # Return when called with pointless context
return
unless $location_hash
&& ref $location_hash
my $error =
sprintf "Problem parsing XML from API URL(%s): %s",
$prepared_url, $@;
+
$log->error( $error );
- die $error;
+ warn $error;
+ return;
}
my ($res_root) = $dom->findnodes('/response');
$res_code ? $api_response_codes[$res_code] : 'n/a',
$location_hash->{address1},
$prepared_url;
+
$log->error( $error );
- die "$error\n";
+ warn "$error\n";
+ return;
}
my %response = (