From 64bcbb6d131f3bf12f2f4615f929b12888149d2e Mon Sep 17 00:00:00 2001 From: Jason Stephenson Date: Sat, 11 Oct 2014 11:45:52 -0400 Subject: [PATCH] Add handling of ItemElementType in NIP::ILS::Evergreen. This includes some template changes to output the ItemOptionalFields element data. Signed-off-by: Jason Stephenson --- lib/NCIP/ILS/Evergreen.pm | 198 ++++++++++++++++-- .../includes/CancelRequestItemResponse.inc | 1 + templates/includes/CheckInItemResponse.inc | 1 + templates/includes/ItemOptionalFields.inc | 91 ++++++++ templates/includes/RequestItemResponse.inc | 1 + 5 files changed, 276 insertions(+), 16 deletions(-) create mode 100644 templates/includes/ItemOptionalFields.inc diff --git a/lib/NCIP/ILS/Evergreen.pm b/lib/NCIP/ILS/Evergreen.pm index df9d6cc..126fc58 100644 --- a/lib/NCIP/ILS/Evergreen.pm +++ b/lib/NCIP/ILS/Evergreen.pm @@ -52,6 +52,11 @@ use NCIP::StructuredAddress; use NCIP::ElectronicAddress; use NCIP::RequestId; use NCIP::Item::Id; +use NCIP::Item::OptionalFields; +use NCIP::Item::BibliographicDescription; +use NCIP::Item::BibliographicItemId; +use NCIP::Item::BibliographicRecordId; +use NCIP::Item::Description; # Inherit from NCIP::ILS. use parent qw(NCIP::ILS); @@ -477,6 +482,12 @@ sub checkinitem { my $optionalfields = $self->handle_user_elements($circ_user, $elements); $data->{UserOptionalFields} = $optionalfields; } + $elements = $request->{$message}->{ItemElementType}; + if ($elements) { + $elements = [$elements] unless (ref $elements eq 'ARRAY'); + my $optionalfields = $self->handle_item_elements($copy, $elements); + $data->{ItemOptionalFields} = $optionalfields; + } $response->data($data); @@ -674,6 +685,12 @@ sub renewitem { my $optionalfields = $self->handle_user_elements($user, $elements); $data->{UserOptionalFields} = $optionalfields; } + $elements = $request->{$message}->{ItemElementType}; + if ($elements) { + $elements = [$elements] unless (ref $elements eq 'ARRAY'); + my $optionalfields = $self->handle_item_elements($details->{copy}, $elements); + $data->{ItemOptionalFields} = $optionalfields; + } $response->data($data); } @@ -841,6 +858,12 @@ sub checkoutitem { my $optionalfields = $self->handle_user_elements($user, $elements); $data->{UserOptionalFields} = $optionalfields; } + $elements = $request->{$message}->{ItemElementType}; + if ($elements) { + $elements = [$elements] unless (ref $elements eq 'ARRAY'); + my $optionalfields = $self->handle_item_elements($details->{copy}, $elements); + $data->{ItemOptionalFields} = $optionalfields; + } $response->data($data); } @@ -1000,6 +1023,12 @@ sub requestitem { my $optionalfields = $self->handle_user_elements($user, $elements); $data->{UserOptionalFields} = $optionalfields; } + $elements = $request->{$message}->{ItemElementType}; + if ($elements && $copy_details) { + $elements = [$elements] unless (ref($elements) eq 'ARRAY'); + my $optionalfields = $self->handle_item_elements($copy_details->{copy}, $elements); + $data->{ItemOptionalFields} = $optionalfields; + } $response->data($data); } @@ -1163,6 +1192,12 @@ sub cancelrequestitem { my $optionalfields = $self->handle_user_elements($user, $elements); $data->{UserOptionalFields} = $optionalfields; } + $elements = $request->{$message}->{ItemElementType}; + if ($elements && $copy_details) { + $elements = [$elements] unless (ref $elements eq 'ARRAY'); + my $optionalfields = $self->handle_item_elements($copy_details->{copy}, $elements); + $data->{ItemOptionalFields} = $optionalfields; + } $response->data($data); } } else { @@ -1202,22 +1237,34 @@ sub cancelrequestitem { ) } elsif ($hold) { $self->cancel_hold($hold); - $response->data( - { - RequestId => NCIP::RequestId->new( - { - RequestIdentifierType => 'SYSNUMBER', - RequestIdentifierValue => $hold->id() - } - ), - UserId => NCIP::User::Id->new( - { - UserIdentifierType => 'Barcode Id', - UserIdentifierValue => $user->card->barcode() - } - ) - } - ) + my $data = { + RequestId => NCIP::RequestId->new( + { + RequestIdentifierType => 'SYSNUMBER', + RequestIdentifierValue => $hold->id() + } + ), + UserId => NCIP::User::Id->new( + { + UserIdentifierType => 'Barcode Id', + UserIdentifierValue => $user->card->barcode() + } + ) + }; + # Look for UserElements requested and add it to the response: + my $elements = $request->{$message}->{UserElementType}; + if ($elements) { + $elements = [$elements] unless (ref $elements eq 'ARRAY'); + my $optionalfields = $self->handle_user_elements($user, $elements); + $data->{UserOptionalFields} = $optionalfields; + } + $elements = $request->{$message}->{ItemElementType}; + if ($elements && $copy_details) { + $elements = [$elements] unless (ref $elements eq 'ARRAY'); + my $optionalfields = $self->handle_item_elements($copy_details->{copy}, $elements); + $data->{ItemOptionalFields} = $optionalfields; + } + $response->data($data); } else { $response->problem( NCIP::Problem->new( @@ -1396,6 +1443,103 @@ sub handle_user_elements { return $optionalfields; } +=head2 handle_item_elements + +=cut + +sub handle_item_elements { + my $self = shift; + my $copy = shift; + my $elments = shift; + my $optionalfields = NCIP::Item::OptionalFields->new(); + + my $details; # In case we need for more than one. + + if (grep {$_ eq 'Bibliographic Description'} @$elements) { + my $description; + # Check for a precat copy, 'cause it is simple. + if ($copy->dummy_title()) { + $description = NCIP::Item::BibliographicDescription->new(); + $description->Title($copy->dummy_title()); + $description->Author($copy->dummy_author()); + if ($copy->dummy_isbn()) { + $description->BibliographicItemId( + NCIP::Item::BibliographicItemId->new( + BibliographicItemIdentifier => $copy->dummy_isbn(), + BibliographicItemIdentifierCode => 'ISBN' + ) + ); + } + } else { + $details = $self->retrieve_copy_details_by_barcode($copy->barcode()) unless($details); + $description = NCIP::Item::BibliographicDescription->new(); + $description->Title($details->{mvr}->title()); + $description->Authort($details->{mvr}->author()); + $description->BibliographicRecordId( + NCIP::Item::BibliographicRecordId->new( + BibliographicRecordIdentifier => $details->{mvr}->doc_id(), + BibliographicRecordIdentifierCode => 'SYSNUMBER' + ) + ); + if ($details->{mvr}->publisher()) { + $description->Publisher($details->{mvr}->publisher()); + } + if ($details->{mvr}->pubdate()) { + $description->PublicationDate($details->{mvr}->pubdate()); + } + if ($details->{mvr}->edition()) { + $description->Edition($details->{mvr}->edition()); + } + } + $optionalfields->BibliographicDescription($description) if ($description); + } + + if (grep {$_ eq 'Item Description'} @$elements) { + $details = $self->retrieve_copy_details_by_barcode($copy->barcode()) unless($details); + # Call Number is the only field we currently return. We also + # do not attempt to retun a prefix and suffix. Someone else + # can deal with that if they want it. + if ($details->{volume}) { + $optionalfields->ItemDescription( + NCIP::Item::Description->new( + CallNumber => $details->{volume}->label(); + ) + ); + } + } + + if (grep {$_ eq 'Circulation Status'} @$elements) { + my $status = $copy->status(); + $status = $self->retrieve_copy_status($status) unless (ref($status)); + $optionalfields->CirculationStatus($status->name()) if ($status); + } + + if (grep {$_ eq 'Date Due'} @$elements) { + $details = $self->retrieve_copy_details_by_barcode($copy->barcode()) unless($details); + if ($details->{circ}) { + if (!$details->{circ}->checkin_time()) { + my $due = DateTime::Format::ISO8601->parse_datetime(cleanse_ISO8601($circ->due_date())); + $due->set_time_zone('UTC'); + $optionalfields->DateDue($due->iso8601()); + } + } + } + + if (grep {$_ eq 'Item Use Restriction Type'} @$elements) { + $optionalfields->ItemUseRestrictionType('None'); + } + + if (grep {$_ eq 'Physical Condition'} @$elements) { + $optionalfields->PhysicalCondition( + NCIP::Item::PhysicalCondition->new( + PhysicalConditionType => 'Unknown' + ) + ); + } + + return $optionalfields; +} + =head2 login $ils->login(); @@ -1707,6 +1851,28 @@ sub retrieve_copy_details_by_barcode { return $copy; } +=head2 retrieve_copy_status + + $status = $ils->retrieve_copy_status($id); + +Retrive a copy status object by database ID. + +=cut + +sub retrieve_copy_status { + my $self = shift; + my $id = shift; + + my $status = $U->simplereq( + 'open-ils.pcrud', + 'open-ils.pcrud.retrieve.ccs', + $self->{session}->{authtoken}, + $id + ); + + return $status; +} + =head2 retrieve_org_unit_by_shortname $org_unit = $ils->retrieve_org_unit_by_shortname($shortname); diff --git a/templates/includes/CancelRequestItemResponse.inc b/templates/includes/CancelRequestItemResponse.inc index d912704..ea3aa3d 100644 --- a/templates/includes/CancelRequestItemResponse.inc +++ b/templates/includes/CancelRequestItemResponse.inc @@ -17,3 +17,4 @@ [% END -%] [% INCLUDE "includes/UserOptionalFields.inc" -%] +[% INCLUDE "includes/ItemOptionalFields.inc" -%] diff --git a/templates/includes/CheckInItemResponse.inc b/templates/includes/CheckInItemResponse.inc index 5a27e1e..29943b0 100644 --- a/templates/includes/CheckInItemResponse.inc +++ b/templates/includes/CheckInItemResponse.inc @@ -19,3 +19,4 @@ [% END -%] [% INCLUDE "includes/UserOptionalFields.inc" -%] +[% INCLUDE "includes/ItemOptionalFields.inc" -%] diff --git a/templates/includes/ItemOptionalFields.inc b/templates/includes/ItemOptionalFields.inc new file mode 100644 index 0000000..35928f9 --- /dev/null +++ b/templates/includes/ItemOptionalFields.inc @@ -0,0 +1,91 @@ +[% IF data.ItemOptionalFields -%] + +[% IF data.ItemOptionalFields.BibliographicDescription -%] + +[% IF data.ItemOptionalFields.BibliographicDescription.Author -%] + +[% data.ItemOptionalFields.BibliographicDescription.Author | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.BibliographicDescription.Title -%] + +[% data.ItemOptionalFields.BibliographicDescription.Title | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.BibliographicDescription.Publisher -%] + +[% data.ItemOptionalFields.BibliographicDescription.Publisher | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.BibliographicDescription.PublicationDate -%] + +[% data.ItemOptionalFields.BibliographicDescription.PublicationDate | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.BibliographicDescription.Edition -%] + +[% data.ItemOptionalFields.BibliographicDescription.Edition | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.BibliographicDescription.BibliographicRecordId; + id = data.ItemOptionalFields.BibliographicDescription.BibliographicRecordId -%] + + +[% id.BibliographicRecordIdentifier | xml %] + +[% IF id.BibliographicRecordIdentifierCode -%] + +[% id.BibliographicRecordIdentifierCode | xml %] + +[% END -%] +[% IF id.AgencyId -%] + +[% id.AgencyId | xml %] + +[% END -%] + +[% END -%] +[% IF data.ItemOptionalFields.BibliographicDescription.BibliographicItemId; + id = data.ItemOptionalFields.BibliographicDescription.BibliographicItemId -%] + + +[% id.BibliographicItemIdentifier | xml %] + +[% IF id.BibliographicItemIdentifierCode -%] + +[% id.BibliographicItemIdentifierCode | xml %] + +[% END -%] + +[% END -%] + +[% END -%] +[% IF data.ItemOptionalFields.ItemDescription -%] + + +[% data.ItemOptionalFields.ItemDescription.CallNumber | xml %] + + +[% END -%] +[% IF data.ItemOptionalFields.CirculationStatus -%] + +[% data.ItemOptionalFields.CirculationStatus | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.DateDue -%] + +[% data.ItemOptionalFields.DateDue | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.ItemUseRestrictionType -%] + +[% data.ItemOptionalFields.ItemUseRestrictionType | xml %] + +[% END -%] +[% IF data.ItemOptionalFields.PhysicalCondition -%] + +[% data.ItemOptionalFields.PhysicalCondition | xml %] + +[% END -%] + +[% END -%] diff --git a/templates/includes/RequestItemResponse.inc b/templates/includes/RequestItemResponse.inc index 5f0ef28..1aaadb3 100644 --- a/templates/includes/RequestItemResponse.inc +++ b/templates/includes/RequestItemResponse.inc @@ -19,3 +19,4 @@ [% data.RequestType | xml %] [% data.RequestScopeType | xml %] [% INCLUDE "includes/UserOptionalFields.inc" -%] +[% INCLUDE "includes/ItemOptionalFields.inc" -%] -- 2.43.2