great shuffling, not finished
[migration-tools.git] / sql / base / 03-items.sql
1 CREATE OR REPLACE FUNCTION migration_tools.change_call_number(copy_id BIGINT, new_label TEXT, cn_class BIGINT) RETURNS VOID AS $$
2
3 DECLARE
4   old_volume   BIGINT;
5   new_volume   BIGINT;
6   bib          BIGINT;
7   owner        INTEGER;
8   old_label    TEXT;
9   remainder    BIGINT;
10
11 BEGIN
12
13   -- Bail out if asked to change the label to ##URI##
14   IF new_label = '##URI##' THEN
15     RETURN;
16   END IF;
17
18   -- Gather information
19   SELECT call_number INTO old_volume FROM asset.copy WHERE id = copy_id;
20   SELECT record INTO bib FROM asset.call_number WHERE id = old_volume;
21   SELECT owning_lib, label INTO owner, old_label FROM asset.call_number WHERE id = old_volume;
22
23   -- Bail out if the label already is ##URI##
24   IF old_label = '##URI##' THEN
25     RETURN;
26   END IF;
27
28   -- Bail out if the call number label is already correct
29   IF new_volume = old_volume THEN
30     RETURN;
31   END IF;
32
33   -- Check whether we already have a destination volume available
34   SELECT id INTO new_volume FROM asset.call_number 
35     WHERE 
36       record = bib AND
37       owning_lib = owner AND
38       label = new_label AND
39       NOT deleted;
40
41   -- Create destination volume if needed
42   IF NOT FOUND THEN
43     INSERT INTO asset.call_number (creator, editor, record, owning_lib, label, label_class) 
44       VALUES (1, 1, bib, owner, new_label, cn_class);
45     SELECT id INTO new_volume FROM asset.call_number
46       WHERE 
47         record = bib AND
48         owning_lib = owner AND
49         label = new_label AND
50         NOT deleted;
51   END IF;
52
53   -- Move copy to destination
54   UPDATE asset.copy SET call_number = new_volume WHERE id = copy_id;
55
56   -- Delete source volume if it is now empty
57   SELECT id INTO remainder FROM asset.copy WHERE call_number = old_volume AND NOT deleted;
58   IF NOT FOUND THEN
59     DELETE FROM asset.call_number WHERE id = old_volume;
60   END IF;
61
62 END;
63
64 $$ LANGUAGE plpgsql;
65
66 CREATE OR REPLACE FUNCTION migration_tools.change_owning_lib(copy_id BIGINT, new_owning_lib INTEGER) RETURNS VOID AS $$
67
68 DECLARE
69   old_volume     BIGINT;
70   new_volume     BIGINT;
71   bib            BIGINT;
72   old_owning_lib INTEGER;
73         old_label      TEXT;
74   remainder      BIGINT;
75
76 BEGIN
77
78   -- Gather information
79   SELECT call_number INTO old_volume FROM asset.copy WHERE id = copy_id;
80   SELECT record INTO bib FROM asset.call_number WHERE id = old_volume;
81   SELECT owning_lib, label INTO old_owning_lib, old_label FROM asset.call_number WHERE id = old_volume;
82
83         -- Bail out if the new_owning_lib is not the ID of an org_unit
84         IF new_owning_lib NOT IN (SELECT id FROM actor.org_unit) THEN
85                 RAISE WARNING 
86                         '% is not a valid actor.org_unit ID; no change made.', 
87                                 new_owning_lib;
88                 RETURN;
89         END IF;
90
91   -- Bail out discreetly if the owning_lib is already correct
92   IF new_owning_lib = old_owning_lib THEN
93     RETURN;
94   END IF;
95
96   -- Check whether we already have a destination volume available
97   SELECT id INTO new_volume FROM asset.call_number 
98     WHERE 
99       record = bib AND
100       owning_lib = new_owning_lib AND
101       label = old_label AND
102       NOT deleted;
103
104   -- Create destination volume if needed
105   IF NOT FOUND THEN
106     INSERT INTO asset.call_number (creator, editor, record, owning_lib, label) 
107       VALUES (1, 1, bib, new_owning_lib, old_label);
108     SELECT id INTO new_volume FROM asset.call_number
109       WHERE 
110         record = bib AND
111         owning_lib = new_owning_lib AND
112         label = old_label AND
113         NOT deleted;
114   END IF;
115
116   -- Move copy to destination
117   UPDATE asset.copy SET call_number = new_volume WHERE id = copy_id;
118
119   -- Delete source volume if it is now empty
120   SELECT id INTO remainder FROM asset.copy WHERE call_number = old_volume AND NOT deleted;
121   IF NOT FOUND THEN
122     DELETE FROM asset.call_number WHERE id = old_volume;
123   END IF;
124
125 END;
126
127 $$ LANGUAGE plpgsql;
128
129
130 CREATE OR REPLACE FUNCTION migration_tools.change_owning_lib(copy_id BIGINT, new_owner TEXT) RETURNS VOID AS $$
131
132 -- You can use shortnames with this function, which looks up the org unit ID and passes it to change_owning_lib(BIGINT,INTEGER).
133
134 DECLARE
135         new_owning_lib  INTEGER;
136
137 BEGIN
138
139         -- Parse the new_owner as an org unit ID or shortname
140         IF new_owner IN (SELECT shortname FROM actor.org_unit) THEN
141                 SELECT id INTO new_owning_lib FROM actor.org_unit WHERE shortname = new_owner;
142                 PERFORM migration_tools.change_owning_lib(copy_id, new_owning_lib);
143         ELSIF new_owner ~ E'^[0-9]+$' THEN
144                 IF new_owner::INTEGER IN (SELECT id FROM actor.org_unit) THEN
145                         RAISE INFO 
146                                 '%',
147                                 E'You don\'t need to put the actor.org_unit ID in quotes; '
148                                         || E'if you put it in quotes, I\'m going to try to parse it as a shortname first.';
149                         new_owning_lib := new_owner::INTEGER;
150                 PERFORM migration_tools.change_owning_lib(copy_id, new_owning_lib);
151                 END IF;
152         ELSE
153                 RAISE WARNING 
154                         '% is not a valid actor.org_unit shortname or ID; no change made.', 
155                         new_owning_lib;
156                 RETURN;
157         END IF;
158
159 END;
160
161 $$ LANGUAGE plpgsql;