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