]> git.evergreen-ils.org Git - working/NCIPServer.git/blob - lib/NCIP/ILS/Koha.pm
Working on the CancelRequest message
[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 $carnumber = shift;
146     my $barcode   = shift;
147     my 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             $branch,                   $borrower->{borrwerborrowernumber},
172             $itemdata->{biblionumber}, 'a',
173             [$biblioitemnumber],       1,
174             undef,                     undef,
175             'Placed By ILL',           '',
176             $itemdata->{'itemnumber'}, undef
177         );
178
179         $result = { success => 1, request_id => 'something' };
180         return $result;
181     }
182     else {
183         $result = { success => 0, messages => { CANNOT_REQUEST => 1 } };
184         return $result;
185
186     }
187 }
188
189 sub cancelrequest {
190     my $self      = shift;
191     my $requestid = shift;
192     CancelReserve( { reserve_id => $requestid } );
193
194     my $result = { success => 1 };
195     return $result;
196 }
197
198 sub acceptitem {
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";
201     my $user    = shift;
202     my $action  = shift;
203     my $create  = shift;
204     my $iteminfo = shift;
205     my $result;
206
207     $self->userenv();    # set userenvironment
208     my ( $biblionumber, $biblioitemnumber );
209     if ($create) {
210         my $record;
211         my $frameworkcode = 'FA';    # we should get this from config
212
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' ) {
216
217             # TODO
218         }
219         elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
220
221             #TODO
222         }
223         else {
224             # MARC21
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} ),
231                 MARC::Field->new(
232                     '260', '1', '0',
233                     'b' => $iteminfo->{publisher},
234                     'c' => $iteminfo->{publicationdate}
235                 ),
236                 MARC::Field->new(
237                     '942', '1', '0', 'c' => $iteminfo->{mediumtype}
238                 )
239             );
240
241         }
242
243         ( $biblionumber, $biblioitemnumber ) =
244           AddBiblio( $record, $frameworkcode );
245         my $itemnumber;
246
247         my %args;
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 );
255         $barcode = $nextnum;
256     }
257
258     # find hold and get branch for that, check in there
259     my $itemdata = GetItem( undef, $barcode );
260
261     my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
262       GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
263
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
269             if ($user) {
270                 my $borrower = GetMemberDetails( undef, $user );
271                 if ($borrower) {
272                     AddReserve(
273                         $branchcode,
274                         $borrower->{'borrowernumber'},
275                         $biblionumber,
276                         'a',
277                         [$biblioitemnumber],
278                         1,
279                         undef,
280                         undef,
281                         'Placed By ILL',
282                         '',
283                         $itemdata->{'itemnumber'},
284                         undef
285                     );
286                 }
287
288                 else {
289                     $result =
290                       { success => 0, messages => { NO_BORROWER => 1 } };
291                     return $result;
292                 }
293             }
294             else {
295                 $result =
296                   { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
297                 return $result;
298             }
299         }
300     }
301     else {
302         unless ($reserve_id) {
303             $result = { success => 0, messages => { NO_HOLD => 1 } };
304             return $result;
305         }
306     }
307     my ( $success, $messages, $issue, $borrower ) =
308       AddReturn( $barcode, $branchcode, undef, undef );
309     if ( $messages->{'NotIssued'} ) {
310         $success = 1
311           ; # we do this because we are only doing the return to trigger the reserve
312     }
313
314     $result = {
315         success         => $success,
316         messages        => $messages,
317         iteminformation => $issue,
318         borrower        => $borrower,
319         newbarcode      => $barcode
320     };
321
322     return $result;
323 }
324 1;