]> git.evergreen-ils.org Git - working/NCIPServer.git/blob - lib/NCIP/ILS/Koha.pm
Continuing on with the changes
[working/NCIPServer.git] / lib / NCIP / ILS / Koha.pm
1 #
2 #===============================================================================
3 #
4 #         FILE: Koha.pm
5 #
6 #  DESCRIPTION:
7 #
8 #        FILES: ---
9 #         BUGS: ---
10 #        NOTES: ---
11 #       AUTHOR: Chris Cormack (rangi), chrisc@catalyst.net.nz
12 # ORGANIZATION: Koha Development Team
13 #      VERSION: 1.0
14 #      CREATED: 05/11/13 11:14:09
15 #     REVISION: ---
16 #===============================================================================
17 package NCIP::ILS::Koha;
18
19 use Modern::Perl;
20 use Object::Tiny qw{ name };
21
22 use MARC::Record;
23 use MARC::Field;
24
25 use C4::Members qw{ GetMemberDetails };
26 use C4::Circulation qw { AddReturn CanBookBeIssued AddIssue };
27 use C4::Context;
28 use C4::Items qw { GetItem };
29 use C4::Reserves
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};
34
35 sub itemdata {
36     my $self     = shift;
37     my $barcode  = shift;
38     my $itemdata = GetItem( undef, $barcode );
39     if ($itemdata) {
40         return ( $itemdata, undef );
41     }
42     else {
43         return ( undef, 1 );    # item not found error
44     }
45 }
46
47 sub userdata {
48     my $self     = shift;
49     my $userid   = shift;
50     my $userdata = GetMemberDetails( undef, $userid );
51     return $userdata;
52 }
53
54 sub userenv {
55     my $self    = shift;
56     my @USERENV = (
57         1,
58         'test',
59         'MASTERTEST',
60         'Test',
61         'Test',
62         'AS',    #branchcode need to set this properly
63         'Auckland',
64         0,
65     );
66
67     C4::Context->_new_userenv('DUMMY_SESSION_ID');
68     C4::Context->set_userenv(@USERENV);
69     return;
70 }
71
72 sub checkin {
73     my $self       = shift;
74     my $barcode    = shift;
75     my $branch     = shift;
76     my $exemptfine = undef;
77     my $dropbox    = undef;
78     $self->userenv();
79     my ( $success, $messages, $issue, $borrower ) =
80       AddReturn( $barcode, $branch, $exemptfine, $dropbox );
81     my $result = {
82         success         => $success,
83         messages        => $messages,
84         iteminformation => $issue,
85         borrower        => $borrower
86     };
87
88     return $result;
89 }
90
91 sub checkout {
92     my $self     = shift;
93     my $userid   = shift;
94     my $barcode  = shift;
95     my $borrower = GetMemberDetails( undef, $userid );
96     my $error;
97     my $confirm;
98     $self->userenv();
99     if ($borrower) {
100
101         ( $error, $confirm ) = CanBookBeIssued( $borrower, $barcode );
102
103   #( $issuingimpossible, $needsconfirmation ) =  CanBookBeIssued( $borrower,
104   #                      $barcode, $duedatespec, $inprocess, $ignore_reserves );
105         if (%$error) {
106
107             # Can't issue item, return error hash
108             return ( 1, $error );
109         }
110         elsif (%$confirm) {
111             return ( 1, $confirm );
112         }
113         else {
114             my $datedue = AddIssue( $borrower, $barcode );
115             return ( 0, undef, $datedue );    #successfully issued
116         }
117     }
118     else {
119         $error->{'badborrower'} = 1;
120         return ( 1, $error );
121     }
122 }
123
124 sub renew {
125     my $self     = shift;
126     my $barcode  = shift;
127     my $userid   = shift;
128     my $borrower = GetMemberDetails( undef, $userid );
129     if ($borrower) {
130         my $datedue = AddRenewal( $barcode, $borrower->{'borrowernumber'} );
131         my $result = {
132             success => 1,
133             datedue => $datedue
134         };
135         return $result;
136
137     }
138     else {
139         #handle stuff here
140     }
141 }
142
143 sub request {
144     my $self         = shift;
145     my $cardnumber   = shift;
146     my $barcode      = shift;
147     my $biblionumber = shift;
148     my $borrower     = GetMemberDetails( undef, $cardnumber );
149     warn $cardnumber;
150     my $result;
151     unless ($borrower) {
152         $result = { success => 0, messages => { 'BORROWER_NOT_FOUND' => 1 } };
153         return $result;
154     }
155     my $itemdata;
156     if ($barcode) {
157         $itemdata = GetItem( undef, $barcode );
158     }
159     else {
160         $itemdata = GetBiblioData($biblionumber);
161     }
162     unless ($itemdata) {
163         $result = { success => 0, messages => {'ITEM_NOT_FOUND'} };
164         return $result;
165     }
166     $self->userenv();
167     warn  $borrower->{borrowernumber};
168     if (
169         CanBookBeReserved(
170             $borrower->{borrowernumber},
171             $itemdata->{biblionumber}
172         )
173       )
174     {
175         my $biblioitemnumber = $itemdata->{biblionumber};
176         my $branchcode       = 'CALG';
177         warn  $borrower->{borrwerborrowernumber};
178         # Add reserve here
179         AddReserve(
180             $branchcode,               $borrower->{borrowernumber},
181             $itemdata->{biblionumber}, 'a',
182             [$biblioitemnumber],       1,
183             undef,                     undef,
184             'Placed By ILL',           '',
185             $itemdata->{'itemnumber'} || undef, undef
186         );
187         my $request_id;
188         if ($biblionumber){
189           warn "yo $biblionumber";
190          my $reserves = GetReservesFromBiblionumber({biblionumber => $itemdata->{biblionumber}});
191             use Data::Dumper;
192             warn Dumper $reserves;
193             $request_id=$reserves->[1]->{reserve_id};
194         }
195         else {
196         my ( $reservedate, $borrowernumber, $branchcode2, $reserve_id, $wait ) =
197           GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
198           $request_id = $reserve_id;
199         }
200         warn $request_id;
201         $result = {
202             success  => 1,
203             messages => { request_id => $request_id }
204         };
205         warn 
206         return $result;
207     }
208     else {
209         $result = { success => 0, messages => { CANNOT_REQUEST => 1 } };
210         return $result;
211
212     }
213 }
214
215 sub cancelrequest {
216     my $self      = shift;
217     my $requestid = shift;
218     CancelReserve( { reserve_id => $requestid } );
219
220     my $result = { success => 1 };
221     return $result;
222 }
223
224 sub acceptitem {
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";
227     my $user    = shift;
228     my $action  = shift;
229     my $create  = shift;
230     my $iteminfo = shift;
231     my $result;
232
233     $self->userenv();    # set userenvironment
234     my ( $biblionumber, $biblioitemnumber );
235     if ($create) {
236         my $record;
237         my $frameworkcode = 'FA';    # we should get this from config
238
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' ) {
242
243             # TODO
244         }
245         elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
246
247             #TODO
248         }
249         else {
250             # MARC21
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} ),
257                 MARC::Field->new(
258                     '260', '1', '0',
259                     'b' => $iteminfo->{publisher},
260                     'c' => $iteminfo->{publicationdate}
261                 ),
262                 MARC::Field->new(
263                     '942', '1', '0', 'c' => $iteminfo->{mediumtype}
264                 )
265             );
266
267         }
268
269         ( $biblionumber, $biblioitemnumber ) =
270           AddBiblio( $record, $frameworkcode );
271         my $itemnumber;
272
273         my %args;
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 );
282         $barcode = $nextnum;
283     }
284
285     # find hold and get branch for that, check in there
286     my $itemdata = GetItem( undef, $barcode );
287
288     my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
289       GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
290
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
296             if ($user) {
297                 my $borrower = GetMemberDetails( undef, $user );
298                 if ($borrower) {
299                     AddReserve(
300                         $branchcode,
301                         $borrower->{'borrowernumber'},
302                         $biblionumber,
303                         'a',
304                         [$biblioitemnumber],
305                         1,
306                         undef,
307                         undef,
308                         'Placed By ILL',
309                         '',
310                         $itemdata->{'itemnumber'},
311                         undef
312                     );
313                 }
314
315                 else {
316                     $result =
317                       { success => 0, messages => { NO_BORROWER => 1 } };
318                     return $result;
319                 }
320             }
321             else {
322                 $result =
323                   { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
324                 return $result;
325             }
326         }
327     }
328     else {
329         unless ($reserve_id) {
330             $result = { success => 0, messages => { NO_HOLD => 1 } };
331             return $result;
332         }
333     }
334     my ( $success, $messages, $issue, $borrower ) =
335       AddReturn( $barcode, $branchcode, undef, undef );
336     if ( $messages->{'NotIssued'} ) {
337         $success = 1
338           ; # we do this because we are only doing the return to trigger the reserve
339     }
340
341     $result = {
342         success         => $success,
343         messages        => $messages,
344         iteminformation => $issue,
345         borrower        => $borrower,
346         newbarcode      => $barcode
347     };
348
349     return $result;
350 }
351 1;