]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-billing-payment.sql
ab8128f008ab3ad4df548bcb5396f95efa810bd4
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema.aged-billing-payment.sql
1
2 BEGIN;
3
4 --SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
5
6 \qecho Migrating aged billing and payment data.  This might take a while.
7
8 CREATE TABLE money.aged_payment (LIKE money.payment INCLUDING INDEXES);
9 ALTER TABLE money.aged_payment ADD COLUMN payment_type TEXT NOT NULL;
10
11 CREATE TABLE money.aged_billing (LIKE money.billing INCLUDING INDEXES);
12
13 INSERT INTO money.aged_payment 
14     SELECT  mp.* FROM money.payment_view mp
15     JOIN action.aged_circulation circ ON (circ.id = mp.xact);
16
17 INSERT INTO money.aged_billing
18     SELECT mb.* FROM money.billing mb
19     JOIN action.aged_circulation circ ON (circ.id = mb.xact);
20
21 CREATE OR REPLACE VIEW money.all_payments AS
22     SELECT * FROM money.payment_view 
23     UNION ALL
24     SELECT * FROM money.aged_payment;
25
26 CREATE OR REPLACE VIEW money.all_billings AS
27     SELECT * FROM money.billing
28     UNION ALL
29     SELECT * FROM money.aged_billing;
30
31 CREATE OR REPLACE FUNCTION action.age_circ_on_delete () RETURNS TRIGGER AS $$
32 DECLARE
33 found char := 'N';
34 BEGIN
35
36     -- If there are any renewals for this circulation, don't archive or delete
37     -- it yet.   We'll do so later, when we archive and delete the renewals.
38
39     SELECT 'Y' INTO found
40     FROM action.circulation
41     WHERE parent_circ = OLD.id
42     LIMIT 1;
43
44     IF found = 'Y' THEN
45         RETURN NULL;  -- don't delete
46         END IF;
47
48     -- Archive a copy of the old row to action.aged_circulation
49
50     INSERT INTO action.aged_circulation
51         (id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
52         copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
53         circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, grace_period, due_date,
54         stop_fines_time, checkin_time, create_time, duration, fine_interval, recurring_fine,
55         max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recurring_fine_rule,
56         max_fine_rule, stop_fines, workstation, checkin_workstation, checkin_scan_time, parent_circ)
57       SELECT
58         id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
59         copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
60         circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, grace_period, due_date,
61         stop_fines_time, checkin_time, create_time, duration, fine_interval, recurring_fine,
62         max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recurring_fine_rule,
63         max_fine_rule, stop_fines, workstation, checkin_workstation, checkin_scan_time, parent_circ
64         FROM action.all_circulation WHERE id = OLD.id;
65
66     -- Migrate billings and payments to aged tables
67
68     INSERT INTO money.aged_billing
69         SELECT * FROM money.billing WHERE xact = OLD.id;
70
71     INSERT INTO money.aged_payment 
72         SELECT * FROM money.payment_view WHERE xact = OLD.id;
73
74     DELETE FROM money.payment WHERE xact = OLD.id;
75     DELETE FROM money.billing WHERE xact = OLD.id;
76
77     RETURN OLD;
78 END;
79 $$ LANGUAGE 'plpgsql';
80
81 -- NOTE you could COMMIT here then start a new TRANSACTION if desired.
82
83 \qecho Deleting aged payments and billings from active payment/billing
84 \qecho tables.  This may take a while...
85
86 ALTER TABLE money.payment DISABLE TRIGGER mat_summary_del_tgr;
87 ALTER TABLE money.cash_payment DISABLE TRIGGER mat_summary_del_tgr;
88 ALTER TABLE money.check_payment DISABLE TRIGGER mat_summary_del_tgr;
89 ALTER TABLE money.credit_card_payment DISABLE TRIGGER mat_summary_del_tgr;
90 ALTER TABLE money.forgive_payment DISABLE TRIGGER mat_summary_del_tgr;
91 ALTER TABLE money.credit_payment DISABLE TRIGGER mat_summary_del_tgr;
92 ALTER TABLE money.goods_payment DISABLE TRIGGER mat_summary_del_tgr;
93
94 DELETE FROM money.payment WHERE id IN (SELECT id FROM money.aged_payment);
95
96 ALTER TABLE money.payment ENABLE TRIGGER mat_summary_del_tgr;
97 ALTER TABLE money.cash_payment ENABLE TRIGGER mat_summary_del_tgr;
98 ALTER TABLE money.check_payment ENABLE TRIGGER mat_summary_del_tgr;
99 ALTER TABLE money.credit_card_payment ENABLE TRIGGER mat_summary_del_tgr;
100 ALTER TABLE money.forgive_payment ENABLE TRIGGER mat_summary_del_tgr;
101 ALTER TABLE money.credit_payment ENABLE TRIGGER mat_summary_del_tgr;
102 ALTER TABLE money.goods_payment ENABLE TRIGGER mat_summary_del_tgr;
103
104 -- TODO: This approach assumes most of the money.billing rows have been
105 -- copied to money.aged_billing.  If that is not the case, which would
106 -- happen if circ anonymization is not enabled, it will be faster to
107 -- perform a simple delete instead of a truncate/rebuild.
108
109 -- Copy all money.billing rows that are not represented in money.aged_billing
110 CREATE TEMPORARY TABLE tmp_money_billing ON COMMIT DROP AS
111     SELECT mb.* FROM money.billing mb
112     LEFT JOIN money.aged_billing mab USING (id)
113     WHERE mab.id IS NULL;
114
115 ALTER TABLE money.billing DISABLE TRIGGER ALL;
116
117 -- temporarily remove the foreign key constraint to money.billing on
118 -- account adjusment.  Needed for money.billing truncate.
119 ALTER TABLE money.account_adjustment 
120     DROP CONSTRAINT account_adjustment_billing_fkey;
121
122 TRUNCATE money.billing;
123
124 INSERT INTO money.billing SELECT * FROM tmp_money_billing;
125
126 ALTER TABLE money.billing ENABLE TRIGGER ALL;
127 ALTER TABLE money.account_adjustment 
128     ADD CONSTRAINT account_adjustment_billing_fkey 
129     FOREIGN KEY (billing) REFERENCES money.billing (id);
130
131 COMMIT;
132
133 -- Good to run after truncating -- OK to run after COMMIT.
134 ANALYZE money.billing;
135