From aa1d5603aacfb37e3559fb6145ba0327c9f6b1a6 Mon Sep 17 00:00:00 2001 From: "a. bellenir" Date: Fri, 8 Jun 2018 11:42:53 -0400 Subject: [PATCH] LP#1775216: inconsistent copy counts between opac and staff client opac version of copy counts was including copies under deleted call numbers more discussion here: http://irc.evergreen-ils.org/evergreen/2018-06-08#i_363334 Signed-off-by: a. bellenir Signed-off-by: Kathy Lussier --- Open-ILS/src/sql/Pg/040.schema.asset.sql | 1 + ...hema.lp1775216_consistent_avail_counts.sql | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/Open-ILS/src/sql/Pg/040.schema.asset.sql b/Open-ILS/src/sql/Pg/040.schema.asset.sql index 3206c29372..79aa442f54 100644 --- a/Open-ILS/src/sql/Pg/040.schema.asset.sql +++ b/Open-ILS/src/sql/Pg/040.schema.asset.sql @@ -568,6 +568,7 @@ BEGIN org_list, asset.copy_vis_attr_cache av JOIN asset.copy cp ON (cp.id = av.target_copy AND av.record = rid) + JOIN asset.call_number cn ON (cp.call_number = cn.id AND not cn.deleted) WHERE cp.circ_lib = ANY (org_list.orgs) AND av.vis_attr_vector @@ mask.c_attrs::query_int GROUP BY 1,2,6; diff --git a/Open-ILS/src/sql/Pg/upgrade/1112.schema.lp1775216_consistent_avail_counts.sql b/Open-ILS/src/sql/Pg/upgrade/1112.schema.lp1775216_consistent_avail_counts.sql index e76d09e90d..b4d36c53e7 100644 --- a/Open-ILS/src/sql/Pg/upgrade/1112.schema.lp1775216_consistent_avail_counts.sql +++ b/Open-ILS/src/sql/Pg/upgrade/1112.schema.lp1775216_consistent_avail_counts.sql @@ -34,3 +34,44 @@ BEGIN RETURN; END; $function$; + +CREATE OR REPLACE FUNCTION asset.opac_ou_record_copy_count(org integer, rid bigint) + RETURNS TABLE(depth integer, org_unit integer, visible bigint, available bigint, unshadow bigint, transcendant integer) + LANGUAGE plpgsql +AS $function$ +DECLARE + ans RECORD; + trans INT; +BEGIN + SELECT 1 INTO trans FROM biblio.record_entry b JOIN config.bib_source src ON (b.source = src.id) WHERE src.transcendant AND b.id = rid; + + FOR ans IN SELECT u.id, t.depth FROM actor.org_unit_ancestors(org) AS u JOIN actor.org_unit_type t ON (u.ou_type = t.id) LOOP + RETURN QUERY + WITH org_list AS (SELECT ARRAY_AGG(id)::BIGINT[] AS orgs FROM actor.org_unit_descendants(ans.id) x), + available_statuses AS (SELECT ARRAY_AGG(id) AS ids FROM config.copy_status WHERE is_available), + mask AS (SELECT c_attrs FROM asset.patron_default_visibility_mask() x) + SELECT ans.depth, + ans.id, + COUNT( av.id ), + SUM( (cp.status = ANY (available_statuses.ids))::INT ), + COUNT( av.id ), + trans + FROM mask, + available_statuses, + org_list, + asset.copy_vis_attr_cache av + JOIN asset.copy cp ON (cp.id = av.target_copy AND av.record = rid) + JOIN asset.call_number cn ON (cp.call_number = cn.id AND not cn.deleted) + WHERE cp.circ_lib = ANY (org_list.orgs) AND av.vis_attr_vector @@ mask.c_attrs::query_int + GROUP BY 1,2,6; + + IF NOT FOUND THEN + RETURN QUERY SELECT ans.depth, ans.id, 0::BIGINT, 0::BIGINT, 0::BIGINT, trans; + END IF; + + END LOOP; + + RETURN; +END; +$function$; + -- 2.43.2