X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=bin%2Fcust_main-bulk_change;h=47a9ae30a1ab14ff36f15d39e817f641b7b9bb6e;hp=618856cdcdea47ebca9479c0d8dba72c1d3a3a7e;hb=8d0e8149e7b19ad8543ac6c8c663be63dbc34762;hpb=5668de2e9beab1c2881dc697aaf9fa19a3be6f2b diff --git a/bin/cust_main-bulk_change b/bin/cust_main-bulk_change index 618856cdc..47a9ae30a 100755 --- a/bin/cust_main-bulk_change +++ b/bin/cust_main-bulk_change @@ -1,45 +1,101 @@ #!/usr/bin/perl use strict; -use vars qw( $opt_p ); +use vars qw( $opt_a $opt_p $opt_t $opt_k $opt_c $opt_v $opt_E ); use Getopt::Std; use FS::UID qw(adminsuidsetup); -use FS::Record qw(qsearchs); +use FS::Record qw(qsearch qsearchs); use FS::cust_main; +use FS::cust_main::Search; +use FS::cust_tag; +use FS::cust_pkg; -getopts('p:'); +getopts('a:p:t:k:c:vE'); my $user = shift or &usage; adminsuidsetup $user; $FS::cust_main::skip_fuzzyfiles = 1; $FS::cust_main::skip_fuzzyfiles = 1; +$FS::cust_main::import = 1; +$FS::cust_main::import = 1; while () { - unless ( /^\s*(\d+)\s*$/ ) { - warn "unparsable line: $_"; - next; + my ($custnum,$cust_main); + if ($opt_E) { + # don't really need to validate input here, search will quote safely + unless ( /^\s*(.*)\s*$/ ) { + warn "unparsable line: $_"; + next; + } + my @cust_main = FS::cust_main::Search::email_search( 'email' => $1 ); + if (@cust_main > 1) { + warn "muliple matching customers for address, skipping: $_"; + next; + } elsif (@cust_main < 1) { + warn "could not find matching customer for address, skipping: $_"; + next; + } + $cust_main = $cust_main[0]; + $custnum = $cust_main->custnum; + } else { + unless ( /^\s*(\d+)\s*$/ ) { + warn "unparsable line: $_"; + next; + } + my $custnum = $1; + $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } ); + unless ( $cust_main ) { + warn "unknown custnum $custnum\n"; + next; + } } - my $custnum = $1; - my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } ); - unless ( $cust_main ) { - warn "unknown custnum $custnum\n"; - next; + if ( $opt_v ) { + print $cust_main->custnum . ": " . $cust_main->name . "\n"; } - if ( $opt_p ) { - $cust_main->payby($opt_p); + my %cust_tag = ( custnum=>$custnum, tagnum=>$opt_t ); + if ( $opt_t && ! qsearchs('cust_tag', \%cust_tag) ) { + my $cust_tag = new FS::cust_tag \%cust_tag; + my $error = $cust_tag->insert; + die "$error\n" if $error; } - my $error = $cust_main->replace; - die "$error\n" if $error; + if ( $opt_p || $opt_a ) { + $cust_main->agentnum($opt_a) if $opt_a; + $cust_main->payby($opt_p) if $opt_p; + + my $error = $cust_main->replace; + die "$error\n" if $error; + } + + if ( $opt_k ) { + foreach my $k (split(/\s*,\s*/, $opt_k)) { + my($old, $new) = split(/\s*:\s*/, $k); + foreach my $cust_pkg ( qsearch('cust_pkg', { + 'custnum' => $cust_main->custnum, + 'pkgpart' => $old, + }) + ) + { + $cust_pkg->pkgpart($new); + my $error = $cust_pkg->replace; + die "$error\n" if $error; + } + } + } + + if ( $opt_c ) { + my @error = $cust_main->cancel( 'reason' => $opt_c ); + die join(' / ', @error). "\n" if @error; + } } sub usage { - die "usage: cust_main-bulk_change -p NEW_PAYBY employee_username or I + +-t: tagnum to add if not present + +-k: old_pkgpart:new_pkgpart, for example, I<5:4>. Multiple entries can be comma-separated. + +-c: Cancel customer + +-v: verbose --p: new payby, for example, I or I. +-E: input is customer emails, rather than customer numbers user: Employee username