]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/090.schema.action.sql
Correcting a typo...
[working/Evergreen.git] / Open-ILS / src / sql / Pg / 090.schema.action.sql
1 /*
2  * Copyright (C) 2004-2008  Georgia Public Library Service
3  * Copyright (C) 2007-2008  Equinox Software, Inc.
4  * Mike Rylander <miker@esilibrary.com> 
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18 DROP SCHEMA action CASCADE;
19
20 BEGIN;
21
22 CREATE SCHEMA action;
23
24 CREATE TABLE action.in_house_use (
25         id              SERIAL                          PRIMARY KEY,
26         item            BIGINT                          NOT NULL REFERENCES asset.copy (id) DEFERRABLE INITIALLY DEFERRED,
27         staff           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
28         org_unit        INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
29         use_time        TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
30 );
31 CREATE INDEX action_in_house_use_staff_idx      ON action.in_house_use ( staff );
32
33 CREATE TABLE action.non_cataloged_circulation (
34         id              SERIAL                          PRIMARY KEY,
35         patron          INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
36         staff           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
37         circ_lib        INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
38         item_type       INT                             NOT NULL REFERENCES config.non_cataloged_type (id) DEFERRABLE INITIALLY DEFERRED,
39         circ_time       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
40 );
41 CREATE INDEX action_non_cat_circ_patron_idx ON action.non_cataloged_circulation ( patron );
42 CREATE INDEX action_non_cat_circ_staff_idx  ON action.non_cataloged_circulation ( staff );
43
44 CREATE TABLE action.non_cat_in_house_use (
45         id              SERIAL                          PRIMARY KEY,
46         item_type       BIGINT                          NOT NULL REFERENCES config.non_cataloged_type(id) DEFERRABLE INITIALLY DEFERRED,
47         staff           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
48         org_unit        INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
49         use_time        TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
50 );
51 CREATE INDEX non_cat_in_house_use_staff_idx ON action.non_cat_in_house_use ( staff );
52
53 CREATE TABLE action.survey (
54         id              SERIAL                          PRIMARY KEY,
55         owner           INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
56         start_date      TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
57         end_date        TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW() + '10 years'::INTERVAL,
58         usr_summary     BOOL                            NOT NULL DEFAULT FALSE,
59         opac            BOOL                            NOT NULL DEFAULT FALSE,
60         poll            BOOL                            NOT NULL DEFAULT FALSE,
61         required        BOOL                            NOT NULL DEFAULT FALSE,
62         name            TEXT                            NOT NULL,
63         description     TEXT                            NOT NULL
64 );
65 CREATE UNIQUE INDEX asv_once_per_owner_idx ON action.survey (owner,name);
66
67 CREATE TABLE action.survey_question (
68         id              SERIAL  PRIMARY KEY,
69         survey          INT     NOT NULL REFERENCES action.survey DEFERRABLE INITIALLY DEFERRED,
70         question        TEXT    NOT NULL
71 );
72
73 CREATE TABLE action.survey_answer (
74         id              SERIAL  PRIMARY KEY,
75         question        INT     NOT NULL REFERENCES action.survey_question DEFERRABLE INITIALLY DEFERRED,
76         answer          TEXT    NOT NULL
77 );
78
79 CREATE SEQUENCE action.survey_response_group_id_seq;
80
81 CREATE TABLE action.survey_response (
82         id                      BIGSERIAL                       PRIMARY KEY,
83         response_group_id       INT,
84         usr                     INT, -- REFERENCES actor.usr
85         survey                  INT                             NOT NULL REFERENCES action.survey DEFERRABLE INITIALLY DEFERRED,
86         question                INT                             NOT NULL REFERENCES action.survey_question DEFERRABLE INITIALLY DEFERRED,
87         answer                  INT                             NOT NULL REFERENCES action.survey_answer DEFERRABLE INITIALLY DEFERRED,
88         answer_date             TIMESTAMP WITH TIME ZONE,
89         effective_date          TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
90 );
91 CREATE INDEX action_survey_response_usr_idx ON action.survey_response ( usr );
92
93 CREATE OR REPLACE FUNCTION action.survey_response_answer_date_fixup () RETURNS TRIGGER AS '
94 BEGIN
95         NEW.answer_date := NOW();
96         RETURN NEW;
97 END;
98 ' LANGUAGE 'plpgsql';
99 CREATE TRIGGER action_survey_response_answer_date_fixup_tgr
100         BEFORE INSERT ON action.survey_response
101         FOR EACH ROW
102         EXECUTE PROCEDURE action.survey_response_answer_date_fixup ();
103
104
105 CREATE TABLE action.circulation (
106         target_copy             BIGINT                          NOT NULL, -- asset.copy.id
107         circ_lib                INT                             NOT NULL, -- actor.org_unit.id
108         circ_staff              INT                             NOT NULL, -- actor.usr.id
109         checkin_staff           INT,                                      -- actor.usr.id
110         checkin_lib             INT,                                      -- actor.org_unit.id
111         renewal_remaining       INT                             NOT NULL, -- derived from "circ duration" rule
112         due_date                TIMESTAMP WITH TIME ZONE,
113         stop_fines_time         TIMESTAMP WITH TIME ZONE,
114         checkin_time            TIMESTAMP WITH TIME ZONE,
115         create_time             TIMESTAMP WITH TIME ZONE    NOT NULL DEFAULT NOW(),
116         duration                INTERVAL,                                 -- derived from "circ duration" rule
117         fine_interval           INTERVAL                        NOT NULL DEFAULT '1 day'::INTERVAL, -- derived from "circ fine" rule
118         recuring_fine           NUMERIC(6,2),                             -- derived from "circ fine" rule
119         max_fine                NUMERIC(6,2),                             -- derived from "max fine" rule
120         phone_renewal           BOOL                            NOT NULL DEFAULT FALSE,
121         desk_renewal            BOOL                            NOT NULL DEFAULT FALSE,
122         opac_renewal            BOOL                            NOT NULL DEFAULT FALSE,
123         duration_rule           TEXT                            NOT NULL, -- name of "circ duration" rule
124         recuring_fine_rule      TEXT                            NOT NULL, -- name of "circ fine" rule
125         max_fine_rule           TEXT                            NOT NULL, -- name of "max fine" rule
126         stop_fines              TEXT                            CHECK (stop_fines IN ('CHECKIN','CLAIMSRETURNED','LOST','MAXFINES','RENEW','LONGOVERDUE')),
127         workstation         INT        REFERENCES actor.workstation(id)
128                                        ON DELETE SET NULL
129                                                                    DEFERRABLE INITIALLY DEFERRED
130 ) INHERITS (money.billable_xact);
131 ALTER TABLE action.circulation ADD PRIMARY KEY (id);
132 CREATE INDEX circ_open_xacts_idx ON action.circulation (usr) WHERE xact_finish IS NULL;
133 CREATE INDEX circ_outstanding_idx ON action.circulation (usr) WHERE checkin_time IS NULL;
134 CREATE INDEX circ_checkin_time ON "action".circulation (checkin_time) WHERE checkin_time IS NOT NULL;
135 CREATE INDEX circ_circ_lib_idx ON "action".circulation (circ_lib);
136 CREATE INDEX circ_open_date_idx ON "action".circulation (xact_start) WHERE xact_finish IS NULL;
137 CREATE INDEX circ_all_usr_idx       ON action.circulation ( usr );
138 CREATE INDEX circ_circ_staff_idx    ON action.circulation ( circ_staff );
139 CREATE INDEX circ_checkin_staff_idx ON action.circulation ( checkin_staff );
140
141 CREATE TRIGGER mat_summary_create_tgr AFTER INSERT ON action.circulation FOR EACH ROW EXECUTE PROCEDURE money.mat_summary_create ();
142 CREATE TRIGGER mat_summary_change_tgr AFTER UPDATE ON action.circulation FOR EACH ROW EXECUTE PROCEDURE money.mat_summary_update ();
143 CREATE TRIGGER mat_summary_remove_tgr AFTER DELETE ON action.circulation FOR EACH ROW EXECUTE PROCEDURE money.mat_summary_delete ();
144
145
146 CREATE TABLE action.aged_circulation (
147         usr_post_code           TEXT,
148         usr_home_ou             INT     NOT NULL,
149         usr_profile             INT     NOT NULL,
150         usr_birth_year          INT,
151         copy_call_number        INT     NOT NULL,
152         copy_location           INT     NOT NULL,
153         copy_owning_lib         INT     NOT NULL,
154         copy_circ_lib           INT     NOT NULL,
155         copy_bib_record         BIGINT  NOT NULL,
156         LIKE action.circulation
157
158 );
159 ALTER TABLE action.aged_circulation ADD PRIMARY KEY (id);
160 ALTER TABLE action.aged_circulation DROP COLUMN usr;
161 CREATE INDEX aged_circ_circ_lib_idx ON "action".aged_circulation (circ_lib);
162 CREATE INDEX aged_circ_start_idx ON "action".aged_circulation (xact_start);
163 CREATE INDEX aged_circ_copy_circ_lib_idx ON "action".aged_circulation (copy_circ_lib);
164 CREATE INDEX aged_circ_copy_owning_lib_idx ON "action".aged_circulation (copy_owning_lib);
165 CREATE INDEX aged_circ_copy_location_idx ON "action".aged_circulation (copy_location);
166
167 CREATE OR REPLACE VIEW action.all_circulation AS
168         SELECT  id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
169                 copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
170                 circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, due_date,
171                 stop_fines_time, checkin_time, create_time, duration, fine_interval, recuring_fine,
172                 max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recuring_fine_rule,
173                 max_fine_rule, stop_fines
174           FROM  action.aged_circulation
175                         UNION ALL
176         SELECT  DISTINCT circ.id,COALESCE(a.post_code,b.post_code) AS usr_post_code, p.home_ou AS usr_home_ou, p.profile AS usr_profile, EXTRACT(YEAR FROM p.dob)::INT AS usr_birth_year,
177                 cp.call_number AS copy_call_number, cp.location AS copy_location, cn.owning_lib AS copy_owning_lib, cp.circ_lib AS copy_circ_lib,
178                 cn.record AS copy_bib_record, circ.xact_start, circ.xact_finish, circ.target_copy, circ.circ_lib, circ.circ_staff, circ.checkin_staff,
179                 circ.checkin_lib, circ.renewal_remaining, circ.due_date, circ.stop_fines_time, circ.checkin_time, circ.create_time, circ.duration,
180                 circ.fine_interval, circ.recuring_fine, circ.max_fine, circ.phone_renewal, circ.desk_renewal, circ.opac_renewal, circ.duration_rule,
181                 circ.recuring_fine_rule, circ.max_fine_rule, circ.stop_fines
182           FROM  action.circulation circ
183                 JOIN asset.copy cp ON (circ.target_copy = cp.id)
184                 JOIN asset.call_number cn ON (cp.call_number = cn.id)
185                 JOIN actor.usr p ON (circ.usr = p.id)
186                 LEFT JOIN actor.usr_address a ON (p.mailing_address = a.id)
187                 LEFT JOIN actor.usr_address b ON (p.billing_address = a.id);
188
189 CREATE OR REPLACE FUNCTION action.age_circ_on_delete () RETURNS TRIGGER AS $$
190 BEGIN
191         INSERT INTO action.aged_circulation
192                 (id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
193                 copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
194                 circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, due_date,
195                 stop_fines_time, checkin_time, create_time, duration, fine_interval, recuring_fine,
196                 max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recuring_fine_rule,
197                 max_fine_rule, stop_fines)
198           SELECT
199                 id,usr_post_code, usr_home_ou, usr_profile, usr_birth_year, copy_call_number, copy_location,
200                 copy_owning_lib, copy_circ_lib, copy_bib_record, xact_start, xact_finish, target_copy,
201                 circ_lib, circ_staff, checkin_staff, checkin_lib, renewal_remaining, due_date,
202                 stop_fines_time, checkin_time, create_time, duration, fine_interval, recuring_fine,
203                 max_fine, phone_renewal, desk_renewal, opac_renewal, duration_rule, recuring_fine_rule,
204                 max_fine_rule, stop_fines
205             FROM action.all_circulation WHERE id = OLD.id;
206
207         RETURN OLD;
208 END;
209 $$ LANGUAGE 'plpgsql';
210
211 CREATE TRIGGER action_circulation_aging_tgr
212         BEFORE DELETE ON action.circulation
213         FOR EACH ROW
214         EXECUTE PROCEDURE action.age_circ_on_delete ();
215
216
217 CREATE OR REPLACE VIEW action.open_circulation AS
218         SELECT  *
219           FROM  action.circulation
220           WHERE checkin_time IS NULL
221           ORDER BY due_date;
222                 
223
224 CREATE OR REPLACE VIEW action.billable_circulations AS
225         SELECT  *
226           FROM  action.circulation
227           WHERE xact_finish IS NULL;
228
229 CREATE VIEW stats.fleshed_circulation AS
230         SELECT  c.*,
231                 CAST(c.xact_start AS DATE) AS start_date_day,
232                 CAST(c.xact_finish AS DATE) AS finish_date_day,
233                 DATE_TRUNC('hour', c.xact_start) AS start_date_hour,
234                 DATE_TRUNC('hour', c.xact_finish) AS finish_date_hour,
235                 cp.call_number_label,
236                 cp.owning_lib,
237                 cp.item_lang,
238                 cp.item_type,
239                 cp.item_form
240         FROM    "action".circulation c
241                 JOIN stats.fleshed_copy cp ON (cp.id = c.target_copy);
242
243
244 CREATE OR REPLACE FUNCTION action.circulation_claims_returned () RETURNS TRIGGER AS $$
245 BEGIN
246         IF OLD.stop_fines IS NULL OR OLD.stop_fines <> NEW.stop_fines THEN
247                 IF NEW.stop_fines = 'CLAIMSRETURNED' THEN
248                         UPDATE actor.usr SET claims_returned_count = claims_returned_count + 1 WHERE id = NEW.usr;
249                 END IF;
250                 IF NEW.stop_fines = 'LOST' THEN
251                         UPDATE asset.copy SET status = 3 WHERE id = NEW.target_copy;
252                 END IF;
253         END IF;
254         RETURN NEW;
255 END;
256 $$ LANGUAGE 'plpgsql';
257 CREATE TRIGGER action_circulation_stop_fines_tgr
258         BEFORE UPDATE ON action.circulation
259         FOR EACH ROW
260         EXECUTE PROCEDURE action.circulation_claims_returned ();
261
262 CREATE TABLE action.hold_request_cancel_cause (
263     id      SERIAL  PRIMARY KEY,
264     label   TEXT    UNIQUE
265 );
266 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (1,'Untargeted expiration');
267 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (2,'Hold Shelf expiration');
268 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (3,'Patron via phone');
269 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (4,'Patron in person');
270 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (5,'Staff forced');
271 INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (6,'Patron via OPAC');
272 SELECT SETVAL('action.hold_request_cancel_cause_id_seq', 100);
273
274 CREATE TABLE action.hold_request (
275         id                      SERIAL                          PRIMARY KEY,
276         request_time            TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
277         capture_time            TIMESTAMP WITH TIME ZONE,
278         fulfillment_time        TIMESTAMP WITH TIME ZONE,
279         checkin_time            TIMESTAMP WITH TIME ZONE,
280         return_time             TIMESTAMP WITH TIME ZONE,
281         prev_check_time         TIMESTAMP WITH TIME ZONE,
282         expire_time             TIMESTAMP WITH TIME ZONE,
283         cancel_time             TIMESTAMP WITH TIME ZONE,
284         cancel_cause    INT REFERENCES action.hold_request_cancel_cause (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
285         cancel_note             TEXT,
286         target                  BIGINT                          NOT NULL, -- see hold_type
287         current_copy            BIGINT                          REFERENCES asset.copy (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
288         fulfillment_staff       INT                             REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
289         fulfillment_lib         INT                             REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
290         request_lib             INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
291         requestor               INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
292         usr                     INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
293         selection_ou            INT                             NOT NULL,
294         selection_depth         INT                             NOT NULL DEFAULT 0,
295         pickup_lib              INT                             NOT NULL REFERENCES actor.org_unit DEFERRABLE INITIALLY DEFERRED,
296         hold_type               TEXT                            NOT NULL CHECK (hold_type IN ('M','T','V','C')),
297         holdable_formats        TEXT,
298         phone_notify            TEXT,
299         email_notify            BOOL                            NOT NULL DEFAULT TRUE,
300         frozen                  BOOL                            NOT NULL DEFAULT FALSE,
301         thaw_date               TIMESTAMP WITH TIME ZONE,
302         shelf_date              TIMESTAMP WITH TIME ZONE
303 );
304
305 CREATE INDEX hold_request_target_idx ON action.hold_request (target);
306 CREATE INDEX hold_request_usr_idx ON action.hold_request (usr);
307 CREATE INDEX hold_request_pickup_lib_idx ON action.hold_request (pickup_lib);
308 CREATE INDEX hold_request_current_copy_idx ON action.hold_request (current_copy);
309 CREATE INDEX hold_request_prev_check_time_idx ON action.hold_request (prev_check_time);
310 CREATE INDEX hold_request_fulfillment_staff_idx ON action.hold_request ( fulfillment_staff );
311 CREATE INDEX hold_request_requestor_idx         ON action.hold_request ( requestor );
312
313
314 CREATE TABLE action.hold_request_note (
315
316     id     BIGSERIAL PRIMARY KEY,
317     hold   BIGINT    NOT NULL REFERENCES action.hold_request (id)
318                               ON DELETE CASCADE
319                               DEFERRABLE INITIALLY DEFERRED,
320     title  TEXT      NOT NULL,
321     body   TEXT      NOT NULL,
322     slip   BOOL      NOT NULL DEFAULT FALSE,
323     pub    BOOL      NOT NULL DEFAULT FALSE,
324     staff  BOOL      NOT NULL DEFAULT FALSE  -- created by staff
325
326 );
327 CREATE INDEX ahrn_hold_idx ON action.hold_request_note (hold);
328
329
330 CREATE TABLE action.hold_notification (
331         id              SERIAL                          PRIMARY KEY,
332         hold            INT                             NOT NULL REFERENCES action.hold_request (id)
333                                                                         ON DELETE CASCADE
334                                                                         DEFERRABLE INITIALLY DEFERRED,
335         notify_staff    INT                     REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
336         notify_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
337         method          TEXT                            NOT NULL, -- email address or phone number
338         note            TEXT
339 );
340 CREATE INDEX ahn_hold_idx ON action.hold_notification (hold);
341 CREATE INDEX ahn_notify_staff_idx ON action.hold_notification ( notify_staff );
342
343 CREATE TABLE action.hold_copy_map (
344         id              SERIAL  PRIMARY KEY,
345         hold            INT     NOT NULL REFERENCES action.hold_request (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
346         target_copy     BIGINT  NOT NULL REFERENCES asset.copy (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
347         CONSTRAINT copy_once_per_hold UNIQUE (hold,target_copy)
348 );
349 -- CREATE INDEX acm_hold_idx ON action.hold_copy_map (hold);
350 CREATE INDEX acm_copy_idx ON action.hold_copy_map (target_copy);
351
352 CREATE TABLE action.transit_copy (
353         id                      SERIAL                          PRIMARY KEY,
354         source_send_time        TIMESTAMP WITH TIME ZONE,
355         dest_recv_time          TIMESTAMP WITH TIME ZONE,
356         target_copy             BIGINT                          NOT NULL REFERENCES asset.copy (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
357         source                  INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
358         dest                    INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
359         prev_hop                INT                             REFERENCES action.transit_copy (id) DEFERRABLE INITIALLY DEFERRED,
360         copy_status             INT                             NOT NULL REFERENCES config.copy_status (id) DEFERRABLE INITIALLY DEFERRED,
361         persistant_transfer     BOOL                            NOT NULL DEFAULT FALSE
362 );
363 CREATE INDEX active_transit_dest_idx ON "action".transit_copy (dest); 
364 CREATE INDEX active_transit_source_idx ON "action".transit_copy (source);
365 CREATE INDEX active_transit_cp_idx ON "action".transit_copy (target_copy);
366
367
368 CREATE TABLE action.hold_transit_copy (
369         hold    INT     REFERENCES action.hold_request (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED
370 ) INHERITS (action.transit_copy);
371 ALTER TABLE action.hold_transit_copy ADD PRIMARY KEY (id);
372 ALTER TABLE action.hold_transit_copy ADD CONSTRAINT ahtc_tc_fkey FOREIGN KEY (target_copy) REFERENCES asset.copy (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
373 CREATE INDEX active_hold_transit_dest_idx ON "action".hold_transit_copy (dest);
374 CREATE INDEX active_hold_transit_source_idx ON "action".hold_transit_copy (source);
375 CREATE INDEX active_hold_transit_cp_idx ON "action".hold_transit_copy (target_copy);
376
377
378 CREATE TABLE action.unfulfilled_hold_list (
379         id              BIGSERIAL                       PRIMARY KEY,
380         current_copy    BIGINT                          NOT NULL,
381         hold            INT                             NOT NULL,
382         circ_lib        INT                             NOT NULL,
383         fail_time       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
384 );
385
386 COMMIT;
387