]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0811.function.copy_related_hold_stats.sql
81b7b9320345acd23774990de0e3d1808402db96
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0811.function.copy_related_hold_stats.sql
1 BEGIN;
2
3 -- check whether patch can be applied
4 SELECT evergreen.upgrade_deps_block_check('0811', :eg_version);
5
6 DROP FUNCTION action.copy_related_hold_stats(integer);
7
8 CREATE OR REPLACE FUNCTION action.copy_related_hold_stats(copy_id bigint)
9   RETURNS action.hold_stats AS
10 $BODY$
11 DECLARE
12     output          action.hold_stats%ROWTYPE;
13     hold_count      INT := 0;
14     copy_count      INT := 0;
15     available_count INT := 0;
16     hold_map_data   RECORD;
17 BEGIN
18
19     output.hold_count := 0;
20     output.copy_count := 0;
21     output.available_count := 0;
22
23     SELECT  COUNT( DISTINCT m.hold ) INTO hold_count
24       FROM  action.hold_copy_map m
25             JOIN action.hold_request h ON (m.hold = h.id)
26       WHERE m.target_copy = copy_id
27             AND NOT h.frozen;
28
29     output.hold_count := hold_count;
30
31     IF output.hold_count > 0 THEN
32         FOR hold_map_data IN
33             SELECT  DISTINCT m.target_copy,
34                     acp.status
35               FROM  action.hold_copy_map m
36                     JOIN asset.copy acp ON (m.target_copy = acp.id)
37                     JOIN action.hold_request h ON (m.hold = h.id)
38               WHERE m.hold IN ( SELECT DISTINCT hold FROM action.hold_copy_map WHERE target_copy = copy_id ) AND NOT h.frozen
39         LOOP
40             output.copy_count := output.copy_count + 1;
41             IF hold_map_data.status IN (0,7,12) THEN
42                 output.available_count := output.available_count + 1;
43             END IF;
44         END LOOP;
45         output.total_copy_ratio = output.copy_count::FLOAT / output.hold_count::FLOAT;
46         output.available_copy_ratio = output.available_count::FLOAT / output.hold_count::FLOAT;
47
48     END IF;
49
50     RETURN output;
51
52 END;
53 $BODY$
54   LANGUAGE plpgsql VOLATILE
55   COST 100;
56 ALTER FUNCTION action.copy_related_hold_stats(bigint)
57   OWNER TO evergreen;
58
59 COMMIT;
60