# frozen_string_literal: true require "xmlsimple" module Alma class AvailabilityResponse attr_accessor :availability def initialize(response) @availability = parse_bibs_data(response.each) end # Data structure for holdings information of bib records. # A hash with mms ids as keys, with values of an array of # one or more hashes of holdings info def parse_bibs_data(bibs) bibs.reduce(Hash.new) { |acc, bib| acc.merge({ "#{bib.id}" => { holdings: build_holdings_for(bib) } }) } end def build_holdings_for(bib) get_inventory_fields_for(bib).map do |inventory_field| # Use the mapping for this inventory type subfield_codes = Alma::INVENTORY_SUBFIELD_MAPPING[inventory_field["tag"]] inventory_field. # Get all the subfields for this inventory field fetch("subfield", []). # Limit to only subfields codes for which we have a mapping select { |sf| subfield_codes.key? sf["code"] }. # Transform the array of subfields into a hash with mapped code as key reduce(Hash.new) { |acc, subfield| acc.merge({ "#{subfield_codes[subfield['code']]}" => subfield["content"] }) }. # Include the inventory type merge({ "inventory_type" => subfield_codes["INVENTORY_TYPE"] }) end end def get_inventory_fields_for(bib) # Return only the datafields with tags AVA, AVD, or AVE bib.record .fetch("datafield", []) .select { |df| Alma::INVENTORY_SUBFIELD_MAPPING.key?(df["tag"]) } end end INVENTORY_SUBFIELD_MAPPING = { "AVA" => { "INVENTORY_TYPE" => "physical", "a" => "institution", "b" => "library_code", "c" => "location", "d" => "call_number", "e" => "availability", "f" => "total_items", "g" => "non_available_items", "j" => "location_code", "k" => "call_number_type", "p" => "priority", "q" => "library", "t" => "holding_info", "8" => "holding_id", }, "AVD" => { "INVENTORY_TYPE" => "digital", "a" => "institution", "b" => "representations_id", "c" => "representation", "d" => "repository_name", "e" => "label", }, "AVE" => { "INVENTORY_TYPE" => "electronic", "c" => "collection_id", "e" => "activation_status", "l" => "library_code", "m" => "collection", "n" => "public_note", "s" => "coverage_statement", "t" => "interface_name", "u" => "link_to_service_page", "8" => "portfolio_pid", } } end