diff --git a/Readme.md b/Readme.md
index 1ff6631..5398d02 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,61 +1,268 @@
-ArchivesSpace Request Fulfillment via Aeon - Updated 20171204
-=============================================================
-This plugin adds a new request button to archival objects that allows researchers to place Aeon requests for archival objects discovered via the ArchivesSpace Public User Interface.
+# ArchivesSpace Request Fulfillment via Aeon
-The functionality provided by this plugin is meant to replace the existing Public UI request action functionality for archival objects. As such, it is recommended that the built in functionality be disabled by setting 'AppConfig[:pui_page_actions_request] = false' or by removing ':archival_object' from your 'AppConfig[:pui_requests_permitted_for_types]' setting. The latter will allow you to use Aeon to fulfill archival_object requests while still allowing other object types to be requested via the default email functionality. By using the 'per repository' configuration options for the built in PUI requesting functionality, it is also possible to configure some repositories to continue using the built in PUI requesting feature for archival objects while allowing other repositories to use Aeon.
+**Version:** 20180111
+
+**Last Updated:** January 11, 2018
+
+
+## Table of Contents
+
+1. [ArchivesSpace Request Fulfillment via Aeon](#archivesspace-request-fulfillment-via-aeon)
+ 1. [Table of Contents](#table-of-contents)
+ 2. [Overview](#overview)
+ 3. [Changelog](#changelog)
+ 4. [Configuring Plugin Settings](#configuring-plugin-settings)
+ 1. [All Aeon Fulfillment Plugin Configuration Options](#all-aeon-fulfillment-plugin-configuration-options)
+ 2. [Example Configuration](#example-configuration)
+ 5. [Imported Fields](#imported-fields)
+ 1. [Common Fields](#common-fields)
+ 2. [Archival Object Fields](#archival-object-fields)
+ 3. [Accession Fields](#accession-fields)
+ 6. [OpenURL Mappings](#openurl-mappings)
+
+
+## Overview
+
+This plugin adds a new request button to archival objects that allows
+researchers to place Aeon requests for archival objects discovered via the
+ArchivesSpace Public User Interface.
+
+The functionality provided by this plugin is meant to replace the existing
+Public UI request action functionality for archival objects. As such, it is
+recommended that the built in functionality be disabled by setting
+`AppConfig[:pui_page_actions_request] = false` or by removing `:archival_object` from your `AppConfig[:pui_requests_permitted_for_types]`
+setting. The latter will allow you to use Aeon to fulfill archival_object
+requests, while still allowing other object types to be requested via the
+default email functionality. By using the 'per repository' configuration
+options for the built in PUI requesting functionality, it is also possible to
+configure some repositories to continue using the built in PUI requesting
+feature for archival objects while allowing other repositories to use Aeon.
+
+This plugin has been tested on version 2.2.0 of ArchivesSpace. Future releases
+of ArchivesSpace may cause changes in the functionality of this plugin.
+
+
+## Changelog
+
+- **20170809**
+ - Initial release of this ArchivesSpace plugin
+ - Added support for sending requests for Archival Objects to Aeon
+- **20171110**
+ - Added readme to include configuration resources
+ - Removed an unused control
+- **20171204**
+ - Changes to readme and configuration resources
+ - Bug fixes
+- **20180111**
+ - Moved core functionality out of the `.erb`
+ - Added support for sending requests for Accessions to Aeon
+ - Bug fixes
+
+
+## Configuring Plugin Settings
+
+In order to configure this plugin, you will need to modify the
+`config/config.rb` file of your ArchivesSpace installation. To enable the
+plugin, you will need to add the following to the configuration file.
-**Add the following after your list of plugins has been initialized**
```ruby
-AppConfig[:plugins] = << 'aeon_fulfillment'
+AppConfig[:plugins] << 'aeon_fulfillment'
AppConfig[:aeon_fulfillment] = {}
```
-**Add the following settings and appropriate values for EACH repository that will use the plugin. Replace '{repo_code}' with the appropriate repository code (also known as a short name) for the repository (lower-cased).**
+Next, you will need to add the appropriate settings appropriate values for
+each repository that will use the plugin. In the sample below, replace
+`{repo_code}` with the repository code for each repository. The repo_code is
+also known as the repository's short name. The repo_code must be written using
+lower-case.
+
```ruby
AppConfig[:aeon_fulfillment]['{repo_code}'] = {}
AppConfig[:aeon_fulfillment]['{repo_code}'][:aeon_web_url] = "{Your aeon web url}"
AppConfig[:aeon_fulfillment]['{repo_code}'][:aeon_return_link_label] = "{The text for the return link from Aeon}"
```
-For example, to configure the addon for a repository with a code of "ATLAS" add the following to config.rb
+For example, to configure the plugin for a repository that has the short name
+"ATLAS", add the following to `config.rb`.
+
```ruby
-AppConfig[:plugins] = << 'aeon_fulfillment'
+AppConfig[:plugins] << 'aeon_fulfillment'
AppConfig[:aeon_fulfillment] = {}
AppConfig[:aeon_fulfillment]['atlas'] = {}
AppConfig[:aeon_fulfillment]['atlas'][:aeon_web_url] = "https://your.institution.edu/aeon/"
-AppConfig[:aeon_fulfillment]['atlas'][:aeon_return_link_label] = "ArchivesSpace"
+AppConfig[:aeon_fulfillment]['atlas'][:aeon_return_link_label] = "ArchivesSpace"
```
-**All Aeon Fulfillment Plugin Specific Configuration Options**
+This plugin configuration can also be formatted using the implicit form of a
+Ruby hash.
+
```ruby
-# (required) The URL to your Aeon web site
-AppConfig[:aeon_fulfillment]['{repo_code}'][:aeon_web_url]
+AppConfig[:plugins] << 'aeon_fulfillment'
+AppConfig[:aeon_fulfillment] = {
+ "atlas" => {
+ :aeon_web_url => "https://your.institution.edu/aeon/",
+ :aeon_external_system_id => "ArchivesSpace"
+ },
+ "test-repo" => {
+ :aeon_web_url => "https://your.institution.edu/aeon/",
+ :aeon_external_system_id => "ArchivesSpace Test Tepo"
+ }
+}
+```
+
+### All Aeon Fulfillment Plugin Configuration Options
+
+- **:aeon\_web\_url**. (Required). This setting specifies the web url that
+ points to an Aeon installation. The plugin will send requests to this url,
+ after adding the external requests endpoint (`aeon.dll?action=11&type=200`)
+ to the end.
-# (required) The text to display on the button that takes users back to ArchivesSpace
-AppConfig[:aeon_fulfillment]['{repo_code}'][:aeon_return_link_label]
+- **:aeon\_return\_link\_label**. (Required). This setting specifies the text
+ that will display on the button that takes users back to ArchivesSpace.
-# Specifies whether requests are limited to resources with top containers only. Default is false.
-AppConfig[:aeon_fulfillment]['{repo_code}'][:requests_permitted_for_containers_only]
+- **:requests\_permitted\_for\_containers\_only**. This settings specifies
+ whether requests are limited to resources with top containers only. The
+ default for this setting is false.
-# The system ID to match fields against in Aeon's OpenURLMapping table.
-AppConfig[:aeon_fulfillment]['{repo_code}'][:aeon_external_system_id]
+- **:aeon\_external\_system\_id**. This setting specifies the System ID, which
+ is used by Aeon to determine which mapping rules to use from its
+ OpenURLMapping table. Each repository configuration can have their own
+ System ID or they can have a duplicate System ID.
+
+### Example Configuration
+
+```ruby
+AppConfig[:plugins] << "aeon_fulfillment"
+
+AppConfig[:aeon_fulfillment] = {
+ "special research collections" => {
+ :aeon_web_url => "https://your.institution.edu/aeon/",
+ :aeon_return_link_label => "Back to ArchivesSpace",
+ :aeon_external_system_id => "ArchivesSpace",
+ :requests_permitted_for_containers_only => true
+ },
+ "test special collections" => {
+ :aeon_web_url => "https://your.institution.edu/aeon/",
+ :aeon_return_link_label => "Back to ArchivesSpace",
+ :aeon_external_system_id => "ArchivesSpace Test",
+ :requests_permitted_for_containers_only => false
+ }
+}
```
-**Fields imported from the resource (Incomplete list)**
-- uri
-- identifier
-- component_id
-- title
-- restrictions_apply
-- level
-- publish
-- creator (as a semi-colon separated string list)
-
-Recommended OpenURL Mappings
-```sql
+## Imported Fields
+
+This plugin builds a form that is sent to Aeon through the external requests
+(`aeon.dll?action=11&type=200`) endpoint of your Aeon installation. Below are
+the names of the fields as they will appear in the request.
+
+### Common Fields
+
+These fields are imported from both Archival Object records and Accession
+records.
+
+- `SystemID`
+- `ReturnLinkURL`
+- `ReturnLinkSystemName`
+- `identifier`
+- `publish` (true/false value)
+- `level`
+- `title`
+- `uri`
+- `collection_id`
+- `collection_title`
+- `repo_code`
+- `repo_name`
+- `language`
+- `restrictions_apply` (true/false value)
+- `display_string`
+- `creators`
+ - semi-colon (`;`) separated string list
+- `accessrestrict`
+ - semi-colon (`;`) separated string list
+ - contains the content from `accessrestrict` subnotes
+- `physical_location_note`
+ - semi-colon (`;`) separated string list
+ - contains the content from `physloc` notes
+- `{date_label}_date`
+ - semi-colon (`;`) separated string list
+ - contains the content from the `expression`s of the record's related
+ dates
+ - The plugin will group all of the related dates of each record based on
+ the date's label. For each distinct date label of the dates that are
+ linked to the record, the request to Aeon will contain a distinct date
+ parameter. Some examples of what to expect for the name of this field
+ include `creation_date`, `event_date`, and `other_date`. The full list
+ of values that could appear in place of the `{date_label}` placeholder
+ is controlled by the `date_label` enumeration of your ArchivesSpace
+ installation.
+
+The following fields are common to both Accession records and Archival Object
+records, but are based on the number of instances associated with the record.
+The number of requests sent to Aeon is equal to the number of instances
+associated with the record. If there are no instances, only one request will
+be sent to Aeon. All of these fields are dependant on the number of instances,
+and the values of each may differ from instance to instance.
+
+- `instance_is_representative`
+- `instance_last_modified_by`
+- `instance_instance_type`
+- `instance_created_by`
+- `instance_container_grandchild_indicator`
+- `instance_container_child_indicator`
+- `instance_container_grandchild_type`
+- `instance_container_child_type`
+- `instance_container_last_modified_by`
+- `instance_container_created_by`
+- `instance_top_container_uri`
+- `instance_top_container_long_display_string`
+- `instance_top_container_last_modified_by`
+- `instance_top_container_display_string`
+- `instance_top_container_restricted`
+- `instance_top_container_created_by`
+- `instance_top_container_indicator`
+- `instance_top_container_type`
+
+### Archival Object Fields
+
+The following fields are specific to requests made for Archival Object
+records.
+
+- `repository_processing_note`
+- `component_id`
+
+### Accession Fields
+
+The following fields are specific to requests made for Accession records.
+
+- `use_restrictions_note`
+- `access_restrictions_note`
+- `language`
+ - This field is also present on most Archival Object requests, but it is
+ mapped from a different location for Accession requests.
+
+
+## OpenURL Mappings
+
+Below is a list of recommended Open URL mappings that should be set in Aeon.
+
+The `rfr_id` column should exactly match the configured
+`:aeon_external_system_id` for each repository. Multiple repositories can have
+the same or different System IDs.
+
+The `AeonFieldName` column should exactly match an Aeon field name.
+
+Each value in the `OpenURLFieldValues` should contain a `<#replacement-tag>`
+that has a name that matches one of the field names from the [Imported Fields](#imported-fields)
+section.
+
+For more information on configuring Aeon for this system, please visit the [Submitting Requests via OpenURL](https://prometheus.atlas-sys.com/display/aeon/Submitting+Requests+via+OpenURL)
+page of our documentation at https://prometheus.atlas-sys.com.
+
+```sql
INSERT INTO OpenURLMapping (URL_Ver, rfr_id, AeonAction, AeonFieldName, OpenURLFieldValues, AeonValue) VALUES ('Default', 'ArchivesSpace', 'Replace', 'ItemAuthor', '<#creators>', 'NULL');
-INSERT INTO OpenURLMapping (URL_Ver, rfr_id, AeonAction, AeonFieldName, OpenURLFieldValues, AeonValue) VALUES ('Default', 'ArchivesSpace', 'Replace', 'ItemDate', '<#created_date>|<#Created_date>', 'NULL');
+INSERT INTO OpenURLMapping (URL_Ver, rfr_id, AeonAction, AeonFieldName, OpenURLFieldValues, AeonValue) VALUES ('Default', 'ArchivesSpace', 'Replace', 'ItemDate', '<#creation_date>', 'NULL');
INSERT INTO OpenURLMapping (URL_Ver, rfr_id, AeonAction, AeonFieldName, OpenURLFieldValues, AeonValue) VALUES ('Default', 'ArchivesSpace', 'Replace', 'ItemTitle', '<#title>', 'NULL');
INSERT INTO OpenURLMapping (URL_Ver, rfr_id, AeonAction, AeonFieldName, OpenURLFieldValues, AeonValue) VALUES ('Default', 'ArchivesSpace', 'Replace', 'ItemNumber', '<#barcode_1-container>', 'NULL');
INSERT INTO OpenURLMapping (URL_Ver, rfr_id, AeonAction, AeonFieldName, OpenURLFieldValues, AeonValue) VALUES ('Default', 'ArchivesSpace', 'Replace', 'Location', '<#instance_top_container_long_display_string>', 'NULL');
diff --git a/public/lib/accession_mapper.rb b/public/lib/accession_mapper.rb
new file mode 100644
index 0000000..a76eff4
--- /dev/null
+++ b/public/lib/accession_mapper.rb
@@ -0,0 +1,23 @@
+class AccessionMapper < RecordMapper
+
+ def initialize(accession)
+ super(accession)
+ end
+
+ # Returns a hash that maps from Aeon OpenURL values to values in the provided record.
+ def record_fields
+ mappings = super
+
+ if record.use_restrictions_note && record.use_restrictions_note.present?
+ mappings['use_restrictions_note'] = record.use_restrictions_note
+ end
+
+ if record.access_restrictions_note && record.access_restrictions_note.present?
+ mappings['access_restrictions_note'] = record.access_restrictions_note
+ end
+
+ mappings['language'] = self.record['language']
+
+ return mappings
+ end
+end
diff --git a/public/lib/archival_object_mapper.rb b/public/lib/archival_object_mapper.rb
new file mode 100644
index 0000000..f648bcc
--- /dev/null
+++ b/public/lib/archival_object_mapper.rb
@@ -0,0 +1,33 @@
+class ArchivalObjectMapper < RecordMapper
+
+ def initialize(archival_object)
+ super(archival_object)
+ end
+
+
+ # Override for RecordMapper json_fields method.
+ def json_fields
+ mappings = super
+
+ json = self.record.json
+ if !json
+ return mappings
+ end
+
+ if json['repository_processing_note'] && json['repository_processing_note'].present?
+ mappings['repository_processing_note'] = json['repository_processing_note']
+ end
+
+ return mappings
+ end
+
+
+ # Returns a hash that maps from Aeon OpenURL values to values in the provided record.
+ def record_fields
+ mappings = super
+
+ mappings['component_id'] = self.record['component_id']
+
+ return mappings
+ end
+end
diff --git a/public/lib/record_mapper.rb b/public/lib/record_mapper.rb
new file mode 100644
index 0000000..fcfd00f
--- /dev/null
+++ b/public/lib/record_mapper.rb
@@ -0,0 +1,245 @@
+class RecordMapper
+
+ attr_reader :record
+
+ def initialize(record)
+ @record = record
+ end
+
+ def repo_code
+ self.record.resolved_repository.dig('repo_code').downcase
+ end
+
+ def repo_settings
+ AppConfig[:aeon_fulfillment][self.repo_code]
+ end
+
+ def show_action?
+ begin
+ puts "Aeon Fulfillment Plugin -- Checking for plugin settings for the repository"
+
+ if !self.repo_settings
+ puts "Aeon Fulfillment Plugin -- Could not find plugin settings for the repository: \"#{self.repo_code}\"."
+ else
+ puts "Aeon Fulfillment Plugin -- Checking for top containers"
+ has_top_container = false
+
+ instances = self.record.dig('json', 'instances')
+ if instances
+ instances.each do |instance|
+
+ sub_container = instance.dig('sub_container')
+ next if !sub_container
+
+ top_container_uri = sub_container.dig('top_container', 'ref')
+
+ if top_container_uri.present?
+ has_top_container = true
+ end
+ end
+ end
+
+ only_top_containers = self.repo_settings[:requests_permitted_for_containers_only] || false
+
+ puts "Aeon Fulfillment Plugin -- Containers found? #{has_top_container}"
+ puts "Aeon Fulfillment Plugin -- only_top_containers? #{only_top_containers}"
+
+ return (has_top_container || !only_top_containers)
+ end
+
+ rescue Exception => e
+ puts "Aeon Fulfillment Plugin -- Failed to create Aeon Request action."
+ puts e.message
+ puts e.backtrace.inspect
+
+ end
+
+ false
+ end
+
+
+ # Pulls data from the contained record
+ def map
+ mappings = {}
+
+ mappings = mappings
+ .merge(self.system_information)
+ .merge(self.json_fields)
+ .merge(self.record_fields)
+
+ return mappings
+ end
+
+
+ # Pulls data from AppConfig and ASpace System
+ def system_information
+ mappings = {}
+
+ mappings['SystemID'] =
+ if (!self.repo_settings[:aeon_external_system_id].blank?)
+ self.repo_settings[:aeon_external_system_id]
+ else
+ "ArchivesSpace"
+ end
+
+ return_url =
+ if (!AppConfig[:public_proxy_url].blank?)
+ AppConfig[:public_proxy_url]
+ elsif (!AppConfig[:public_url].blank?)
+ AppConfig[:public_url]
+ else
+ ""
+ end
+
+ mappings['ReturnLinkURL'] = "#{return_url}#{self.record['uri']}"
+
+ mappings['ReturnLinkSystemName'] =
+ if (!self.repo_settings[:aeon_return_link_label].blank?)
+ self.repo_settings[:aeon_return_link_label]
+ else
+ "ArchivesSpace"
+ end
+
+ return mappings
+ end
+
+
+ # Pulls data from self.record
+ def record_fields
+ mappings = {}
+
+ mappings['identifier'] = self.record.identifier || self.record['identifier']
+ mappings['publish'] = self.record['publish']
+ mappings['level'] = self.record.level || self.record['level']
+ mappings['title'] = self.record['title']
+ mappings['uri'] = self.record.uri || self.record['uri']
+
+ resolved_resource = self.record['_resolved_resource'] || self.record.resolved_resource
+ if resolved_resource
+ resource_obj = resolved_resource[self.record['resource']]
+ if resource_obj
+ mappings['collection_id'] = "#{resource_obj[0]['id_0']} #{resource_obj[0]['id_1']} #{resource_obj[0]['id_2']} #{resource_obj[0]['id_3']}".rstrip
+ mappings['collection_title'] = resource_obj[0]['title']
+ end
+ end
+
+ resolved_repository = self.record.resolved_repository
+ if resolved_repository
+ mappings['repo_code'] = resolved_repository['repo_code']
+ mappings['repo_name'] = resolved_repository['name']
+ end
+
+ if record['creators']
+ mappings['creators'] = self.record['creators']
+ .select { |cr| cr.present? }
+ .map { |cr| cr.strip }
+ .join("; ")
+ end
+
+ if record.notes
+ accessrestrict = record.notes['accessrestrict']
+ if accessrestrict
+ arSubnotes = accessrestrict['subnotes']
+ if arSubnotes
+ mappings['accessrestrict'] = arSubnotes
+ .select { |arSubnote| arSubnote['content'].present? }
+ .map { |arSubnote| arSubnote['content'].strip }
+ .join("; ")
+ end
+ end
+ end
+
+ return mappings
+ end
+
+
+ # Pulls relevant data from the record's JSON property
+ def json_fields
+
+ mappings = {}
+
+ json = self.record.json
+ if !json
+ return mappings
+ end
+
+ mappings['language'] = json['language']
+
+ if json['notes']
+ json['notes'].each do |note|
+ if note['type'] == 'physloc' and !note['content'].blank?
+ mappings['physical_location_note'] = note['content'].map { |cont| "#{cont}" }.join("; ")
+ end
+ end
+ end
+
+ if json['dates']
+ json['dates']
+ .select { |date| date['expression'].present? }
+ .group_by { |date| date['label'] }
+ .each { |label, dates|
+ mappings["#{label}_date"] = dates
+ .map { |date| date['expression'] }
+ .join("; ")
+ }
+ end
+
+ mappings['restrictions_apply'] = json['restrictions_apply']
+ mappings['display_string'] = json['display_string']
+
+ instances = json.fetch('instances')
+ if !instances
+ return mappings
+ end
+
+ mappings['requests'] = instances
+ .select{ |instance| !instance['digital_object'] }
+ .each_with_index
+ .map { |instance, i|
+ request = {}
+
+ instance_count = i + 1
+
+ request['Request'] = "#{instance_count}"
+
+ request["instance_is_representative_#{instance_count}"] = instance['is_representative']
+ request["instance_last_modified_by_#{instance_count}"] = instance['last_modified_by']
+ request["instance_instance_type_#{instance_count}"] = instance['instance_type']
+ request["instance_created_by_#{instance_count}"] = instance['created_by']
+
+ request["instance_container_grandchild_indicator_#{instance_count}"] = instance['indicator_3']
+ request["instance_container_child_indicator_#{instance_count}"] = instance['indicator_2']
+ request["instance_container_grandchild_type_#{instance_count}"] = instance['type_3']
+ request["instance_container_child_type_#{instance_count}"] = instance['type_2']
+
+ container = instance['sub_container']
+ if container
+ request["instance_container_last_modified_by_#{instance_count}"] = container['last_modified_by']
+ request["instance_container_created_by_#{instance_count}"] = container['created_by']
+
+ top_container = container['top_container']
+ if top_container
+ request["instance_top_container_uri_#{instance_count}"] = top_container['uri']
+
+ top_container_resolved = top_container['_resolved']
+ if top_container_resolved
+ request["instance_top_container_long_display_string_#{instance_count}"] = top_container_resolved['long_display_string']
+ request["instance_top_container_last_modified_by_#{instance_count}"] = top_container_resolved['last_modified_by']
+ request["instance_top_container_display_string_#{instance_count}"] = top_container_resolved['display_string']
+ request["instance_top_container_restricted_#{instance_count}"] = top_container_resolved['restricted']
+ request["instance_top_container_created_by_#{instance_count}"] = top_container_resolved['created_by']
+ request["instance_top_container_indicator_#{instance_count}"] = top_container_resolved['indicator']
+ request["instance_top_container_type_#{instance_count}"] = top_container_resolved['type']
+ end
+ end
+ end
+
+ return request
+ }
+
+ return mappings
+ end
+
+
+ protected :json_fields, :record_fields, :system_information
+end
diff --git a/public/locales/en.yml b/public/locales/en.yml
new file mode 100644
index 0000000..48965f8
--- /dev/null
+++ b/public/locales/en.yml
@@ -0,0 +1,5 @@
+en:
+ plugins:
+ aeon_fulfillment:
+ request_button_label: Aeon Request
+ requesting_disabled: This record cannot be sent in a request.
diff --git a/public/plugin_init.rb b/public/plugin_init.rb
index 789fc39..3d9d8a6 100644
--- a/public/plugin_init.rb
+++ b/public/plugin_init.rb
@@ -1,5 +1,12 @@
## Register our custom page action
+
+require_relative 'lib/record_mapper'
+require_relative 'lib/archival_object_mapper'
+require_relative 'lib/accession_mapper'
+
AppConfig[:pui_page_custom_actions] << {
- 'record_type' => ['archival_object'],
+ 'record_type' => ['archival_object', 'accession'],
'erb_partial' => 'aeon/aeon_request_action'
-}
\ No newline at end of file
+}
+
+
diff --git a/public/views/aeon/_aeon_request_action.html.erb b/public/views/aeon/_aeon_request_action.html.erb
index aeacad0..e43c130 100644
--- a/public/views/aeon/_aeon_request_action.html.erb
+++ b/public/views/aeon/_aeon_request_action.html.erb
@@ -1,143 +1,46 @@
-<%
- showAction = false
- begin
- repo_code = record.resolved_repository.dig('repo_code').downcase
-
- repo_settings = nil
-
- if (AppConfig[:aeon_fulfillment].include?(repo_code))
- repo_settings = AppConfig[:aeon_fulfillment][repo_code]
- end
-
- if (repo_settings)
- puts "-- Aeon Plugin checking for top containers."
- has_top_container = false
-
- unless record['json'].blank? || record['json']['instances'].blank?
- record['json']['instances'].each do |instance|
- sub_container = instance.dig('sub_container')
-
- next if sub_container.nil?
-
- top_container_uri = sub_container.dig('top_container', 'ref');
-
- if (!top_container_uri.blank?)
- has_top_container = true
- end
- end
- end
-
- only_top_containers = (repo_settings.include?(:requests_permitted_for_containers_only) ? repo_settings[:requests_permitted_for_containers_only] : false)
-
- puts "-- Aeon Plugin Containers found? #{has_top_container}"
- puts "-- Aeon Plugin only_top_containers? #{only_top_containers}"
-
- showAction = (has_top_container || !only_top_containers)
- end
- rescue Exception => e
- puts "Failed to create Aeon Request action!!"
- puts e.message
- puts e.backtrace.inspect
- end
- %>
-<% if showAction %>
- <%= form_tag "#{repo_settings[:aeon_web_url]}aeon.dll?action=11&type=200", :id => 'aeon_request_sub' do |f| %>
- <% if repo_settings[:aeon_external_system_id].blank? %>
-
- <% else %>
-
- <% end %>
-
- <% if !AppConfig[:public_proxy_url].blank? %>
- ' />
- ' />
- <% elsif !AppConfig[:public_url].blank? %>
- ' />
- ' />
- <% end %>
-
- <% %i(uri identifier component_id title restrictions_apply level publish).each do |member_name| %>
-
- <% end %>
-
- <% creators = record['agents'] %>
- <% if creators %>
-
- <% end %>
-
- <% resolved_resource = record['_resolved_resource'] %>
- <% if resolved_resource %>
- <% resource_obj = resolved_resource[record['resource']] %>
- <% if resource_obj %>
- ' />
- ' />
- <% end %>
- <% end %>
-
- <% json = record['json'] %>
- <% if json %>
- <% %i(display_string language repository_processing_note).each do |member_name| %>
-
- <% end %>
-
- <% if json['dates'] %>
- <% json['dates'].each do |date| %>
- ' value='<%= date['expression'] %>' />
- <% end %>
- <% end %>
-
- <% notes = json['notes'] %>
- <% if notes %>
- <% notes.each do |note| %>
- <% if note['type'] == 'physloc' and note['content'].length > 0 %>
- ' />
- <% end %>
- <% end %>
- <% end %>
-
- <% instances = json.fetch('instances') %>
- <% if instances %>
- <% instanceCount = 0 %>
- <% instances.each do |instance| %>
- <% if !instance['digital_object'] %>
- <% instanceCount += 1 %>
-
- <% %i(instance_type created_by last_modified_by is_representative).each do |member_name| %>
-
- <% end %>
-
- ' />
- ' />
- ' />
- ' />
-
- <% container = instance['sub_container'] %>
- <% if container %>
- <% %i(created_by last_modified_by).each do |member_name| %>
-
- <% end %>
-
- <% topContainer = container['top_container'] %>
- <% if topContainer %>
- '
- <% topContainer = topContainer['_resolved'] %>
- <% if topContainer %>
- <% %i(created_by last_modified_by type indicator restricted display_string long_display_string).each do |member_name| %>
-
- <% end %>
- <% end %>
- <% end %>
- <% end %>
+<%
+puts "Aeon Fulfillment Plugin -- Initializing Plugin..."
+
+mapper = case record
+ when ArchivalObject
+ ArchivalObjectMapper.new(record)
+ when Accession
+ AccessionMapper.new(record)
+ else
+ message = "Aeon Fulfillment Plugin -- This ArchivesSpace object type is not supported by this plugin."
+ puts record.inspect
+ puts message
+ raise message
+ end
+%>
+
+<% if mapper.show_action? %>
+ <%= form_tag "#{mapper.repo_settings[:aeon_web_url]}aeon.dll?action=11&type=200", :id => 'aeon_request_sub' do |f| %>
+ <% mapper.map.each do |name, value| %>
+ <% if name.casecmp('requests').zero? %>
+ <% value.each do |request| %>
+ <% request.each do |request_param, request_value| %>
+
<% end %>
<% end %>
+ <% else %>
+
<% end %>
<% end %>
-
+
<% end %>
+
<% else %>
+
-<% end %>
\ No newline at end of file
+
+<% end %>
+
+<%
+ puts "Aeon Fulfillment Plugin -- Finished initializing plugin."
+%>