]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0734.tpac_holdable_check.sql
Update permission name to match existing ones
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0734.tpac_holdable_check.sql
1 -- Evergreen DB patch 0734.tpac_holdable_check.sql
2 --
3 BEGIN;
4
5 -- check whether patch can be applied
6 SELECT evergreen.upgrade_deps_block_check('0734', :eg_version);
7
8 CREATE OR REPLACE FUNCTION asset.record_has_holdable_copy ( rid BIGINT ) RETURNS BOOL AS $f$
9 BEGIN
10     PERFORM 1
11         FROM
12             asset.copy acp
13             JOIN asset.call_number acn ON acp.call_number = acn.id
14             JOIN asset.copy_location acpl ON acp.location = acpl.id
15             JOIN config.copy_status ccs ON acp.status = ccs.id
16         WHERE
17             acn.record = rid
18             AND acp.holdable = true
19             AND acpl.holdable = true
20             AND ccs.holdable = true
21             AND acp.deleted = false
22         LIMIT 1;
23     IF FOUND THEN
24         RETURN true;
25     END IF;
26     RETURN FALSE;
27 END;
28 $f$ LANGUAGE PLPGSQL;
29
30 CREATE OR REPLACE FUNCTION asset.metarecord_has_holdable_copy ( rid BIGINT ) RETURNS BOOL AS $f$
31 BEGIN
32     PERFORM 1
33         FROM
34             asset.copy acp
35             JOIN asset.call_number acn ON acp.call_number = acn.id
36             JOIN asset.copy_location acpl ON acp.location = acpl.id
37             JOIN config.copy_status ccs ON acp.status = ccs.id
38             JOIN metabib.metarecord_source_map mmsm ON acn.record = mmsm.source
39         WHERE
40             mmsm.metarecord = rid
41             AND acp.holdable = true
42             AND acpl.holdable = true
43             AND ccs.holdable = true
44             AND acp.deleted = false
45         LIMIT 1;
46     IF FOUND THEN
47         RETURN true;
48     END IF;
49     RETURN FALSE;
50 END;
51 $f$ LANGUAGE PLPGSQL;
52
53 CREATE OR REPLACE FUNCTION unapi.holdings_xml (
54     bid BIGINT,
55     ouid INT,
56     org TEXT,
57     depth INT DEFAULT NULL,
58     includes TEXT[] DEFAULT NULL::TEXT[],
59     slimit HSTORE DEFAULT NULL,
60     soffset HSTORE DEFAULT NULL,
61     include_xmlns BOOL DEFAULT TRUE,
62     pref_lib INT DEFAULT NULL
63 )
64 RETURNS XML AS $F$
65      SELECT  XMLELEMENT(
66                  name holdings,
67                  XMLATTRIBUTES(
68                     CASE WHEN $8 THEN 'http://open-ils.org/spec/holdings/v1' ELSE NULL END AS xmlns,
69                     CASE WHEN ('bre' = ANY ($5)) THEN 'tag:open-ils.org:U2@bre/' || $1 || '/' || $3 ELSE NULL END AS id,
70                     (SELECT record_has_holdable_copy FROM asset.record_has_holdable_copy($1)) AS has_holdable
71                  ),
72                  XMLELEMENT(
73                      name counts,
74                      (SELECT  XMLAGG(XMLELEMENT::XML) FROM (
75                          SELECT  XMLELEMENT(
76                                      name count,
77                                      XMLATTRIBUTES('public' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
78                                  )::text
79                            FROM  asset.opac_ou_record_copy_count($2,  $1)
80                                      UNION
81                          SELECT  XMLELEMENT(
82                                      name count,
83                                      XMLATTRIBUTES('staff' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
84                                  )::text
85                            FROM  asset.staff_ou_record_copy_count($2, $1)
86                                      UNION
87                          SELECT  XMLELEMENT(
88                                      name count,
89                                      XMLATTRIBUTES('pref_lib' as type, depth, org_unit, coalesce(transcendant,0) as transcendant, available, visible as count, unshadow)
90                                  )::text
91                            FROM  asset.opac_ou_record_copy_count($9,  $1)
92                                      ORDER BY 1
93                      )x)
94                  ),
95                  CASE 
96                      WHEN ('bmp' = ANY ($5)) THEN
97                         XMLELEMENT(
98                             name monograph_parts,
99                             (SELECT XMLAGG(bmp) FROM (
100                                 SELECT  unapi.bmp( id, 'xml', 'monograph_part', evergreen.array_remove_item_by_value( evergreen.array_remove_item_by_value($5,'bre'), 'holdings_xml'), $3, $4, $6, $7, FALSE)
101                                   FROM  biblio.monograph_part
102                                   WHERE record = $1
103                             )x)
104                         )
105                      ELSE NULL
106                  END,
107                  XMLELEMENT(
108                      name volumes,
109                      (SELECT XMLAGG(acn ORDER BY rank, name, label_sortkey) FROM (
110                         -- Physical copies
111                         SELECT  unapi.acn(y.id,'xml','volume',evergreen.array_remove_item_by_value( evergreen.array_remove_item_by_value($5,'holdings_xml'),'bre'), $3, $4, $6, $7, FALSE), y.rank, name, label_sortkey
112                         FROM evergreen.ranked_volumes($1, $2, $4, $6, $7, $9) AS y
113                         UNION ALL
114                         -- Located URIs
115                         SELECT unapi.acn(uris.id,'xml','volume',evergreen.array_remove_item_by_value( evergreen.array_remove_item_by_value($5,'holdings_xml'),'bre'), $3, $4, $6, $7, FALSE), 0, name, label_sortkey
116                         FROM evergreen.located_uris($1, $2, $9) AS uris
117                      )x)
118                  ),
119                  CASE WHEN ('ssub' = ANY ($5)) THEN 
120                      XMLELEMENT(
121                          name subscriptions,
122                          (SELECT XMLAGG(ssub) FROM (
123                             SELECT  unapi.ssub(id,'xml','subscription','{}'::TEXT[], $3, $4, $6, $7, FALSE)
124                               FROM  serial.subscription
125                               WHERE record_entry = $1
126                         )x)
127                      )
128                  ELSE NULL END,
129                  CASE WHEN ('acp' = ANY ($5)) THEN 
130                      XMLELEMENT(
131                          name foreign_copies,
132                          (SELECT XMLAGG(acp) FROM (
133                             SELECT  unapi.acp(p.target_copy,'xml','copy',evergreen.array_remove_item_by_value($5,'acp'), $3, $4, $6, $7, FALSE)
134                               FROM  biblio.peer_bib_copy_map p
135                                     JOIN asset.copy c ON (p.target_copy = c.id)
136                               WHERE NOT c.deleted AND p.peer_record = $1
137                             LIMIT ($6 -> 'acp')::INT
138                             OFFSET ($7 -> 'acp')::INT
139                         )x)
140                      )
141                  ELSE NULL END
142              );
143 $F$ LANGUAGE SQL STABLE;
144
145 COMMIT;