]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0121.schema.acq_fund_transfer.sql
LP#1178377: Make bib source optional element from unapi.bre
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0121.schema.acq_fund_transfer.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0121'); -- Scott McKellar
4
5 CREATE TABLE acq.fund_transfer (
6         id               SERIAL         PRIMARY KEY,
7         src_fund         INT            NOT NULL REFERENCES acq.fund( id )
8                                         DEFERRABLE INITIALLY DEFERRED,
9         src_amount       NUMERIC        NOT NULL,
10         dest_fund        INT            NOT NULL REFERENCES acq.fund( id )
11                                         DEFERRABLE INITIALLY DEFERRED,
12         dest_amount      NUMERIC        NOT NULL,
13         transfer_time    TIMESTAMPTZ    NOT NULL DEFAULT now(),
14         transfer_user    INT            NOT NULL REFERENCES actor.usr( id )
15                                         DEFERRABLE INITIALLY DEFERRED,
16         note             TEXT
17 );
18
19 CREATE INDEX acqftr_usr_idx
20 ON acq.fund_transfer( transfer_user );
21
22 COMMENT ON TABLE acq.fund_transfer IS $$
23 /*
24  * Copyright (C) 2009  Georgia Public Library Service
25  * Scott McKellar <scott@esilibrary.com>
26  *
27  * Fund Transfer
28  *
29  * Each row represents the transfer of money from a source fund
30  * to a destination fund.  There should be corresponding entries
31  * in acq.fund_allocation.  The purpose of acq.fund_transfer is
32  * to record how much money moved from which fund to which other
33  * fund.
34  * 
35  * The presence of two amount fields, rather than one, reflects
36  * the possibility that the two funds are denominated in different
37  * currencies.  If they use the same currency type, the two
38  * amounts should be the same.
39  *
40  * ****
41  *
42  * This program is free software; you can redistribute it and/or
43  * modify it under the terms of the GNU General Public License
44  * as published by the Free Software Foundation; either version 2
45  * of the License, or (at your option) any later version.
46  *
47  * This program is distributed in the hope that it will be useful,
48  * but WITHOUT ANY WARRANTY; without even the implied warranty of
49  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
50  * GNU General Public License for more details.
51  */
52 $$;
53
54 CREATE OR REPLACE FUNCTION actor.usr_merge(
55         src_usr INT,
56         dest_usr INT,
57         del_addrs BOOLEAN,
58         del_cards BOOLEAN,
59         deactivate_cards BOOLEAN
60 ) RETURNS VOID AS $$
61 DECLARE
62         suffix TEXT;
63         bucket_row RECORD;
64         picklist_row RECORD;
65         queue_row RECORD;
66         folder_row RECORD;
67 BEGIN
68
69     -- do some initial cleanup 
70     UPDATE actor.usr SET card = NULL WHERE id = src_usr;
71     UPDATE actor.usr SET mailing_address = NULL WHERE id = src_usr;
72     UPDATE actor.usr SET billing_address = NULL WHERE id = src_usr;
73
74     -- actor.*
75     IF del_cards THEN
76         DELETE FROM actor.card where usr = src_usr;
77     ELSE
78         IF deactivate_cards THEN
79             UPDATE actor.card SET active = 'f' WHERE usr = src_usr;
80         END IF;
81         UPDATE actor.card SET usr = dest_usr WHERE usr = src_usr;
82     END IF;
83
84
85     IF del_addrs THEN
86         DELETE FROM actor.usr_address WHERE usr = src_usr;
87     ELSE
88         UPDATE actor.usr_address SET usr = dest_usr WHERE usr = src_usr;
89     END IF;
90
91     UPDATE actor.usr_note SET usr = dest_usr WHERE usr = src_usr;
92     -- dupes are technically OK in actor.usr_standing_penalty, should manually delete them...
93     UPDATE actor.usr_standing_penalty SET usr = dest_usr WHERE usr = src_usr;
94     PERFORM actor.usr_merge_rows('actor.usr_org_unit_opt_in', 'usr', src_usr, dest_usr);
95     PERFORM actor.usr_merge_rows('actor.usr_setting', 'usr', src_usr, dest_usr);
96
97     -- permission.*
98     PERFORM actor.usr_merge_rows('permission.usr_perm_map', 'usr', src_usr, dest_usr);
99     PERFORM actor.usr_merge_rows('permission.usr_object_perm_map', 'usr', src_usr, dest_usr);
100     PERFORM actor.usr_merge_rows('permission.usr_grp_map', 'usr', src_usr, dest_usr);
101     PERFORM actor.usr_merge_rows('permission.usr_work_ou_map', 'usr', src_usr, dest_usr);
102
103
104     -- container.*
105         
106         -- For each *_bucket table: transfer every bucket belonging to src_usr
107         -- into the custody of dest_usr.
108         --
109         -- In order to avoid colliding with an existing bucket owned by
110         -- the destination user, append the source user's id (in parenthesese)
111         -- to the name.  If you still get a collision, add successive
112         -- spaces to the name and keep trying until you succeed.
113         --
114         FOR bucket_row in
115                 SELECT id, name
116                 FROM   container.biblio_record_entry_bucket
117                 WHERE  owner = src_usr
118         LOOP
119                 suffix := ' (' || src_usr || ')';
120                 LOOP
121                         BEGIN
122                                 UPDATE  container.biblio_record_entry_bucket
123                                 SET     owner = dest_usr, name = name || suffix
124                                 WHERE   id = bucket_row.id;
125                         EXCEPTION WHEN unique_violation THEN
126                                 suffix := suffix || ' ';
127                                 CONTINUE;
128                         END;
129                         EXIT;
130                 END LOOP;
131         END LOOP;
132
133         FOR bucket_row in
134                 SELECT id, name
135                 FROM   container.call_number_bucket
136                 WHERE  owner = src_usr
137         LOOP
138                 suffix := ' (' || src_usr || ')';
139                 LOOP
140                         BEGIN
141                                 UPDATE  container.call_number_bucket
142                                 SET     owner = dest_usr, name = name || suffix
143                                 WHERE   id = bucket_row.id;
144                         EXCEPTION WHEN unique_violation THEN
145                                 suffix := suffix || ' ';
146                                 CONTINUE;
147                         END;
148                         EXIT;
149                 END LOOP;
150         END LOOP;
151
152         FOR bucket_row in
153                 SELECT id, name
154                 FROM   container.copy_bucket
155                 WHERE  owner = src_usr
156         LOOP
157                 suffix := ' (' || src_usr || ')';
158                 LOOP
159                         BEGIN
160                                 UPDATE  container.copy_bucket
161                                 SET     owner = dest_usr, name = name || suffix
162                                 WHERE   id = bucket_row.id;
163                         EXCEPTION WHEN unique_violation THEN
164                                 suffix := suffix || ' ';
165                                 CONTINUE;
166                         END;
167                         EXIT;
168                 END LOOP;
169         END LOOP;
170
171         FOR bucket_row in
172                 SELECT id, name
173                 FROM   container.user_bucket
174                 WHERE  owner = src_usr
175         LOOP
176                 suffix := ' (' || src_usr || ')';
177                 LOOP
178                         BEGIN
179                                 UPDATE  container.user_bucket
180                                 SET     owner = dest_usr, name = name || suffix
181                                 WHERE   id = bucket_row.id;
182                         EXCEPTION WHEN unique_violation THEN
183                                 suffix := suffix || ' ';
184                                 CONTINUE;
185                         END;
186                         EXIT;
187                 END LOOP;
188         END LOOP;
189
190         UPDATE container.user_bucket_item SET target_user = dest_usr WHERE target_user = src_usr;
191
192     -- vandelay.*
193         -- transfer queues the same way we transfer buckets (see above)
194         FOR queue_row in
195                 SELECT id, name
196                 FROM   vandelay.queue
197                 WHERE  owner = src_usr
198         LOOP
199                 suffix := ' (' || src_usr || ')';
200                 LOOP
201                         BEGIN
202                                 UPDATE  vandelay.queue
203                                 SET     owner = dest_usr, name = name || suffix
204                                 WHERE   id = queue_row.id;
205                         EXCEPTION WHEN unique_violation THEN
206                                 suffix := suffix || ' ';
207                                 CONTINUE;
208                         END;
209                         EXIT;
210                 END LOOP;
211         END LOOP;
212
213     -- money.*
214     PERFORM actor.usr_merge_rows('money.collections_tracker', 'usr', src_usr, dest_usr);
215     PERFORM actor.usr_merge_rows('money.collections_tracker', 'collector', src_usr, dest_usr);
216     UPDATE money.billable_xact SET usr = dest_usr WHERE usr = src_usr;
217     UPDATE money.billing SET voider = dest_usr WHERE voider = src_usr;
218     UPDATE money.bnm_payment SET accepting_usr = dest_usr WHERE accepting_usr = src_usr;
219
220     -- action.*
221     UPDATE action.circulation SET usr = dest_usr WHERE usr = src_usr;
222     UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
223     UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
224
225     UPDATE action.hold_request SET usr = dest_usr WHERE usr = src_usr;
226     UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
227     UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
228     UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
229
230     UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
231     UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
232     UPDATE action.non_cataloged_circulation SET patron = dest_usr WHERE patron = src_usr;
233     UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
234     UPDATE action.survey_response SET usr = dest_usr WHERE usr = src_usr;
235
236     -- acq.*
237     UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
238     UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
239
240         -- transfer picklists the same way we transfer buckets (see above)
241         FOR picklist_row in
242                 SELECT id, name
243                 FROM   acq.picklist
244                 WHERE  owner = src_usr
245         LOOP
246                 suffix := ' (' || src_usr || ')';
247                 LOOP
248                         BEGIN
249                                 UPDATE  acq.picklist
250                                 SET     owner = dest_usr, name = name || suffix
251                                 WHERE   id = picklist_row.id;
252                         EXCEPTION WHEN unique_violation THEN
253                                 suffix := suffix || ' ';
254                                 CONTINUE;
255                         END;
256                         EXIT;
257                 END LOOP;
258         END LOOP;
259
260     UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
261     UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
262     UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
263     UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
264     UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
265     UPDATE acq.lineitem_usr_attr_definition SET usr = dest_usr WHERE usr = src_usr;
266
267     -- asset.*
268     UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
269     UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
270     UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
271     UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
272     UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
273     UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
274
275     -- serial.*
276     UPDATE serial.record_entry SET creator = dest_usr WHERE creator = src_usr;
277     UPDATE serial.record_entry SET editor = dest_usr WHERE editor = src_usr;
278
279     -- reporter.*
280     -- It's not uncommon to define the reporter schema in a replica 
281     -- DB only, so don't assume these tables exist in the write DB.
282     BEGIN
283         UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
284     EXCEPTION WHEN undefined_table THEN
285         -- do nothing
286     END;
287     BEGIN
288         UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
289     EXCEPTION WHEN undefined_table THEN
290         -- do nothing
291     END;
292     BEGIN
293         UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
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.template_folder
302                         WHERE  owner = src_usr
303                 LOOP
304                         suffix := ' (' || src_usr || ')';
305                         LOOP
306                                 BEGIN
307                                         UPDATE  reporter.template_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     BEGIN
321                 -- transfer folders the same way we transfer buckets (see above)
322                 FOR folder_row in
323                         SELECT id, name
324                         FROM   reporter.report_folder
325                         WHERE  owner = src_usr
326                 LOOP
327                         suffix := ' (' || src_usr || ')';
328                         LOOP
329                                 BEGIN
330                                         UPDATE  reporter.report_folder
331                                         SET     owner = dest_usr, name = name || suffix
332                                         WHERE   id = folder_row.id;
333                                 EXCEPTION WHEN unique_violation THEN
334                                         suffix := suffix || ' ';
335                                         CONTINUE;
336                                 END;
337                                 EXIT;
338                         END LOOP;
339                 END LOOP;
340     EXCEPTION WHEN undefined_table THEN
341         -- do nothing
342     END;
343     BEGIN
344                 -- transfer folders the same way we transfer buckets (see above)
345                 FOR folder_row in
346                         SELECT id, name
347                         FROM   reporter.output_folder
348                         WHERE  owner = src_usr
349                 LOOP
350                         suffix := ' (' || src_usr || ')';
351                         LOOP
352                                 BEGIN
353                                         UPDATE  reporter.output_folder
354                                         SET     owner = dest_usr, name = name || suffix
355                                         WHERE   id = folder_row.id;
356                                 EXCEPTION WHEN unique_violation THEN
357                                         suffix := suffix || ' ';
358                                         CONTINUE;
359                                 END;
360                                 EXIT;
361                         END LOOP;
362                 END LOOP;
363     EXCEPTION WHEN undefined_table THEN
364         -- do nothing
365     END;
366
367     -- Finally, delete the source user
368     DELETE FROM actor.usr WHERE id = src_usr;
369
370 END;
371 $$ LANGUAGE plpgsql;
372
373 CREATE OR REPLACE FUNCTION actor.usr_purge_data(
374         src_usr  IN INTEGER,
375         dest_usr IN INTEGER
376 ) RETURNS VOID AS $$
377 DECLARE
378         suffix TEXT;
379         renamable_row RECORD;
380 BEGIN
381
382         UPDATE actor.usr SET
383                 active = FALSE,
384                 card = NULL,
385                 mailing_address = NULL,
386                 billing_address = NULL
387         WHERE id = src_usr;
388
389         -- acq.*
390         UPDATE acq.fund_allocation SET allocator = dest_usr WHERE allocator = src_usr;
391     UPDATE acq.fund_transfer SET transfer_user = dest_usr WHERE transfer_user = src_usr;
392         UPDATE acq.lineitem SET creator = dest_usr WHERE creator = src_usr;
393         UPDATE acq.lineitem SET editor = dest_usr WHERE editor = src_usr;
394         UPDATE acq.lineitem SET selector = dest_usr WHERE selector = src_usr;
395         UPDATE acq.lineitem_note SET creator = dest_usr WHERE creator = src_usr;
396         UPDATE acq.lineitem_note SET editor = dest_usr WHERE editor = src_usr;
397         DELETE FROM acq.lineitem_usr_attr_definition WHERE usr = src_usr;
398
399         -- Update with a rename to avoid collisions
400         FOR renamable_row in
401                 SELECT id, name
402                 FROM   acq.picklist
403                 WHERE  owner = src_usr
404         LOOP
405                 suffix := ' (' || src_usr || ')';
406                 LOOP
407                         BEGIN
408                                 UPDATE  acq.picklist
409                                 SET     owner = dest_usr, name = name || suffix
410                                 WHERE   id = renamable_row.id;
411                         EXCEPTION WHEN unique_violation THEN
412                                 suffix := suffix || ' ';
413                                 CONTINUE;
414                         END;
415                         EXIT;
416                 END LOOP;
417         END LOOP;
418
419         UPDATE acq.picklist SET creator = dest_usr WHERE creator = src_usr;
420         UPDATE acq.picklist SET editor = dest_usr WHERE editor = src_usr;
421         UPDATE acq.po_note SET creator = dest_usr WHERE creator = src_usr;
422         UPDATE acq.po_note SET editor = dest_usr WHERE editor = src_usr;
423         UPDATE acq.purchase_order SET owner = dest_usr WHERE owner = src_usr;
424         UPDATE acq.purchase_order SET creator = dest_usr WHERE creator = src_usr;
425         UPDATE acq.purchase_order SET editor = dest_usr WHERE editor = src_usr;
426
427         -- action.*
428         DELETE FROM action.circulation WHERE usr = src_usr;
429         UPDATE action.circulation SET circ_staff = dest_usr WHERE circ_staff = src_usr;
430         UPDATE action.circulation SET checkin_staff = dest_usr WHERE checkin_staff = src_usr;
431         UPDATE action.hold_notification SET notify_staff = dest_usr WHERE notify_staff = src_usr;
432         UPDATE action.hold_request SET fulfillment_staff = dest_usr WHERE fulfillment_staff = src_usr;
433         UPDATE action.hold_request SET requestor = dest_usr WHERE requestor = src_usr;
434         DELETE FROM action.hold_request WHERE usr = src_usr;
435         UPDATE action.in_house_use SET staff = dest_usr WHERE staff = src_usr;
436         UPDATE action.non_cat_in_house_use SET staff = dest_usr WHERE staff = src_usr;
437         DELETE FROM action.non_cataloged_circulation WHERE patron = src_usr;
438         UPDATE action.non_cataloged_circulation SET staff = dest_usr WHERE staff = src_usr;
439         DELETE FROM action.survey_response WHERE usr = src_usr;
440
441         -- actor.*
442         DELETE FROM actor.card WHERE usr = src_usr;
443         DELETE FROM actor.stat_cat_entry_usr_map WHERE target_usr = src_usr;
444
445         -- The following update is intended to avoid transient violations of a foreign
446         -- key constraint, whereby actor.usr_address references itself.  It may not be
447         -- necessary, but it does no harm.
448         UPDATE actor.usr_address SET replaces = NULL
449                 WHERE usr = src_usr AND replaces IS NOT NULL;
450         DELETE FROM actor.usr_address WHERE usr = src_usr;
451         DELETE FROM actor.usr_note WHERE usr = src_usr;
452         UPDATE actor.usr_note SET creator = dest_usr WHERE creator = src_usr;
453         DELETE FROM actor.usr_org_unit_opt_in WHERE usr = src_usr;
454         UPDATE actor.usr_org_unit_opt_in SET staff = dest_usr WHERE staff = src_usr;
455         DELETE FROM actor.usr_setting WHERE usr = src_usr;
456         DELETE FROM actor.usr_standing_penalty WHERE usr = src_usr;
457         UPDATE actor.usr_standing_penalty SET staff = dest_usr WHERE staff = src_usr;
458
459         -- asset.*
460         UPDATE asset.call_number SET creator = dest_usr WHERE creator = src_usr;
461         UPDATE asset.call_number SET editor = dest_usr WHERE editor = src_usr;
462         UPDATE asset.call_number_note SET creator = dest_usr WHERE creator = src_usr;
463         UPDATE asset.copy SET creator = dest_usr WHERE creator = src_usr;
464         UPDATE asset.copy SET editor = dest_usr WHERE editor = src_usr;
465         UPDATE asset.copy_note SET creator = dest_usr WHERE creator = src_usr;
466
467         -- auditor.*
468         DELETE FROM auditor.actor_usr_address_history WHERE id = src_usr;
469         DELETE FROM auditor.actor_usr_history WHERE id = src_usr;
470         UPDATE auditor.asset_call_number_history SET creator = dest_usr WHERE creator = src_usr;
471         UPDATE auditor.asset_call_number_history SET editor  = dest_usr WHERE editor  = src_usr;
472         UPDATE auditor.asset_copy_history SET creator = dest_usr WHERE creator = src_usr;
473         UPDATE auditor.asset_copy_history SET editor  = dest_usr WHERE editor  = src_usr;
474         UPDATE auditor.biblio_record_entry_history SET creator = dest_usr WHERE creator = src_usr;
475         UPDATE auditor.biblio_record_entry_history SET editor  = dest_usr WHERE editor  = src_usr;
476
477         -- biblio.*
478         UPDATE biblio.record_entry SET creator = dest_usr WHERE creator = src_usr;
479         UPDATE biblio.record_entry SET editor = dest_usr WHERE editor = src_usr;
480         UPDATE biblio.record_note SET creator = dest_usr WHERE creator = src_usr;
481         UPDATE biblio.record_note SET editor = dest_usr WHERE editor = src_usr;
482
483         -- container.*
484         -- Update buckets with a rename to avoid collisions
485         FOR renamable_row in
486                 SELECT id, name
487                 FROM   container.biblio_record_entry_bucket
488                 WHERE  owner = src_usr
489         LOOP
490                 suffix := ' (' || src_usr || ')';
491                 LOOP
492                         BEGIN
493                                 UPDATE  container.biblio_record_entry_bucket
494                                 SET     owner = dest_usr, name = name || suffix
495                                 WHERE   id = renamable_row.id;
496                         EXCEPTION WHEN unique_violation THEN
497                                 suffix := suffix || ' ';
498                                 CONTINUE;
499                         END;
500                         EXIT;
501                 END LOOP;
502         END LOOP;
503
504         FOR renamable_row in
505                 SELECT id, name
506                 FROM   container.call_number_bucket
507                 WHERE  owner = src_usr
508         LOOP
509                 suffix := ' (' || src_usr || ')';
510                 LOOP
511                         BEGIN
512                                 UPDATE  container.call_number_bucket
513                                 SET     owner = dest_usr, name = name || suffix
514                                 WHERE   id = renamable_row.id;
515                         EXCEPTION WHEN unique_violation THEN
516                                 suffix := suffix || ' ';
517                                 CONTINUE;
518                         END;
519                         EXIT;
520                 END LOOP;
521         END LOOP;
522
523         FOR renamable_row in
524                 SELECT id, name
525                 FROM   container.copy_bucket
526                 WHERE  owner = src_usr
527         LOOP
528                 suffix := ' (' || src_usr || ')';
529                 LOOP
530                         BEGIN
531                                 UPDATE  container.copy_bucket
532                                 SET     owner = dest_usr, name = name || suffix
533                                 WHERE   id = renamable_row.id;
534                         EXCEPTION WHEN unique_violation THEN
535                                 suffix := suffix || ' ';
536                                 CONTINUE;
537                         END;
538                         EXIT;
539                 END LOOP;
540         END LOOP;
541
542         FOR renamable_row in
543                 SELECT id, name
544                 FROM   container.user_bucket
545                 WHERE  owner = src_usr
546         LOOP
547                 suffix := ' (' || src_usr || ')';
548                 LOOP
549                         BEGIN
550                                 UPDATE  container.user_bucket
551                                 SET     owner = dest_usr, name = name || suffix
552                                 WHERE   id = renamable_row.id;
553                         EXCEPTION WHEN unique_violation THEN
554                                 suffix := suffix || ' ';
555                                 CONTINUE;
556                         END;
557                         EXIT;
558                 END LOOP;
559         END LOOP;
560
561         DELETE FROM container.user_bucket_item WHERE target_user = src_usr;
562
563         -- money.*
564         DELETE FROM money.billable_xact WHERE usr = src_usr;
565         DELETE FROM money.collections_tracker WHERE usr = src_usr;
566         UPDATE money.collections_tracker SET collector = dest_usr WHERE collector = src_usr;
567
568         -- permission.*
569         DELETE FROM permission.usr_grp_map WHERE usr = src_usr;
570         DELETE FROM permission.usr_object_perm_map WHERE usr = src_usr;
571         DELETE FROM permission.usr_perm_map WHERE usr = src_usr;
572         DELETE FROM permission.usr_work_ou_map WHERE usr = src_usr;
573
574         -- reporter.*
575         -- Update with a rename to avoid collisions
576         BEGIN
577                 FOR renamable_row in
578                         SELECT id, name
579                         FROM   reporter.output_folder
580                         WHERE  owner = src_usr
581                 LOOP
582                         suffix := ' (' || src_usr || ')';
583                         LOOP
584                                 BEGIN
585                                         UPDATE  reporter.output_folder
586                                         SET     owner = dest_usr, name = name || suffix
587                                         WHERE   id = renamable_row.id;
588                                 EXCEPTION WHEN unique_violation THEN
589                                         suffix := suffix || ' ';
590                                         CONTINUE;
591                                 END;
592                                 EXIT;
593                         END LOOP;
594                 END LOOP;
595         EXCEPTION WHEN undefined_table THEN
596                 -- do nothing
597         END;
598
599         BEGIN
600                 UPDATE reporter.report SET owner = dest_usr WHERE owner = src_usr;
601         EXCEPTION WHEN undefined_table THEN
602                 -- do nothing
603         END;
604
605         -- Update with a rename to avoid collisions
606         BEGIN
607                 FOR renamable_row in
608                         SELECT id, name
609                         FROM   reporter.report_folder
610                         WHERE  owner = src_usr
611                 LOOP
612                         suffix := ' (' || src_usr || ')';
613                         LOOP
614                                 BEGIN
615                                         UPDATE  reporter.report_folder
616                                         SET     owner = dest_usr, name = name || suffix
617                                         WHERE   id = renamable_row.id;
618                                 EXCEPTION WHEN unique_violation THEN
619                                         suffix := suffix || ' ';
620                                         CONTINUE;
621                                 END;
622                                 EXIT;
623                         END LOOP;
624                 END LOOP;
625         EXCEPTION WHEN undefined_table THEN
626                 -- do nothing
627         END;
628
629         BEGIN
630                 UPDATE reporter.schedule SET runner = dest_usr WHERE runner = src_usr;
631         EXCEPTION WHEN undefined_table THEN
632                 -- do nothing
633         END;
634
635         BEGIN
636                 UPDATE reporter.template SET owner = dest_usr WHERE owner = src_usr;
637         EXCEPTION WHEN undefined_table THEN
638                 -- do nothing
639         END;
640
641         -- Update with a rename to avoid collisions
642         BEGIN
643                 FOR renamable_row in
644                         SELECT id, name
645                         FROM   reporter.template_folder
646                         WHERE  owner = src_usr
647                 LOOP
648                         suffix := ' (' || src_usr || ')';
649                         LOOP
650                                 BEGIN
651                                         UPDATE  reporter.template_folder
652                                         SET     owner = dest_usr, name = name || suffix
653                                         WHERE   id = renamable_row.id;
654                                 EXCEPTION WHEN unique_violation THEN
655                                         suffix := suffix || ' ';
656                                         CONTINUE;
657                                 END;
658                                 EXIT;
659                         END LOOP;
660                 END LOOP;
661         EXCEPTION WHEN undefined_table THEN
662         -- do nothing
663         END;
664
665         -- vandelay.*
666         -- Update with a rename to avoid collisions
667         FOR renamable_row in
668                 SELECT id, name
669                 FROM   vandelay.queue
670                 WHERE  owner = src_usr
671         LOOP
672                 suffix := ' (' || src_usr || ')';
673                 LOOP
674                         BEGIN
675                                 UPDATE  vandelay.queue
676                                 SET     owner = dest_usr, name = name || suffix
677                                 WHERE   id = renamable_row.id;
678                         EXCEPTION WHEN unique_violation THEN
679                                 suffix := suffix || ' ';
680                                 CONTINUE;
681                         END;
682                         EXIT;
683                 END LOOP;
684         END LOOP;
685
686 END;
687 $$ LANGUAGE plpgsql;
688
689 COMMIT;