change credit reasons from freetext to new reason/reason type system (#2777)
[freeside.git] / FS / bin / freeside-upgrade
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw($opt_d $opt_q $opt_v);
5 use vars qw($DEBUG $DRY_RUN);
6 use Getopt::Std;
7 use DBIx::DBSchema 0.31;
8 use FS::UID qw(adminsuidsetup checkeuid datasrc );  #getsecrets);
9 use FS::CurrentUser;
10 use FS::Schema qw( dbdef dbdef_dist reload_dbdef );
11 use FS::Misc::prune qw(prune_applications);
12 use FS::Conf;
13 use FS::Record qw(qsearch);
14 use FS::Upgrade qw(upgrade);
15
16 die "Not running uid freeside!" unless checkeuid();
17
18 getopts("dq");
19
20 $DEBUG = !$opt_q;
21 #$DEBUG = $opt_v;
22
23 $DRY_RUN = $opt_d;
24
25 my $user = shift or die &usage;
26 $FS::CurrentUser::upgrade_hack = 1;
27 $FS::UID::callback_hack = 1;
28 my $dbh = adminsuidsetup($user);
29 $FS::UID::callback_hack = 0;
30
31 #needs to match FS::Schema...
32 my $dbdef_file = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;
33
34 dbdef_create($dbh, $dbdef_file);
35
36 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
37 reload_dbdef($dbdef_file);
38
39 $DBIx::DBSchema::DEBUG = $DEBUG;
40 $DBIx::DBSchema::Table::DEBUG = $DEBUG;
41 $DBIx::DBSchema::Index::DEBUG = $DEBUG;
42
43 my @bugfix = ();
44
45 if (dbdef->table('cust_main')->column('agent_custid')) { 
46   push @bugfix,
47     "UPDATE cust_main SET agent_custid = NULL where agent_custid = ''";
48
49   push @bugfix,
50     "UPDATE h_cust_main SET agent_custid = NULL where agent_custid = ''"
51       if (dbdef->table('h_cust_main')); 
52 }
53
54 #you should have run fs-migrate-part_svc ages ago, when you upgraded
55 #from 1.3 to 1.4... if not, it needs to be hooked into -upgrade here or
56 #you'll lose all the part_svc settings it migrates to part_svc_column
57
58 if ( $DRY_RUN ) {
59   print
60     join(";\n", @bugfix, dbdef->sql_update_schema( dbdef_dist(datasrc), $dbh ) ). ";\n";
61   exit;
62 } else {
63   foreach my $statement ( @bugfix ) {
64     $dbh->do( $statement )
65       or die "Error: ". $dbh->errstr. "\n executing: $statement";
66   }
67
68   dbdef->update_schema( dbdef_dist(datasrc), $dbh );
69 }
70
71 my $hashref = {};
72 $hashref->{dry_run} = 1 if $DRY_RUN;
73 $hashref->{debug} = 1 if $DEBUG;
74 print join "\n", prune_applications($hashref);
75 print "\n" if $DRY_RUN;
76
77 if ( $dbh->{Driver}->{Name} =~ /^mysql/i ) {
78
79   my $sth = $dbh->prepare(
80     "SELECT COUNT(*) FROM duplicate_lock WHERE lockname = 'svc_acct'"
81   ) or die $dbh->errstr;
82
83   $sth->execute or die $sth->errstr;
84
85   unless ( $sth->fetchrow_arrayref->[0] ) {
86
87     $sth = $dbh->prepare(
88       "INSERT INTO duplicate_lock ( lockname ) VALUES ( 'svc_acct' )"
89     ) or die $dbh->errstr;
90
91     $sth->execute or die $sth->errstr;
92
93   }
94 }
95
96 upgrade()
97   unless $DRY_RUN;
98
99 $dbh->commit or die $dbh->errstr;
100
101 dbdef_create($dbh, $dbdef_file);
102
103 $dbh->disconnect or die $dbh->errstr;
104
105 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
106 $FS::UID::AutoCommit = 1;
107 $FS::UID::callback_hack = 1;
108 $dbh = adminsuidsetup($user);
109 $FS::UID::callback_hack = 0;
110 unless ( $DRY_RUN ) {
111   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
112   if (!scalar(qsearch('conf', {}))) {
113     my $error = FS::Conf::init_config($dir);
114     if ($error) {
115       warn "CONFIGURATION UPGRADE FAILED\n";
116       $dbh->rollback or die $dbh->errstr;
117       die $error;
118     }
119   }
120 }
121 $dbh->commit or die $dbh->errstr;
122 $dbh->disconnect or die $dbh->errstr;
123
124 ###
125
126 sub dbdef_create { # reverse engineer the schema from the DB and save to file
127   my( $dbh, $file ) = @_;
128   my $dbdef = new_native DBIx::DBSchema $dbh;
129   $dbdef->save($file);
130 }
131
132 sub usage {
133   die "Usage:\n  freeside-upgrade [ -d ] [ -q | -v ] user\n"; 
134 }
135
136 =head1 NAME
137
138 freeside-upgrade - Upgrades database schema for new freeside verisons.
139
140 =head1 SYNOPSIS
141
142   freeside-upgrade [ -d ] [ -q | -v ]
143
144 =head1 DESCRIPTION
145
146 Reads your existing database schema and updates it to match the current schema,
147 adding any columns or tables necessary.
148
149 Also performs other upgrade functions:
150
151 =over 4
152
153 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
154
155 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
156
157 =back
158
159   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
160           them.
161
162   [ -q ]: Run quietly.  This may become the default at some point.
163
164   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
165           current default.
166
167 =head1 SEE ALSO
168
169 =cut
170