]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/1292.functions.triggered_event_log.sql
LP#1831803: (follow-up) update release notes formatting
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 1292.functions.triggered_event_log.sql
1 BEGIN;
2
3 SELECT evergreen.upgrade_deps_block_check('1292', :eg_version);
4
5 CREATE OR REPLACE FUNCTION action.age_circ_on_delete () RETURNS TRIGGER AS $$
6 DECLARE
7 found char := 'N';
8 BEGIN
9
10     -- If there are any renewals for this circulation, don't archive or delete
11     -- it yet.   We'll do so later, when we archive and delete the renewals.
12
13     SELECT 'Y' INTO found
14     FROM action.circulation
15     WHERE parent_circ = OLD.id
16     LIMIT 1;
17
18     IF found = 'Y' THEN
19         RETURN NULL;  -- don't delete
20         END IF;
21
22     -- Archive a copy of the old row to action.aged_circulation
23
24     INSERT INTO action.aged_circulation
25         (id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
26         copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
27         circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, grace_period, due_date,
28         stop_fines_time, checkin_time, create_time, duration, fine_interval, recurring_fine,
29         max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recurring_fine_rule,
30         max_fine_rule, stop_fines, workstation, checkin_workstation, checkin_scan_time, parent_circ,
31         auto_renewal, auto_renewal_remaining)
32       SELECT
33         id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
34         copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
35         circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, grace_period, due_date,
36         stop_fines_time, checkin_time, create_time, duration, fine_interval, recurring_fine,
37         max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recurring_fine_rule,
38         max_fine_rule, stop_fines, workstation, checkin_workstation, checkin_scan_time, parent_circ,
39         auto_renewal, auto_renewal_remaining
40         FROM action.all_circulation WHERE id = OLD.id;
41
42     -- Migrate billings and payments to aged tables
43
44     SELECT 'Y' INTO found FROM config.global_flag 
45         WHERE name = 'history.money.age_with_circs' AND enabled;
46
47     IF found = 'Y' THEN
48         PERFORM money.age_billings_and_payments_for_xact(OLD.id);
49     END IF;
50
51     -- Break the link with the user in action_trigger.event (warning: event_output may essentially have this information)
52     UPDATE
53         action_trigger.event e
54     SET
55         context_user = NULL
56     FROM
57         action.all_circulation c
58     WHERE
59             c.id = OLD.id
60         AND e.context_user = c.usr
61         AND e.target = c.id
62         AND e.event_def IN (
63             SELECT id
64             FROM action_trigger.event_definition
65             WHERE hook in (SELECT key FROM action_trigger.hook WHERE core_type = 'circ')
66         )
67     ;
68
69     RETURN OLD;
70 END;
71 $$ LANGUAGE 'plpgsql';
72
73 CREATE OR REPLACE FUNCTION actor.usr_purge_data(
74         src_usr  IN INTEGER,
75         specified_dest_usr IN INTEGER
76 ) RETURNS VOID AS $$
77 DECLARE
78         suffix TEXT;
79         renamable_row RECORD;
80         dest_usr INTEGER;
81 BEGIN
82
83         IF specified_dest_usr IS NULL THEN
84                 dest_usr := 1; -- Admin user on stock installs
85         ELSE
86                 dest_usr := specified_dest_usr;
87         END IF;
88
89     -- action_trigger.event (even doing this, event_output may--and probably does--contain PII and should have a retention/removal policy)
90     UPDATE action_trigger.event SET context_user = dest_usr WHERE context_user = src_usr;
91
92         -- acq.*
93         UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
94         UPDATE acq.lineitem SET creator = dest_usr WHERE creator = src_usr;
95         UPDATE acq.lineitem SET editor = dest_usr WHERE editor = src_usr;
96         UPDATE acq.lineitem SET selector = dest_usr WHERE selector = src_usr;
97         UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
98         UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
99     UPDATE acq.invoice SET closed_by = dest_usr WHERE closed_by = src_usr;
100         DELETE FROM acq.lineitem_usr_attr_definition WHERE usr = src_usr;
101
102         -- Update with a rename to avoid collisions
103         FOR renamable_row in
104                 SELECT id, name
105                 FROM   acq.picklist
106                 WHERE  owner = src_usr
107         LOOP
108                 suffix := ' (' || src_usr || ')';
109                 LOOP
110                         BEGIN
111                                 UPDATE  acq.picklist
112                                 SET     owner = dest_usr, name = name || suffix
113                                 WHERE   id = renamable_row.id;
114                         EXCEPTION WHEN unique_violation THEN
115                                 suffix := suffix || ' ';
116                                 CONTINUE;
117                         END;
118                         EXIT;
119                 END LOOP;
120         END LOOP;
121
122         UPDATE acq.picklist SET creator = dest_usr WHERE creator = src_usr;
123         UPDATE acq.picklist SET editor = dest_usr WHERE editor = src_usr;
124         UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
125         UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
126         UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
127         UPDATE acq.purchase_order SET creator = dest_usr WHERE creator = src_usr;
128         UPDATE acq.purchase_order SET editor = dest_usr WHERE editor = src_usr;
129         UPDATE acq.claim_event SET creator = dest_usr WHERE creator = src_usr;
130
131         -- action.*
132         DELETE FROM action.circulation WHERE usr = src_usr;
133         UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
134         UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
135         UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
136         UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
137         UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
138         DELETE FROM action.hold_request WHERE usr = src_usr;
139         UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
140         UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
141         DELETE FROM action.non_cataloged_circulation WHERE patron = src_usr;
142         UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
143         DELETE FROM action.survey_response WHERE usr = src_usr;
144         UPDATE action.fieldset SET owner = dest_usr WHERE owner = src_usr;
145         DELETE FROM action.usr_circ_history WHERE usr = src_usr;
146
147         -- actor.*
148         DELETE FROM actor.card WHERE usr = src_usr;
149         DELETE FROM actor.stat_cat_entry_usr_map WHERE target_usr = src_usr;
150         DELETE FROM actor.usr_privacy_waiver WHERE usr = src_usr;
151
152         -- The following update is intended to avoid transient violations of a foreign
153         -- key constraint, whereby actor.usr_address references itself.  It may not be
154         -- necessary, but it does no harm.
155         UPDATE actor.usr_address SET replaces = NULL
156                 WHERE usr = src_usr AND replaces IS NOT NULL;
157         DELETE FROM actor.usr_address WHERE usr = src_usr;
158         DELETE FROM actor.usr_note WHERE usr = src_usr;
159         UPDATE actor.usr_note SET creator = dest_usr WHERE creator = src_usr;
160         DELETE FROM actor.usr_org_unit_opt_in WHERE usr = src_usr;
161         UPDATE actor.usr_org_unit_opt_in SET staff = dest_usr WHERE staff = src_usr;
162         DELETE FROM actor.usr_setting WHERE usr = src_usr;
163         DELETE FROM actor.usr_standing_penalty WHERE usr = src_usr;
164         UPDATE actor.usr_standing_penalty SET staff = dest_usr WHERE staff = src_usr;
165
166         -- asset.*
167         UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
168         UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
169         UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
170         UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
171         UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
172         UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
173
174         -- auditor.*
175         DELETE FROM auditor.actor_usr_address_history WHERE id = src_usr;
176         DELETE FROM auditor.actor_usr_history WHERE id = src_usr;
177         UPDATE auditor.asset_call_number_history SET creator = dest_usr WHERE creator = src_usr;
178         UPDATE auditor.asset_call_number_history SET editor  = dest_usr WHERE editor  = src_usr;
179         UPDATE auditor.asset_copy_history SET creator = dest_usr WHERE creator = src_usr;
180         UPDATE auditor.asset_copy_history SET editor  = dest_usr WHERE editor  = src_usr;
181         UPDATE auditor.biblio_record_entry_history SET creator = dest_usr WHERE creator = src_usr;
182         UPDATE auditor.biblio_record_entry_history SET editor  = dest_usr WHERE editor  = src_usr;
183
184         -- biblio.*
185         UPDATE biblio.record_entry SET creator = dest_usr WHERE creator = src_usr;
186         UPDATE biblio.record_entry SET editor = dest_usr WHERE editor = src_usr;
187         UPDATE biblio.record_note SET creator = dest_usr WHERE creator = src_usr;
188         UPDATE biblio.record_note SET editor = dest_usr WHERE editor = src_usr;
189
190         -- container.*
191         -- Update buckets with a rename to avoid collisions
192         FOR renamable_row in
193                 SELECT id, name
194                 FROM   container.biblio_record_entry_bucket
195                 WHERE  owner = src_usr
196         LOOP
197                 suffix := ' (' || src_usr || ')';
198                 LOOP
199                         BEGIN
200                                 UPDATE  container.biblio_record_entry_bucket
201                                 SET     owner = dest_usr, name = name || suffix
202                                 WHERE   id = renamable_row.id;
203                         EXCEPTION WHEN unique_violation THEN
204                                 suffix := suffix || ' ';
205                                 CONTINUE;
206                         END;
207                         EXIT;
208                 END LOOP;
209         END LOOP;
210
211         FOR renamable_row in
212                 SELECT id, name
213                 FROM   container.call_number_bucket
214                 WHERE  owner = src_usr
215         LOOP
216                 suffix := ' (' || src_usr || ')';
217                 LOOP
218                         BEGIN
219                                 UPDATE  container.call_number_bucket
220                                 SET     owner = dest_usr, name = name || suffix
221                                 WHERE   id = renamable_row.id;
222                         EXCEPTION WHEN unique_violation THEN
223                                 suffix := suffix || ' ';
224                                 CONTINUE;
225                         END;
226                         EXIT;
227                 END LOOP;
228         END LOOP;
229
230         FOR renamable_row in
231                 SELECT id, name
232                 FROM   container.copy_bucket
233                 WHERE  owner = src_usr
234         LOOP
235                 suffix := ' (' || src_usr || ')';
236                 LOOP
237                         BEGIN
238                                 UPDATE  container.copy_bucket
239                                 SET     owner = dest_usr, name = name || suffix
240                                 WHERE   id = renamable_row.id;
241                         EXCEPTION WHEN unique_violation THEN
242                                 suffix := suffix || ' ';
243                                 CONTINUE;
244                         END;
245                         EXIT;
246                 END LOOP;
247         END LOOP;
248
249         FOR renamable_row in
250                 SELECT id, name
251                 FROM   container.user_bucket
252                 WHERE  owner = src_usr
253         LOOP
254                 suffix := ' (' || src_usr || ')';
255                 LOOP
256                         BEGIN
257                                 UPDATE  container.user_bucket
258                                 SET     owner = dest_usr, name = name || suffix
259                                 WHERE   id = renamable_row.id;
260                         EXCEPTION WHEN unique_violation THEN
261                                 suffix := suffix || ' ';
262                                 CONTINUE;
263                         END;
264                         EXIT;
265                 END LOOP;
266         END LOOP;
267
268         DELETE FROM container.user_bucket_item WHERE target_user = src_usr;
269
270         -- money.*
271         DELETE FROM money.billable_xact WHERE usr = src_usr;
272         DELETE FROM money.collections_tracker WHERE usr = src_usr;
273         UPDATE money.collections_tracker SET collector = dest_usr WHERE collector = src_usr;
274
275         -- permission.*
276         DELETE FROM permission.usr_grp_map WHERE usr = src_usr;
277         DELETE FROM permission.usr_object_perm_map WHERE usr = src_usr;
278         DELETE FROM permission.usr_perm_map WHERE usr = src_usr;
279         DELETE FROM permission.usr_work_ou_map WHERE usr = src_usr;
280
281         -- reporter.*
282         -- Update with a rename to avoid collisions
283         BEGIN
284                 FOR renamable_row in
285                         SELECT id, name
286                         FROM   reporter.output_folder
287                         WHERE  owner = src_usr
288                 LOOP
289                         suffix := ' (' || src_usr || ')';
290                         LOOP
291                                 BEGIN
292                                         UPDATE  reporter.output_folder
293                                         SET     owner = dest_usr, name = name || suffix
294                                         WHERE   id = renamable_row.id;
295                                 EXCEPTION WHEN unique_violation THEN
296                                         suffix := suffix || ' ';
297                                         CONTINUE;
298                                 END;
299                                 EXIT;
300                         END LOOP;
301                 END LOOP;
302         EXCEPTION WHEN undefined_table THEN
303                 -- do nothing
304         END;
305
306         BEGIN
307                 UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
308         EXCEPTION WHEN undefined_table THEN
309                 -- do nothing
310         END;
311
312         -- Update with a rename to avoid collisions
313         BEGIN
314                 FOR renamable_row in
315                         SELECT id, name
316                         FROM   reporter.report_folder
317                         WHERE  owner = src_usr
318                 LOOP
319                         suffix := ' (' || src_usr || ')';
320                         LOOP
321                                 BEGIN
322                                         UPDATE  reporter.report_folder
323                                         SET     owner = dest_usr, name = name || suffix
324                                         WHERE   id = renamable_row.id;
325                                 EXCEPTION WHEN unique_violation THEN
326                                         suffix := suffix || ' ';
327                                         CONTINUE;
328                                 END;
329                                 EXIT;
330                         END LOOP;
331                 END LOOP;
332         EXCEPTION WHEN undefined_table THEN
333                 -- do nothing
334         END;
335
336         BEGIN
337                 UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
338         EXCEPTION WHEN undefined_table THEN
339                 -- do nothing
340         END;
341
342         BEGIN
343                 UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
344         EXCEPTION WHEN undefined_table THEN
345                 -- do nothing
346         END;
347
348         -- Update with a rename to avoid collisions
349         BEGIN
350                 FOR renamable_row in
351                         SELECT id, name
352                         FROM   reporter.template_folder
353                         WHERE  owner = src_usr
354                 LOOP
355                         suffix := ' (' || src_usr || ')';
356                         LOOP
357                                 BEGIN
358                                         UPDATE  reporter.template_folder
359                                         SET     owner = dest_usr, name = name || suffix
360                                         WHERE   id = renamable_row.id;
361                                 EXCEPTION WHEN unique_violation THEN
362                                         suffix := suffix || ' ';
363                                         CONTINUE;
364                                 END;
365                                 EXIT;
366                         END LOOP;
367                 END LOOP;
368         EXCEPTION WHEN undefined_table THEN
369         -- do nothing
370         END;
371
372         -- vandelay.*
373         -- Update with a rename to avoid collisions
374         FOR renamable_row in
375                 SELECT id, name
376                 FROM   vandelay.queue
377                 WHERE  owner = src_usr
378         LOOP
379                 suffix := ' (' || src_usr || ')';
380                 LOOP
381                         BEGIN
382                                 UPDATE  vandelay.queue
383                                 SET     owner = dest_usr, name = name || suffix
384                                 WHERE   id = renamable_row.id;
385                         EXCEPTION WHEN unique_violation THEN
386                                 suffix := suffix || ' ';
387                                 CONTINUE;
388                         END;
389                         EXIT;
390                 END LOOP;
391         END LOOP;
392
393     UPDATE vandelay.session_tracker SET usr = dest_usr WHERE usr = src_usr;
394
395     -- NULL-ify addresses last so other cleanup (e.g. circ anonymization)
396     -- can access the information before deletion.
397         UPDATE actor.usr SET
398                 active = FALSE,
399                 card = NULL,
400                 mailing_address = NULL,
401                 billing_address = NULL
402         WHERE id = src_usr;
403
404 END;
405 $$ LANGUAGE plpgsql;
406
407 COMMIT;