summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/fixme/README9
-rw-r--r--utils/fixme/fixme.pgsql63
2 files changed, 72 insertions, 0 deletions
diff --git a/utils/fixme/README b/utils/fixme/README
new file mode 100644
index 00000000..cce8790d
--- /dev/null
+++ b/utils/fixme/README
@@ -0,0 +1,9 @@
+README for fixme.pgsql
+
+This utility attempts to move all damaged data into one location so that it
+can be sorted out. It creates an account with the number of 1000000000 that
+stores the broken transactions.
+
+It can be run from psql.
+
+IMPORTANT: BACK UP YOUR DATABASE BEFORE TRYING THIS SCRIPT
diff --git a/utils/fixme/fixme.pgsql b/utils/fixme/fixme.pgsql
new file mode 100644
index 00000000..7ee23b4d
--- /dev/null
+++ b/utils/fixme/fixme.pgsql
@@ -0,0 +1,63 @@
+begin;
+
+-- handle NULL chart_id's
+insert into chart (accno, description, charttype) values ('1000000000', 'Broken SQL-Ledger Data', 'L');
+
+--handle duplicate transaction id's.
+CREATE TEMPORARY TABLE id_agregator (id INT, table_name text);
+
+insert into id_agregator (id, table_name) SELECT id, 'ar' from ar;
+insert into id_agregator (id, table_name) SELECT id, 'ap' from ap;
+insert into id_agregator (id, table_name) SELECT id, 'business' from business;
+insert into id_agregator (id, table_name) SELECT id, 'chart' from chart;
+insert into id_agregator (id, table_name) SELECT id, 'customer' from customer;
+insert into id_agregator (id, table_name)
+ SELECT id, 'department' from department;
+insert into id_agregator (id, table_name) SELECT id, 'employee' from employee;
+insert into id_agregator (id, table_name) SELECT id, 'gl' from gl;
+insert into id_agregator (id, table_name) SELECT id, 'oe' from oe;
+insert into id_agregator (id, table_name) SELECT id, 'parts' from parts;
+insert into id_agregator (id, table_name)
+ SELECT id, 'partsgroup' from partsgroup;
+insert into id_agregator (id, table_name) SELECT id, 'project' from project;
+insert into id_agregator (id, table_name) SELECT id, 'vendor' from vendor;
+insert into id_agregator (id, table_name) SELECT id, 'warehouse' from warehouse;
+
+CREATE TEMPORARY VIEW id_view1 AS
+SELECT id, count(*) AS num_rows FROM id_agregator
+GROUP BY id HAVING num_rows > 1;
+
+select setval('id', select max(id) + 1 from id_agregator);
+
+create function fix_dupes() RETURNS OPAQUE AS
+'
+DECLARE
+dupe_id id_agregator%ROWTYPE;
+BEGIN
+FOR dupe_id IN SELECT id FROM id_agregator
+ WHERE id IN (SELECT id FROM id_view1)
+LOOP
+ EXECUTE ''UPDATE '' || dupe_id.table_name ||
+ SET id = nextval(''''id'''') WHERE
+ id = '' ||dupe_id.id;
+ UPDATE acc_trans SET trans_id = currval(''id'') WHERE
+ id = '' ||dupe_id.id;
+ INSERT INTO acc_trans (trans_id, amount, chart_id) VALUES (
+ currval(''id''), '1', (
+ SELECT id FROM chart WHERE accno = ''1000000000''
+ )
+ );
+ INSERT INTO acc_trans (trans_id, amount, chart_id) VALUES (
+ currval(''id''), '-1', (
+ SELECT id FROM chart WHERE accno = ''1000000000''
+ )
+ );
+END;
+' LANGUAGE PLPGSQL;
+
+SELECT fix_dupes ();
+
+drop function fix_dupes();
+
+
+commit;