summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2016-11-16 14:07:57 -0800
committerMark Wells <mark@freeside.biz>2016-11-16 14:07:57 -0800
commit7429a9a63dd734a43e50a43a2e1af5b1f99ed83a (patch)
tree853883070ceef486892d90a0577ad53b7c05b8b1
parentb5ce5f3e32b0f40a7c6a7da86a25ec772c8dbc71 (diff)
lock table for tax district updates, #73185
-rwxr-xr-xFS/FS/Cron/tax_rate_update.pm1
-rw-r--r--FS/FS/geocode_Mixin.pm12
-rwxr-xr-xFS/bin/freeside-upgrade2
3 files changed, 11 insertions, 4 deletions
diff --git a/FS/FS/Cron/tax_rate_update.pm b/FS/FS/Cron/tax_rate_update.pm
index 2c021b8..b6ac63c 100755
--- a/FS/FS/Cron/tax_rate_update.pm
+++ b/FS/FS/Cron/tax_rate_update.pm
@@ -40,6 +40,7 @@ sub tax_rate_update {
my $taxname = $conf->config('tax_district_taxname') || '';
+ FS::cust_main_county->lock_table;
if ($method eq 'wa_sales') {
# download the update file
my $now = DateTime->now;
diff --git a/FS/FS/geocode_Mixin.pm b/FS/FS/geocode_Mixin.pm
index 46f8128..ef16e74 100644
--- a/FS/FS/geocode_Mixin.pm
+++ b/FS/FS/geocode_Mixin.pm
@@ -260,6 +260,7 @@ sub process_district_update {
die $@ if $@;
die "$class has no location data" if !$class->can('location_hash');
+ my $error;
my $conf = FS::Conf->new;
my $method = $conf->config('tax_district_method')
or return; #nothing to do if null
@@ -269,9 +270,11 @@ sub process_district_update {
my $tax_info = get_district({ $self->location_hash }, $method);
return unless $tax_info;
- $self->set('district', $tax_info->{'district'} );
- my $error = $self->replace;
- die $error if $error;
+ if ($self->district ne $tax_info->{'district'}) {
+ $self->set('district', $tax_info->{'district'} );
+ $error = $self->replace;
+ die $error if $error;
+ }
my %hash = map { $_ => uc( $tax_info->{$_} ) }
qw( district city county state country );
@@ -281,6 +284,9 @@ sub process_district_update {
my $taxname = $conf->config('tax_district_taxname');
# there must be exactly one cust_main_county for each district+taxclass.
# do NOT exclude taxes that are zero.
+
+ # mutex here so that concurrent queue jobs can't make duplicates.
+ FS::cust_main_county->lock_table;
foreach my $taxclass (@classes) {
my @existing = qsearch('cust_main_county', {
%hash,
diff --git a/FS/bin/freeside-upgrade b/FS/bin/freeside-upgrade
index 95916ae..a454481 100755
--- a/FS/bin/freeside-upgrade
+++ b/FS/bin/freeside-upgrade
@@ -313,7 +313,7 @@ print "\n" if $DRY_RUN;
if ( $dbh->{Driver}->{Name} =~ /^mysql/i && ! $opt_s ) {
- foreach my $table (qw( svc_acct svc_phone )) {
+ foreach my $table (qw( svc_acct svc_phone cust_main_county )) {
my $sth = $dbh->prepare(
"SELECT COUNT(*) FROM duplicate_lock WHERE lockname = '$table'"