diff --git a/app/models/folio/patron.rb b/app/models/folio/patron.rb index 61f2e9c0b..bbca15996 100644 --- a/app/models/folio/patron.rb +++ b/app/models/folio/patron.rb @@ -166,6 +166,14 @@ def expired? user_info['active'] == false end + def holds + patron_summary['holds'] + end + + def loans + patron_summary['loans'] + end + private def valid_proxy_relation?(info) @@ -201,6 +209,11 @@ def policy_service @policy_service ||= Folio::CirculationRules::PolicyService.new(patron_groups: [patron_group['id']]) end + def patron_summary + @patron_summary ||= user_info.dig('stubs', 'patron_summary') # used for stubbing + @patron_summary ||= self.class.folio_client.patron_summary(id) + end + def patron_blocks @patron_blocks ||= user_info.dig('stubs', 'patron_blocks') # used for stubbing @patron_blocks ||= self.class.folio_client.patron_blocks(id).fetch('automatedPatronBlocks', []) diff --git a/app/models/patron_request.rb b/app/models/patron_request.rb index 7c99fa036..9e273485d 100644 --- a/app/models/patron_request.rb +++ b/app/models/patron_request.rb @@ -272,6 +272,39 @@ def selected_items items end + def on_account?(item = nil) + return instances_on_account if selectable_items.none? + + items_account(item) + end + + def instances_on_account + requests = 'request' if account_has_instance?(patron.holds) + loans = 'loan' if account_has_instance?(patron.loans) + [requests, loans].compact.join(' and ') + end + + def items_on_account(item) + requests = 'request' if account_has_item?(item, patron.holds) + loans = 'loan' if account_has_item?(item, patron.loans) + [requests, loans].compact.join(' and ') + end + + def account_has_instance?(instance_list) + return false unless selectable_items.none? && instance_list.present? + + instanceids = instance_list.map { |elem| elem['item']['instanceId'] } + instanceids.include?(instance_id) + end + + def account_has_item?(item, item_list) + return false unless (item || selectable_items.one?) && item_list.present? + + itemid = item ? item.id : selectable_items.first.id + itemids = item_list.map { |elem| elem['item']['itemId'] } + itemids.include?(itemid) + end + # @return [Array] the items that are holdable and recallable by the patron def holdable_recallable_items @holdable_recallable_items ||= selectable_items.filter { |item| item.recallable?(patron) && item.holdable?(patron) } diff --git a/app/services/folio_client.rb b/app/services/folio_client.rb index f2d9c35a6..428e03835 100644 --- a/app/services/folio_client.rb +++ b/app/services/folio_client.rb @@ -148,6 +148,10 @@ def patron_blocks(user_id) get_json("/automated-patron-blocks/#{user_id}") end + def patron_summary(user_id) + get_json("/patron/account/#{user_id}", params: { includeLoans: true, includeHolds: true }) + end + # Defines the hold request data for Folio # [String] pickup_location_id the UUID of the pickup location # [String] patron_comments diff --git a/app/views/patron_requests/_item_request_hold.html.erb b/app/views/patron_requests/_item_request_hold.html.erb new file mode 100644 index 000000000..32e28d1df --- /dev/null +++ b/app/views/patron_requests/_item_request_hold.html.erb @@ -0,0 +1,9 @@ +<% if type.present? %> +
+ +
+ Please be aware that there is already a <%= type %> for this title in our system under your name. +
+ +
+<% end %> \ No newline at end of file diff --git a/app/views/patron_requests/new.html.erb b/app/views/patron_requests/new.html.erb index cfc9e1d48..fba7e5f72 100644 --- a/app/views/patron_requests/new.html.erb +++ b/app/views/patron_requests/new.html.erb @@ -6,6 +6,8 @@ <%= render 'messages', messages: @patron_request.active_messages %> +<%= render 'item_request_hold', type: @patron_request.on_account? %> +

<%= @patron_request.item_title %>

<% if @patron_request.selectable_items.one? %> <% single_item = @patron_request.selectable_items.first %> @@ -170,6 +172,7 @@ <%= item.public_note %> <% end %> + <%= render 'item_request_hold', type: @patron_request.on_account?(item) %> <% if item.bound_with_holdings_per_item.any? %> diff --git a/spec/factories/patrons.rb b/spec/factories/patrons.rb index b5db1cad8..019bb2d9e 100644 --- a/spec/factories/patrons.rb +++ b/spec/factories/patrons.rb @@ -16,7 +16,8 @@ { patron_blocks: [], proxies: [], - sponsors: [] + sponsors: [], + patron_summary: { holds: [], loans: [] } } end @@ -61,7 +62,8 @@ } ], proxies: [], - sponsors: [] + sponsors: [], + patron_summary: { holds: [], loans: [] } } end end diff --git a/spec/features/create_aeon_patron_request_spec.rb b/spec/features/create_aeon_patron_request_spec.rb index bb7184291..95fc7e56f 100644 --- a/spec/features/create_aeon_patron_request_spec.rb +++ b/spec/features/create_aeon_patron_request_spec.rb @@ -9,7 +9,7 @@ let(:patron) do instance_double(Folio::Patron, id: user.patron_key, username: 'auser', display_name: 'A User', exists?: true, email: nil, patron_description: 'faculty', - patron_group_name: 'faculty', + patron_group_name: 'faculty', holds: [], blocked?: false, proxies: [], sponsors: [], sponsor?: false, proxy?: false, allowed_request_types: ['Hold', 'Recall', 'Page']) end