require 'amsi/validator/request_errors' require_relative 'base' module Amsi module DocumentParser # Parse the GetMoveinsByFirstMarketingSource response class GetMoveins < Base private # @param body [Hash] the body of the XML response parsed # into a Hash # @return [Array] the leases contained in the # response # @raise [Amsi::Error::Base] if the response is invalid def parse_body(body) lease_hashes(body).map do |lease_hash| lease = Model::Lease.new(lease_hash) lease.occupants = occupants(lease_hash) lease.guest_card = guest_card(lease_hash) lease.matched_guest_cards = matched_guest_cards(lease_hash) lease end end def lease_hashes(body) response = body['GetMoveinsByFirstMarketingSourceResponse'] escaped_result = response['GetMoveinsByFirstMarketingSourceResult'] parsed_result = MultiXml.parse(escaped_result) leases = parsed_result['Leases']['Lease'] return [] if leases.nil? leases.is_a?(Array) ? leases : [leases] end def occupants(lease_hash) occupant_hashes(lease_hash).map do |occupant_hash| Model::Occupant.new(occupant_hash) end end def occupant_hashes(lease_hash) occupants = lease_hash['Occupant'] return [] if occupants.nil? occupants.is_a?(Array) ? occupants : [occupants] end def guest_card(lease_hash) guest_card_hash = lease_hash['GuestCard'] Model::GuestCard.new(guest_card_hash) unless guest_card_hash.nil? end def matched_guest_cards(lease_hash) matched_guest_card_hashes = lease_hash['MatchedGuestCard'] if matched_guest_card_hashes.is_a?(Hash) [matched_guest_card_hashes] else [*matched_guest_card_hashes] end.map { |h| Model::GuestCard.new(h) } end end end end