add Excel and CSV download of templated reports and clean up their HTML formatting...
[freeside.git] / httemplate / docs / upgrade10.html
1 <pre>
2 this is incomplete
3
4 install DBD::Pg 1.32 (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)
5 install DBIx::DBSchema 0.23
6 install Net::SSH 0.08
7 - 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.
8 - In httpd.conf, change &lt;Files ~ \.cgi&gt; to  &lt;Files ~ (\.cgi|\.html)&gt;
9 - In httpd.conf, change <b>AddHandler perl-script .cgi</b> or <b>SetHandler perl-script</b> to <b>AddHandler perl-script .cgi .html</b>
10
11 install NetAddr::IP, Chart::Base, Locale::SubCountry, 
12 JavaScript::RPC (JavaScript::RPC::Server::CGI), Text::CSV_XS and
13 Spreadsheet::WriteExcel<!-- and Crypt::YAPassGen-->
14
15 INSERT INTO msgcat ( msgnum, msgcode, locale, msg ) VALUES ( 20, 'svc_external-id', 'en_US', 'External ID' );
16 INSERT INTO msgcat ( msgnum, msgcode, locale, msg ) VALUES ( 21, 'svc_external-title', 'en_US', 'Title' );
17
18 CREATE TABLE cust_bill_pkg_detail (
19   detailnum serial,
20   pkgnum int NOT NULL,
21   invnum int NOT NULL,
22   detail varchar(80),
23   PRIMARY KEY (detailnum)
24 );
25 CREATE INDEX cust_bill_pkg_detail1 ON cust_bill_pkg_detail ( pkgnum, invnum );
26
27 CREATE TABLE part_virtual_field (
28   vfieldpart int NOT NULL,
29   dbtable varchar(32) NOT NULL,
30   name varchar(32) NOT NULL,
31   check_block text,
32   list_source text,
33   length integer,
34   label varchar(80),
35   PRIMARY KEY (vfieldpart)
36 );
37
38 CREATE TABLE virtual_field (
39   recnum integer NOT NULL,
40   vfieldpart integer NOT NULL,
41   value varchar(128) NOT NULL,
42   PRIMARY KEY (vfieldpart, recnum)
43 );
44
45 CREATE TABLE router (
46   routernum serial,
47   routername varchar(80),
48   svcnum int,
49   PRIMARY KEY (routernum)
50 );
51
52 CREATE TABLE part_svc_router (
53   svcpart int NOT NULL,
54   routernum int NOT NULL
55 );
56
57 CREATE TABLE addr_block (
58   blocknum serial,
59   routernum int NOT NULL,
60   ip_gateway varchar(15) NOT NULL,
61   ip_netmask int NOT NULL,
62   PRIMARY KEY (blocknum)
63 );
64 CREATE UNIQUE INDEX addr_block1 ON addr_block ( blocknum, routernum );
65
66 CREATE TABLE svc_broadband (
67   svcnum int NOT NULL,
68   blocknum int NOT NULL,
69   speed_up int NOT NULL,
70   speed_down int NOT NULL,
71   ip_addr varchar(15),
72   PRIMARY KEY (svcnum)
73 );
74
75 CREATE TABLE acct_snarf (
76   snarfnum serial,
77   svcnum int NOT NULL,
78   machine varchar(255) NULL,
79   protocol varchar(80) NULL,
80   username varchar(80) NULL,
81   _password varchar(80) NULL,
82   PRIMARY KEY (snarfnum)
83 );
84 CREATE INDEX acct_snarf1 ON acct_snarf ( svcnum );
85
86 CREATE TABLE svc_external (
87   svcnum int NOT NULL,
88   id int,
89   title varchar(80),
90   PRIMARY KEY (svcnum)
91 );
92
93 CREATE TABLE part_pkg_temp (
94     pkgpart serial NOT NULL,
95     pkg varchar(80) NOT NULL,
96     "comment" varchar(80) NOT NULL,
97     setup text NULL,
98     freq varchar(80) NOT NULL,
99     recur text NULL,
100     setuptax char(1) NULL,
101     recurtax char(1) NULL,
102     plan varchar(80) NULL,
103     plandata text NULL,
104     disabled char(1) NULL,
105     taxclass varchar(80) NULL,
106     PRIMARY KEY (pkgpart)
107 );
108 INSERT INTO part_pkg_temp SELECT * from part_pkg;
109 DROP TABLE part_pkg;
110 ALTER TABLE part_pkg_temp RENAME TO part_pkg;
111 CREATE INDEX part_pkg1 ON part_pkg(disabled);
112
113 On modern Pg:
114 ALTER TABLE part_pkg DROP CONSTRAINT part_pkg_temp_pkey;
115 ALTER TABLE part_pkg ADD PRIMARY KEY (pkgpart);
116 select setval('public.part_pkg_temp_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
117
118 Or on Pg versions that don't support DROP CONSTRAINT and ADD PRIMARY KEY (tested on 7.1 and 7.2 so far):
119 DROP INDEX part_pkg_temp_pkey;
120 CREATE UNIQUE INDEX part_pkg_pkey ON part_pkg (pkgpart);
121 probably this one?: select setval('part_pkg_temp_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
122 probably not this one?: select setval('part_pkg_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
123
124 CREATE TABLE h_part_pkg_temp (
125     historynum serial NOT NULL,
126     history_date int,
127     history_user varchar(80) NOT NULL,
128     history_action varchar(80) NOT NULL,
129     pkgpart int NOT NULL,
130     pkg varchar(80) NOT NULL,
131     "comment" varchar(80) NOT NULL,
132     setup text NULL,
133     freq varchar(80) NOT NULL,
134     recur text NULL,
135     setuptax char(1) NULL,
136     recurtax char(1) NULL,
137     plan varchar(80) NULL,
138     plandata text NULL,
139     disabled char(1) NULL,
140     taxclass varchar(80) NULL,
141     PRIMARY KEY (historynum)
142 );
143 INSERT INTO h_part_pkg_temp SELECT * from h_part_pkg;
144 DROP TABLE h_part_pkg;
145 ALTER TABLE h_part_pkg_temp RENAME TO h_part_pkg;
146 CREATE INDEX h_part_pkg1 ON h_part_pkg(disabled);
147
148 On modern Pg:
149 ALTER TABLE h_part_pkg DROP CONSTRAINT h_part_pkg_temp_pkey;
150 ALTER TABLE h_part_pkg ADD PRIMARY KEY (historynum);
151 select setval('public.h_part_pkg_temp_historynum_seq', ( select max(historynum) from h_part_pkg) );
152
153 Or on Pg versions that don't support DROP CONSTRAINT and ADD PRIMARY KEY (tested on 7.1 and 7.2 so far):
154 DROP INDEX h_part_pkg_temp_pkey;
155 CREATE UNIQUE INDEX h_part_pkg_pkey ON h_part_pkg (historynum);
156 probably this one?: select setval('h_part_pkg_temp_historynum_seq', ( select max(historynum) from h_part_pkg) );
157 probably not this one?: select setval('h_part_pkg_historynum_seq', ( select max(historynum) from h_part_pkg) );
158
159 CREATE TABLE cust_pay_refund (
160     payrefundnum serial NOT NULL,
161     paynum int NOT NULL,
162     refundnum int NOT NULL,
163     _date int NOT NULL,
164     amount decimal(10,2) NOT NULL,
165     PRIMARY KEY (payrefundnum)
166 );
167 CREATE INDEX cust_pay_refund1 ON cust_pay_refund(paynum);
168 CREATE INDEX cust_pay_refund2 ON cust_pay_refund(refundnum);
169
170 CREATE TABLE cust_pay_void (
171   paynum int NOT NULL,
172   custnum int NOT NULL,
173   paid decimal(10,2) NOT NULL,
174   _date int,
175   payby char(4) NOT NULL,
176   payinfo varchar(80),
177   paybatch varchar(80),
178   closed char(1),
179   void_date int,
180   reason varchar(80),
181   otaker varchar(32) NOT NULL,
182   PRIMARY KEY (paynum)
183 );
184 CREATE INDEX cust_pay_void1 ON cust_pay_void(custnum);
185
186 CREATE TABLE part_pkg_option (
187   optionnum int primary key,
188   pkgpart int not null,
189   optionname varchar(80) not null,
190   optionvalue text NULL
191 );
192 CREATE INDEX part_pkg_option1 ON part_export_option ( pkgpart );
193 CREATE INDEX part_pkg_option2 ON part_export_option ( optionname );
194
195 CREATE TABLE rate (
196     ratenum serial NOT NULL,
197     reatename varchar(80) NOT NULL,
198     PRIMARY KEY (ratenum)
199 );
200
201 CREATE TABLE rate_detail (
202     ratenum int NOT NULL,
203     orig_regionnum int NULL,
204     dest_regionnum int NOT NULL,
205     min_included int NOT NULL,
206     min_charge decimal(10,2) NOT NULL,
207     sec_granularity int NOT NULL
208 );
209 CREATE UNIQUE INDEX rate_detail1 ON rate_detail ( ratenum, orig_regionnum, dest_regionnum );
210
211 CREATE TABLE rate_region (
212     regionnum serial NOT NULL,
213     regionname varchar(80) NOT NULL,
214     PRIMARY KEY (regionnum)
215 );
216
217 CREATE TABLE rate_prefix (
218     prefixnum serial NOT NULL,
219     regionnum int NOT NULL, 
220     countrycode varchar(3) NOT NULL,
221     npa varchar(6) NULL,
222     nxx varchar(3) NULL,
223     PRIMARY KEY (prefixnum)
224 );
225 CREATE INDEX rate_prefix1 ON rate_prefix ( countrycode );
226 CREATE INDEX rate_prefix2 ON rate_prefix ( regionnum );
227
228 CREATE TABLE reg_code (
229     codenum serial NOT NULL,
230     code varchar(80) NOT NULL,
231     agentnum int NOT NULL,
232     PRIMARY KEY (codenum)
233 );
234 CREATE UNIQUE INDEX reg_code1 ON reg_code ( agentnum, code );
235 CREATE INDEX reg_code2 ON reg_code ( agentnum );
236
237 CREATE TABLE reg_code_pkg (
238     codenum int NOT NULL,
239     pkgpart int NOT NULL
240 );
241 CREATE UNIQUE INDEX reg_code_pkg1 ON reg_code_pkg ( codenum, pkgpart );
242 CREATE INDEX reg_code_pkg2 ON reg_code_pkg ( codenum );
243
244 CREATE TABLE clientapi_session (
245     sessionnum serial NOT NULL,
246     sessionid varchar(80) NOT NULL,
247     namespace varchar(80) NOT NULL,
248     PRIMARY KEY (sessionnum)
249 );
250 CREATE UNIQUE INDEX clientapi_session1 ON clientapi_session ( sessionid, namespace );
251
252 CREATE TABLE clientapi_session_field (
253     fieldnum serial NOT NULL,
254     sessionnum int NOT NULL,
255     fieldname varchar(80) NOT NULL,
256     fieldvalue text NULL,
257     PRIMARY KEY (fieldnum)
258 );
259 CREATE UNIQUE INDEX clientapi_session_field1 ON clientapi_session_field ( sessionnum, fieldname );
260
261 DROP INDEX cust_bill_pkg1;
262
263 ALTER TABLE cust_bill_pkg ADD itemdesc varchar(80) NULL;
264 ALTER TABLE h_cust_bill_pkg ADD itemdesc varchar(80) NULL;
265 ALTER TABLE cust_main_county ADD taxname varchar(80) NULL;
266 ALTER TABLE h_cust_main_county ADD taxname varchar(80) NULL;
267 ALTER TABLE cust_main_county ADD setuptax char(1) NULL;
268 ALTER TABLE h_cust_main_county ADD setuptax char(1) NULL;
269 ALTER TABLE cust_main_county ADD recurtax char(1) NULL;
270 ALTER TABLE h_cust_main_county ADD recurtax char(1) NULL;
271 ALTER TABLE cust_pkg ADD last_bill int NULL;
272 ALTER TABLE h_cust_pkg ADD last_bill int NULL;
273 ALTER TABLE agent ADD disabled char(1) NULL;
274 ALTER TABLE h_agent ADD disabled char(1) NULL;
275 ALTER TABLE agent ADD username varchar(80) NULL;
276 ALTER TABLE h_agent ADD username varchar(80) NULL;
277 ALTER TABLE agent ADD _password varchar(80) NULL;
278 ALTER TABLE h_agent ADD _password varchar(80) NULL;
279 ALTER TABLE cust_main ADD paycvv varchar(4) NULL;
280 ALTER TABLE h_cust_main ADD paycvv varchar(4) NULL;
281 ALTER TABLE part_referral ADD disabled char(1) NULL;
282 ALTER TABLE h_part_referral ADD disabled char(1) NULL;
283 CREATE INDEX part_referral1 ON part_referral ( disabled );
284 ALTER TABLE pkg_svc ADD primary_svc char(1) NULL;
285 ALTER TABLE h_pkg_svc ADD primary_svc char(1) NULL;
286 ALTER TABLE svc_forward ADD src varchar(255) NULL;
287 ALTER TABLE h_svc_forward ADD src varchar(255) NULL;
288 ALTER TABLE part_pkg ADD promo_code varchar(80) NULL;
289 ALTER TABLE h_part_pkg ADD promo_code varchar(80) NULL;
290 CREATE INDEX part_pkg2 ON part_pkg ( promo_code );
291 CREATE INDEX h_part_pkg2 ON h_part_pkg ( promo_code );
292
293 On recent Pg versions:
294
295 ALTER TABLE svc_forward ALTER COLUMN srcsvc DROP NOT NULL;
296 ALTER TABLE h_svc_forward ALTER COLUMN srcsvc DROP NOT NULL;
297 ALTER TABLE svc_forward ALTER COLUMN dstsvc DROP NOT NULL;
298 ALTER TABLE h_svc_forward ALTER COLUMN dstsvc DROP NOT NULL;
299 ALTER TABLE cust_main ALTER COLUMN zip DROP NOT NULL;
300 ALTER TABLE h_cust_main ALTER COLUMN zip DROP NOT NULL;
301
302 Or on Pg versions that don't support DROP NOT NULL (tested on 7.1 and 7.2 so far):
303 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' ) );
304 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' ) );
305
306 If you created your database with a version before 1.4.2, dump database, edit:
307 - cust_main and h_cust_main: increase otaker from 8 to 32
308 - cust_main and h_cust_main: change ss from char(11) to varchar(11) ( "character(11)" to "character varying(11)" )
309 - cust_credit and h_cust_credit: increase otaker from 8 to 32
310 - cust_pkg and h_cust_pkg: increase otaker from 8 to 32
311 - cust_refund and h_cust_refund: increase otaker from 8 to 32
312 - domain_record and h_domain_record: increase reczone from 80 to 255
313 - domain_record and h_domain_record: change rectype from char to varchar ( "character(5)" to "character varying(5)" )
314 - domain_record and h_domain_record: increase recdata from 80 to 255
315 then reload
316
317 optionally:
318
319   CREATE INDEX cust_main6 ON cust_main ( daytime );
320   CREATE INDEX cust_main7 ON cust_main ( night );
321   CREATE INDEX cust_main8 ON cust_main ( fax );
322   CREATE INDEX cust_main9 ON cust_main ( ship_daytime );
323   CREATE INDEX cust_main10 ON cust_main ( ship_night );
324   CREATE INDEX cust_main11 ON cust_main ( ship_fax );
325   CREATE INDEX agent2 ON agent ( disabled );
326   CREATE INDEX part_bill_event2 ON part_bill_event ( disabled );
327   CREATE INDEX cust_pay4 ON cust_pay (_date);
328
329   serial columns
330
331 mandatory again:
332
333 dbdef-create username
334 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
335 dbdef-create username
336
337 apache - fix <Files> sections to include .html also
338
339 </pre>