]> git.evergreen-ils.org Git - working/NCIPServer.git/blob - lib/NCIP/ILS/Koha.pm
0773d098e4dba396d9b21ee81ee364a9fad7ca22
[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};
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 $borrower   = GetMemberDetails( undef, $cardnumber );
148     my $result;
149     unless ($borrower) {
150         $result = { success => 0, messages => { 'BORROWER_NOT_FOUND' => 1 } };
151         return $result;
152     }
153     my $itemdata = GetItem( undef, $barcode );
154     unless ($itemdata) {
155         $result = { success => 0, messages => {'ITEM_NOT_FOUND'} };
156         return $result;
157     }
158     $self->userenv();
159     if (
160         CanBookBeReserved(
161             $borrower->{borrowernumber},
162             $itemdata->{biblionumber}
163         )
164       )
165     {
166         my $biblioitemnumber = $itemdata->{biblionumber};
167         my $branchcode       = 'AS';
168
169         # Add reserve here
170         AddReserve(
171             $branchcode,               $borrower->{borrwerborrowernumber},
172             $itemdata->{biblionumber}, 'a',
173             [$biblioitemnumber],       1,
174             undef,                     undef,
175             'Placed By ILL',           '',
176             $itemdata->{'itemnumber'}, undef
177         );
178         my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
179           GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
180         $result = {
181             success  => 1,
182             messages => { request_id => $reserve_id }
183         };
184         return $result;
185     }
186     else {
187         $result = { success => 0, messages => { CANNOT_REQUEST => 1 } };
188         return $result;
189
190     }
191 }
192
193 sub cancelrequest {
194     my $self      = shift;
195     my $requestid = shift;
196     CancelReserve( { reserve_id => $requestid } );
197
198     my $result = { success => 1 };
199     return $result;
200 }
201
202 sub acceptitem {
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";
205     my $user    = shift;
206     my $action  = shift;
207     my $create  = shift;
208     my $iteminfo = shift;
209     my $result;
210
211     $self->userenv();    # set userenvironment
212     my ( $biblionumber, $biblioitemnumber );
213     if ($create) {
214         my $record;
215         my $frameworkcode = 'FA';    # we should get this from config
216
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' ) {
220
221             # TODO
222         }
223         elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
224
225             #TODO
226         }
227         else {
228             # MARC21
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} ),
235                 MARC::Field->new(
236                     '260', '1', '0',
237                     'b' => $iteminfo->{publisher},
238                     'c' => $iteminfo->{publicationdate}
239                 ),
240                 MARC::Field->new(
241                     '942', '1', '0', 'c' => $iteminfo->{mediumtype}
242                 )
243             );
244
245         }
246
247         ( $biblionumber, $biblioitemnumber ) =
248           AddBiblio( $record, $frameworkcode );
249         my $itemnumber;
250
251         my %args;
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 );
259         $barcode = $nextnum;
260     }
261
262     # find hold and get branch for that, check in there
263     my $itemdata = GetItem( undef, $barcode );
264
265     my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
266       GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
267
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
273             if ($user) {
274                 my $borrower = GetMemberDetails( undef, $user );
275                 if ($borrower) {
276                     AddReserve(
277                         $branchcode,
278                         $borrower->{'borrowernumber'},
279                         $biblionumber,
280                         'a',
281                         [$biblioitemnumber],
282                         1,
283                         undef,
284                         undef,
285                         'Placed By ILL',
286                         '',
287                         $itemdata->{'itemnumber'},
288                         undef
289                     );
290                 }
291
292                 else {
293                     $result =
294                       { success => 0, messages => { NO_BORROWER => 1 } };
295                     return $result;
296                 }
297             }
298             else {
299                 $result =
300                   { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
301                 return $result;
302             }
303         }
304     }
305     else {
306         unless ($reserve_id) {
307             $result = { success => 0, messages => { NO_HOLD => 1 } };
308             return $result;
309         }
310     }
311     my ( $success, $messages, $issue, $borrower ) =
312       AddReturn( $barcode, $branchcode, undef, undef );
313     if ( $messages->{'NotIssued'} ) {
314         $success = 1
315           ; # we do this because we are only doing the return to trigger the reserve
316     }
317
318     $result = {
319         success         => $success,
320         messages        => $messages,
321         iteminformation => $issue,
322         borrower        => $borrower,
323         newbarcode      => $barcode
324     };
325
326     return $result;
327 }
328 1;