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