2 * Copyright (C) 2004-2008 Georgia Public Library Service
3 * Copyright (C) 2007-2008 Equinox Software, Inc.
4 * Mike Rylander <miker@esilibrary.com>
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.
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.
18 DROP SCHEMA action CASCADE;
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()
32 CREATE TABLE action.non_cataloged_circulation (
33 id SERIAL PRIMARY KEY,
34 patron INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
35 staff INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
36 circ_lib INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
37 item_type INT NOT NULL REFERENCES config.non_cataloged_type (id) DEFERRABLE INITIALLY DEFERRED,
38 circ_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
41 CREATE TABLE action.non_cat_in_house_use (
42 id SERIAL PRIMARY KEY,
43 item_type BIGINT NOT NULL REFERENCES config.non_cataloged_type(id) DEFERRABLE INITIALLY DEFERRED,
44 staff INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
45 org_unit INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
46 use_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
49 CREATE TABLE action.survey (
50 id SERIAL PRIMARY KEY,
51 owner INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
52 start_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
53 end_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() + '10 years'::INTERVAL,
54 usr_summary BOOL NOT NULL DEFAULT FALSE,
55 opac BOOL NOT NULL DEFAULT FALSE,
56 poll BOOL NOT NULL DEFAULT FALSE,
57 required BOOL NOT NULL DEFAULT FALSE,
59 description TEXT NOT NULL
61 CREATE UNIQUE INDEX asv_once_per_owner_idx ON action.survey (owner,name);
63 CREATE TABLE action.survey_question (
64 id SERIAL PRIMARY KEY,
65 survey INT NOT NULL REFERENCES action.survey DEFERRABLE INITIALLY DEFERRED,
66 question TEXT NOT NULL
69 CREATE TABLE action.survey_answer (
70 id SERIAL PRIMARY KEY,
71 question INT NOT NULL REFERENCES action.survey_question DEFERRABLE INITIALLY DEFERRED,
75 CREATE SEQUENCE action.survey_response_group_id_seq;
77 CREATE TABLE action.survey_response (
78 id BIGSERIAL PRIMARY KEY,
79 response_group_id INT,
80 usr INT, -- REFERENCES actor.usr
81 survey INT NOT NULL REFERENCES action.survey DEFERRABLE INITIALLY DEFERRED,
82 question INT NOT NULL REFERENCES action.survey_question DEFERRABLE INITIALLY DEFERRED,
83 answer INT NOT NULL REFERENCES action.survey_answer DEFERRABLE INITIALLY DEFERRED,
84 answer_date TIMESTAMP WITH TIME ZONE,
85 effective_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
87 CREATE OR REPLACE FUNCTION action.survey_response_answer_date_fixup () RETURNS TRIGGER AS '
89 NEW.answer_date := NOW();
93 CREATE TRIGGER action_survey_response_answer_date_fixup_tgr
94 BEFORE INSERT ON action.survey_response
96 EXECUTE PROCEDURE action.survey_response_answer_date_fixup ();
99 CREATE TABLE action.circulation (
100 target_copy BIGINT NOT NULL, -- asset.copy.id
101 circ_lib INT NOT NULL, -- actor.org_unit.id
102 circ_staff INT NOT NULL, -- actor.usr.id
103 checkin_staff INT, -- actor.usr.id
104 checkin_lib INT, -- actor.org_unit.id
105 renewal_remaining INT NOT NULL, -- derived from "circ duration" rule
106 due_date TIMESTAMP WITH TIME ZONE,
107 stop_fines_time TIMESTAMP WITH TIME ZONE,
108 checkin_time TIMESTAMP WITH TIME ZONE,
109 create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
110 duration INTERVAL, -- derived from "circ duration" rule
111 fine_interval INTERVAL NOT NULL DEFAULT '1 day'::INTERVAL, -- derived from "circ fine" rule
112 recuring_fine NUMERIC(6,2), -- derived from "circ fine" rule
113 max_fine NUMERIC(6,2), -- derived from "max fine" rule
114 phone_renewal BOOL NOT NULL DEFAULT FALSE,
115 desk_renewal BOOL NOT NULL DEFAULT FALSE,
116 opac_renewal BOOL NOT NULL DEFAULT FALSE,
117 duration_rule TEXT NOT NULL, -- name of "circ duration" rule
118 recuring_fine_rule TEXT NOT NULL, -- name of "circ fine" rule
119 max_fine_rule TEXT NOT NULL, -- name of "max fine" rule
120 stop_fines TEXT CHECK (stop_fines IN ('CHECKIN','CLAIMSRETURNED','LOST','MAXFINES','RENEW','LONGOVERDUE'))
121 ) INHERITS (money.billable_xact);
122 ALTER TABLE action.circulation ADD PRIMARY KEY (id);
123 CREATE INDEX circ_open_xacts_idx ON action.circulation (usr) WHERE xact_finish IS NULL;
124 CREATE INDEX circ_outstanding_idx ON action.circulation (usr) WHERE checkin_time IS NULL;
125 CREATE INDEX circ_checkin_time ON "action".circulation (checkin_time) WHERE checkin_time IS NOT NULL;
126 CREATE INDEX circ_circ_lib_idx ON "action".circulation (circ_lib);
127 CREATE INDEX circ_open_date_idx ON "action".circulation (xact_start) WHERE xact_finish IS NULL;
130 CREATE OR REPLACE VIEW action.open_circulation AS
132 FROM action.circulation
133 WHERE checkin_time IS NULL
137 CREATE OR REPLACE VIEW action.billable_cirulations AS
139 FROM action.circulation
140 WHERE xact_finish IS NULL;
142 CREATE VIEW stats.fleshed_circulation AS
144 CAST(c.xact_start AS DATE) AS start_date_day,
145 CAST(c.xact_finish AS DATE) AS finish_date_day,
146 DATE_TRUNC('hour', c.xact_start) AS start_date_hour,
147 DATE_TRUNC('hour', c.xact_finish) AS finish_date_hour,
148 cp.call_number_label,
153 FROM "action".circulation c
154 JOIN stats.fleshed_copy cp ON (cp.id = c.target_copy);
157 CREATE OR REPLACE FUNCTION action.circulation_claims_returned () RETURNS TRIGGER AS $$
159 IF OLD.stop_fines IS NULL OR OLD.stop_fines <> NEW.stop_fines THEN
160 IF NEW.stop_fines = 'CLAIMSRETURNED' THEN
161 UPDATE actor.usr SET claims_returned_count = claims_returned_count + 1 WHERE id = NEW.usr;
163 IF NEW.stop_fines = 'LOST' THEN
164 UPDATE asset.copy SET status = 3 WHERE id = NEW.target_copy;
169 $$ LANGUAGE 'plpgsql';
170 CREATE TRIGGER action_circulation_stop_fines_tgr
171 BEFORE UPDATE ON action.circulation
173 EXECUTE PROCEDURE action.circulation_claims_returned ();
176 CREATE TABLE action.hold_request (
177 id SERIAL PRIMARY KEY,
178 request_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
179 capture_time TIMESTAMP WITH TIME ZONE,
180 fulfillment_time TIMESTAMP WITH TIME ZONE,
181 checkin_time TIMESTAMP WITH TIME ZONE,
182 return_time TIMESTAMP WITH TIME ZONE,
183 prev_check_time TIMESTAMP WITH TIME ZONE,
184 expire_time TIMESTAMP WITH TIME ZONE,
185 cancel_time TIMESTAMP WITH TIME ZONE,
186 target BIGINT NOT NULL, -- see hold_type
187 current_copy BIGINT REFERENCES asset.copy (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
188 fulfillment_staff INT REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
189 fulfillment_lib INT REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
190 request_lib INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
191 requestor INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
192 usr INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
193 selection_ou INT NOT NULL,
194 selection_depth INT NOT NULL DEFAULT 0,
195 pickup_lib INT NOT NULL REFERENCES actor.org_unit DEFERRABLE INITIALLY DEFERRED,
196 hold_type TEXT NOT NULL CHECK (hold_type IN ('M','T','V','C')),
197 holdable_formats TEXT,
199 email_notify BOOL NOT NULL DEFAULT TRUE,
200 frozen BOOL NOT NULL DEFAULT FALSE,
201 thaw_date TIMESTAMP WITH TIME ZONE
204 CREATE INDEX hold_request_target_idx ON action.hold_request (target);
205 CREATE INDEX hold_request_usr_idx ON action.hold_request (usr);
206 CREATE INDEX hold_request_pickup_lib_idx ON action.hold_request (pickup_lib);
207 CREATE INDEX hold_request_current_copy_idx ON action.hold_request (current_copy);
208 CREATE INDEX hold_request_prev_check_time_idx ON action.hold_request (prev_check_time);
211 CREATE TABLE action.hold_notification (
212 id SERIAL PRIMARY KEY,
213 hold INT NOT NULL REFERENCES action.hold_request (id) DEFERRABLE INITIALLY DEFERRED,
214 notify_staff INT REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
215 notify_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
216 method TEXT NOT NULL, -- email address or phone number
219 CREATE INDEX ahn_hold_idx ON action.hold_notification (hold);
221 CREATE TABLE action.hold_copy_map (
222 id SERIAL PRIMARY KEY,
223 hold INT NOT NULL REFERENCES action.hold_request (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
224 target_copy BIGINT NOT NULL REFERENCES asset.copy (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
225 CONSTRAINT copy_once_per_hold UNIQUE (hold,target_copy)
227 -- CREATE INDEX acm_hold_idx ON action.hold_copy_map (hold);
228 CREATE INDEX acm_copy_idx ON action.hold_copy_map (target_copy);
230 CREATE TABLE action.transit_copy (
231 id SERIAL PRIMARY KEY,
232 source_send_time TIMESTAMP WITH TIME ZONE,
233 dest_recv_time TIMESTAMP WITH TIME ZONE,
234 target_copy BIGINT NOT NULL REFERENCES asset.copy (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
235 source INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
236 dest INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
237 prev_hop INT REFERENCES action.transit_copy (id) DEFERRABLE INITIALLY DEFERRED,
238 copy_status INT NOT NULL REFERENCES config.copy_status (id) DEFERRABLE INITIALLY DEFERRED,
239 persistant_transfer BOOL NOT NULL DEFAULT FALSE
241 CREATE INDEX active_transit_dest_idx ON "action".transit_copy (dest);
242 CREATE INDEX active_transit_source_idx ON "action".transit_copy (source);
243 CREATE INDEX active_transit_cp_idx ON "action".transit_copy (target_copy);
246 CREATE TABLE action.hold_transit_copy (
247 hold INT REFERENCES action.hold_request (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED
248 ) INHERITS (action.transit_copy);
249 ALTER TABLE action.hold_transit_copy ADD PRIMARY KEY (id);
250 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;
251 CREATE INDEX active_hold_transit_dest_idx ON "action".hold_transit_copy (dest);
252 CREATE INDEX active_hold_transit_source_idx ON "action".hold_transit_copy (source);
253 CREATE INDEX active_hold_transit_cp_idx ON "action".hold_transit_copy (target_copy);
256 CREATE TABLE action.unfulfilled_hold_list (
257 id BIGSERIAL PRIMARY KEY,
258 current_copy BIGINT NOT NULL,
260 circ_lib INT NOT NULL,
261 fail_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()