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