require 'xmlsimple' module Alma class AvailabilityResponse attr_accessor :availability def initialize(response) @availability = parse_bibs_data(response.list) 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