note alternate instructions for 0pre6->7
[freeside.git] / httemplate / docs / upgrade10.html
1 <pre>
2 this is incomplete
3
4 NOTE: Version numbering has been simplified.  1.5.7 is the version after
5 1.5.0pre6.  It is still a development version - releases with odd numbered 
6 middle parts (NN in x.NN.x) are development versions, like Perl or Linux.
7
8 If migrating from 1.5.0pre6, see README.1.5.7 instead
9
10 install DBD::Pg 1.32, 1.41 or later (not 1.40) (or, if you're using a Perl version before 5.6, you could try installing DBD::Pg 1.22 with <a href="http://420.am/~ivan/DBD-Pg-1.22-fixvercmp.patch">this patch</a> and commenting out the "use DBD::Pg 1.32" at the top of DBIx/DBSchema/DBD/Pg.pm)
11 install DBIx::DBSchema 0.26
12 install Net::SSH 0.08
13 - If using Apache::ASP, add PerlSetVar RequestBinaryRead Off and PerlSetVar IncludesDir /your/freeside/document/root/ to your Apache configuration and make sure you are using Apache::ASP minimum version 2.55.
14 - In httpd.conf, change &lt;Files ~ \.cgi&gt; to  &lt;Files ~ (\.cgi|\.html)&gt;
15 - In httpd.conf, change <b>AddHandler perl-script .cgi</b> or <b>SetHandler perl-script</b> to <b>AddHandler perl-script .cgi .html</b>
16
17 install NetAddr::IP, Chart::Base, Locale::SubCountry, 
18 JavaScript::RPC (JavaScript::RPC::Server::CGI), Text::CSV_XS, 
19 Spreadsheet::WriteExcel, IO-stringy (IO::Scalar), Frontier::RPC
20 (Frontier::RPC2), MIME::Entity (MIME-tools) and IPC::Run3
21 <!-- and Crypt::YAPassGen-->
22
23 INSERT INTO msgcat ( msgnum, msgcode, locale, msg ) VALUES ( 20, 'svc_external-id', 'en_US', 'External ID' );
24 INSERT INTO msgcat ( msgnum, msgcode, locale, msg ) VALUES ( 21, 'svc_external-title', 'en_US', 'Title' );
25
26 CREATE TABLE cust_bill_pkg_detail (
27   detailnum serial,
28   pkgnum int NOT NULL,
29   invnum int NOT NULL,
30   detail varchar(80),
31   PRIMARY KEY (detailnum)
32 );
33 CREATE INDEX cust_bill_pkg_detail1 ON cust_bill_pkg_detail ( pkgnum, invnum );
34
35 CREATE TABLE part_virtual_field (
36   vfieldpart int NOT NULL,
37   dbtable varchar(32) NOT NULL,
38   name varchar(32) NOT NULL,
39   check_block text,
40   list_source text,
41   length integer,
42   label varchar(80),
43   PRIMARY KEY (vfieldpart)
44 );
45
46 CREATE TABLE virtual_field (
47   recnum integer NOT NULL,
48   vfieldpart integer NOT NULL,
49   value varchar(128) NOT NULL,
50   PRIMARY KEY (vfieldpart, recnum)
51 );
52
53 CREATE TABLE router (
54   routernum serial,
55   routername varchar(80),
56   svcnum int,
57   PRIMARY KEY (routernum)
58 );
59
60 CREATE TABLE part_svc_router (
61   svcrouternum serial,
62   svcpart int NOT NULL,
63   routernum int NOT NULL,
64   PRIMARY KEY (svcrouternum)
65 );
66
67 CREATE TABLE addr_block (
68   blocknum serial,
69   routernum int NOT NULL,
70   ip_gateway varchar(15) NOT NULL,
71   ip_netmask int NOT NULL,
72   PRIMARY KEY (blocknum)
73 );
74 CREATE UNIQUE INDEX addr_block1 ON addr_block ( blocknum, routernum );
75
76 CREATE TABLE svc_broadband (
77   svcnum int NOT NULL,
78   blocknum int NOT NULL,
79   speed_up int NOT NULL,
80   speed_down int NOT NULL,
81   ip_addr varchar(15),
82   PRIMARY KEY (svcnum)
83 );
84
85 CREATE TABLE acct_snarf (
86   snarfnum serial,
87   svcnum int NOT NULL,
88   machine varchar(255) NULL,
89   protocol varchar(80) NULL,
90   username varchar(80) NULL,
91   _password varchar(80) NULL,
92   PRIMARY KEY (snarfnum)
93 );
94 CREATE INDEX acct_snarf1 ON acct_snarf ( svcnum );
95
96 CREATE TABLE svc_external (
97   svcnum int NOT NULL,
98   id int,
99   title varchar(80),
100   PRIMARY KEY (svcnum)
101 );
102
103 <!--
104 CREATE TABLE part_pkg_temp (
105     pkgpart serial NOT NULL,
106     pkg varchar(80) NOT NULL,
107     "comment" varchar(80) NOT NULL,
108     setup text NULL,
109     freq varchar(80) NOT NULL,
110     recur text NULL,
111     setuptax char(1) NULL,
112     recurtax char(1) NULL,
113     plan varchar(80) NULL,
114     plandata text NULL,
115     disabled char(1) NULL,
116     taxclass varchar(80) NULL,
117     PRIMARY KEY (pkgpart)
118 );
119 INSERT INTO part_pkg_temp SELECT * from part_pkg;
120 DROP TABLE part_pkg;
121 ALTER TABLE part_pkg_temp RENAME TO part_pkg;
122 CREATE INDEX part_pkg1 ON part_pkg(disabled);
123
124 On modern Pg:
125 ALTER TABLE part_pkg DROP CONSTRAINT part_pkg_temp_pkey;
126 ALTER TABLE part_pkg ADD PRIMARY KEY (pkgpart);
127 select setval('public.part_pkg_temp_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
128
129 Or on Pg versions that don't support DROP CONSTRAINT and ADD PRIMARY KEY (tested on 7.1 and 7.2 so far):
130 DROP INDEX part_pkg_temp_pkey;
131 CREATE UNIQUE INDEX part_pkg_pkey ON part_pkg (pkgpart);
132 probably this one?: select setval('part_pkg_temp_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
133 probably not this one?: select setval('part_pkg_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
134
135 CREATE TABLE h_part_pkg_temp (
136     historynum serial NOT NULL,
137     history_date int,
138     history_user varchar(80) NOT NULL,
139     history_action varchar(80) NOT NULL,
140     pkgpart int NOT NULL,
141     pkg varchar(80) NOT NULL,
142     "comment" varchar(80) NOT NULL,
143     setup text NULL,
144     freq varchar(80) NOT NULL,
145     recur text NULL,
146     setuptax char(1) NULL,
147     recurtax char(1) NULL,
148     plan varchar(80) NULL,
149     plandata text NULL,
150     disabled char(1) NULL,
151     taxclass varchar(80) NULL,
152     PRIMARY KEY (historynum)
153 );
154 INSERT INTO h_part_pkg_temp SELECT * from h_part_pkg;
155 DROP TABLE h_part_pkg;
156 ALTER TABLE h_part_pkg_temp RENAME TO h_part_pkg;
157 CREATE INDEX h_part_pkg1 ON h_part_pkg(disabled);
158
159 On modern Pg:
160 ALTER TABLE h_part_pkg DROP CONSTRAINT h_part_pkg_temp_pkey;
161 ALTER TABLE h_part_pkg ADD PRIMARY KEY (historynum);
162 select setval('public.h_part_pkg_temp_historynum_seq', ( select max(historynum) from h_part_pkg) );
163
164 Or on Pg versions that don't support DROP CONSTRAINT and ADD PRIMARY KEY (tested on 7.1 and 7.2 so far):
165 DROP INDEX h_part_pkg_temp_pkey;
166 CREATE UNIQUE INDEX h_part_pkg_pkey ON h_part_pkg (historynum);
167 probably this one?: select setval('h_part_pkg_temp_historynum_seq', ( select max(historynum) from h_part_pkg) );
168 probably not this one?: select setval('h_part_pkg_historynum_seq', ( select max(historynum) from h_part_pkg) );
169 -->ALTER TABLE part_pkg ADD COLUMN taxclass varchar(80) NULL;
170 ALTER TABLE h_part_pkg ADD COLUMN taxclass varchar(80) NULL;
171
172 CREATE TABLE cust_pay_refund (
173     payrefundnum serial NOT NULL,
174     paynum int NOT NULL,
175     refundnum int NOT NULL,
176     _date int NOT NULL,
177     amount decimal(10,2) NOT NULL,
178     PRIMARY KEY (payrefundnum)
179 );
180 CREATE INDEX cust_pay_refund1 ON cust_pay_refund(paynum);
181 CREATE INDEX cust_pay_refund2 ON cust_pay_refund(refundnum);
182
183 CREATE TABLE cust_pay_void (
184   paynum int NOT NULL,
185   custnum int NOT NULL,
186   paid decimal(10,2) NOT NULL,
187   _date int,
188   payby char(4) NOT NULL,
189   payinfo varchar(80),
190   paybatch varchar(80),
191   closed char(1),
192   void_date int,
193   reason varchar(80),
194   otaker varchar(32) NOT NULL,
195   PRIMARY KEY (paynum)
196 );
197 CREATE INDEX cust_pay_void1 ON cust_pay_void(custnum);
198
199 CREATE TABLE part_pkg_option (
200   optionnum serial,
201   pkgpart int not null,
202   optionname varchar(80) not null,
203   optionvalue text NULL,
204   PRIMARY KEY (optionnum)
205 );
206 CREATE INDEX part_pkg_option1 ON part_pkg_option ( pkgpart );
207 CREATE INDEX part_pkg_option2 ON part_pkg_option ( optionname );
208
209 CREATE TABLE rate (
210     ratenum serial NOT NULL,
211     ratename varchar(80) NOT NULL,
212     PRIMARY KEY (ratenum)
213 );
214
215 CREATE TABLE rate_detail (
216     ratedetailnum serial NOT NULL,
217     ratenum int NOT NULL,
218     orig_regionnum int NULL,
219     dest_regionnum int NOT NULL,
220     min_included int NOT NULL,
221     min_charge decimal(10,2) NOT NULL,
222     sec_granularity int NOT NULL,
223     PRIMARY KEY (ratedetailnum)
224 );
225 CREATE UNIQUE INDEX rate_detail1 ON rate_detail ( ratenum, orig_regionnum, dest_regionnum );
226
227 CREATE TABLE rate_region (
228     regionnum serial NOT NULL,
229     regionname varchar(80) NOT NULL,
230     PRIMARY KEY (regionnum)
231 );
232
233 CREATE TABLE rate_prefix (
234     prefixnum serial NOT NULL,
235     regionnum int NOT NULL, 
236     countrycode varchar(3) NOT NULL,
237     npa varchar(6) NULL,
238     nxx varchar(3) NULL,
239     PRIMARY KEY (prefixnum)
240 );
241 CREATE INDEX rate_prefix1 ON rate_prefix ( countrycode );
242 CREATE INDEX rate_prefix2 ON rate_prefix ( regionnum );
243
244 CREATE TABLE reg_code (
245     codenum serial NOT NULL,
246     code varchar(80) NOT NULL,
247     agentnum int NOT NULL,
248     PRIMARY KEY (codenum)
249 );
250 CREATE UNIQUE INDEX reg_code1 ON reg_code ( agentnum, code );
251 CREATE INDEX reg_code2 ON reg_code ( agentnum );
252
253 CREATE TABLE reg_code_pkg (
254     codepkgnum serial,
255     codenum int NOT NULL,
256     pkgpart int NOT NULL,
257     PRIMARY KEY (codepkgnum)
258 );
259 CREATE UNIQUE INDEX reg_code_pkg1 ON reg_code_pkg ( codenum, pkgpart );
260 CREATE INDEX reg_code_pkg2 ON reg_code_pkg ( codenum );
261
262 CREATE TABLE clientapi_session (
263     sessionnum serial NOT NULL,
264     sessionid varchar(80) NOT NULL,
265     namespace varchar(80) NOT NULL,
266     PRIMARY KEY (sessionnum)
267 );
268 CREATE UNIQUE INDEX clientapi_session1 ON clientapi_session ( sessionid, namespace );
269
270 CREATE TABLE clientapi_session_field (
271     fieldnum serial NOT NULL,
272     sessionnum int NOT NULL,
273     fieldname varchar(80) NOT NULL,
274     fieldvalue text NULL,
275     PRIMARY KEY (fieldnum)
276 );
277 CREATE UNIQUE INDEX clientapi_session_field1 ON clientapi_session_field ( sessionnum, fieldname );
278
279 DROP INDEX cust_bill_pkg1;
280
281 ALTER TABLE cust_bill_pkg ADD itemdesc varchar(80) NULL;
282 ALTER TABLE h_cust_bill_pkg ADD itemdesc varchar(80) NULL;
283 ALTER TABLE cust_main_county ADD taxname varchar(80) NULL;
284 ALTER TABLE h_cust_main_county ADD taxname varchar(80) NULL;
285 ALTER TABLE cust_main_county ADD setuptax char(1) NULL;
286 ALTER TABLE h_cust_main_county ADD setuptax char(1) NULL;
287 ALTER TABLE cust_main_county ADD recurtax char(1) NULL;
288 ALTER TABLE h_cust_main_county ADD recurtax char(1) NULL;
289 ALTER TABLE cust_pkg ADD last_bill int NULL;
290 ALTER TABLE h_cust_pkg ADD last_bill int NULL;
291 ALTER TABLE agent ADD disabled char(1) NULL;
292 ALTER TABLE h_agent ADD disabled char(1) NULL;
293 ALTER TABLE agent ADD username varchar(80) NULL;
294 ALTER TABLE h_agent ADD username varchar(80) NULL;
295 ALTER TABLE agent ADD _password varchar(80) NULL;
296 ALTER TABLE h_agent ADD _password varchar(80) NULL;
297 ALTER TABLE cust_main ADD paycvv varchar(512) NULL;
298 ALTER TABLE h_cust_main ADD paycvv varchar(512) NULL;
299 ALTER TABLE cust_main ADD paymask varchar(80) NULL;
300 ALTER TABLE h_cust_main ADD paymask varchar(80) NULL;
301 ALTER TABLE part_referral ADD disabled char(1) NULL;
302 ALTER TABLE h_part_referral ADD disabled char(1) NULL;
303 CREATE INDEX part_referral1 ON part_referral ( disabled );
304 ALTER TABLE pkg_svc ADD primary_svc char(1) NULL;
305 ALTER TABLE h_pkg_svc ADD primary_svc char(1) NULL;
306 ALTER TABLE svc_forward ADD src varchar(255) NULL;
307 ALTER TABLE h_svc_forward ADD src varchar(255) NULL;
308 ALTER TABLE part_pkg ADD promo_code varchar(80) NULL;
309 ALTER TABLE h_part_pkg ADD promo_code varchar(80) NULL;
310 CREATE INDEX part_pkg2 ON part_pkg ( promo_code );
311 CREATE INDEX h_part_pkg2 ON h_part_pkg ( promo_code );
312 ALTER TABLE prepay_credit ADD agentnum integer NULL;
313 ALTER TABLE h_prepay_credit ADD agentnum integer NULL;
314
315 ALTER TABLE type_pkgs ADD typepkgnum int;
316 ALTER TABLE type_pkgs ALTER COLUMN typepkgnum SET DEFAULT nextval('public.type_pkgs_typepkgnum_seq'::text);
317 CREATE SEQUENCE type_pkgs_typepkgnum_seq;
318 UPDATE type_pkgs SET typepkgnum = nextval('public.type_pkgs_typepkgnum_seq'::text) WHERE typepkgnum IS NULL;
319 ALTER TABLE type_pkgs ALTER typepkgnum SET NOT NULL;
320 ALTER TABLE type_pkgs ADD PRIMARY KEY (typepkgnum);
321 ALTER TABLE h_type_pkgs ADD typepkgnum int;
322
323 ALTER TABLE cust_bill_pkg ADD billpkgnum int;
324 ALTER TABLE cust_bill_pkg ALTER COLUMN billpkgnum SET DEFAULT nextval('public.cust_bill_pkg_billpkgnum_seq'::text);
325 CREATE SEQUENCE cust_bill_pkg_billpkgnum_seq;
326 UPDATE cust_bill_pkg SET billpkgnum = nextval('public.cust_bill_pkg_billpkgnum_seq'::text) WHERE billpkgnum IS NULL;
327 ALTER TABLE cust_bill_pkg ALTER billpkgnum SET NOT NULL;
328 ALTER TABLE cust_bill_pkg ADD PRIMARY KEY (billpkgnum);
329 ALTER TABLE h_cust_bill_pkg ADD billpkgnum int;
330
331 ALTER TABLE pkg_svc ADD pkgsvcnum int;
332 ALTER TABLE pkg_svc ALTER COLUMN pkgsvcnum SET DEFAULT nextval('public.pkg_svc_pkgsvcnum_seq'::text);
333 CREATE SEQUENCE pkg_svc_pkgsvcnum_seq;
334 UPDATE pkg_svc SET pkgsvcnum = nextval('public.pkg_svc_pkgsvcnum_seq'::text) WHERE pkgsvcnum IS NULL;
335 ALTER TABLE pkg_svc ALTER pkgsvcnum SET NOT NULL;
336 ALTER TABLE pkg_svc ADD PRIMARY KEY (pkgsvcnum);
337 ALTER TABLE h_pkg_svc ADD pkgsvcnum int;
338
339 On recent Pg versions:
340
341 ALTER TABLE cust_main ALTER COLUMN payinfo varchar(512) NULL;
342 ALTER TABLE h_cust_main ALTER COLUMN payinfo varchar(512) NULL;
343
344 Or on older Pg versions that don't support altering columns directly:
345
346
347 On recent Pg versions:
348
349 ALTER TABLE svc_forward ALTER COLUMN srcsvc DROP NOT NULL;
350 ALTER TABLE h_svc_forward ALTER COLUMN srcsvc DROP NOT NULL;
351 ALTER TABLE svc_forward ALTER COLUMN dstsvc DROP NOT NULL;
352 ALTER TABLE h_svc_forward ALTER COLUMN dstsvc DROP NOT NULL;
353 ALTER TABLE cust_main ALTER COLUMN zip DROP NOT NULL;
354 ALTER TABLE h_cust_main ALTER COLUMN zip DROP NOT NULL;
355
356 Or on Pg versions that don't support DROP NOT NULL (tested on 7.1 and 7.2 so far):
357 UPDATE pg_attribute SET attnotnull = FALSE WHERE ( attname = 'srcsvc' OR attname = 'dstsvc' ) AND ( attrelid = ( SELECT oid FROM pg_class WHERE relname = 'svc_forward' ) OR attrelid = ( SELECT oid FROM pg_class WHERE relname = 'h_svc_forward' ) );
358 UPDATE pg_attribute SET attnotnull = FALSE WHERE ( attname = 'zip' ) AND ( attrelid = ( SELECT oid FROM pg_class WHERE relname = 'cust_main' ) OR attrelid = ( SELECT oid FROM pg_class WHERE relname = 'h_cust_main' ) );
359
360 If you created your database with a version before 1.4.2, dump database, edit:
361 - cust_main and h_cust_main: increase otaker from 8 to 32
362 - cust_main and h_cust_main: change ss from char(11) to varchar(11) ( "character(11)" to "character varying(11)" )
363 - cust_credit and h_cust_credit: increase otaker from 8 to 32
364 - cust_pkg and h_cust_pkg: increase otaker from 8 to 32
365 - cust_refund and h_cust_refund: increase otaker from 8 to 32
366 - domain_record and h_domain_record: increase reczone from 80 to 255
367 - domain_record and h_domain_record: change rectype from char to varchar ( "character(5)" to "character varying(5)" )
368 - domain_record and h_domain_record: increase recdata from 80 to 255
369 then reload
370
371 optionally:
372
373   CREATE INDEX cust_main6 ON cust_main ( daytime );
374   CREATE INDEX cust_main7 ON cust_main ( night );
375   CREATE INDEX cust_main8 ON cust_main ( fax );
376   CREATE INDEX cust_main9 ON cust_main ( ship_daytime );
377   CREATE INDEX cust_main10 ON cust_main ( ship_night );
378   CREATE INDEX cust_main11 ON cust_main ( ship_fax );
379   CREATE INDEX agent2 ON agent ( disabled );
380   CREATE INDEX part_bill_event2 ON part_bill_event ( disabled );
381   CREATE INDEX cust_pay4 ON cust_pay (_date);
382
383   serial columns
384
385 mandatory again:
386
387 dbdef-create username
388 create-history-tables username cust_bill_pkg_detail router part_svc_router addr_block svc_broadband acct_snarf svc_external cust_pay_refund cust_pay_void part_pkg_option rate rate_detail rate_region rate_prefix reg_code reg_code_pkg
389 dbdef-create username
390
391 apache - fix <Files> sections to include .html also
392
393 </pre>