From: Mark Wells Date: Wed, 9 Mar 2016 23:49:53 +0000 (-0800) Subject: fix contact upgrade for multiple email addresses, #40971, from #25536 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=b472074e9b8d1d9ca2e2e38e231bf1f209281286 fix contact upgrade for multiple email addresses, #40971, from #25536 --- diff --git a/FS/FS/contact.pm b/FS/FS/contact.pm index 188d28779..592c7199f 100644 --- a/FS/FS/contact.pm +++ b/FS/FS/contact.pm @@ -945,6 +945,7 @@ sub _upgrade_data { #class method # always migrate cust_main_invoice records over local $FS::cust_main::import = 1; # override require_phone and such my $search = FS::Cursor->new('cust_main_invoice', {}); + my %custnum_dest; while (my $cust_main_invoice = $search->fetch) { my $custnum = $cust_main_invoice->custnum; my $dest = $cust_main_invoice->dest; @@ -956,17 +957,22 @@ sub _upgrade_data { #class method if !$svc_acct; $dest = $svc_acct->email; } + push @{ $custnum_dest{$custnum} ||= [] }, $dest; - my $error = $cust_main->replace( invoicing_list => [ $dest ] ); - + my $error = $cust_main_invoice->delete; if ( $error ) { - die "custnum $custnum, invoice destination $dest, creating contact: $error\n"; + die "custnum $custnum, cleaning up cust_main_invoice: $error\n"; } + } - $error = $cust_main_invoice->delete; - die "custnum $custnum, cleaning up cust_main_invoice: $error\n" if $error; - - } # while $search->fetch + foreach my $custnum (keys %custnum_dest) { + my $dests = $custnum_dest{$custnum}; + my $cust_main = FS::cust_main->by_key($custnum); + my $error = $cust_main->replace( invoicing_list => $dests ); + if ( $error ) { + die "custnum $custnum, creating contact: $error\n"; + } + } unless ( FS::upgrade_journal->is_done('contact_invoice_dest') ) { diff --git a/bin/contact-upgrade-fix-multiple b/bin/contact-upgrade-fix-multiple new file mode 100755 index 000000000..f5d68fc01 --- /dev/null +++ b/bin/contact-upgrade-fix-multiple @@ -0,0 +1,60 @@ +#!/usr/bin/perl + +use FS::UID qw(adminsuidsetup); +use FS::cust_main_invoice; +use FS::Record qw(qsearch qsearchs dbh); +use FS::cust_main; +use Date::Parse 'str2time'; +use strict; + +my $usage = "usage: contact-upgrade-fix-multiple \n"; + +my $user = shift or die $usage; +adminsuidsetup($user); +local $FS::UID::AutoCommit = 0; + +my $date = shift; +my $timestamp = str2time($date) or die $usage; +# safety +die "upgrade date is before the 4.0 release, must be incorrect.\n$usage" + if $timestamp < 1455609600; + +my $search = { + 'table' => 'h_cust_main_invoice', + 'hashref' => { + 'history_date' => { op => '>=', value => $timestamp }, + 'history_action' => 'delete', + 'dest' => { op => '!=', value => 'POST' }, + } +}; + +# find deleted cust_main_invoice records +my %custnum_dest; +foreach my $deleted (qsearch $search) { + my $custnum = $deleted->custnum; + push @{ $custnum_dest{$custnum} ||= [] }, $deleted->dest; +} + +# find those customers +while (my ($custnum, $dests) = each(%custnum_dest)) { + my $cust_main = FS::cust_main->by_key($custnum); + # filter out the email(s) that the customer already has + my @curr_dest = $cust_main->invoicing_list_email; + my @new_dest = @curr_dest; + print "cust#$custnum\n"; + foreach my $email ( @$dests ) { + print " $email: "; + if ( grep { $_ eq $email } @curr_dest ) { + print "skipped.\n"; + next; + } + print "appending.\n"; + push @new_dest, $email; + } + my $error = $cust_main->replace( invoicing_list => \@new_dest ); + die $error if $error; +} + +dbh->commit; +print "Done.\n"; +