LP#1715767: remove privacy waiver entries when purging user data
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.function.privacy_waiver_in_purge_data.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('XXXX');
4
5 CREATE OR REPLACE FUNCTION actor.usr_purge_data(
6         src_usr  IN INTEGER,
7         specified_dest_usr IN INTEGER
8 ) RETURNS VOID AS $$
9 DECLARE
10         suffix TEXT;
11         renamable_row RECORD;
12         dest_usr INTEGER;
13 BEGIN
14
15         IF specified_dest_usr IS NULL THEN
16                 dest_usr := 1; -- Admin user on stock installs
17         ELSE
18                 dest_usr := specified_dest_usr;
19         END IF;
20
21         -- acq.*
22         UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
23         UPDATE acq.lineitem SET creator = dest_usr WHERE creator = src_usr;
24         UPDATE acq.lineitem SET editor = dest_usr WHERE editor = src_usr;
25         UPDATE acq.lineitem SET selector = dest_usr WHERE selector = src_usr;
26         UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
27         UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
28     UPDATE acq.invoice SET closed_by = dest_usr WHERE closed_by = src_usr;
29         DELETE FROM acq.lineitem_usr_attr_definition WHERE usr = src_usr;
30
31         -- Update with a rename to avoid collisions
32         FOR renamable_row in
33                 SELECT id, name
34                 FROM   acq.picklist
35                 WHERE  owner = src_usr
36         LOOP
37                 suffix := ' (' || src_usr || ')';
38                 LOOP
39                         BEGIN
40                                 UPDATE  acq.picklist
41                                 SET     owner = dest_usr, name = name || suffix
42                                 WHERE   id = renamable_row.id;
43                         EXCEPTION WHEN unique_violation THEN
44                                 suffix := suffix || ' ';
45                                 CONTINUE;
46                         END;
47                         EXIT;
48                 END LOOP;
49         END LOOP;
50
51         UPDATE acq.picklist SET creator = dest_usr WHERE creator = src_usr;
52         UPDATE acq.picklist SET editor = dest_usr WHERE editor = src_usr;
53         UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
54         UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
55         UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
56         UPDATE acq.purchase_order SET creator = dest_usr WHERE creator = src_usr;
57         UPDATE acq.purchase_order SET editor = dest_usr WHERE editor = src_usr;
58         UPDATE acq.claim_event SET creator = dest_usr WHERE creator = src_usr;
59
60         -- action.*
61         DELETE FROM action.circulation WHERE usr = src_usr;
62         UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
63         UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
64         UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
65         UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
66         UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
67         DELETE FROM action.hold_request WHERE usr = src_usr;
68         UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
69         UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
70         DELETE FROM action.non_cataloged_circulation WHERE patron = src_usr;
71         UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
72         DELETE FROM action.survey_response WHERE usr = src_usr;
73         UPDATE action.fieldset SET owner = dest_usr WHERE owner = src_usr;
74         DELETE FROM action.usr_circ_history WHERE usr = src_usr;
75
76         -- actor.*
77         DELETE FROM actor.card WHERE usr = src_usr;
78         DELETE FROM actor.stat_cat_entry_usr_map WHERE target_usr = src_usr;
79         DELETE FROM actor.usr_privacy_waiver WHERE usr = src_usr;
80
81         -- The following update is intended to avoid transient violations of a foreign
82         -- key constraint, whereby actor.usr_address references itself.  It may not be
83         -- necessary, but it does no harm.
84         UPDATE actor.usr_address SET replaces = NULL
85                 WHERE usr = src_usr AND replaces IS NOT NULL;
86         DELETE FROM actor.usr_address WHERE usr = src_usr;
87         DELETE FROM actor.usr_note WHERE usr = src_usr;
88         UPDATE actor.usr_note SET creator = dest_usr WHERE creator = src_usr;
89         DELETE FROM actor.usr_org_unit_opt_in WHERE usr = src_usr;
90         UPDATE actor.usr_org_unit_opt_in SET staff = dest_usr WHERE staff = src_usr;
91         DELETE FROM actor.usr_setting WHERE usr = src_usr;
92         DELETE FROM actor.usr_standing_penalty WHERE usr = src_usr;
93         UPDATE actor.usr_standing_penalty SET staff = dest_usr WHERE staff = src_usr;
94
95         -- asset.*
96         UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
97         UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
98         UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
99         UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
100         UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
101         UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
102
103         -- auditor.*
104         DELETE FROM auditor.actor_usr_address_history WHERE id = src_usr;
105         DELETE FROM auditor.actor_usr_history WHERE id = src_usr;
106         UPDATE auditor.asset_call_number_history SET creator = dest_usr WHERE creator = src_usr;
107         UPDATE auditor.asset_call_number_history SET editor  = dest_usr WHERE editor  = src_usr;
108         UPDATE auditor.asset_copy_history SET creator = dest_usr WHERE creator = src_usr;
109         UPDATE auditor.asset_copy_history SET editor  = dest_usr WHERE editor  = src_usr;
110         UPDATE auditor.biblio_record_entry_history SET creator = dest_usr WHERE creator = src_usr;
111         UPDATE auditor.biblio_record_entry_history SET editor  = dest_usr WHERE editor  = src_usr;
112
113         -- biblio.*
114         UPDATE biblio.record_entry SET creator = dest_usr WHERE creator = src_usr;
115         UPDATE biblio.record_entry SET editor = dest_usr WHERE editor = src_usr;
116         UPDATE biblio.record_note SET creator = dest_usr WHERE creator = src_usr;
117         UPDATE biblio.record_note SET editor = dest_usr WHERE editor = src_usr;
118
119         -- container.*
120         -- Update buckets with a rename to avoid collisions
121         FOR renamable_row in
122                 SELECT id, name
123                 FROM   container.biblio_record_entry_bucket
124                 WHERE  owner = src_usr
125         LOOP
126                 suffix := ' (' || src_usr || ')';
127                 LOOP
128                         BEGIN
129                                 UPDATE  container.biblio_record_entry_bucket
130                                 SET     owner = dest_usr, name = name || suffix
131                                 WHERE   id = renamable_row.id;
132                         EXCEPTION WHEN unique_violation THEN
133                                 suffix := suffix || ' ';
134                                 CONTINUE;
135                         END;
136                         EXIT;
137                 END LOOP;
138         END LOOP;
139
140         FOR renamable_row in
141                 SELECT id, name
142                 FROM   container.call_number_bucket
143                 WHERE  owner = src_usr
144         LOOP
145                 suffix := ' (' || src_usr || ')';
146                 LOOP
147                         BEGIN
148                                 UPDATE  container.call_number_bucket
149                                 SET     owner = dest_usr, name = name || suffix
150                                 WHERE   id = renamable_row.id;
151                         EXCEPTION WHEN unique_violation THEN
152                                 suffix := suffix || ' ';
153                                 CONTINUE;
154                         END;
155                         EXIT;
156                 END LOOP;
157         END LOOP;
158
159         FOR renamable_row in
160                 SELECT id, name
161                 FROM   container.copy_bucket
162                 WHERE  owner = src_usr
163         LOOP
164                 suffix := ' (' || src_usr || ')';
165                 LOOP
166                         BEGIN
167                                 UPDATE  container.copy_bucket
168                                 SET     owner = dest_usr, name = name || suffix
169                                 WHERE   id = renamable_row.id;
170                         EXCEPTION WHEN unique_violation THEN
171                                 suffix := suffix || ' ';
172                                 CONTINUE;
173                         END;
174                         EXIT;
175                 END LOOP;
176         END LOOP;
177
178         FOR renamable_row in
179                 SELECT id, name
180                 FROM   container.user_bucket
181                 WHERE  owner = src_usr
182         LOOP
183                 suffix := ' (' || src_usr || ')';
184                 LOOP
185                         BEGIN
186                                 UPDATE  container.user_bucket
187                                 SET     owner = dest_usr, name = name || suffix
188                                 WHERE   id = renamable_row.id;
189                         EXCEPTION WHEN unique_violation THEN
190                                 suffix := suffix || ' ';
191                                 CONTINUE;
192                         END;
193                         EXIT;
194                 END LOOP;
195         END LOOP;
196
197         DELETE FROM container.user_bucket_item WHERE target_user = src_usr;
198
199         -- money.*
200         DELETE FROM money.billable_xact WHERE usr = src_usr;
201         DELETE FROM money.collections_tracker WHERE usr = src_usr;
202         UPDATE money.collections_tracker SET collector = dest_usr WHERE collector = src_usr;
203
204         -- permission.*
205         DELETE FROM permission.usr_grp_map WHERE usr = src_usr;
206         DELETE FROM permission.usr_object_perm_map WHERE usr = src_usr;
207         DELETE FROM permission.usr_perm_map WHERE usr = src_usr;
208         DELETE FROM permission.usr_work_ou_map WHERE usr = src_usr;
209
210         -- reporter.*
211         -- Update with a rename to avoid collisions
212         BEGIN
213                 FOR renamable_row in
214                         SELECT id, name
215                         FROM   reporter.output_folder
216                         WHERE  owner = src_usr
217                 LOOP
218                         suffix := ' (' || src_usr || ')';
219                         LOOP
220                                 BEGIN
221                                         UPDATE  reporter.output_folder
222                                         SET     owner = dest_usr, name = name || suffix
223                                         WHERE   id = renamable_row.id;
224                                 EXCEPTION WHEN unique_violation THEN
225                                         suffix := suffix || ' ';
226                                         CONTINUE;
227                                 END;
228                                 EXIT;
229                         END LOOP;
230                 END LOOP;
231         EXCEPTION WHEN undefined_table THEN
232                 -- do nothing
233         END;
234
235         BEGIN
236                 UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
237         EXCEPTION WHEN undefined_table THEN
238                 -- do nothing
239         END;
240
241         -- Update with a rename to avoid collisions
242         BEGIN
243                 FOR renamable_row in
244                         SELECT id, name
245                         FROM   reporter.report_folder
246                         WHERE  owner = src_usr
247                 LOOP
248                         suffix := ' (' || src_usr || ')';
249                         LOOP
250                                 BEGIN
251                                         UPDATE  reporter.report_folder
252                                         SET     owner = dest_usr, name = name || suffix
253                                         WHERE   id = renamable_row.id;
254                                 EXCEPTION WHEN unique_violation THEN
255                                         suffix := suffix || ' ';
256                                         CONTINUE;
257                                 END;
258                                 EXIT;
259                         END LOOP;
260                 END LOOP;
261         EXCEPTION WHEN undefined_table THEN
262                 -- do nothing
263         END;
264
265         BEGIN
266                 UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
267         EXCEPTION WHEN undefined_table THEN
268                 -- do nothing
269         END;
270
271         BEGIN
272                 UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
273         EXCEPTION WHEN undefined_table THEN
274                 -- do nothing
275         END;
276
277         -- Update with a rename to avoid collisions
278         BEGIN
279                 FOR renamable_row in
280                         SELECT id, name
281                         FROM   reporter.template_folder
282                         WHERE  owner = src_usr
283                 LOOP
284                         suffix := ' (' || src_usr || ')';
285                         LOOP
286                                 BEGIN
287                                         UPDATE  reporter.template_folder
288                                         SET     owner = dest_usr, name = name || suffix
289                                         WHERE   id = renamable_row.id;
290                                 EXCEPTION WHEN unique_violation THEN
291                                         suffix := suffix || ' ';
292                                         CONTINUE;
293                                 END;
294                                 EXIT;
295                         END LOOP;
296                 END LOOP;
297         EXCEPTION WHEN undefined_table THEN
298         -- do nothing
299         END;
300
301         -- vandelay.*
302         -- Update with a rename to avoid collisions
303         FOR renamable_row in
304                 SELECT id, name
305                 FROM   vandelay.queue
306                 WHERE  owner = src_usr
307         LOOP
308                 suffix := ' (' || src_usr || ')';
309                 LOOP
310                         BEGIN
311                                 UPDATE  vandelay.queue
312                                 SET     owner = dest_usr, name = name || suffix
313                                 WHERE   id = renamable_row.id;
314                         EXCEPTION WHEN unique_violation THEN
315                                 suffix := suffix || ' ';
316                                 CONTINUE;
317                         END;
318                         EXIT;
319                 END LOOP;
320         END LOOP;
321
322     UPDATE vandelay.session_tracker SET usr = dest_usr WHERE usr = src_usr;
323
324     -- NULL-ify addresses last so other cleanup (e.g. circ anonymization)
325     -- can access the information before deletion.
326         UPDATE actor.usr SET
327                 active = FALSE,
328                 card = NULL,
329                 mailing_address = NULL,
330                 billing_address = NULL
331         WHERE id = src_usr;
332
333 END;
334 $$ LANGUAGE plpgsql;
335
336 COMMENT ON FUNCTION actor.usr_purge_data(INT, INT) IS $$
337 Finds rows dependent on a given row in actor.usr and either deletes them
338 or reassigns them to a different user.
339 $$;
340
341 COMMIT;
342