#!/usr/bin/perl use strict; 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(qsearch qsearchs); use FS::cust_main; use FS::cust_main::Search; use FS::cust_tag; use FS::cust_pkg; 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 () { 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; } } if ( $opt_v ) { print $cust_main->custnum . ": " . $cust_main->name . "\n"; } 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; } 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 [ -a agentnum ] [ -p NEW_PAYBY ] [ -t tagnum ] [ -k old_pkgpart:new_pkgpart,... ] [-v] [-E] 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 -E: input is customer emails, rather than customer numbers user: Employee username =head1 BUGS =head1 SEE ALSO L, L, L =cut 1;