]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0399.schema.strict-renewal-test.sql
LP#1772955: Only include xacts with balance in summary
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0399.schema.strict-renewal-test.sql
1
2 BEGIN;
3
4 INSERT INTO config.upgrade_log (version) VALUES ('0399'); -- miker
5
6 CREATE OR REPLACE FUNCTION action.find_circ_matrix_matchpoint( context_ou INT, match_item BIGINT, match_user INT, renewal BOOL ) RETURNS config.circ_matrix_matchpoint AS $func$
7 DECLARE
8     current_group    permission.grp_tree%ROWTYPE;
9     user_object    actor.usr%ROWTYPE;
10     item_object    asset.copy%ROWTYPE;
11     cn_object    asset.call_number%ROWTYPE;
12     rec_descriptor    metabib.rec_descriptor%ROWTYPE;
13     current_mp    config.circ_matrix_matchpoint%ROWTYPE;
14     matchpoint    config.circ_matrix_matchpoint%ROWTYPE;
15 BEGIN
16     SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
17     SELECT INTO item_object * FROM asset.copy WHERE id = match_item;
18     SELECT INTO cn_object * FROM asset.call_number WHERE id = item_object.call_number;
19     SELECT INTO rec_descriptor r.* FROM metabib.rec_descriptor r JOIN asset.call_number c USING (record) WHERE c.id = item_object.call_number;
20     SELECT INTO current_group * FROM permission.grp_tree WHERE id = user_object.profile;
21
22     LOOP 
23         -- for each potential matchpoint for this ou and group ...
24         FOR current_mp IN
25             SELECT  m.*
26               FROM  config.circ_matrix_matchpoint m
27                     JOIN actor.org_unit_ancestors( context_ou ) d ON (m.org_unit = d.id)
28                     LEFT JOIN actor.org_unit_proximity p ON (p.from_org = context_ou AND p.to_org = d.id)
29               WHERE m.grp = current_group.id
30                     AND m.active
31                     AND (m.copy_owning_lib IS NULL OR cn_object.owning_lib IN ( SELECT id FROM actor.org_unit_descendants(m.copy_owning_lib) ))
32                     AND (m.copy_circ_lib   IS NULL OR item_object.circ_lib IN ( SELECT id FROM actor.org_unit_descendants(m.copy_circ_lib)   ))
33               ORDER BY    CASE WHEN p.prox        IS NULL THEN 999 ELSE p.prox END,
34                     CASE WHEN m.copy_owning_lib IS NOT NULL
35                         THEN 256 / ( SELECT COALESCE(prox, 255) + 1 FROM actor.org_unit_proximity WHERE to_org = cn_object.owning_lib AND from_org = m.copy_owning_lib LIMIT 1 )
36                         ELSE 0
37                     END +
38                     CASE WHEN m.copy_circ_lib IS NOT NULL
39                         THEN 256 / ( SELECT COALESCE(prox, 255) + 1 FROM actor.org_unit_proximity WHERE to_org = item_object.circ_lib AND from_org = m.copy_circ_lib LIMIT 1 )
40                         ELSE 0
41                     END +
42                     CASE WHEN m.is_renewal = renewal        THEN 128 ELSE 0 END +
43                     CASE WHEN m.juvenile_flag    IS NOT NULL THEN 64 ELSE 0 END +
44                     CASE WHEN m.circ_modifier    IS NOT NULL THEN 32 ELSE 0 END +
45                     CASE WHEN m.marc_type        IS NOT NULL THEN 16 ELSE 0 END +
46                     CASE WHEN m.marc_form        IS NOT NULL THEN 8 ELSE 0 END +
47                     CASE WHEN m.marc_vr_format    IS NOT NULL THEN 4 ELSE 0 END +
48                     CASE WHEN m.ref_flag        IS NOT NULL THEN 2 ELSE 0 END +
49                     CASE WHEN m.usr_age_lower_bound    IS NOT NULL THEN 0.5 ELSE 0 END +
50                     CASE WHEN m.usr_age_upper_bound    IS NOT NULL THEN 0.5 ELSE 0 END DESC LOOP
51
52             IF current_mp.is_renewal IS NOT NULL THEN
53                 CONTINUE WHEN current_mp.is_renewal <> renewal;
54             END IF;
55
56             IF current_mp.circ_modifier IS NOT NULL THEN
57                 CONTINUE WHEN current_mp.circ_modifier <> item_object.circ_modifier OR item_object.circ_modifier IS NULL;
58             END IF;
59
60             IF current_mp.marc_type IS NOT NULL THEN
61                 IF item_object.circ_as_type IS NOT NULL THEN
62                     CONTINUE WHEN current_mp.marc_type <> item_object.circ_as_type;
63                 ELSE
64                     CONTINUE WHEN current_mp.marc_type <> rec_descriptor.item_type;
65                 END IF;
66             END IF;
67
68             IF current_mp.marc_form IS NOT NULL THEN
69                 CONTINUE WHEN current_mp.marc_form <> rec_descriptor.item_form;
70             END IF;
71
72             IF current_mp.marc_vr_format IS NOT NULL THEN
73                 CONTINUE WHEN current_mp.marc_vr_format <> rec_descriptor.vr_format;
74             END IF;
75
76             IF current_mp.ref_flag IS NOT NULL THEN
77                 CONTINUE WHEN current_mp.ref_flag <> item_object.ref;
78             END IF;
79
80             IF current_mp.juvenile_flag IS NOT NULL THEN
81                 CONTINUE WHEN current_mp.juvenile_flag <> user_object.juvenile;
82             END IF;
83
84             IF current_mp.usr_age_lower_bound IS NOT NULL THEN
85                 CONTINUE WHEN user_object.dob IS NULL OR current_mp.usr_age_lower_bound < age(user_object.dob);
86             END IF;
87
88             IF current_mp.usr_age_upper_bound IS NOT NULL THEN
89                 CONTINUE WHEN user_object.dob IS NULL OR current_mp.usr_age_upper_bound > age(user_object.dob);
90             END IF;
91
92
93             -- everything was undefined or matched
94             matchpoint = current_mp;
95
96             EXIT WHEN matchpoint.id IS NOT NULL;
97         END LOOP;
98
99         EXIT WHEN current_group.parent IS NULL OR matchpoint.id IS NOT NULL;
100
101         SELECT INTO current_group * FROM permission.grp_tree WHERE id = current_group.parent;
102     END LOOP;
103
104     RETURN matchpoint;
105 END;
106 $func$ LANGUAGE plpgsql;
107
108 COMMIT;
109