moving sql files to dir matching the Open-ILS driver name (sorry for killing the...
[Evergreen.git] / Open-ILS / src / sql / Pg / 090.schema.action.sql
1 DROP SCHEMA action CASCADE;
2
3 BEGIN;
4
5 CREATE SCHEMA action;
6
7 CREATE TABLE action.survey (
8         id              SERIAL  PRIMARY KEY,
9         owner           INT     NOT NULL REFERENCES actor.org_unit (id),
10         name            TEXT    NOT NULL,
11         description     TEXT    NOT NULL,
12         start_date      DATE    NOT NULL DEFAULT NOW(),
13         end_date        DATE    NOT NULL DEFAULT NOW() + '10 years'::INTERVAL,
14         usr_summary     BOOL    NOT NULL DEFAULT FALSE,
15         opac            BOOL    NOT NULL DEFAULT FALSE,
16         poll            BOOL    NOT NULL DEFAULT FALSE,
17         required        BOOL    NOT NULL DEFAULT FALSE
18 );
19 CREATE UNIQUE INDEX asv_once_per_owner_idx ON action.survey (owner,name);
20
21 CREATE TABLE action.survey_question (
22         id              SERIAL  PRIMARY KEY,
23         survey          INT     NOT NULL REFERENCES action.survey,
24         question        TEXT    NOT NULL
25 );
26
27 CREATE TABLE action.survey_answer (
28         id              SERIAL  PRIMARY KEY,
29         question        INT     NOT NULL REFERENCES action.survey_question,
30         answer          TEXT    NOT NULL
31 );
32
33 CREATE SEQUENCE action.survey_response_group_id_seq;
34
35 CREATE TABLE action.survey_response (
36         id                      BIGSERIAL                       PRIMARY KEY,
37         response_group_id       INT,
38         usr                     INT, -- REFERENCES actor.usr
39         survey                  INT                             NOT NULL REFERENCES action.survey,
40         question                INT                             NOT NULL REFERENCES action.survey_question,
41         answer                  INT                             NOT NULL REFERENCES action.survey_answer,
42         answer_date             TIMESTAMP WITH TIME ZONE,
43         effective_date          TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
44 );
45 CREATE OR REPLACE FUNCTION action.survey_response_answer_date_fixup () RETURNS TRIGGER AS '
46 BEGIN
47         NEW.answer_date := NOW();
48         RETURN NEW;
49 END;
50 ' LANGUAGE 'plpgsql';
51 CREATE TRIGGER action_survey_response_answer_date_fixup_tgr
52         BEFORE INSERT ON action.survey_response
53         FOR EACH ROW
54         EXECUTE PROCEDURE action.survey_response_answer_date_fixup ();
55
56
57 CREATE TABLE action.circulation (
58         target_copy             BIGINT                          NOT NULL, -- asset.copy.id
59         renewal                 BOOL                            NOT NULL DEFAULT FALSE,
60         circ_lib                INT                             NOT NULL, -- actor.org_unit.id
61         duration_rule           TEXT                            NOT NULL, -- name of "circ duration" rule
62         duration                INTERVAL                        NOT NULL, -- derived from "circ duration" rule
63         renewal_remaining       INT                             NOT NULL, -- derived from "circ duration" rule
64         recuring_fine_rule      TEXT                            NOT NULL, -- name of "circ fine" rule
65         recuring_fine           NUMERIC(6,2)                    NOT NULL, -- derived from "circ fine" rule
66         max_fine_rule           TEXT                            NOT NULL, -- name of "max fine" rule
67         max_fine                NUMERIC(6,2)                    NOT NULL, -- derived from "max fine" rule
68         fine_interval           INTERVAL                        NOT NULL DEFAULT '1 day'::INTERVAL, -- derived from "circ fine" rule
69         due_date                TIMESTAMP WITH TIME ZONE        NOT NULL,
70         stop_fines              TEXT                            CHECK (stop_fines IN ('CHECKIN','CLAIMSRETURNED','LOST','MAXFINES','RENEW','LONGOVERDUE'))
71 ) INHERITS (money.billable_xact);
72 CREATE INDEX circ_open_xacts_idx ON action.circulation (usr) WHERE xact_finish IS NULL;
73
74 CREATE VIEW action.open_circulation AS
75         SELECT  *
76           FROM  action.circulation
77           WHERE xact_finish IS NULL
78                 AND (   stop_fines IS NULL OR
79                         stop_fines IN ('CLAIMSRETURNED','MAXFINES','LONGOVERDUE')
80                 )
81           ORDER BY due_date;
82                 
83
84 CREATE OR REPLACE VIEW action.open_cirulations AS
85         SELECT  *
86           FROM  action.circulation
87           WHERE xact_finish IS NULL;
88
89 CREATE OR REPLACE FUNCTION action.circulation_claims_returned () RETURNS TRIGGER AS $$
90 BEGIN
91         IF NEW.stop_fines <> OLD.stop_fines AND NEW.stop_fines = 'CLAIMSRETURNED' THEN
92                 UPDATE actor.usr SET claims_returned_count = claims_returned_count + 1 WHERE id = NEW.usr;
93         END IF;
94         RETURN NEW;
95 END;
96 $$ LANGUAGE 'plpgsql';
97 CREATE TRIGGER action_circulation_claims_returned
98         BEFORE UPDATE ON action.circulation
99         FOR EACH ROW
100         EXECUTE PROCEDURE action.circulation_claims_returned ();
101
102
103 CREATE TABLE action.hold_request (
104         id                      SERIAL                          PRIMARY KEY,
105         request_time            TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
106         capture_time            TIMESTAMP WITH TIME ZONE,
107         fulfillment_time        TIMESTAMP WITH TIME ZONE,
108         checkin_time            TIMESTAMP WITH TIME ZONE,
109         return_time             TIMESTAMP WITH TIME ZONE,
110         prev_check_time         TIMESTAMP WITH TIME ZONE,
111         expire_time             TIMESTAMP WITH TIME ZONE,
112         requestor               INT                             NOT NULL REFERENCES actor.usr (id),
113         usr                     INT                             NOT NULL REFERENCES actor.usr (id),
114         hold_type               CHAR                            NOT NULL CHECK (hold_type IN ('M','T','V','C')),
115         holdable_formats        TEXT,
116         phone_notify            TEXT,
117         email_notify            TEXT,
118         target                  BIGINT                          NOT NULL, -- see hold_type
119         selection_depth         INT                             NOT NULL DEFAULT 0,
120         pickup_lib              INT                             NOT NULL REFERENCES actor.org_unit,
121         current_copy            BIGINT                          REFERENCES asset.copy (id) ON DELETE SET NULL
122 );
123
124
125 CREATE TABLE action.hold_notification (
126         id              SERIAL                          PRIMARY KEY,
127         hold            INT                             NOT NULL REFERENCES action.hold_request (id),
128         method          TEXT                            NOT NULL, -- eh...
129         notify_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
130         note            TEXT
131 );
132
133 CREATE TABLE action.hold_copy_map (
134         id              SERIAL  PRIMARY KEY,
135         hold            INT     NOT NULL REFERENCES action.hold_request (id) ON DELETE CASCADE,
136         target_copy     BIGINT  NOT NULL REFERENCES asset.copy (id) ON DELETE CASCADE,
137         CONSTRAINT copy_once_per_hold UNIQUE (hold,target_copy)
138 );
139
140 CREATE TABLE action.transit_copy (
141         id                      SERIAL                          PRIMARY KEY,
142         target_copy             BIGINT                          NOT NULL asset.copy (id) ON DELETE CASCADE,
143         source                  INT                             NOT NULL REFERENCES actor.org_unit (id),
144         dest                    INT                             NOT NULL REFERENCES actor.org_unit (id),
145         persistant_transfer     BOOL                            NOT NULL DEFAULT FALSE,
146         source_send_time        TIMESTAMP WITH TIME ZONE,
147         dest_recv_time          TIMESTAMP WITH TIME ZONE,
148         prev_hop                INT                             REFERENCES action.transit_copy (id)
149 );
150
151 CREATE TABLE action.hold_transit_copy (
152         hold                    INT                             REFERENCES action.hold_request (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED
153 ) INHERITS (action.transit_copy);
154
155 CREATE TABLE action.unfulfilled_hold_list (
156         id              BIGSERIAL       PRIMARY KEY,
157         hold            INT                             NOT NULL,
158         current_copy    BIGINT                          NOT NULL,
159         circ_lib        INT                             NOT NULL,
160         fail_time       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
161 );
162
163 COMMIT;
164