]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0283.schema.user-visiable-holds-circs-fixes.sql
Stamping upgrade scripts for LP#818740
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0283.schema.user-visiable-holds-circs-fixes.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0283');
4
5 CREATE OR REPLACE FUNCTION action.usr_visible_circs (usr_id INT) RETURNS SETOF action.circulation AS $func$
6 DECLARE
7     c               action.circulation%ROWTYPE;
8     view_age        INTERVAL;
9     usr_view_age    actor.usr_setting%ROWTYPE;
10     usr_view_start  actor.usr_setting%ROWTYPE;
11 BEGIN
12     SELECT * INTO usr_view_age FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.circ.retention_age';
13     SELECT * INTO usr_view_start FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.circ.retention_start';
14
15     IF usr_view_age.value IS NOT NULL AND usr_view_start.value IS NOT NULL THEN
16         -- User opted in and supplied a retention age
17         IF oils_json_to_text(usr_view_age.value)::INTERVAL > AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ) THEN
18             view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ);
19         ELSE
20             view_age := oils_json_to_text(usr_view_age.value)::INTERVAL;
21         END IF;
22     ELSIF usr_view_start.value IS NOT NULL THEN
23         -- User opted in
24         view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ);
25     ELSE
26         -- User did not opt in
27         RETURN;
28     END IF;
29
30     FOR c IN
31         SELECT  *
32           FROM  action.circulation
33           WHERE usr = usr_id
34                 AND parent_circ IS NULL
35                 AND xact_start > NOW() - view_age
36           ORDER BY xact_start
37     LOOP
38         RETURN NEXT c;
39     END LOOP;
40
41     RETURN;
42 END;
43 $func$ LANGUAGE PLPGSQL;
44
45 CREATE OR REPLACE FUNCTION action.usr_visible_holds (usr_id INT) RETURNS SETOF action.hold_request AS $func$
46 DECLARE
47     h               action.hold_request%ROWTYPE;
48     view_age        INTERVAL;
49     view_count      INT;
50     usr_view_count  actor.usr_setting%ROWTYPE;
51     usr_view_age    actor.usr_setting%ROWTYPE;
52 BEGIN
53     SELECT * INTO usr_view_count FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.hold.retention_count';
54     SELECT * INTO usr_view_age FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.hold.retention_age';
55
56     IF usr_view_count.value IS NULL AND usr_view_age.value IS NULL THEN
57         -- Only show "open" holds
58         FOR h IN
59             SELECT  *
60               FROM  action.hold_request
61               WHERE usr = usr_id
62                     AND fulfillment_time IS NULL
63                     AND cancel_time IS NULL
64               ORDER BY xact_start
65         LOOP
66             RETURN NEXT h;
67         END LOOP;
68     
69         RETURN;
70     END IF;
71
72     IF usr_view_age.value IS NOT NULL THEN
73         view_age := oils_json_to_text(usr_view_age.value)::INTERVAL;
74     ELSE
75         view_age := '2000 years'::INTERVAL;
76     END IF;
77
78     IF usr_view_count.value IS NOT NULL THEN
79         view_count := oils_json_to_text(usr_view_count.value)::INT;
80     ELSE
81         view_count := 1000;
82     END IF;
83
84     -- Else, show those /and/ some fulfilled/canceled holds
85     FOR h IN
86         SELECT  *
87           FROM  action.hold_request
88           WHERE usr = usr_id
89                 AND fulfillment_time IS NULL
90                 AND cancel_time IS NULL
91                     UNION ALL
92         SELECT  *
93           FROM  action.hold_request
94           WHERE usr = usr_id
95                 AND ( fulfillment_time IS NOT NULL OR cancel_time IS NOT NULL )
96                 AND request_time > NOW() - view_age
97           ORDER BY request_time
98           LIMIT view_count
99     LOOP
100         RETURN NEXT h;
101     END LOOP;
102
103     RETURN;
104 END;
105 $func$ LANGUAGE PLPGSQL;
106
107 COMMIT;
108