BEGIN; ALTER TABLE ap ADD PRIMARY KEY (id); ALTER TABLE ar ADD PRIMARY KEY (id); ALTER TABLE assembly ADD PRIMARY KEY (id, parts_id); ALTER TABLE business ADD PRIMARY KEY (id); ALTER TABLE customer ADD PRIMARY KEY (id); ALTER TABLE customertax ADD PRIMARY KEY (customer_id, chart_id); ALTER TABLE department ADD PRIMARY KEY (id); ALTER TABLE dpt_trans ADD PRIMARY KEY (trans_id); ALTER TABLE employee ADD PRIMARY KEY (id); ALTER TABLE exchangerate ADD PRIMARY KEY (curr, transdate); ALTER TABLE gifi ADD PRIMARY KEY (accno); ALTER TABLE gl ADD PRIMARY KEY (id); ALTER TABLE invoice ADD PRIMARY KEY (id); ALTER TABLE jcitems ADD PRIMARY KEY (id); ALTER TABLE language ADD PRIMARY KEY (code); ALTER TABLE makemodel ADD PRIMARY KEY (parts_id); ALTER TABLE oe ADD PRIMARY KEY (id); ALTER TABLE orderitems ADD PRIMARY KEY (id); ALTER TABLE parts ADD PRIMARY KEY (id); ALTER TABLE partsgroup ADD PRIMARY KEY (id); ALTER TABLE partstax ADD PRIMARY KEY (parts_id, chart_id); ALTER TABLE partstax ADD FOREIGN KEY (chart_id) REFERENCES chart (id); ALTER TABLE partstax ADD FOREIGN KEY (parts_id) REFERENCES parts (id); ALTER TABLE pricegroup ADD PRIMARY KEY (id); ALTER TABLE project ADD PRIMARY KEY (id); ALTER TABLE recurringemail ADD PRIMARY KEY (id); ALTER TABLE recurring ADD PRIMARY KEY (id); ALTER TABLE recurringprint ADD PRIMARY KEY (id); ALTER TABLE sic ADD PRIMARY KEY (code); ALTER TABLE status ADD PRIMARY KEY (trans_id); ALTER TABLE tax ADD PRIMARY KEY (chart_id); ALTER TABLE tax ADD FOREIGN KEY (chart_id) REFERENCES chart (id); ALTER TABLE translation ADD PRIMARY KEY (trans_id, language_code); ALTER TABLE vendor ADD PRIMARY KEY (id); ALTER TABLE vendortax ADD PRIMARY KEY (vendor_id, chart_id); ALTER TABLE warehouse ADD PRIMARY KEY (id); ALTER TABLE yearend ADD PRIMARY KEY (trans_id); LOCK inventory in EXCLUSIVE mode; ALTER TABLE inventory ADD COLUMN entry_id bigint; CREATE SEQUENCE inventory_entry_id_seq; ALTER TABLE inventory ALTER COLUMN entry_id SET DEFAULT nextval('inventory_entry_id_seq'); UPDATE inventory SET entry_id = nextval('inventory_entry_id_seq'); ALTER TABLE inventory ADD PRIMARY key (entry_id); LOCK partscustomer IN EXCLUSIVE MODE; ALTER TABLE partscustomer ADD COLUMN entry_id int; CREATE SEQUENCE partscustomer_entry_id_seq; ALTER TABLE partscustomer ALTER COLUMN entry_id SET DEFAULT nextval('partscustomer_entry_id_seq'); UPDATE partscustomer SET entry_id = nextval('partscustomer_entry_id_seq'); ALTER TABLE partscustomer ADD PRIMARY KEY (entry_id); LOCK partsvendor IN EXCLUSIVE MODE; ALTER TABLE partsvendor ADD COLUMN entry_id int; CREATE SEQUENCE partsvendor_entry_id_seq; ALTER TABLE partsvendor ALTER COLUMN entry_id SET DEFAULT nextval('partsvendor_entry_id_seq'); UPDATE partsvendor SET entry_id = nextval('partsvendor_entry_id_seq'); ALTER TABLE partsvendor ADD PRIMARY KEY (entry_id); LOCK audittrail IN EXCLUSIVE MODE; ALTER TABLE audittrail ADD COLUMN entry_id int; CREATE SEQUENCE audittrail_entry_id_seq ; ALTER TABLE audittrail ALTER COLUMN entry_id SET DEFAULT nextval('audittrail_entry_id_seq'); UPDATE audittrail SET entry_id = nextval('audittrail_entry_id_seq'); ALTER TABLE audittrail ADD PRIMARY KEY (entry_id); LOCK shipto IN EXCLUSIVE MODE; ALTER TABLE shipto ADD COLUMN entry_id int; CREATE SEQUENCE shipto_entry_id_seq ; ALTER TABLE shipto ALTER COLUMN entry_id SET DEFAULT nextval('shipto_entry_id_seq'); UPDATE shipto SET entry_id = nextval('shipto_entry_id_seq'); ALTER TABLE shipto ADD PRIMARY KEY (entry_id); CREATE TABLE taxmodule ( taxmodule_id serial PRIMARY KEY, taxmodulename text NOT NULL ); INSERT INTO taxmodule ( taxmodule_id, taxmodulename ) VALUES ( 1, 'Simple' ); CREATE TABLE taxcategory ( taxcategory_id serial PRIMARY KEY, taxcategoryname text NOT NULL, taxmodule_id int NOT NULL REFERENCES taxmodule (taxmodule_id) ); ALTER TABLE partstax ADD COLUMN taxcategory_id int REFERENCES taxcategory (taxcategory_id); LOCK tax IN EXCLUSIVE MODE; ALTER TABLE tax ADD COLUMN pass int DEFAULT 0; UPDATE tax SET pass = 0; ALTER TABLE tax ALTER COLUMN pass SET NOT NULL; ALTER TABLE tax ADD COLUMN taxmodule_id int REFERENCES taxmodule DEFAULT 1; UPDATE tax SET taxmodule_id = 1; ALTER TABLE tax ALTER COLUMN taxmodule_id SET NOT NULL; -- Fixed session table and add users table -- CREATE TABLE users (id serial UNIQUE, username varchar(30) PRIMARY KEY); COMMENT ON TABLE users IS 'username is the primary key because we don\'t want duplicate users'; CREATE TABLE users_conf(id integer primary key references users(id) deferrable initially deferred, acs text, address text, businessnumber text, company text, countrycode text, currency text, dateformat text, dbconnect text, dbdriver text default 'Pg', dbhost text default 'localhost', dbname text, dboptions text, dbpasswd text, dbport text, dbuser text, email text, fax text, menuwidth text, name text, numberformat text, password varchar(32) check(length(password) = 32), print text, printer text, role text, sid text, signature text, stylesheet text, tel text, templates text, crypted_password text, timeout numeric, vclimit numeric); COMMENT ON TABLE users_conf IS 'This is a completely dumb table that is a place holder to get usersconf into the database. Next major release will have a much more sane implementation'; COMMENT ON COLUMN users_conf.id IS 'Yes primary key with a FOREIGN KEY to users(id) is correct'; COMMENT ON COLUMN users_conf.password IS 'This means we have to get rid of the current password stuff and move to presumably md5()'; LOCK session in EXCLUSIVE MODE; DELETE FROM session; ALTER TABLE session ADD CONSTRAINT session_token_check check (length(token::text) = 32); ALTER TABLE session ADD column user_id integer not null references users(id); -- comment this out when user db is working: ALTER TABLE session ALTER COLUMN user_id DROP NOT NULL; -- Admin user -- BEGIN; INSERT INTO users(username) VALUES ('admin'); INSERT INTO users_conf(id,password) VALUES (currval('users_id_seq'),NULL); -- Functions CREATE FUNCTION create_user(text) RETURNS bigint AS $$ INSERT INTO users(username) VALUES ('$1'); SELECT currval('users_id_seq'); $$ LANGUAGE 'SQL'; COMMENT ON FUNCTION create_user(text) IS $$ Function to create user Returns users.id if successful, else it is an error. $$; CREATE FUNCTION update_user(int4,text) RETURNS int4 AS $$ UPDATE users SET username = '$2' WHERE id = $1; SELECT 1; $$ LANGUAGE 'SQL'; COMMENT ON FUNCTION update_user(int4,text) IS $$ Takes int4 which is users.id and text which is username. Will update username based on id. Username is unique $$; ALTER TABLE defaults RENAME TO old_defaults; CREATE TABLE defaults ( setting_key TEXT PRIMARY KEY, value TEXT ); COMMENT ON TABLE defaults IS $$This table replaces the old one column per value system with a simple key => value table$$; INSERT INTO defaults (setting_key, value) SELECT 'inventory_accno_id', inventory_accno_id::text FROM old_defaults UNION SELECT 'income_accno_id', income_accno_id::text FROM old_defaults UNION SELECT 'expense_accno_id', expense_accno_id::text FROM old_defaults UNION SELECT 'fxloss_accno_id', fxloss_accno_id::text FROM old_defaults UNION SELECT 'fxgain_accno_id', fxgain_accno_id::text FROM old_defaults UNION SELECT 'sinumber', sinumber::text FROM old_defaults UNION SELECT 'sonumber', sonumber::text FROM old_defaults UNION SELECT 'yearend', yearend::text FROM old_defaults UNION SELECT 'weightunit', weightunit::text FROM old_defaults UNION SELECT 'businessnumber', businessnumber::text FROM old_defaults UNION SELECT 'version', '1.2.0'::text UNION SELECT 'curr', curr::text FROM old_defaults UNION SELECT 'closedto', closedto::text FROM old_defaults UNION SELECT 'revtrans', (CASE WHEN revtrans IS NULL THEN NULL WHEN revtrans THEN '1' ELSE '0' END) FROM old_defaults UNION SELECT 'ponumber', ponumber::text FROM old_defaults UNION SELECT 'sqnumber', sqnumber::text FROM old_defaults UNION SELECT 'rfqnumber', rfqnumber::text FROM old_defaults UNION SELECT 'audittrail', (CASE WHEN audittrail IS NULL THEN NULL WHEN audittrail THEN '1' ELSE '0' END) FROM old_defaults UNION SELECT 'vinumber', vinumber::text FROM old_defaults UNION SELECT 'employeenumber', employeenumber::text FROM old_defaults UNION SELECT 'partnumber', partnumber::text FROM old_defaults UNION SELECT 'customernumber', customernumber::text FROM old_defaults UNION SELECT 'vendornumber', vendornumber::text FROM old_defaults UNION SELECT 'glnumber', glnumber::text FROM old_defaults UNION SELECT 'projectnumber', projectnumber::text FROM old_defaults UNION SELECT 'appname', 'LedgerSMB'::text; DROP TABLE old_defaults; CREATE OR REPLACE FUNCTION del_exchangerate() RETURNS TRIGGER AS ' declare t_transdate date; t_curr char(3); t_id int; d_curr text; begin select into d_curr substr(value,1,3) from defaults where setting_key = ''curr''; if TG_RELNAME = ''ar'' then select into t_curr, t_transdate curr, transdate from ar where id = old.id; end if; if TG_RELNAME = ''ap'' then select into t_curr, t_transdate curr, transdate from ap where id = old.id; end if; if TG_RELNAME = ''oe'' then select into t_curr, t_transdate curr, transdate from oe where id = old.id; end if; if d_curr != t_curr then select into t_id a.id from acc_trans ac join ar a on (a.id = ac.trans_id) where a.curr = t_curr and ac.transdate = t_transdate except select a.id from ar a where a.id = old.id union select a.id from acc_trans ac join ap a on (a.id = ac.trans_id) where a.curr = t_curr and ac.transdate = t_transdate except select a.id from ap a where a.id = old.id union select o.id from oe o where o.curr = t_curr and o.transdate = t_transdate except select o.id from oe o where o.id = old.id; if not found then delete from exchangerate where curr = t_curr and transdate = t_transdate; end if; end if; return old; end; ' language 'plpgsql'; CREATE OR REPLACE FUNCTION add_custom_field (VARCHAR, VARCHAR, VARCHAR) RETURNS BOOL AS 'BEGIN EXECUTE ''SELECT TABLE_ID FROM custom_table_catalog WHERE extends = '''''' || table_name || '''''' ''; IF NOT FOUND THEN BEGIN INSERT INTO custom_table_catalog (extends) VALUES (table_name); EXECUTE ''CREATE TABLE custom_''||table_name || '' (row_id INT PRIMARY KEY)''; EXCEPTION WHEN duplicate_table THEN -- do nothing END; END IF; EXECUTE ''INSERT INTO custom_field_catalog (field_name, table_id) VALUES ( '''''' || new_field_name ||'''''', (SELECT table_id FROM custom_table_catalog WHERE extends = ''''''|| table_name || ''''''))''; EXECUTE ''ALTER TABLE custom_''||table_name || '' ADD COLUMN '' || new_field_name || '' '' || field_datatype; RETURN TRUE; END; ' LANGUAGE PLPGSQL; COMMIT;