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 GetReservesFromBiblionumber};
31 use C4::Biblio qw {AddBiblio GetMarcFromKohaField GetBiblioData};
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 );
56 my $branch = shift || 'AS';
63 $branch, #branchcode need to set this properly
68 C4::Context->_new_userenv('DUMMY_SESSION_ID');
69 C4::Context->set_userenv(@USERENV);
77 my $exemptfine = undef;
81 my $item = GetItem( undef, $barcode );
82 $branch = $item->{holdingbranch};
84 ( $success, $messages, $issue, $borrower ) =
85 AddReturn( $barcode, $branch, $exemptfine, $dropbox );
88 messages => $messages,
89 iteminformation => $issue,
100 my $borrower = GetMemberDetails( undef, $userid );
101 my $item = GetItem( undef, $barcode );
104 $self->userenv( $item->{holdingbranch} );
108 ( $error, $confirm ) = CanBookBeIssued( $borrower, $barcode );
112 # Can't issue item, return error hash
113 return ( 1, $error );
116 return ( 1, $confirm );
119 my $datedue = AddIssue( $borrower, $barcode );
120 return ( 0, undef, $datedue ); #successfully issued
124 $error->{'badborrower'} = 1;
125 return ( 1, $error );
133 my $borrower = GetMemberDetails( undef, $userid );
135 my $datedue = AddRenewal( $barcode, $borrower->{'borrowernumber'} );
150 my $cardnumber = shift;
152 my $biblionumber = shift;
153 my $borrower = GetMemberDetails( undef, $cardnumber );
156 $result = { success => 0, messages => { 'BORROWER_NOT_FOUND' => 1 } };
161 $itemdata = GetItem( undef, $barcode );
164 $itemdata = GetBiblioData($biblionumber);
167 $result = { success => 0, messages => {'ITEM_NOT_FOUND'} };
173 $borrower->{borrowernumber},
174 $itemdata->{biblionumber}
178 my $biblioitemnumber = $itemdata->{biblionumber};
179 my $branchcode = 'CALG';
183 $branchcode, $borrower->{borrowernumber},
184 $itemdata->{biblionumber}, 'a',
185 [$biblioitemnumber], 1,
188 $itemdata->{'itemnumber'} || undef, undef
192 my $reserves = GetReservesFromBiblionumber(
193 { biblionumber => $itemdata->{biblionumber} } );
194 $request_id = $reserves->[1]->{reserve_id};
197 my ( $reservedate, $borrowernumber, $branchcode2, $reserve_id,
199 = GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
200 $request_id = $reserve_id;
204 messages => { request_id => $request_id }
209 $result = { success => 0, messages => { CANNOT_REQUEST => 1 } };
217 my $requestid = shift;
218 CancelReserve( { reserve_id => $requestid } );
220 my $result = { success => 1 };
225 my $self = shift || die "Not called as a method, we must bail out";
226 my $barcode = shift || die "No barcode passed can not continue";
230 my $iteminfo = shift;
233 $self->userenv(); # set userenvironment
234 my ( $biblionumber, $biblioitemnumber );
237 my $frameworkcode = 'FA'; # we should get this from config
239 # we must make the item first
240 # Autographics workflow is to make the item each time
241 if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
245 elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
251 # create a marc record
252 $record = MARC::Record->new();
253 $record->leader(' nac 22 1u 4500');
254 $record->insert_fields_ordered(
255 MARC::Field->new( '100', '1', '0', 'a' => $iteminfo->{author} ),
256 MARC::Field->new( '245', '1', '0', 'a' => $iteminfo->{title} ),
259 'b' => $iteminfo->{publisher},
260 'c' => $iteminfo->{publicationdate}
263 '942', '1', '0', 'c' => $iteminfo->{mediumtype}
269 ( $biblionumber, $biblioitemnumber ) =
270 AddBiblio( $record, $frameworkcode );
274 ( $args{tag}, $args{subfield} ) =
275 GetMarcFromKohaField( "items.barcode", '' );
276 my ( $nextnum, $scr ) =
277 C4::Barcodes::ValueBuilder::incremental::get_barcode( \%args );
278 $nextnum = sprintf( "%.0f", $nextnum );
279 my $item = { 'barcode' => $nextnum };
280 ( $biblionumber, $biblioitemnumber, $itemnumber ) =
281 AddItem( $item, $biblionumber );
285 # find hold and get branch for that, check in there
286 my $itemdata = GetItem( undef, $barcode );
288 my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
289 GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
291 # now we have to check the requested action
292 if ( $action =~ /^Hold For Pickup And Notify/ ) {
293 unless ($reserve_id) {
294 $branchcode = 'CALG'; # set this properly
295 # no reserve, place one
297 my $borrower = GetMemberDetails( undef, $user );
301 $borrower->{'borrowernumber'},
310 $itemdata->{'itemnumber'},
317 { success => 0, messages => { NO_BORROWER => 1 } };
323 { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
329 unless ($reserve_id) {
330 $result = { success => 0, messages => { NO_HOLD => 1 } };
334 my ( $success, $messages, $issue, $borrower ) =
335 AddReturn( $barcode, $branchcode, undef, undef );
336 if ( $messages->{'NotIssued'} ) {
338 ; # we do this because we are only doing the return to trigger the reserve
343 messages => $messages,
344 iteminformation => $issue,
345 borrower => $borrower,
346 newbarcode => $barcode