]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/XXXX.schema.actor_usr_merge-bail-on-same-user.sql
9f295c99e77803b47ae08492c575e5c3cdf09c65
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema.actor_usr_merge-bail-on-same-user.sql
1 BEGIN;
2
3 -- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
4
5 CREATE OR REPLACE FUNCTION actor.usr_merge( src_usr INT, dest_usr INT, del_addrs BOOLEAN, del_cards BOOLEAN, deactivate_cards BOOLEAN ) RETURNS VOID AS $$
6 DECLARE
7         suffix TEXT;
8         bucket_row RECORD;
9         picklist_row RECORD;
10         queue_row RECORD;
11         folder_row RECORD;
12 BEGIN
13
14     -- Bail if src_usr equals dest_usr because the result of merging a
15     -- user with itself probably not what you want.
16     IF src_usr = dest_usr THEN
17         RETURN;
18     END IF;
19
20     -- do some initial cleanup 
21     UPDATE actor.usr SET card = NULL WHERE id = src_usr;
22     UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
23     UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
24
25     -- actor.*
26     IF del_cards THEN
27         DELETE FROM actor.card where usr = src_usr;
28     ELSE
29         IF deactivate_cards THEN
30             UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
31         END IF;
32         UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
33     END IF;
34
35
36     IF del_addrs THEN
37         DELETE FROM actor.usr_address WHERE usr = src_usr;
38     ELSE
39         UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
40     END IF;
41
42     UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
43     -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
44     UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
45     PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
46     PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
47
48     -- permission.*
49     PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
50     PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
51     PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
52     PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
53
54
55     -- container.*
56         
57         -- For each *_bucket table: transfer every bucket belonging to src_usr
58         -- into the custody of dest_usr.
59         --
60         -- In order to avoid colliding with an existing bucket owned by
61         -- the destination user, append the source user's id (in parenthesese)
62         -- to the name.  If you still get a collision, add successive
63         -- spaces to the name and keep trying until you succeed.
64         --
65         FOR bucket_row in
66                 SELECT id, name
67                 FROM   container.biblio_record_entry_bucket
68                 WHERE  owner = src_usr
69         LOOP
70                 suffix := ' (' || src_usr || ')';
71                 LOOP
72                         BEGIN
73                                 UPDATE  container.biblio_record_entry_bucket
74                                 SET     owner = dest_usr, name = name || suffix
75                                 WHERE   id = bucket_row.id;
76                         EXCEPTION WHEN unique_violation THEN
77                                 suffix := suffix || ' ';
78                                 CONTINUE;
79                         END;
80                         EXIT;
81                 END LOOP;
82         END LOOP;
83
84         FOR bucket_row in
85                 SELECT id, name
86                 FROM   container.call_number_bucket
87                 WHERE  owner = src_usr
88         LOOP
89                 suffix := ' (' || src_usr || ')';
90                 LOOP
91                         BEGIN
92                                 UPDATE  container.call_number_bucket
93                                 SET     owner = dest_usr, name = name || suffix
94                                 WHERE   id = bucket_row.id;
95                         EXCEPTION WHEN unique_violation THEN
96                                 suffix := suffix || ' ';
97                                 CONTINUE;
98                         END;
99                         EXIT;
100                 END LOOP;
101         END LOOP;
102
103         FOR bucket_row in
104                 SELECT id, name
105                 FROM   container.copy_bucket
106                 WHERE  owner = src_usr
107         LOOP
108                 suffix := ' (' || src_usr || ')';
109                 LOOP
110                         BEGIN
111                                 UPDATE  container.copy_bucket
112                                 SET     owner = dest_usr, name = name || suffix
113                                 WHERE   id = bucket_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         FOR bucket_row in
123                 SELECT id, name
124                 FROM   container.user_bucket
125                 WHERE  owner = src_usr
126         LOOP
127                 suffix := ' (' || src_usr || ')';
128                 LOOP
129                         BEGIN
130                                 UPDATE  container.user_bucket
131                                 SET     owner = dest_usr, name = name || suffix
132                                 WHERE   id = bucket_row.id;
133                         EXCEPTION WHEN unique_violation THEN
134                                 suffix := suffix || ' ';
135                                 CONTINUE;
136                         END;
137                         EXIT;
138                 END LOOP;
139         END LOOP;
140
141         UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
142
143     -- vandelay.*
144         -- transfer queues the same way we transfer buckets (see above)
145         FOR queue_row in
146                 SELECT id, name
147                 FROM   vandelay.queue
148                 WHERE  owner = src_usr
149         LOOP
150                 suffix := ' (' || src_usr || ')';
151                 LOOP
152                         BEGIN
153                                 UPDATE  vandelay.queue
154                                 SET     owner = dest_usr, name = name || suffix
155                                 WHERE   id = queue_row.id;
156                         EXCEPTION WHEN unique_violation THEN
157                                 suffix := suffix || ' ';
158                                 CONTINUE;
159                         END;
160                         EXIT;
161                 END LOOP;
162         END LOOP;
163
164     -- money.*
165     PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
166     PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
167     UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
168     UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
169     UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
170
171     -- action.*
172     UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
173     UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
174     UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
175     UPDATE action.usr_circ_history SET usr = dest_usr WHERE usr = src_usr;
176
177     UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
178     UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
179     UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
180     UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
181
182     UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
183     UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
184     UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
185     UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
186     UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
187
188     -- acq.*
189     UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
190         UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
191
192         -- transfer picklists the same way we transfer buckets (see above)
193         FOR picklist_row in
194                 SELECT id, name
195                 FROM   acq.picklist
196                 WHERE  owner = src_usr
197         LOOP
198                 suffix := ' (' || src_usr || ')';
199                 LOOP
200                         BEGIN
201                                 UPDATE  acq.picklist
202                                 SET     owner = dest_usr, name = name || suffix
203                                 WHERE   id = picklist_row.id;
204                         EXCEPTION WHEN unique_violation THEN
205                                 suffix := suffix || ' ';
206                                 CONTINUE;
207                         END;
208                         EXIT;
209                 END LOOP;
210         END LOOP;
211
212     UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
213     UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
214     UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
215     UPDATE acq.provider_note SET creator = dest_usr WHERE creator = src_usr;
216     UPDATE acq.provider_note SET editor = dest_usr WHERE editor = src_usr;
217     UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
218     UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
219     UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
220
221     -- asset.*
222     UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
223     UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
224     UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
225     UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
226     UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
227     UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
228
229     -- serial.*
230     UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
231     UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
232
233     -- reporter.*
234     -- It's not uncommon to define the reporter schema in a replica 
235     -- DB only, so don't assume these tables exist in the write DB.
236     BEGIN
237         UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
238     EXCEPTION WHEN undefined_table THEN
239         -- do nothing
240     END;
241     BEGIN
242         UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
243     EXCEPTION WHEN undefined_table THEN
244         -- do nothing
245     END;
246     BEGIN
247         UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
248     EXCEPTION WHEN undefined_table THEN
249         -- do nothing
250     END;
251     BEGIN
252                 -- transfer folders the same way we transfer buckets (see above)
253                 FOR folder_row in
254                         SELECT id, name
255                         FROM   reporter.template_folder
256                         WHERE  owner = src_usr
257                 LOOP
258                         suffix := ' (' || src_usr || ')';
259                         LOOP
260                                 BEGIN
261                                         UPDATE  reporter.template_folder
262                                         SET     owner = dest_usr, name = name || suffix
263                                         WHERE   id = folder_row.id;
264                                 EXCEPTION WHEN unique_violation THEN
265                                         suffix := suffix || ' ';
266                                         CONTINUE;
267                                 END;
268                                 EXIT;
269                         END LOOP;
270                 END LOOP;
271     EXCEPTION WHEN undefined_table THEN
272         -- do nothing
273     END;
274     BEGIN
275                 -- transfer folders the same way we transfer buckets (see above)
276                 FOR folder_row in
277                         SELECT id, name
278                         FROM   reporter.report_folder
279                         WHERE  owner = src_usr
280                 LOOP
281                         suffix := ' (' || src_usr || ')';
282                         LOOP
283                                 BEGIN
284                                         UPDATE  reporter.report_folder
285                                         SET     owner = dest_usr, name = name || suffix
286                                         WHERE   id = folder_row.id;
287                                 EXCEPTION WHEN unique_violation THEN
288                                         suffix := suffix || ' ';
289                                         CONTINUE;
290                                 END;
291                                 EXIT;
292                         END LOOP;
293                 END LOOP;
294     EXCEPTION WHEN undefined_table THEN
295         -- do nothing
296     END;
297     BEGIN
298                 -- transfer folders the same way we transfer buckets (see above)
299                 FOR folder_row in
300                         SELECT id, name
301                         FROM   reporter.output_folder
302                         WHERE  owner = src_usr
303                 LOOP
304                         suffix := ' (' || src_usr || ')';
305                         LOOP
306                                 BEGIN
307                                         UPDATE  reporter.output_folder
308                                         SET     owner = dest_usr, name = name || suffix
309                                         WHERE   id = folder_row.id;
310                                 EXCEPTION WHEN unique_violation THEN
311                                         suffix := suffix || ' ';
312                                         CONTINUE;
313                                 END;
314                                 EXIT;
315                         END LOOP;
316                 END LOOP;
317     EXCEPTION WHEN undefined_table THEN
318         -- do nothing
319     END;
320
321     -- Finally, delete the source user
322     DELETE FROM actor.usr WHERE id = src_usr;
323
324 END;
325 $$ LANGUAGE plpgsql;
326
327 COMMIT;