{
acs_renewal_policy: {
type: Types::Bool,
format: format_bool,
},
alert: {
type: Types::Bool,
format: format_bool,
},
available: {
type: Types::Bool,
format: format_bool,
},
blocked_card_msg: {
code: "AL",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
cancel: {
code: "BI",
type: Types::Bool,
format: format_bool,
},
card_retained: {
type: Types::Bool,
format: format_bool,
},
charged_items: {
code: "AU",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
charged_items_count: {
type: Types::Integer.constrained(included_in: 0..9999).optional,
format: format_int_4_or_blank,
},
charged_items_limit: {
code: "CB",
type: Types::Integer.constrained(included_in: 0..9999),
format: format_int_4,
},
checkin_ok: {
type: Types::Bool,
format: format_bool,
},
checkout_ok: {
type: Types::Bool,
format: format_bool,
},
checksum: {
code: "AZ",
type: Types::String.constrained(format: /^[0-9A-Fa-f]{4,4}$/),
format: format_string,
},
circulation_status: {
type: Types::Integer.constrained(included_in: 0..99),
format: format_int_2,
},
currency_type: {
code: "BH",
type: Types::String.constrained(size: 3),
format: format_string,
},
currency_type_ordered: {
name: :currency_type,
type: Types::String.constrained(size: 3),
format: format_string,
},
current_location: {
code: "AP",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
date_time_sync: {
type: Types::JSON::Time,
format: format_timestamp,
},
desensitize: {
type: Types::Bool.optional,
format: format_bool_nillable,
},
due_date: {
code: "AH",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
email_address: {
code: "BE",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
end_item: {
code: "BQ",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
end_session: {
type: Types::Bool,
format: format_bool,
},
expiration_date: {
code: "BW",
type: Types::JSON::Time,
format: format_timestamp,
},
fee_acknowledged: {
code: "BO",
type: Types::Bool,
format: format_bool,
},
fee_amount: {
code: "BV",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
fee_identifier: {
code: "CG",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
fee_limit: {
code: "CC",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
fee_type: {
code: "BT",
type: Types::Integer.constrained(included_in: 1..99),
format: format_int_2,
},
fee_type_ordered: {
name: :fee_type,
type: Types::Integer.constrained(included_in: 1..99),
format: format_int_2,
},
fine_items: {
code: "AV",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
fine_items_count: {
type: Types::Integer.constrained(included_in: 0..9999).optional,
format: format_int_4_or_blank,
},
hold_items: {
code: "AS",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
hold_items_count: {
type: Types::Integer.constrained(included_in: 0..9999).optional,
format: format_int_4_or_blank,
},
hold_items_limit: {
code: "BZ",
type: Types::Integer.constrained(included_in: 0..9999),
format: format_int_4,
},
hold_mode: {
type: Types::String.constrained(size: 1),
format: format_string,
},
hold_pickup_date: {
code: "CM",
type: Types::JSON::Time,
format: format_timestamp,
},
hold_queue_length: {
code: "CF",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
hold_type: {
code: "BY",
type: Types::Integer.constrained(included_in: 1..9),
format: format_string,
},
home_address: {
code: "BD",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
home_phone_number: {
code: "BF",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
institution_id: {
code: "AO",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
item_identifier: {
code: "AB",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
item_properties: {
code: "CH",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
item_properties_ok: {
type: Types::String.constrained(size: 1),
format: format_string,
},
language: {
type: Types::Integer.constrained(included_in: (0..999)),
format: format_int_3,
},
library_name: {
code: "AM",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
location_code: {
code: "CP",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
login_password: {
code: "CO",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
login_user_id: {
code: "CN",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
magnetic_media: {
type: Types::Bool.optional,
format: format_bool_nillable,
},
max_print_width: {
type: Types::Integer.constrained(included_in: 0..999),
format: format_int_3,
},
media_type: {
code: "CK",
type: Types::Integer.constrained(included_in: 0..999),
format: format_int_3,
},
nb_due_date: {
type: Types::JSON::Time.optional,
format: format_timestamp_or_blanks,
},
no_block: {
type: Types::Bool,
format: format_bool,
},
offline_ok: {
type: Types::Bool,
format: format_bool,
},
ok: {
type: Types::Bool,
format: ->(v) { v ? "1" : "0" },
},
online_status: {
type: Types::Bool,
format: format_bool,
},
overdue_items: {
code: "AT",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
overdue_items_count: {
type: Types::Integer.constrained(included_in: 0..9999).optional,
format: format_int_4_or_blank,
},
overdue_items_limit: {
code: "CA",
type: Types::Integer.constrained(included_in: 0..9999),
format: format_int_4,
},
owner: {
code: "BG",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
patron_identifier: {
code: "AA",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
patron_password: {
code: "AD",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
patron_status: {
type: {
charge_privileges_denied: Types::Bool,
renewal_privileges_denied: Types::Bool,
recall_privileges_denied: Types::Bool,
hold_privileges_denied: Types::Bool,
card_reported_lost: Types::Bool,
too_many_items_charged: Types::Bool,
too_many_items_overdue: Types::Bool,
too_many_renewals: Types::Bool,
too_many_claims_of_items_returned: Types::Bool,
too_many_items_lost: Types::Bool,
excessive_outstanding_fines: Types::Bool,
excessive_outstanding_fees: Types::Bool,
recall_overdue: Types::Bool,
too_many_items_billed: Types::Bool,
},
format: ->(v) {
v.attributes.map { |_,b| format_bool_with_space.call(b) }
},
},
payment_accepted: {
type: Types::Bool,
format: format_bool,
},
payment_type: {
type: Types::Integer.constrained(included_in: 0..99),
format: format_int_2,
},
permanent_location: {
code: "AQ",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
personal_name: {
code: "AE",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
pickup_location: {
code: "BS",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
print_line: {
code: "AG",
type: Types::Array.of(Types::String.constrained(max_size: 255)),
format: format_string,
},
protocol_version: {
type: Types::String.constrained(format: /^\d\.\d\d$/),
format: format_string,
},
pwd_algorithm: {
type: Types::String.constrained(size: 1),
format: format_string,
},
queue_position: {
code: "BR",
type: Types::Integer.constrained(gteq: 0).optional,
format: format_string,
},
recall_date: {
code: "CJ",
type: Types::JSON::Time,
format: format_timestamp,
},
recall_items: {
code: "BU",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
recall_items_count: {
type: Types::Integer.constrained(included_in: 0..9999).optional,
format: format_int_4_or_blank,
},
renewal_ok: {
type: Types::Bool,
format: format_bool,
},
renewed_count: {
type: Types::Integer.constrained(included_in: 0..9999),
format: format_int_4_or_blank,
},
renewed_items: {
code: "BM",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
resensitize: {
type: Types::Bool,
format: format_bool,
},
retries_allowed: {
type: Types::Integer.constrained(included_in: 0..999),
format: format_int_3,
},
return_date: {
type: Types::JSON::Time,
format: format_timestamp,
},
sc_renewal_policy: {
type: Types::Bool,
format: format_bool,
},
screen_message: {
code: "AF",
type: Types::Array.of(Types::String.constrained(max_size: 255)),
format: format_string,
},
security_inhibit: {
code: "CI",
type: Types::Bool,
format: format_bool,
},
security_marker: {
type: Types::Integer.constrained(included_in: 0..99),
format: format_int_2,
},
sequence_number: {
code: "AY",
type: Types::Integer.constrained(included_in: 0..9),
format: format_string,
},
sort_bin: {
code: "CL",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
start_item: {
code: "BP",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
status_code: {
type: Types::Integer.constrained(included_in: 0..2),
format: format_string,
},
status_update_ok: {
type: Types::Bool,
format: format_bool,
},
summary: {
type: {
hold_items: Types::Bool,
overdue_items: Types::Bool,
charged_items: Types::Bool,
fine_items: Types::Bool,
recall_items: Types::Bool,
unavailable_holds: Types::Bool,
},
format: ->(v) {
v.attributes.map { |_,b| format_bool_with_space.call(b) }.join + " "*4
},
},
supported_messages: {
code: "BX",
type: {
patron_status_request: Types::Bool,
checkout: Types::Bool,
checkin: Types::Bool,
block_patron: Types::Bool,
sc_acs_status: Types::Bool,
request_sc_asc_resend: Types::Bool,
login: Types::Bool,
patron_information: Types::Bool,
end_patron_session: Types::Bool,
fee_paid: Types::Bool,
item_information: Types::Bool,
item_status_update: Types::Bool,
patron_enable: Types::Bool,
hold: Types::Bool,
renew: Types::Bool,
renew_all: Types::Bool,
},
format: ->(v) {
v.attributes.map { |_,b| format_bool.call(b) }.join
},
},
terminal_location: {
code: "AN",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
terminal_password: {
code: "AC",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
third_party_allowed: {
type: Types::Bool,
format: format_bool,
},
timeout_period: {
type: Types::Integer.constrained(included_in: 0..999),
format: format_int_3,
},
title_identifier: {
code: "AJ",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
transaction_date: {
type: Types::JSON::Time,
format: format_timestamp,
},
transaction_id: {
code: "BK",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
uid_algorithm: {
type: Types::String.constrained(size: 1),
format: format_string,
},
unavailable_holds_count: {
type: Types::Integer.constrained(included_in: 0..9999).optional,
format: format_int_4_or_blank,
},
unavailable_hold_items: {
code: "CD",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
unrenewed_count: {
type: Types::Integer.constrained(included_in: 0..9999),
format: format_int_4,
},
unrenewed_items: {
code: "BN",
type: Types::String.constrained(max_size: 255),
format: format_string,
},
valid_patron: {
code: "BL",
type: Types::Bool,
format: format_bool,
},
valid_patron_password: {
code: "CQ",
type: Types::Bool,
format: format_bool,
},
}
{
code: "01",
name: "Block Patron",
symbol: :block_patron,
ordered_fields: %i[
card_retained
transaction_date
],
required_delimited_fields: %i[
institution_id
blocked_card_msg
patron_identifier
terminal_password
],
optional_delimited_fields: [],
},
{
code: "09",
name: "Checkin",
symbol: :checkin,
ordered_fields: %i[
no_block
transaction_date
return_date
],
required_delimited_fields: %i[
current_location
institution_id
item_identifier
terminal_password
],
optional_delimited_fields: %i[
item_properties
cancel
],
},
{
code: "10",
name: "Checkin Response",
symbol: :checkin_response,
ordered_fields: %i[
ok
resensitize
magnetic_media
alert
transaction_date
],
required_delimited_fields: %i[
institution_id
item_identifier
permanent_location
],
optional_delimited_fields: %i[
title_identifier
sort_bin
patron_identifier
media_type
item_properties
screen_message
print_line
],
},
{
code: "11",
name: "Checkout",
symbol: :checkout,
ordered_fields: %i[
sc_renewal_policy
no_block
transaction_date
nb_due_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
item_identifier
terminal_password
],
optional_delimited_fields: %i[
patron_password
item_properties
fee_acknowledged
cancel
],
},
{
code: "12",
name: "Checkout Response",
symbol: :checkout_response,
ordered_fields: %i[
ok
renewal_ok
magnetic_media
desensitize
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
item_identifier
title_identifier
due_date
],
optional_delimited_fields: %i[
fee_type
security_inhibit
currency_type
fee_amount
media_type
item_properties
transaction_id
screen_message
print_line
]
},
{
code: "15",
name: "Hold",
symbol: :hold,
ordered_fields: %i[
hold_mode
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
expiration_date
pickup_location
hold_type
patron_password
item_identifier
title_identifier
terminal_password
fee_acknowledged
],
},
{
code: "16",
name: "Hold Response",
symbol: :hold_response,
ordered_fields: %i[
ok
available
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
expiration_date
queue_position
pickup_location
item_identifier
title_identifier
screen_message
print_line
],
},
{
code: "17",
name: "Item Information",
symbol: :item_information,
ordered_fields: %i[
transaction_date
],
required_delimited_fields: %i[
institution_id
item_identifier
],
optional_delimited_fields: %i[
terminal_password
],
},
{
code: "18",
name: "Item Information Response",
symbol: :item_information_response,
ordered_fields: %i[
circulation_status
security_marker
fee_type_ordered
transaction_date
],
required_delimited_fields: %i[
item_identifier
title_identifier
],
optional_delimited_fields: %i[
hold_queue_length
due_date
recall_date
hold_pickup_date
owner
currency_type
fee_amount
media_type
permanent_location
current_location
item_properties
screen_message
print_line
],
},
{
code: "19",
name: "Item Status Update",
symbol: :item_status_update,
ordered_fields: %i[
transaction_date
],
required_delimited_fields: %i[
institution_id
item_identifier
item_properties
],
optional_delimited_fields: %i[
terminal_password
],
},
{
code: "20",
name: "Item Status Update Response",
symbol: :item_status_update_response,
ordered_fields: %i[
item_properties_ok
transaction_date
],
required_delimited_fields: %i[
item_identifier
],
optional_delimited_fields: %i[
title_identifier
item_properties
screen_message
print_line
],
},
{
code: "23",
name: "Patron Status Request",
symbol: :patron_status_request,
ordered_fields: %i[
language
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
terminal_password
patron_password
],
optional_delimited_fields: [],
},
{
code: "24",
name: "Patron Status Response",
symbol: :patron_status_response,
ordered_fields: %i[
patron_status
language
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
personal_name
],
optional_delimited_fields: %i[
valid_patron
valid_patron_password
currency_type
fee_amount
screen_message
print_line
],
},
{
code: "25",
name: "Patron Enable",
symbol: :patron_enable,
ordered_fields: %i[
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
terminal_password
patron_password
],
},
{
code: "26",
name: "Patron Enable Response",
symbol: :patron_enable_response,
ordered_fields: %i[
patron_status
language
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
personal_name
],
optional_delimited_fields: %i[
valid_patron
valid_patron_password
screen_message
print_line
],
},
{
code: "29",
name: "Renew",
symbol: :renew,
ordered_fields: %i[
third_party_allowed
no_block
transaction_date
nb_due_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
patron_password
item_identifier
title_identifier
terminal_password
item_properties
fee_acknowledged
],
},
{
code: "30",
name: "Renew Response",
symbol: :renew_response,
ordered_fields: %i[
ok
renewal_ok
magnetic_media
desensitize
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
item_identifier
title_identifier
due_date
],
optional_delimited_fields: %i[
fee_type
security_inhibit
currency_type
fee_amount
media_type
item_properties
transaction_id
screen_message
print_line
],
},
{
code: "35",
name: "End Patron Session",
symbol: :end_patron_session,
ordered_fields: %i[
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
terminal_password
patron_password
],
},
{
code: "36",
name: "End Session Response",
symbol: :end_session_response,
ordered_fields: %i[
end_session
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
screen_message
print_line
],
},
{
code: "37",
name: "Fee Paid",
symbol: :fee_paid,
ordered_fields: %i[
transaction_date
fee_type_ordered
payment_type
currency_type_ordered
],
required_delimited_fields: %i[
fee_amount
institution_id
patron_identifier
],
optional_delimited_fields: %i[
terminal_password
patron_password
fee_identifier
transaction_id
],
},
{
code: "38",
name: "Fee Paid Response",
symbol: :fee_paid_response,
ordered_fields: %i[
payment_accepted
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
transaction_id
screen_message
print_line
],
},
{
code: "63",
name: "Patron Information",
symbol: :patron_information,
ordered_fields: %i[
language
transaction_date
summary
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
terminal_password
patron_password
start_item
end_item
]
},
{
code: "64",
name: "Patron Information Response",
symbol: :patron_information_response,
ordered_fields: %i[
patron_status
language
transaction_date
hold_items_count
overdue_items_count
charged_items_count
fine_items_count
recall_items_count
unavailable_holds_count
],
required_delimited_fields: %i[
institution_id
patron_identifier
personal_name
],
optional_delimited_fields: %i[
hold_items_limit
overdue_items_limit
charged_items_limit
valid_patron
valid_patron_password
currency_type
fee_amount
fee_limit
items
home_address
email_address
home_phone_number
screen_message
print_line
]
},
{
code: "65",
name: "Renew All",
symbol: :renew_all,
ordered_fields: %i[
transaction_date
],
required_delimited_fields: %i[
institution_id
patron_identifier
],
optional_delimited_fields: %i[
patron_password
terminal_password
fee_acknowledged
],
},
{
code: "66",
name: "Renew All Response",
symbol: :renew_all_response,
ordered_fields: %i[
ok
renewed_count
unrenewed_count
transaction_date
],
required_delimited_fields: %i[
institution_id
],
optional_delimited_fields: %i[
renewed_items
unrenewed_items
screen_message
print_line
],
},
{
code: "93",
name: "Login",
symbol: :login,
ordered_fields: %i[
uid_algorithm
pwd_algorithm
],
required_delimited_fields: %i[
login_user_id
login_password
],
optional_delimited_fields: %i[
location_code
],
},
{
code: "94",
name: "Login Response",
symbol: :login_response,
ordered_fields: %i[
ok
],
required_delimited_fields: [],
optional_delimited_fields: [],
},
{
code: "96",
name: "Request SC Resend",
symbol: :request_sc_resend,
ordered_fields: [],
required_delimited_fields: [],
optional_delimited_fields: [],
},
{
code: "97",
name: "Request ACS Resend",
symbol: :request_acs_resend,
ordered_fields: [],
required_delimited_fields: [],
optional_delimited_fields: [],
},
{
code: "98",
name: "ACS Status",
symbol: :acs_status,
ordered_fields: %i[
online_status
checkin_ok
checkout_ok
acs_renewal_policy
status_update_ok
offline_ok
timeout_period
retries_allowed
date_time_sync
protocol_version
],
required_delimited_fields: %i[
institution_id
supported_messages
],
optional_delimited_fields: %i[
library_name
terminal_location
screen_message
print_line
],
},
{
code: "99",
name: "SC Status",
symbol: :sc_status,
ordered_fields: %i[
status_code
max_print_width
protocol_version
],
required_delimited_fields: [],
optional_delimited_fields: [],
},
].map { |msg|
msg[:symbol] = msg[:name].downcase.gsub(" ", "_").to_sym
msg
}