]> git.evergreen-ils.org Git - working/NCIPServer.git/blob - lib/NCIP/ILS/Koha.pm
Working AcceptItem now
[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 qw {CanBookBeReserved AddReserve GetReservesFromItemnumber};
30 use C4::Biblio qw {AddBiblio GetMarcFromKohaField};
31 use C4::Barcodes::ValueBuilder;
32 use C4::Items qw{AddItem};
33
34 sub itemdata {
35     my $self     = shift;
36     my $barcode  = shift;
37     my $itemdata = GetItem( undef, $barcode );
38     if ($itemdata) {
39         return ( $itemdata, undef );
40     }
41     else {
42         return ( undef, 1 );    # item not found error
43     }
44 }
45
46 sub userdata {
47     my $self     = shift;
48     my $userid   = shift;
49     my $userdata = GetMemberDetails( undef, $userid );
50     return $userdata;
51 }
52
53 sub userenv {
54     my $self    = shift;
55     my @USERENV = (
56         1,
57         'test',
58         'MASTERTEST',
59         'Test',
60         'Test',
61         'AS',    #branchcode need to set this properly
62         'Auckland',
63         0,
64     );
65
66     C4::Context->_new_userenv('DUMMY_SESSION_ID');
67     C4::Context->set_userenv(@USERENV);
68     return;
69 }
70
71 sub checkin {
72     my $self       = shift;
73     my $barcode    = shift;
74     my $branch     = shift;
75     my $exemptfine = undef;
76     my $dropbox    = undef;
77     $self->userenv();
78     my ( $success, $messages, $issue, $borrower ) =
79       AddReturn( $barcode, $branch, $exemptfine, $dropbox );
80     my $result = {
81         success         => $success,
82         messages        => $messages,
83         iteminformation => $issue,
84         borrower        => $borrower
85     };
86
87     return $result;
88 }
89
90 sub checkout {
91     my $self     = shift;
92     my $userid   = shift;
93     my $barcode  = shift;
94     my $borrower = GetMemberDetails( undef, $userid );
95     my $error;
96     my $confirm;
97     $self->userenv();
98     if ($borrower) {
99
100         ( $error, $confirm ) = CanBookBeIssued( $borrower, $barcode );
101
102   #( $issuingimpossible, $needsconfirmation ) =  CanBookBeIssued( $borrower,
103   #                      $barcode, $duedatespec, $inprocess, $ignore_reserves );
104         if (%$error) {
105
106             # Can't issue item, return error hash
107             return ( 1, $error );
108         }
109         elsif (%$confirm) {
110             return ( 1, $confirm );
111         }
112         else {
113             my $datedue = AddIssue( $borrower, $barcode );
114             return ( 0, undef, $datedue );    #successfully issued
115         }
116     }
117     else {
118         $error->{'badborrower'} = 1;
119         return ( 1, $error );
120     }
121 }
122
123 sub renew {
124     my $self     = shift;
125     my $barcode  = shift;
126     my $userid   = shift;
127     my $borrower = GetMemberDetails( undef, $userid );
128     if ($borrower) {
129         my $datedue = AddRenewal( $barcode, $borrower->{'borrowernumber'} );
130         my $result = {
131             success => 1,
132             datedue => $datedue
133         };
134         return $result;
135
136     }
137     else {
138         #handle stuff here
139     }
140 }
141
142 sub request {
143     my $self           = shift;
144     my $biblionumber   = shift;
145     my $borrowernumber = shift;
146     if ( CanBookBeReserved( $borrowernumber, $biblionumber ) ) {
147
148         # Add reserve here
149         return ( undef, "Requested" );
150     }
151     else {
152         return ( 1, "Book can not be requested" );
153     }
154 }
155
156 sub acceptitem {
157     my $self    = shift || die "Not called as a method, we must bail out";
158     my $barcode = shift || die "No barcode passed can not continue";
159     my $user    = shift;
160     my $action  = shift;
161     my $create  = shift;
162     my $iteminfo = shift;
163     my $result;
164
165     $self->userenv();    # set userenvironment
166     my ( $biblionumber, $biblioitemnumber );
167     if ($create) {
168         my $record;
169         my $frameworkcode = 'FA';    # we should get this from config
170         warn "Create yo";
171         warn $iteminfo->{title};
172
173         # we must make the item first
174         # Autographics workflow is to make the item each time
175         if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
176
177             # TODO
178         }
179         elsif ( C4::Context->preference('marcflavour') eq 'NORMARC' ) {
180
181             #TODO
182         }
183         else {
184             # MARC21
185             # create a marc record
186             $record = MARC::Record->new();
187             $record->leader('     nac  22     1u 4500');
188             $record->insert_fields_ordered(
189                 MARC::Field->new( '100', '1', '0', 'a' => $iteminfo->{author} ),
190                 MARC::Field->new( '245', '1', '0', 'a' => $iteminfo->{title} ),
191                 MARC::Field->new(
192                     '260', '1', '0',
193                     'b' => $iteminfo->{publisher},
194                     'c' => $iteminfo->{publicationdate}
195                 ),
196                 MARC::Field->new(
197                     '942', '1', '0', 'c' => $iteminfo->{mediumtype}
198                 )
199             );
200
201         }
202
203         ( $biblionumber, $biblioitemnumber ) =
204           AddBiblio( $record, $frameworkcode );
205         my $itemnumber;
206
207         my %args;
208         ( $args{tag}, $args{subfield} ) =
209           GetMarcFromKohaField( "items.barcode", '' );
210         my ( $nextnum, $scr ) =
211           C4::Barcodes::ValueBuilder::incremental::get_barcode( \%args );
212         my $item = { 'barcode' => $nextnum };
213         ( $biblionumber, $biblioitemnumber, $itemnumber ) =
214           AddItem( $item, $biblionumber );
215         $barcode = $nextnum;
216     }
217
218     # find hold and get branch for that, check in there
219     my $itemdata = GetItem( undef, $barcode );
220     warn $itemdata->{'itemnumber'};
221
222     my ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $wait ) =
223       GetReservesFromItemnumber( $itemdata->{'itemnumber'} );
224     warn "barcode $barcode";
225     # now we have to check the requested action
226     if ( $action =~ /^Hold For Pickup And Notify/ ) {
227         unless ($reserve_id) {
228             $branchcode = 'AS';    # set this properly
229                                    # no reserve, place one
230             if ($user) {
231                 my $borrower = GetMemberDetails( undef, $user );
232                 if ($borrower) {
233                     AddReserve(
234                         $branchcode,
235                         $borrower->{'borrowernumber'},
236                         $biblionumber,
237                         'a',
238                         [$biblioitemnumber],
239                         1,
240                         undef,
241                         undef,
242                         'Placed By ILL',
243                         '',
244                         $itemdata->{'itemnumber'},
245                         undef
246                     );
247                 }
248
249                 else {
250                     $result =
251                       { success => 0, messages => { NO_BORROWER => 1 } };
252                     return $result;
253                 }
254             }
255             else {
256                 $result =
257                   { success => 0, messages => { NO_HOLD_BORROWER => 1 } };
258                 return $result;
259             }
260         }
261     }
262     else {
263         unless ($reserve_id) {
264             $result = { success => 0, messages => { NO_HOLD => 1 } };
265             return $result;
266         }
267     }
268     my ( $success, $messages, $issue, $borrower ) =
269       AddReturn( $barcode, $branchcode, undef, undef );
270     if ( $messages->{'NotIssued'} ) {
271         $success = 1
272           ; # we do this because we are only doing the return to trigger the reserve
273     }
274
275     $result = {
276         success         => $success,
277         messages        => $messages,
278         iteminformation => $issue,
279         borrower        => $borrower,
280         newbarcode         => $barcode
281     };
282
283     return $result;
284 }
285 1;