Ticket #39615 Fix versions for upgrades
[freeside.git] / bin / cust_main-bulk_change
index 618856c..e039012 100755 (executable)
@@ -1,19 +1,23 @@
 #!/usr/bin/perl
 
 use strict;
-use vars qw( $opt_p );
+use vars qw( $opt_a $opt_p $opt_t $opt_k $opt_c );
 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_tag;
+use FS::cust_pkg;
 
-getopts('p:');
+getopts('a:p:t:k:c:');
 
 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 (<STDIN>) {
 
@@ -29,17 +33,46 @@ while (<STDIN>) {
     next;
   }
 
-  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 <custnums.txt\n";
+  die "usage: cust_main-bulk_change [ -a agentnum ] [ -p NEW_PAYBY ] [ -t tagnum ] [ -k old_pkgpart:new_pkgpart,... ] employee_username <custnums.txt\n";
 }
 
 =head1 NAME
@@ -48,13 +81,21 @@ cust_main-bulk_change
 
 =head1 SYNOPSIS
 
-  cust_main-bulk_change -p NEW_PAYBY username <custnums.txt
+  cust_main-bulk_change [ -a agentnum ] [ -p NEW_PAYBY ] [ -t tagnum ] [ -k old_pkgpart:new_pkgpart,... ] [ -c reasonnum ] username <custnums.txt
 
 =head1 DESCRIPTION
 
-Command-line tool to change the payby field for a group of customers.
+Command-line tool to make bulk changes to a group of customers.
+
+-a: new agentnum
+
+-p: new payby, for example, I<CARD> or I<DCRD>
+
+-t: tagnum to add if not present
+
+-k: old_pkgpart:new_pkgpart, for example, I<5:4>.  Multiple entries can be comma-separated.
 
--p: new payby, for example, I<CARD> or I<DCRD>.
+-c: Cancel customer
 
 user: Employee username