]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/reporter-schema.sql
adding helper views for overdue, running and pending reports
[Evergreen.git] / Open-ILS / src / sql / Pg / reporter-schema.sql
1 DROP SCHEMA reporter CASCADE;
2
3 BEGIN;
4
5 CREATE SCHEMA reporter;
6
7 CREATE TABLE reporter.template_folder (
8         id              SERIAL                          PRIMARY KEY,
9         parent          INT                             REFERENCES reporter.template_folder (id) DEFERRABLE INITIALLY DEFERRED,
10         owner           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
11         create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
12         name            TEXT                            NOT NULL,
13         shared          BOOL                            NOT NULL DEFAULT FALSE,
14         share_with      INT                             REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED
15 );
16 CREATE INDEX rpt_tmpl_fldr_owner_idx ON reporter.template_folder (owner);
17 CREATE UNIQUE INDEX rpt_template_folder_once_parent_idx ON reporter.template_folder (name,parent);
18 CREATE UNIQUE INDEX rpt_template_folder_once_idx ON reporter.template_folder (name,owner) WHERE parent IS NULL;
19
20 CREATE TABLE reporter.report_folder (
21         id              SERIAL                          PRIMARY KEY,
22         parent          INT                             REFERENCES reporter.report_folder (id) DEFERRABLE INITIALLY DEFERRED,
23         owner           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
24         create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
25         name            TEXT                            NOT NULL,
26         shared          BOOL                            NOT NULL DEFAULT FALSE,
27         share_with      INT                             REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED
28 );
29 CREATE INDEX rpt_rpt_fldr_owner_idx ON reporter.report_folder (owner);
30 CREATE UNIQUE INDEX rpt_report_folder_once_parent_idx ON reporter.report_folder (name,parent);
31 CREATE UNIQUE INDEX rpt_report_folder_once_idx ON reporter.report_folder (name,owner) WHERE parent IS NULL;
32
33 CREATE TABLE reporter.output_folder (
34         id              SERIAL                          PRIMARY KEY,
35         parent          INT                             REFERENCES reporter.output_folder (id) DEFERRABLE INITIALLY DEFERRED,
36         owner           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
37         create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
38         name            TEXT                            NOT NULL,
39         shared          BOOL                            NOT NULL DEFAULT FALSE,
40         share_with      INT                             REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED
41 );
42 CREATE INDEX rpt_output_fldr_owner_idx ON reporter.output_folder (owner);
43 CREATE UNIQUE INDEX rpt_output_folder_once_parent_idx ON reporter.output_folder (name,parent);
44 CREATE UNIQUE INDEX rpt_output_folder_once_idx ON reporter.output_folder (name,owner) WHERE parent IS NULL;
45
46
47 CREATE TABLE reporter.template (
48         id              SERIAL                          PRIMARY KEY,
49         owner           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
50         create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
51         name            TEXT                            NOT NULL,
52         description     TEXT                            NOT NULL,
53         data            TEXT                            NOT NULL,
54         folder          INT                             NOT NULL REFERENCES reporter.template_folder (id)
55 );
56 CREATE INDEX rpt_tmpl_owner_idx ON reporter.template (owner);
57 CREATE INDEX rpt_tmpl_fldr_idx ON reporter.template (folder);
58 CREATE UNIQUE INDEX rtp_template_folder_once_idx ON reporter.template (name,folder);
59
60 CREATE TABLE reporter.report (
61         id              SERIAL                          PRIMARY KEY,
62         owner           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
63         create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
64         name            TEXT                            NOT NULL DEFAULT '',
65         description     TEXT                            NOT NULL DEFAULT '',
66         template        INT                             NOT NULL REFERENCES reporter.template (id) DEFERRABLE INITIALLY DEFERRED,
67         data            TEXT                            NOT NULL,
68         folder          INT                             NOT NULL REFERENCES reporter.report_folder (id),
69         recur           BOOL                            NOT NULL DEFAULT FALSE,
70         recurance       INTERVAL
71 );
72 CREATE INDEX rpt_rpt_owner_idx ON reporter.report (owner);
73 CREATE INDEX rpt_rpt_fldr_idx ON reporter.report (folder);
74 CREATE UNIQUE INDEX rtp_report_folder_once_idx ON reporter.report (name,folder);
75
76 CREATE TABLE reporter.schedule (
77         id              SERIAL                          PRIMARY KEY,
78         report          INT                             NOT NULL REFERENCES reporter.report (id) DEFERRABLE INITIALLY DEFERRED,
79         folder          INT                             NOT NULL REFERENCES reporter.output_folder (id),
80         runner          INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
81         run_time        TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
82         start_time      TIMESTAMP WITH TIME ZONE,
83         complete_time   TIMESTAMP WITH TIME ZONE,
84         email           TEXT,
85         excel_format    BOOL                            NOT NULL DEFAULT TRUE,
86         html_format     BOOL                            NOT NULL DEFAULT TRUE,
87         csv_format      BOOL                            NOT NULL DEFAULT TRUE,
88         chart_pie       BOOL                            NOT NULL DEFAULT FALSE,
89         chart_bar       BOOL                            NOT NULL DEFAULT FALSE,
90         chart_line      BOOL                            NOT NULL DEFAULT FALSE,
91         error_code      INT,
92         error_text      TEXT
93 );
94 CREATE INDEX rpt_sched_runner_idx ON reporter.schedule (runner);
95 CREATE INDEX rpt_sched_folder_idx ON reporter.schedule (folder);
96
97 CREATE OR REPLACE VIEW reporter.simple_record AS
98 SELECT  r.id,
99         s.metarecord,
100         r.fingerprint,
101         r.quality,
102         r.tcn_source,
103         r.tcn_value,
104         title.value AS title,
105         uniform_title.value AS uniform_title,
106         author.value AS author,
107         publisher.value AS publisher,
108         SUBSTRING(pubdate.value FROM $$\d+$$) AS pubdate,
109         series_title.value AS series_title,
110         series_statement.value AS series_statement,
111         summary.value AS summary,
112         ARRAY_ACCUM( SUBSTRING(isbn.value FROM $$^\S+$$) ) AS isbn,
113         ARRAY_ACCUM( SUBSTRING(issn.value FROM $$^\S+$$) ) AS issn,
114         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '650' AND subfield = 'a' AND record = r.id)) AS topic_subject,
115         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '651' AND subfield = 'a' AND record = r.id)) AS geographic_subject,
116         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '655' AND subfield = 'a' AND record = r.id)) AS genre,
117         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '600' AND subfield = 'a' AND record = r.id)) AS name_subject,
118         ARRAY((SELECT DISTINCT value FROM metabib.full_rec WHERE tag = '610' AND subfield = 'a' AND record = r.id)) AS corporate_subject,
119         ARRAY((SELECT value FROM metabib.full_rec WHERE tag = '856' AND subfield IN ('3','y','u') AND record = r.id ORDER BY CASE WHEN subfield IN ('3','y') THEN 0 ELSE 1 END)) AS external_uri
120   FROM  biblio.record_entry r
121         JOIN metabib.metarecord_source_map s ON (s.source = r.id)
122         LEFT JOIN metabib.full_rec uniform_title ON (r.id = uniform_title.record AND uniform_title.tag = '240' AND uniform_title.subfield = 'a')
123         LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
124         LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag = '100' AND author.subfield = 'a')
125         LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
126         LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
127         LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
128         LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
129         LEFT JOIN metabib.full_rec series_title ON (r.id = series_title.record AND series_title.tag IN ('830','440') AND series_title.subfield = 'a')
130         LEFT JOIN metabib.full_rec series_statement ON (r.id = series_statement.record AND series_statement.tag = '490' AND series_statement.subfield = 'a')
131         LEFT JOIN metabib.full_rec summary ON (r.id = summary.record AND summary.tag = '520' AND summary.subfield = 'a')
132   WHERE r.deleted IS FALSE
133   GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14;
134
135 CREATE OR REPLACE VIEW reporter.super_simple_record AS
136 SELECT  r.id,
137         r.fingerprint,
138         r.quality,
139         r.tcn_source,
140         r.tcn_value,
141         title.value AS title,
142         FIRST(author.value) AS author,
143         publisher.value AS publisher,
144         SUBSTRING(pubdate.value FROM $$\d+$$) AS pubdate,
145         ARRAY_ACCUM( SUBSTRING(isbn.value FROM $$^\S+$$) ) AS isbn,
146         ARRAY_ACCUM( SUBSTRING(issn.value FROM $$^\S+$$) ) AS issn
147   FROM  biblio.record_entry r
148         LEFT JOIN metabib.full_rec title ON (r.id = title.record AND title.tag = '245' AND title.subfield = 'a')
149         LEFT JOIN metabib.full_rec author ON (r.id = author.record AND author.tag IN ('100','110','111') AND author.subfield = 'a')
150         LEFT JOIN metabib.full_rec publisher ON (r.id = publisher.record AND publisher.tag = '260' AND publisher.subfield = 'b')
151         LEFT JOIN metabib.full_rec pubdate ON (r.id = pubdate.record AND pubdate.tag = '260' AND pubdate.subfield = 'c')
152         LEFT JOIN metabib.full_rec isbn ON (r.id = isbn.record AND isbn.tag IN ('024', '020') AND isbn.subfield IN ('a','z'))
153         LEFT JOIN metabib.full_rec issn ON (r.id = issn.record AND issn.tag = '022' AND issn.subfield = 'a')
154   WHERE r.deleted IS FALSE
155   GROUP BY 1,2,3,4,5,6,8,9;
156
157 CREATE OR REPLACE VIEW reporter.demographic AS
158 SELECT  u.id,
159         u.dob,
160         CASE
161                 WHEN u.dob IS NULL
162                         THEN 'Adult'
163                 WHEN AGE(u.dob) > '18 years'::INTERVAL
164                         THEN 'Adult'
165                 ELSE 'Juvenile'
166         END AS general_division
167   FROM  actor.usr u;
168
169 CREATE OR REPLACE VIEW reporter.circ_type AS
170 SELECT  id,
171         CASE WHEN opac_renewal OR phone_renewal OR desk_renewal
172                 THEN 'RENEWAL'
173                 ELSE 'CHECKOUT'
174         END AS "type"
175   FROM  action.circulation;
176
177 CREATE OR REPLACE VIEW reporter.hold_request_record AS
178 SELECT  id,
179         target,
180         hold_type,
181         CASE
182                 WHEN hold_type = 'T'
183                         THEN target
184                 WHEN hold_type = 'V'
185                         THEN (SELECT cn.record FROM asset.call_number cn WHERE cn.id = ahr.target)
186                 WHEN hold_type = 'C'
187                         THEN (SELECT cn.record FROM asset.call_number cn JOIN asset.copy cp ON (cn.id = cp.call_number) WHERE cp.id = ahr.target)
188                 WHEN hold_type = 'M'
189                         THEN (SELECT mr.master_record FROM metabib.metarecord mr WHERE mr.id = ahr.target)
190         END AS bib_record
191   FROM  action.hold_request ahr;
192
193 CREATE OR REPLACE VIEW reporter.xact_billing_totals AS
194 SELECT  b.xact,
195         SUM( CASE WHEN b.voided THEN 0 ELSE amount END ) as unvoided,
196         SUM( CASE WHEN b.voided THEN amount ELSE 0 END ) as voided,
197         SUM( amount ) as total
198   FROM  money.billing b
199   GROUP BY 1;
200
201 CREATE OR REPLACE VIEW reporter.xact_paid_totals AS
202 SELECT  b.xact,
203         SUM( CASE WHEN b.voided THEN 0 ELSE amount END ) as unvoided,
204         SUM( CASE WHEN b.voided THEN amount ELSE 0 END ) as voided,
205         SUM( amount ) as total
206   FROM  money.payment b
207   GROUP BY 1;
208
209 CREATE OR REPLACE VIEW reporter.overdue_circs AS
210 SELECT  *
211   FROM  "action".circulation
212   WHERE checkin_time is null
213         AND (stop_fines NOT IN ('LOST','CLAIMSRETURNED') OR stop_fines IS NULL)
214         AND due_date < now();
215
216 CREATE OR REPLACE VIEW reporter.overdue_reports AS
217  SELECT s.id, c.barcode AS runner_barcode, r.name, s.run_time, s.run_time - now() AS scheduled_wait_time
218    FROM reporter.schedule s
219    JOIN reporter.report r ON r.id = s.report
220    JOIN actor.usr u ON s.runner = u.id
221    JOIN actor.card c ON c.id = u.card
222   WHERE s.start_time IS NULL AND s.run_time < now();
223
224 CREATE OR REPLACE VIEW reporter.pending_reports AS
225  SELECT s.id, c.barcode AS runner_barcode, r.name, s.run_time, s.run_time - now() AS scheduled_wait_time
226    FROM reporter.schedule s
227    JOIN reporter.report r ON r.id = s.report
228    JOIN actor.usr u ON s.runner = u.id
229    JOIN actor.card c ON c.id = u.card
230   WHERE s.start_time IS NULL;
231
232 CREATE OR REPLACE VIEW reporter.currently_running AS
233  SELECT s.id, c.barcode AS runner_barcode, r.name, s.run_time, s.run_time - now() AS scheduled_wait_time
234    FROM reporter.schedule s
235    JOIN reporter.report r ON r.id = s.report
236    JOIN actor.usr u ON s.runner = u.id
237    JOIN actor.card c ON c.id = u.card
238   WHERE s.start_time IS NOT NULL AND s.complete_time IS NULL;
239
240 COMMIT;
241