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 $carnumber = shift;
147 my 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 $branch, $borrower->{borrwerborrowernumber},
172 $itemdata->{biblionumber}, 'a',
173 [$biblioitemnumber], 1,
176 $itemdata->{'itemnumber'}, undef
179 $result = { success => 1, request_id => 'something' };
183 $result = { success => 0, messages => { CANNOT_REQUEST => 1 } };
191 my $requestid = shift;
192 CancelReserve( { reserve_id => $requestid } );
194 my $result = { success => 1 };
199 my $self = shift || die "Not called as a method, we must bail out";
200 my $barcode = shift || die "No barcode passed can not continue";
204 my $iteminfo = shift;
207 $self->userenv(); # set userenvironment
208 my ( $biblionumber, $biblioitemnumber );
211 my $frameworkcode = 'FA'; # we should get this from config
213 # we must make the item first
214 # Autographics workflow is to make the item each time
215 if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
219 elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
225 # create a marc record
226 $record = MARC::Record->new();
227 $record->leader(' nac 22 1u 4500');
228 $record->insert_fields_ordered(
229 MARC::Field->new( '100', '1', '0', 'a' => $iteminfo->{author} ),
230 MARC::Field->new( '245', '1', '0', 'a' => $iteminfo->{title} ),
233 'b' => $iteminfo->{publisher},
234 'c' => $iteminfo->{publicationdate}
237 '942', '1', '0', 'c' => $iteminfo->{mediumtype}
243 ( $biblionumber, $biblioitemnumber ) =
244 AddBiblio( $record, $frameworkcode );
248 ( $args{tag}, $args{subfield} ) =
249 GetMarcFromKohaField( "items.barcode", '' );
250 my ( $nextnum, $scr ) =
251 C4::Barcodes::ValueBuilder::incremental::get_barcode( \%args );
252 my $item = { 'barcode' => $nextnum };
253 ( $biblionumber, $biblioitemnumber, $itemnumber ) =
254 AddItem( $item, $biblionumber );
258 # find hold and get branch for that, check in there
259 my $itemdata = GetItem( undef, $barcode );
261 my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
262 GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
264 # now we have to check the requested action
265 if ( $action =~ /^Hold For Pickup And Notify/ ) {
266 unless ($reserve_id) {
267 $branchcode = 'AS'; # set this properly
268 # no reserve, place one
270 my $borrower = GetMemberDetails( undef, $user );
274 $borrower->{'borrowernumber'},
283 $itemdata->{'itemnumber'},
290 { success => 0, messages => { NO_BORROWER => 1 } };
296 { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
302 unless ($reserve_id) {
303 $result = { success => 0, messages => { NO_HOLD => 1 } };
307 my ( $success, $messages, $issue, $borrower ) =
308 AddReturn( $barcode, $branchcode, undef, undef );
309 if ( $messages->{'NotIssued'} ) {
311 ; # we do this because we are only doing the return to trigger the reserve
316 messages => $messages,
317 iteminformation => $issue,
318 borrower => $borrower,
319 newbarcode => $barcode