2 #===============================================================================
11 # AUTHOR: Chris Cormack (rangi), chrisc@catalyst.net.nz
12 # ORGANIZATION: Koha Development Team
14 # CREATED: 05/11/13 11:14:09
16 #===============================================================================
17 package NCIP::ILS::Koha;
20 use Object::Tiny qw{ name };
25 use C4::Members qw{ GetMemberDetails };
26 use C4::Circulation qw { AddReturn CanBookBeIssued AddIssue };
28 use C4::Items qw { GetItem };
30 qw {CanBookBeReserved AddReserve GetReservesFromItemnumber CancelReserve};
31 use C4::Biblio qw {AddBiblio GetMarcFromKohaField};
32 use C4::Barcodes::ValueBuilder;
33 use C4::Items qw{AddItem};
38 my $itemdata = GetItem( undef, $barcode );
40 return ( $itemdata, undef );
43 return ( undef, 1 ); # item not found error
50 my $userdata = GetMemberDetails( undef, $userid );
62 'AS', #branchcode need to set this properly
67 C4::Context->_new_userenv('DUMMY_SESSION_ID');
68 C4::Context->set_userenv(@USERENV);
76 my $exemptfine = undef;
79 my ( $success, $messages, $issue, $borrower ) =
80 AddReturn( $barcode, $branch, $exemptfine, $dropbox );
83 messages => $messages,
84 iteminformation => $issue,
95 my $borrower = GetMemberDetails( undef, $userid );
101 ( $error, $confirm ) = CanBookBeIssued( $borrower, $barcode );
103 #( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $borrower,
104 # $barcode, $duedatespec, $inprocess, $ignore_reserves );
107 # Can't issue item, return error hash
108 return ( 1, $error );
111 return ( 1, $confirm );
114 my $datedue = AddIssue( $borrower, $barcode );
115 return ( 0, undef, $datedue ); #successfully issued
119 $error->{'badborrower'} = 1;
120 return ( 1, $error );
128 my $borrower = GetMemberDetails( undef, $userid );
130 my $datedue = AddRenewal( $barcode, $borrower->{'borrowernumber'} );
145 my $cardnumber = shift;
147 my $borrower = GetMemberDetails( undef, $cardnumber );
150 $result = { success => 0, messages => { 'BORROWER_NOT_FOUND' => 1 } };
153 my $itemdata = GetItem( undef, $barcode );
155 $result = { success => 0, messages => {'ITEM_NOT_FOUND'} };
161 $borrower->{borrowernumber},
162 $itemdata->{biblionumber}
166 my $biblioitemnumber = $itemdata->{biblionumber};
167 my $branchcode = 'AS';
171 $branchcode, $borrower->{borrwerborrowernumber},
172 $itemdata->{biblionumber}, 'a',
173 [$biblioitemnumber], 1,
176 $itemdata->{'itemnumber'}, undef
178 my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
179 GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
182 messages => { request_id => $reserve_id }
187 $result = { success => 0, messages => { CANNOT_REQUEST => 1 } };
195 my $requestid = shift;
196 CancelReserve( { reserve_id => $requestid } );
198 my $result = { success => 1 };
203 my $self = shift || die "Not called as a method, we must bail out";
204 my $barcode = shift || die "No barcode passed can not continue";
208 my $iteminfo = shift;
211 $self->userenv(); # set userenvironment
212 my ( $biblionumber, $biblioitemnumber );
215 my $frameworkcode = 'FA'; # we should get this from config
217 # we must make the item first
218 # Autographics workflow is to make the item each time
219 if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
223 elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
229 # create a marc record
230 $record = MARC::Record->new();
231 $record->leader(' nac 22 1u 4500');
232 $record->insert_fields_ordered(
233 MARC::Field->new( '100', '1', '0', 'a' => $iteminfo->{author} ),
234 MARC::Field->new( '245', '1', '0', 'a' => $iteminfo->{title} ),
237 'b' => $iteminfo->{publisher},
238 'c' => $iteminfo->{publicationdate}
241 '942', '1', '0', 'c' => $iteminfo->{mediumtype}
247 ( $biblionumber, $biblioitemnumber ) =
248 AddBiblio( $record, $frameworkcode );
252 ( $args{tag}, $args{subfield} ) =
253 GetMarcFromKohaField( "items.barcode", '' );
254 my ( $nextnum, $scr ) =
255 C4::Barcodes::ValueBuilder::incremental::get_barcode( \%args );
256 my $item = { 'barcode' => $nextnum };
257 ( $biblionumber, $biblioitemnumber, $itemnumber ) =
258 AddItem( $item, $biblionumber );
262 # find hold and get branch for that, check in there
263 my $itemdata = GetItem( undef, $barcode );
265 my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
266 GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
268 # now we have to check the requested action
269 if ( $action =~ /^Hold For Pickup And Notify/ ) {
270 unless ($reserve_id) {
271 $branchcode = 'AS'; # set this properly
272 # no reserve, place one
274 my $borrower = GetMemberDetails( undef, $user );
278 $borrower->{'borrowernumber'},
287 $itemdata->{'itemnumber'},
294 { success => 0, messages => { NO_BORROWER => 1 } };
300 { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
306 unless ($reserve_id) {
307 $result = { success => 0, messages => { NO_HOLD => 1 } };
311 my ( $success, $messages, $issue, $borrower ) =
312 AddReturn( $barcode, $branchcode, undef, undef );
313 if ( $messages->{'NotIssued'} ) {
315 ; # we do this because we are only doing the return to trigger the reserve
320 messages => $messages,
321 iteminformation => $issue,
322 borrower => $borrower,
323 newbarcode => $barcode