adding openncip / opensip SIP2 service
[koha.git] / C4 / SIP / ILS / Patron.pm
1 #
2 # ILS::Patron.pm
3
4 # A Class for hiding the ILS's concept of the patron from the OpenSIP
5 # system
6 #
7
8 package ILS::Patron;
9
10 use strict;
11 use warnings;
12 use Exporter;
13
14 use Sys::Syslog qw(syslog);
15 use Data::Dumper;
16
17 our (@ISA, @EXPORT_OK);
18
19 @ISA = qw(Exporter);
20
21 @EXPORT_OK = qw(invalid_patron);
22
23 our %patron_db = (
24                   djfiander => {
25                       name => "David J. Fiander",
26                       id => 'djfiander',
27                       password => '6789',
28                       ptype => 'A', # 'A'dult.  Whatever.
29                       birthdate => '19640925',
30                       address => '2 Meadowvale Dr. St Thomas, ON',
31                       home_phone => '(519) 555 1234',
32                       email_addr => 'djfiander@hotmail.com',
33                       charge_ok => 1,
34                       renew_ok => 1,
35                       recall_ok => 0,
36                       hold_ok => 1,
37                       card_lost => 0,
38                       claims_returned => 0,
39                       fines => 100,
40                       fees => 0,
41                       recall_overdue => 0,
42                       items_billed => 0,
43                       screen_msg => '',
44                       print_line => '',
45                       items => [],
46                       hold_items => [],
47                       overdue_items => [],
48                       fine_items => ['Computer Time'],
49                       recall_items => [],
50                       unavail_holds => [],
51                       inet => 1,
52                   },
53                   miker => {
54                       name => "Mike Rylander",
55                       id => 'miker',
56                       password => '6789',
57                       ptype => 'A', # 'A'dult.  Whatever.
58                       birthdate => '19640925',
59                       address => 'Somewhere in Atlanta',
60                       home_phone => '(404) 555 1235',
61                       email_addr => 'mrylander@gmail.com',
62                       charge_ok => 1,
63                       renew_ok => 1,
64                       recall_ok => 0,
65                       hold_ok => 1,
66                       card_lost => 0,
67                       claims_returned => 0,
68                       fines => 0,
69                       fees => 0,
70                       recall_overdue => 0,
71                       items_billed => 0,
72                       screen_msg => '',
73                       print_line => '',
74                       items => [],
75                       hold_items => [],
76                       overdue_items => [],
77                       fine_items => [],
78                       recall_items => [],
79                       unavail_holds => [],
80                       inet => 0,
81                   },
82                   );
83
84 sub new {
85     my ($class, $patron_id) = @_;
86     my $type = ref($class) || $class;
87     my $self;
88
89     if (!exists($patron_db{$patron_id})) {
90         syslog("LOG_DEBUG", "new ILS::Patron(%s): no such patron", $patron_id);
91         return undef;
92     }
93
94     $self = $patron_db{$patron_id};
95
96     syslog("LOG_DEBUG", "new ILS::Patron(%s): found patron '%s'", $patron_id,
97            $self->{id});
98
99     bless $self, $type;
100     return $self;
101 }
102
103 sub id {
104     my $self = shift;
105
106     return $self->{id};
107 }
108
109 sub name {
110     my $self = shift;
111
112     return $self->{name};
113 }
114
115 sub address {
116     my $self = shift;
117
118     return $self->{address};
119 }
120
121 sub email_addr {
122     my $self = shift;
123
124     return $self->{email_addr};
125 }
126
127 sub home_phone {
128     my $self = shift;
129
130     return $self->{home_phone};
131 }
132
133 sub sip_birthdate {
134     my $self = shift;
135
136     return $self->{birthdate};
137 }
138
139 sub ptype {
140     my $self = shift;
141
142     return $self->{ptype};
143 }
144
145 sub language {
146     my $self = shift;
147
148     return $self->{language} || '000'; # Unspecified
149 }
150
151 sub charge_ok {
152     my $self = shift;
153
154     return $self->{charge_ok};
155 }
156
157 sub renew_ok {
158     my $self = shift;
159
160     return $self->{renew_ok};
161 }
162
163 sub recall_ok {
164     my $self = shift;
165
166     return $self->{recall_ok};
167 }
168
169 sub hold_ok {
170     my $self = shift;
171
172     return $self->{hold_ok};
173 }
174
175 sub card_lost {
176     my $self = shift;
177
178     return $self->{card_lost};
179 }
180
181 sub recall_overdue {
182     my $self = shift;
183
184     return $self->{recall_overdue};
185 }
186
187 sub check_password {
188     my ($self, $pwd) = @_;
189
190     # If the patron doesn't have a password,
191     # then we don't need to check
192     return (!$self->{password} || ($pwd && ($self->{password} eq $pwd)));
193 }
194
195 sub currency {
196     my $self = shift;
197
198     return $self->{currency};
199 }
200
201 sub fee_amount {
202     my $self = shift;
203
204     return $self->{fee_amount} || undef;
205 }
206
207 sub screen_msg {
208     my $self = shift;
209
210     return $self->{screen_msg};
211 }
212
213 sub print_line {
214     my $self = shift;
215
216     return $self->{print_line};
217 }
218
219 sub too_many_charged {
220     my $self = shift;
221
222     return $self->{too_many_charged};
223 }
224
225 sub too_many_overdue {
226     my $self = shift;
227
228     return $self->{too_many_overdue};
229 }
230
231 sub too_many_renewal {
232     my $self = shift;
233
234     return $self->{too_many_renewal};
235 }
236
237 sub too_many_claim_return {
238     my $self = shift;
239
240     return $self->{too_many_claim_return};
241 }
242
243 sub too_many_lost {
244     my $self = shift;
245
246     return $self->{too_many_lost};
247 }
248
249 sub excessive_fines {
250     my $self = shift;
251
252     return $self->{excessive_fines};
253 }
254
255 sub excessive_fees {
256     my $self = shift;
257
258     return $self->{excessive_fees};
259 }
260
261 sub too_many_billed {
262     my $self = shift;
263
264     return $self->{too_many_billed};
265 }
266
267 #
268 # List of outstanding holds placed
269 #
270 sub hold_items {
271     my ($self, $start, $end) = @_;
272
273     $start = 1 if !defined($start);
274     $end = scalar @{$self->{hold_items}} if !defined($end);
275
276     return [@{$self->{hold_items}}[$start-1 .. $end-1]];
277 }
278
279 #
280 # remove the hold on item item_id from my hold queue.
281 # return true if I was holding the item, false otherwise.
282
283 sub drop_hold {
284     my ($self, $item_id) = @_;
285     my $i;
286
287     for ($i = 0; $i < scalar @{$self->{hold_items}}; $i += 1) {
288         if ($self->{hold_items}[$i]->{item_id} eq $item_id) {
289             splice @{$self->{hold_items}}, $i, 1;
290             return 1;
291         }
292     }
293
294     return 0;
295 }
296
297 sub overdue_items {
298     my ($self, $start, $end) = @_;
299
300     $start = 1 if !defined($start);
301     $end = scalar @{$self->{overdue_items}} if !defined($end);
302
303     return [@{$self->{overdue_items}}[$start-1 .. $end-1]];
304 }
305
306 sub charged_items {
307     my ($self, $start, $end) = shift;
308
309     $start = 1 if !defined($start);
310     $end = scalar @{$self->{items}} if !defined($end);
311
312     syslog("LOG_DEBUG", "charged_items: start = %d, end = %d", $start, $end);
313     syslog("LOG_DEBUG", "charged_items: items = (%s)",
314            join(', ', @{$self->{items}}));
315
316         return [@{$self->{items}}[$start-1 .. $end-1]];
317 }
318
319 sub fine_items {
320     my ($self, $start, $end) = @_;
321
322     $start = 1 if !defined($start);
323     $end = scalar @{$self->{fine_items}} if !defined($end);
324
325     return [@{$self->{fine_items}}[$start-1 .. $end-1]];
326 }
327
328 sub recall_items {
329     my ($self, $start, $end) = @_;
330
331     $start = 1 if !defined($start);
332     $end = scalar @{$self->{recall_items}} if !defined($end);
333
334     return [@{$self->{recall_items}}[$start-1 .. $end-1]];
335 }
336
337 sub unavail_holds {
338     my ($self, $start, $end) = @_;
339
340     $start = 1 if !defined($start);
341     $end = scalar @{$self->{unavail_holds}} if !defined($end);
342
343     return [@{$self->{unavail_holds}}[$start-1 .. $end-1]];
344 }
345
346 sub block {
347     my ($self, $card_retained, $blocked_card_msg) = @_;
348
349     foreach my $field ('charge_ok', 'renew_ok', 'recall_ok', 'hold_ok') {
350         $self->{$field} = 0;
351     }
352
353     $self->{screen_msg} = $blocked_card_msg || "Card Blocked.  Please contact library staff";
354
355     return $self;
356 }
357
358 sub enable {
359     my $self = shift;
360
361     foreach my $field ('charge_ok', 'renew_ok', 'recall_ok', 'hold_ok') {
362         $self->{$field} = 1;
363     }
364
365     syslog("LOG_DEBUG", "Patron(%s)->enable: charge: %s, renew:%s, recall:%s, hold:%s",
366            $self->{id}, $self->{charge_ok}, $self->{renew_ok},
367            $self->{recall_ok}, $self->{hold_ok});
368
369     $self->{screen_msg} = "All privileges restored.";
370
371     return $self;
372 }
373
374
375 sub inet_privileges {
376     my $self = shift;
377
378     return $self->{inet} ? 'Y' : 'N';
379 }
380
381 #
382 # Messages
383 #
384
385 sub invalid_patron {
386     return "Please contact library staff";
387 }
388
389 sub charge_denied {
390     return "Please contact library staff";
391 }
392
393 1;