1 package C4::ILSDI::Services;
3 # Copyright 2009 SARL Biblibre
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
31 use C4::AuthoritiesMarc;
32 use C4::ILSDI::Utility;
39 C4::ILS-DI::Services - ILS-DI Services
43 Each function in this module represents an ILS-DI service.
44 They all takes a CGI instance as argument and most of them return a
45 hashref that will be printed by XML::Simple in opac/ilsdi.pl
49 use C4::ILSDI::Services;
55 $out = LookupPatron($cgi);
57 print CGI::header('text/xml');
62 xmldecl => '<?xml version="1.0" encoding="ISO-8859-1" ?>',
63 RootName => 'LookupPatron',
68 =head2 GetAvailability
70 Given a set of biblionumbers or itemnumbers, returns a list with
71 availability of the items associated with the identifiers.
76 list of either biblionumbers or itemnumbers
78 defines the type of record identifier being used in the request,
82 - return_type (Optional)
83 requests a particular level of detail in reporting availability,
87 - return_fmt (Optional)
88 requests a particular format or set of formats in reporting
96 my $out = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
97 $out .= "<dlf:collection\n";
98 $out .= " xmlns:dlf=\"http://diglib.org/ilsdi/1.1\"\n";
99 $out .= " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
100 $out .= " xsi:schemaLocation=\"http://diglib.org/ilsdi/1.1\n";
101 $out .= " http://diglib.org/architectures/ilsdi/schemas/1.1/dlfexpanded.xsd\">\n";
103 foreach my $id ( split( / /, $cgi->param('id') ) ) {
104 if ( $cgi->param('id_type') eq "item" ) {
105 my ( $biblionumber, $status, $msg, $location ) = Availability($id);
107 $out .= " <dlf:record>\n";
108 $out .= " <dlf:bibliographic id=\"" . ( $biblionumber || $id ) . "\" />\n";
109 $out .= " <dlf:items>\n";
110 $out .= " <dlf:item id=\"" . $id . "\">\n";
111 $out .= " <dlf:simpleavailability>\n";
112 $out .= " <dlf:identifier>" . $id . "</dlf:identifier>\n";
113 $out .= " <dlf:availabilitystatus>" . $status . "</dlf:availabilitystatus>\n";
114 if ($msg) { $out .= " <dlf:availabilitymsg>" . $msg . "</dlf:availabilitymsg>\n"; }
115 if ($location) { $out .= " <dlf:location>" . $location . "</dlf:location>\n"; }
116 $out .= " </dlf:simpleavailability>\n";
117 $out .= " </dlf:item>\n";
118 $out .= " </dlf:items>\n";
119 $out .= " </dlf:record>\n";
123 my $biblioitem = ( GetBiblioItemByBiblioNumber( $id, undef ) )[0];
128 $msg = "Error: could not retrieve availability for this ID";
130 $out .= " <dlf:record>\n";
131 $out .= " <dlf:bibliographic id=\"" . $id . "\" />\n";
132 $out .= " <dlf:simpleavailability>\n";
133 $out .= " <dlf:identifier>" . $id . "</dlf:identifier>\n";
134 $out .= " <dlf:availabilitystatus>" . $status . "</dlf:availabilitystatus>\n";
135 $out .= " <dlf:availabilitymsg>" . $msg . "</dlf:availabilitymsg>\n";
136 $out .= " </dlf:simpleavailability>\n";
137 $out .= " </dlf:record>\n";
140 $out .= "</dlf:collection>\n";
147 Given a list of biblionumbers, returns a list of record objects that
148 contain bibliographic information, as well as associated holdings and item
149 information. The caller may request a specific metadata schema for the
150 record objects to be returned.
151 This function behaves similarly to HarvestBibliographicRecords and
152 HarvestExpandedRecords in Data Aggregation, but allows quick, real time
153 lookup by bibliographic identifier.
155 You can use OAI-PMH ListRecords instead of this service.
160 list of system record identifiers
162 Defines the metadata schema in which the records are returned,
171 # Check if the schema is supported. For now, GetRecords only supports MARCXML
172 if ( $cgi->param('schema') and $cgi->param('schema') ne "MARCXML" ) {
173 return { code => 'UnsupportedSchema' };
178 # Loop over biblionumbers
179 foreach my $biblionumber ( split( / /, $cgi->param('id') ) ) {
181 # Get the biblioitem from the biblionumber
182 my $biblioitem = ( GetBiblioItemByBiblioNumber( $biblionumber, undef ) )[0];
183 if ( not $biblioitem->{'biblionumber'} ) {
184 $biblioitem = "RecordNotFound";
187 # We don't want MARC to be displayed
188 delete $biblioitem->{'marc'};
190 # nor the XML declaration of MARCXML
191 $biblioitem->{'marcxml'} =~ s/<\?xml version="1.0" encoding="UTF-8"\?>//go;
193 # Get most of the needed data
194 my $biblioitemnumber = $biblioitem->{'biblioitemnumber'};
195 my @reserves = GetReservesFromBiblionumber( $biblionumber, undef, undef );
196 my $issues = GetBiblioIssues($biblionumber);
197 my $items = GetItemsByBiblioitemnumber($biblioitemnumber);
199 # We loop over the items to clean them
200 foreach my $item (@$items) {
202 # This hides additionnal XML subfields, we don't need these info
203 delete $item->{'more_subfields_xml'};
205 # Display branch names instead of branch codes
206 $item->{'homebranchname'} = GetBranchName( $item->{'homebranch'} );
207 $item->{'holdingbranchname'} = GetBranchName( $item->{'holdingbranch'} );
210 # Hashref building...
211 $biblioitem->{'items'}->{'item'} = $items;
212 $biblioitem->{'reserves'}->{'reserve'} = $reserves[1];
213 $biblioitem->{'issues'}->{'issue'} = $issues;
215 map { $biblioitem->{$_} = encode_entities( $biblioitem->{$_}, '&' ) } grep( !/marcxml/, keys %$biblioitem );
217 <<<<<<< HEAD:C4/ILSDI/Services.pm
218 push @records, $biblioitem;
220 $_ = encode_entities( $$biblioitem{$_}, '&' ) for @$biblioitem{ grep {!/marcxml/} keys %$biblioitem };
222 push @records, $biblioitem;
225 push @records, { code => 'RecordNotFound' };
227 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
230 return { record => \@records };
233 =head2 GetAuthorityRecords
235 Given a list of authority record identifiers, returns a list of record
236 objects that contain the authority records. The function user may request
237 a specific metadata schema for the record objects.
242 list of authority record identifiers
244 specifies the metadata schema of records to be returned, possible values:
249 sub GetAuthorityRecords {
252 # If the user asks for an unsupported schema, return an error code
253 if ( $cgi->param('schema') and $cgi->param('schema') ne "MARCXML" ) {
254 return { code => 'UnsupportedSchema' };
259 # Let's loop over the authority IDs
260 foreach my $authid ( split( / /, $cgi->param('id') ) ) {
262 # Get the record as XML string, or error code
263 <<<<<<< HEAD:C4/ILSDI/Services.pm
264 my $record = GetAuthorityXML($authid) || "<record>RecordNotFound</record>";
266 my $record = GetAuthorityXML( $_ ) || "<record><code>RecordNotFound</code></record>";
267 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
268 $record =~ s/<\?xml(.*)\?>//go;
277 Looks up a patron in the ILS by an identifier, and returns the borrowernumber.
282 an identifier used to look up the patron in Koha
284 the type of the identifier, possible values:
295 # Get the borrower...
296 <<<<<<< HEAD:C4/ILSDI/Services.pm
297 my $borrower = GetMember($cgi->param('id_type') => $cgi->param('id'));
298 if ( not $borrower->{'borrowernumber'} ) {
299 return { message => 'PatronNotFound' };
303 my $patron->{'id'} = $borrower->{'borrowernumber'};
305 my $borrower = GetMember( $cgi->param('id'), $cgi->param('id_type') );
306 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
307 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
309 # ...and return his ID
313 =head2 AuthenticatePatron
315 Authenticates a user's login credentials and returns the identifier for
320 - username (Required)
321 user's login identifier
322 - password (Required)
327 sub AuthenticatePatron {
330 <<<<<<< HEAD:C4/ILSDI/Services.pm
331 # Check if borrower exists, using a C4::ILSDI::Utility function...
332 if ( not( BorrowerExists( $cgi->param('username'), $cgi->param('password') ) ) ) {
333 return { message => 'PatronNotFound' };
335 # Check if borrower exists, using a C4::Auth function...
336 unless( checkpw( C4::Context->dbh, $cgi->param('username'), $cgi->param('password') ) ) {
337 return { code => 'PatronNotFound' };
338 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
342 my $borrower = GetMember( userid => $cgi->param('username') );
345 my $patron->{'id'} = $borrower->{'borrowernumber'};
347 # ... and return his ID
353 Returns specified information about the patron, based on options in the
354 request. This function can optionally return patron's contact information,
355 fine information, hold request information, and loan information.
359 - patron_id (Required)
361 - show_contact (Optional, default 1)
362 whether or not to return patron's contact information in the response
363 - show_fines (Optional, default 0)
364 whether or not to return fine information in the response
365 - show_holds (Optional, default 0)
366 whether or not to return hold request information in the response
367 - show_loans (Optional, default 0)
368 whether or not to return loan information request information in the response
376 my $borrowernumber = $cgi->param('patron_id');
377 <<<<<<< HEAD:C4/ILSDI/Services.pm
378 my $borrower = GetMemberDetails( $borrowernumber, undef );
379 if ( not $borrower->{'borrowernumber'} ) {
380 return { message => 'PatronNotFound' };
383 my $borrower = GetMemberDetails( $borrowernumber );
384 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
385 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
387 # Cleaning the borrower hashref
388 $borrower->{'charges'} = $borrower->{'flags'}->{'CHARGES'}->{'amount'};
389 $borrower->{'branchname'} = GetBranchName( $borrower->{'branchcode'} );
390 delete $borrower->{'flags'};
391 delete $borrower->{'userid'};
392 delete $borrower->{'password'};
394 # Contact fields management
395 if ( $cgi->param('show_contact') eq "0" ) {
397 # Define contact fields
398 my @contactfields = (
399 'email', 'emailpro', 'fax', 'mobile', 'phone', 'phonepro',
400 'streetnumber', 'zipcode', 'city', 'streettype', 'B_address', 'B_city',
401 'B_email', 'B_phone', 'B_zipcode', 'address', 'address2', 'altcontactaddress1',
402 'altcontactaddress2', 'altcontactaddress3', 'altcontactfirstname', 'altcontactphone', 'altcontactsurname', 'altcontactzipcode'
406 foreach my $field (@contactfields) {
407 delete $borrower->{$field};
412 if ( $cgi->param('show_fines') eq "1" ) {
414 for ( my $i = 1 ; my @charge = getcharges( $borrowernumber, undef, $i ) ; $i++ ) {
415 push( @charges, @charge );
417 $borrower->{'fines'}->{'fine'} = \@charges;
420 # Reserves management
421 if ( $cgi->param('show_holds') eq "1" ) {
423 # Get borrower's reserves
424 my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef );
425 foreach my $reserve (@reserves) {
427 # Get additional informations
428 my $item = GetBiblioFromItemNumber( $reserve->{'itemnumber'}, undef );
429 my $branchname = GetBranchName( $reserve->{'branchcode'} );
431 # Remove unwanted fields
432 delete $item->{'marc'};
433 delete $item->{'marcxml'};
434 delete $item->{'more_subfields_xml'};
436 # Add additional fields
437 $reserve->{'item'} = $item;
438 $reserve->{'branchname'} = $branchname;
439 $reserve->{'title'} = ( GetBiblio( $reserve->{'biblionumber'} ) )[1]->{'title'};
441 $borrower->{'holds'}->{'hold'} = \@reserves;
445 if ( $cgi->param('show_loans') eq "1" ) {
446 my $issues = GetPendingIssues($borrowernumber);
447 $borrower->{'loans'}->{'loan'} = $issues;
453 =head2 GetPatronStatus
455 Returns a patron's status information.
459 - patron_id (Required)
464 sub GetPatronStatus {
468 my $borrowernumber = $cgi->param('patron_id');
469 <<<<<<< HEAD:C4/ILSDI/Services.pm
470 my $borrower = GetMemberDetails( $borrowernumber, undef );
471 if ( not $borrower->{'borrowernumber'} ) {
472 return { message => 'PatronNotFound' };
477 $patron->{'type'} = $borrower->{'categorycode'};
478 $patron->{'status'} = 0; #TODO
479 $patron->{'expiry'} = $borrower->{'dateexpiry'};
483 my $borrower = GetMemberDetails( $borrowernumber );
484 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
488 type => $$borrower{categorycode},
490 expiry => $$borrower{dateexpiry},
492 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
497 Returns information about the services available on a particular item for
502 - patron_id (Required)
511 # Get the member, or return an error code if not found
512 my $borrowernumber = $cgi->param('patron_id');
513 <<<<<<< HEAD:C4/ILSDI/Services.pm
514 my $borrower = GetMemberDetails( $borrowernumber, undef );
515 if ( not $borrower->{'borrowernumber'} ) {
516 return { message => 'PatronNotFound' };
519 # Get the item, or return an error code if not found
520 my $itemnumber = $cgi->param('item_id');
521 my $item = GetItem( $itemnumber, undef, undef );
522 if ( not $item->{'itemnumber'} ) {
523 return { message => 'RecordNotFound' };
526 my $borrower = GetMemberDetails( $borrowernumber );
527 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
529 # Get the item, or return an error code if not found
530 my $itemnumber = $cgi->param('item_id');
531 my $item = GetItem( $itemnumber );
532 return { code => 'RecordNotFound' } unless $$item{itemnumber};
533 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
537 # Reserve level management
538 my $biblionumber = $item->{'biblionumber'};
539 my $canbookbereserved = CanBookBeReserved( $borrower, $biblionumber );
540 if ($canbookbereserved) {
541 push @availablefor, 'title level hold';
542 my $canitembereserved = IsAvailableForItemLevelRequest($itemnumber);
543 if ($canitembereserved) {
544 push @availablefor, 'item level hold';
548 # Reserve cancellation management
549 my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef );
551 foreach my $reserve (@reserves) {
552 push @reserveditems, $reserve->{'itemnumber'};
554 if ( grep { $itemnumber eq $_ } @reserveditems ) {
555 push @availablefor, 'hold cancellation';
559 my @renewal = CanBookBeRenewed( $borrowernumber, $itemnumber );
561 push @availablefor, 'loan renewal';
565 my $barcode = $item->{'barcode'} || '';
566 $barcode = barcodedecode($barcode) if ( $barcode && C4::Context->preference('itemBarcodeInputFilter') );
568 my ( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $borrower, $barcode );
570 # TODO push @availablefor, 'loan';
574 $out->{'AvailableFor'} = \@availablefor;
581 Extends the due date for a borrower's existing issue.
585 - patron_id (Required)
589 - desired_due_date (Required)
590 the date the patron would like the item returned by
597 # Get borrower infos or return an error code
598 my $borrowernumber = $cgi->param('patron_id');
599 <<<<<<< HEAD:C4/ILSDI/Services.pm
600 my $borrower = GetMemberDetails( $borrowernumber, undef );
601 if ( not $borrower->{'borrowernumber'} ) {
602 return { message => 'PatronNotFound' };
605 my $borrower = GetMemberDetails( $borrowernumber );
606 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
607 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
609 # Get the item, or return an error code
610 my $itemnumber = $cgi->param('item_id');
611 <<<<<<< HEAD:C4/ILSDI/Services.pm
612 my $item = GetItem( $itemnumber, undef, undef );
613 if ( not $item->{'itemnumber'} ) {
614 return { message => 'RecordNotFound' };
617 my $item = GetItem( $itemnumber );
618 return { code => 'RecordNotFound' } unless $$item{itemnumber};
619 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
621 # Add renewal if possible
622 my @renewal = CanBookBeRenewed( $borrowernumber, $itemnumber );
623 if ( $renewal[0] ) { AddRenewal( $borrowernumber, $itemnumber ); }
625 my $issue = GetItemIssue($itemnumber);
629 $out->{'renewals'} = $issue->{'renewals'};
630 $out->{'date_due'} = $issue->{'date_due'};
631 $out->{'success'} = $renewal[0];
632 $out->{'error'} = $renewal[1];
639 Creates, for a borrower, a biblio-level hold reserve.
643 - patron_id (Required)
647 - request_location (Required)
648 IP address where the end user request is being placed
649 - pickup_location (Optional)
650 a branch code indicating the location to which to deliver the item for pickup
651 - needed_before_date (Optional)
652 date after which hold request is no longer needed
653 - pickup_expiry_date (Optional)
654 date after which item returned to shelf if item is not picked up
661 # Get the borrower or return an error code
662 my $borrowernumber = $cgi->param('patron_id');
663 <<<<<<< HEAD:C4/ILSDI/Services.pm
664 my $borrower = GetMemberDetails( $borrowernumber, undef );
665 if ( not $borrower->{'borrowernumber'} ) {
666 return { message => 'PatronNotFound' };
669 # Get the biblio record, or return an error code
670 my $biblionumber = $cgi->param('bib_id');
671 my ( $count, $biblio ) = GetBiblio($biblionumber);
672 if ( not $biblio->{'biblionumber'} ) {
673 return { message => 'RecordNotFound' };
675 my $title = $biblio->{'title'};
677 # Check if the biblio can be reserved
678 my $canbereserved = CanBookBeReserved( $borrower, $biblionumber );
679 if ( not $canbereserved ) {
680 return { message => 'NotHoldable' };
683 my $borrower = GetMemberDetails( $borrowernumber );
684 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
686 # Get the biblio record, or return an error code
687 my $biblionumber = $cgi->param('bib_id');
688 my ( $count, $biblio ) = GetBiblio( $biblionumber );
689 return { code => 'RecordNotFound' } unless $$biblio{biblionumber};
691 my $title = $$biblio{title};
693 # Check if the biblio can be reserved
694 return { code => 'NotHoldable' } unless CanBookBeReserved( $borrowernumber, $biblionumber );
695 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
699 # Pickup branch management
700 if ( $cgi->param('pickup_location') ) {
701 $branch = $cgi->param('pickup_location');
702 <<<<<<< HEAD:C4/ILSDI/Services.pm
703 my $branches = GetBranches();
704 if ( not $branches->{$branch} ) {
705 return { message => 'LocationNotFound' };
707 } else { # if user provide no branch, use his own
708 $branch = $borrower->{'branchcode'};
710 my $branches = GetBranches;
711 return { code => 'LocationNotFound' } unless $$branches{$branch};
712 } else { # if the request provide no branch, use the borrower's branch
713 $branch = $$borrower{branchcode};
714 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
718 # $branch, $borrowernumber, $biblionumber, $constraint, $bibitems, $priority, $notes, $title, $checkitem, $found
719 AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, 0, undef, $title, undef, undef );
723 $out->{'title'} = $title;
724 $out->{'pickup_location'} = GetBranchName($branch);
726 # TODO $out->{'date_available'} = '';
733 Creates, for a borrower, an item-level hold request on a specific item of
734 a bibliographic record in Koha.
738 - patron_id (Required)
744 - pickup_location (Optional)
745 a branch code indicating the location to which to deliver the item for pickup
746 - needed_before_date (Optional)
747 date after which hold request is no longer needed
748 - pickup_expiry_date (Optional)
749 date after which item returned to shelf if item is not picked up
756 # Get the borrower or return an error code
757 my $borrowernumber = $cgi->param('patron_id');
758 <<<<<<< HEAD:C4/ILSDI/Services.pm
759 my $borrower = GetMemberDetails( $borrowernumber, undef );
760 if ( not $borrower->{'borrowernumber'} ) {
761 return { message => 'PatronNotFound' };
764 my $borrower = GetMemberDetails( $borrowernumber );
765 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
766 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
768 # Get the biblio or return an error code
769 my $biblionumber = $cgi->param('bib_id');
770 my ( $count, $biblio ) = GetBiblio($biblionumber);
771 <<<<<<< HEAD:C4/ILSDI/Services.pm
772 if ( not $biblio->{'biblionumber'} ) {
773 return { message => 'RecordNotFound' };
775 my $title = $biblio->{'title'};
777 # Get the item or return an error code
778 my $itemnumber = $cgi->param('item_id');
779 my $item = GetItem( $itemnumber, undef, undef );
780 if ( not $item->{'itemnumber'} ) {
781 return { message => 'RecordNotFound' };
784 # if the biblio does not match the item, return an error code
785 if ( $item->{'biblionumber'} ne $biblio->{'biblionumber'} ) {
786 return { message => 'RecordNotFound' };
789 # Check for item disponibility
790 my $canitembereserved = IsAvailableForItemLevelRequest($itemnumber);
791 my $canbookbereserved = CanBookBeReserved( $borrower, $biblionumber );
792 if ( ( not $canbookbereserved ) or not($canitembereserved) ) {
793 return { message => 'NotHoldable' };
796 return { code => 'RecordNotFound' } unless $$biblio{biblionumber};
798 my $title = $$biblio{title};
800 # Get the item or return an error code
801 my $itemnumber = $cgi->param('item_id');
802 my $item = GetItem( $itemnumber );
803 return { code => 'RecordNotFound' } unless $$item{itemnumber};
805 # If the biblio does not match the item, return an error code
806 return { code => 'RecordNotFound' } if $$item{biblionumber} ne $$biblio{biblionumber};
808 # Check for item disponibility
809 my $canitembereserved = CanItemBeReserved( $borrowernumber, $itemnumber );
810 my $canbookbereserved = CanBookBeReserved( $borrowernumber, $biblionumber );
811 return { code => 'NotHoldable' } unless $canbookbereserved and $canitembereserved;
812 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
816 # Pickup branch management
817 if ( $cgi->param('pickup_location') ) {
818 $branch = $cgi->param('pickup_location');
819 my $branches = GetBranches();
820 <<<<<<< HEAD:C4/ILSDI/Services.pm
821 if ( not $branches->{$branch} ) {
822 return { message => 'LocationNotFound' };
824 } else { # if user provide no branch, use his own
825 $branch = $borrower->{'branchcode'};
827 return { code => 'LocationNotFound' } unless $$branches{$branch};
828 } else { # if the request provide no branch, use the borrower's branch
829 $branch = $$borrower{branchcode};
830 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
837 $rank = '0' unless C4::Context->preference('ReservesNeedReturns');
838 if ( $item->{'holdingbranch'} eq $branch ) {
839 $found = 'W' unless C4::Context->preference('ReservesNeedReturns');
843 # $branch, $borrowernumber, $biblionumber, $constraint, $bibitems, $priority, $notes, $title, $checkitem, $found
844 AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $rank, undef, $title, $itemnumber, $found );
848 $out->{'pickup_location'} = GetBranchName($branch);
850 # TODO $out->{'date_available'} = '';
857 Cancels an active reserve request for the borrower.
861 - patron_id (Required)
871 # Get the borrower or return an error code
872 my $borrowernumber = $cgi->param('patron_id');
873 <<<<<<< HEAD:C4/ILSDI/Services.pm
874 my $borrower = GetMemberDetails( $borrowernumber, undef );
875 if ( not $borrower->{'borrowernumber'} ) {
876 return { message => 'PatronNotFound' };
879 # Get the item or return an error code
880 my $itemnumber = $cgi->param('item_id');
881 my $item = GetItem( $itemnumber, undef, undef );
882 if ( not $item->{'itemnumber'} ) {
883 return { message => 'RecordNotFound' };
886 my $borrower = GetMemberDetails( $borrowernumber );
887 return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
889 # Get the item or return an error code
890 my $itemnumber = $cgi->param('item_id');
891 my $item = GetItem( $itemnumber );
892 return { code => 'RecordNotFound' } unless $$item{itemnumber};
893 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
895 # Get borrower's reserves
896 my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef );
899 # ...and loop over it to build an array of reserved itemnumbers
900 foreach my $reserve (@reserves) {
901 push @reserveditems, $reserve->{'itemnumber'};
904 # if the item was not reserved by the borrower, returns an error code
905 <<<<<<< HEAD:C4/ILSDI/Services.pm
906 if ( not grep { $itemnumber eq $_ } @reserveditems ) {
907 return { message => 'NotCanceled' };
910 return { code => 'NotCanceled' } unless any { $itemnumber eq $_ } @reserveditemnumbers;
911 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm
914 CancelReserve( $itemnumber, undef, $borrowernumber );
916 <<<<<<< HEAD:C4/ILSDI/Services.pm
917 return { message => 'Canceled' };
920 return { code => 'Canceled' };
921 >>>>>>> [MT2306_2271] ILS-DI Message codes consistence:C4/ILSDI.pm