]> git.evergreen-ils.org Git - working/NCIPServer.git/blob - lib/NCIP/ILS/Koha.pm
Continuing with the work for RequestHandler
[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};
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     my $result;
150     unless ($borrower) {
151         $result = { success => 0, messages => { 'BORROWER_NOT_FOUND' => 1 } };
152         return $result;
153     }
154     my $itemdata;
155     if ($barcode) {
156         $itemdata = GetItem( undef, $barcode );
157     }
158     else {
159         $itemdata = GetBiblioData($biblionumber);
160     }
161     unless ($itemdata) {
162         $result = { success => 0, messages => {'ITEM_NOT_FOUND'} };
163         return $result;
164     }
165     $self->userenv();
166     if (
167         CanBookBeReserved(
168             $borrower->{borrowernumber},
169             $itemdata->{biblionumber}
170         )
171       )
172     {
173         my $biblioitemnumber = $itemdata->{biblionumber};
174         my $branchcode       = 'AS';
175
176         # Add reserve here
177         AddReserve(
178             $branchcode,               $borrower->{borrwerborrowernumber},
179             $itemdata->{biblionumber}, 'a',
180             [$biblioitemnumber],       1,
181             undef,                     undef,
182             'Placed By ILL',           '',
183             $itemdata->{'itemnumber'}, undef
184         );
185         my ( $reservedate, $borrowernumber, $branchcode2, $reserve_id, $wait ) =
186           GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
187         $result = {
188             success  => 1,
189             messages => { request_id => $reserve_id }
190         };
191         return $result;
192     }
193     else {
194         $result = { success => 0, messages => { CANNOT_REQUEST => 1 } };
195         return $result;
196
197     }
198 }
199
200 sub cancelrequest {
201     my $self      = shift;
202     my $requestid = shift;
203     CancelReserve( { reserve_id => $requestid } );
204
205     my $result = { success => 1 };
206     return $result;
207 }
208
209 sub acceptitem {
210     my $self    = shift || die "Not called as a method, we must bail out";
211     my $barcode = shift || die "No barcode passed can not continue";
212     my $user    = shift;
213     my $action  = shift;
214     my $create  = shift;
215     my $iteminfo = shift;
216     my $result;
217
218     $self->userenv();    # set userenvironment
219     my ( $biblionumber, $biblioitemnumber );
220     if ($create) {
221         my $record;
222         my $frameworkcode = 'FA';    # we should get this from config
223
224         # we must make the item first
225         # Autographics workflow is to make the item each time
226         if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
227
228             # TODO
229         }
230         elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
231
232             #TODO
233         }
234         else {
235             # MARC21
236             # create a marc record
237             $record = MARC::Record->new();
238             $record->leader('     nac  22     1u 4500');
239             $record->insert_fields_ordered(
240                 MARC::Field->new( '100', '1', '0', 'a' => $iteminfo->{author} ),
241                 MARC::Field->new( '245', '1', '0', 'a' => $iteminfo->{title} ),
242                 MARC::Field->new(
243                     '260', '1', '0',
244                     'b' => $iteminfo->{publisher},
245                     'c' => $iteminfo->{publicationdate}
246                 ),
247                 MARC::Field->new(
248                     '942', '1', '0', 'c' => $iteminfo->{mediumtype}
249                 )
250             );
251
252         }
253
254         ( $biblionumber, $biblioitemnumber ) =
255           AddBiblio( $record, $frameworkcode );
256         my $itemnumber;
257
258         my %args;
259         ( $args{tag}, $args{subfield} ) =
260           GetMarcFromKohaField( "items.barcode", '' );
261         my ( $nextnum, $scr ) =
262           C4::Barcodes::ValueBuilder::incremental::get_barcode( \%args );
263         my $item = { 'barcode' => $nextnum };
264         ( $biblionumber, $biblioitemnumber, $itemnumber ) =
265           AddItem( $item, $biblionumber );
266         $barcode = $nextnum;
267     }
268
269     # find hold and get branch for that, check in there
270     my $itemdata = GetItem( undef, $barcode );
271
272     my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
273       GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
274
275     # now we have to check the requested action
276     if ( $action =~ /^Hold For Pickup And Notify/ ) {
277         unless ($reserve_id) {
278             $branchcode = 'AS';    # set this properly
279                                    # no reserve, place one
280             if ($user) {
281                 my $borrower = GetMemberDetails( undef, $user );
282                 if ($borrower) {
283                     AddReserve(
284                         $branchcode,
285                         $borrower->{'borrowernumber'},
286                         $biblionumber,
287                         'a',
288                         [$biblioitemnumber],
289                         1,
290                         undef,
291                         undef,
292                         'Placed By ILL',
293                         '',
294                         $itemdata->{'itemnumber'},
295                         undef
296                     );
297                 }
298
299                 else {
300                     $result =
301                       { success => 0, messages => { NO_BORROWER => 1 } };
302                     return $result;
303                 }
304             }
305             else {
306                 $result =
307                   { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
308                 return $result;
309             }
310         }
311     }
312     else {
313         unless ($reserve_id) {
314             $result = { success => 0, messages => { NO_HOLD => 1 } };
315             return $result;
316         }
317     }
318     my ( $success, $messages, $issue, $borrower ) =
319       AddReturn( $barcode, $branchcode, undef, undef );
320     if ( $messages->{'NotIssued'} ) {
321         $success = 1
322           ; # we do this because we are only doing the return to trigger the reserve
323     }
324
325     $result = {
326         success         => $success,
327         messages        => $messages,
328         iteminformation => $issue,
329         borrower        => $borrower,
330         newbarcode      => $barcode
331     };
332
333     return $result;
334 }
335 1;