|
Lines 1-6
Link Here
|
| 1 |
# |
1 |
# |
| 2 |
# ILS::Patron.pm |
2 |
# ILS::Patron.pm |
| 3 |
# |
3 |
# |
| 4 |
# A Class for hiding the ILS's concept of the patron from the OpenSIP |
4 |
# A Class for hiding the ILS's concept of the patron from the OpenSIP |
| 5 |
# system |
5 |
# system |
| 6 |
# |
6 |
# |
|
Lines 26-207
use Digest::MD5 qw(md5_base64);
Link Here
|
| 26 |
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); |
26 |
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); |
| 27 |
|
27 |
|
| 28 |
BEGIN { |
28 |
BEGIN { |
| 29 |
$VERSION = 2.03; |
29 |
$VERSION = 2.03; |
| 30 |
@ISA = qw(Exporter); |
30 |
@ISA = qw(Exporter); |
| 31 |
@EXPORT_OK = qw(invalid_patron); |
31 |
@EXPORT_OK = qw(invalid_patron); |
| 32 |
} |
32 |
} |
| 33 |
|
33 |
|
| 34 |
our $kp; # koha patron |
34 |
our $kp; # koha patron |
| 35 |
|
35 |
|
| 36 |
sub new { |
36 |
sub new { |
| 37 |
my ($class, $patron_id) = @_; |
37 |
my ( $class, $patron_id ) = @_; |
| 38 |
my $type = ref($class) || $class; |
38 |
my $type = ref($class) || $class; |
| 39 |
my $self; |
39 |
my $self; |
| 40 |
$kp = GetMember(cardnumber=>$patron_id); |
40 |
$kp = GetMember( cardnumber => $patron_id ); |
| 41 |
$debug and warn "new Patron (GetMember): " . Dumper($kp); |
41 |
$debug and warn "new Patron (GetMember): " . Dumper($kp); |
| 42 |
unless (defined $kp) { |
42 |
unless ( defined $kp ) { |
| 43 |
syslog("LOG_DEBUG", "new ILS::Patron(%s): no such patron", $patron_id); |
43 |
syslog( "LOG_DEBUG", "new ILS::Patron(%s): no such patron", |
| 44 |
return undef; |
44 |
$patron_id ); |
| 45 |
} |
45 |
return undef; |
| 46 |
$kp = GetMemberDetails(undef,$patron_id); |
46 |
} |
| 47 |
$debug and warn "new Patron (GetMemberDetails): " . Dumper($kp); |
47 |
$kp = GetMemberDetails( undef, $patron_id ); |
| 48 |
my $pw = $kp->{password}; ### FIXME - md5hash -- deal with . |
48 |
$debug and warn "new Patron (GetMemberDetails): " . Dumper($kp); |
| 49 |
my $flags = $kp->{flags}; # or warn "Warning: No flags from patron object for '$patron_id'"; |
49 |
my $pw = $kp->{password}; ### FIXME - md5hash -- deal with . |
| 50 |
my $debarred = $kp->{debarred}; # 1 if ($kp->{flags}->{DBARRED}->{noissues}); |
50 |
my $flags = $kp |
| 51 |
$debug and warn sprintf("Debarred = %s : ", ($debarred||'undef')) . Dumper(%{$kp->{flags}}); |
51 |
->{flags}; # or warn "Warning: No flags from patron object for '$patron_id'"; |
| 52 |
my ($day, $month, $year) = (localtime)[3,4,5]; |
52 |
my $debarred = |
| 53 |
my $today = sprintf '%04d-%02d-%02d', $year+1900, $month+1, $day; |
53 |
$kp->{debarred}; # 1 if ($kp->{flags}->{DBARRED}->{noissues}); |
| 54 |
my $expired = ($today gt $kp->{dateexpiry}) ? 1 : 0; |
54 |
$debug |
|
|
55 |
and warn sprintf( "Debarred = %s : ", ( $debarred || 'undef' ) ) |
| 56 |
. Dumper( %{ $kp->{flags} } ); |
| 57 |
my ( $day, $month, $year ) = (localtime)[ 3, 4, 5 ]; |
| 58 |
my $today = sprintf '%04d-%02d-%02d', $year + 1900, $month + 1, $day; |
| 59 |
my $expired = ( $today gt $kp->{dateexpiry} ) ? 1 : 0; |
| 60 |
|
| 55 |
if ($expired) { |
61 |
if ($expired) { |
| 56 |
if ($kp->{opacnote} ) { |
62 |
if ( $kp->{opacnote} ) { |
| 57 |
$kp->{opacnote} .= q{ }; |
63 |
$kp->{opacnote} .= q{ }; |
| 58 |
} |
64 |
} |
| 59 |
$kp->{opacnote} .= 'PATRON EXPIRED'; |
65 |
$kp->{opacnote} .= 'PATRON EXPIRED'; |
| 60 |
} |
66 |
} |
| 61 |
my %ilspatron; |
67 |
my %ilspatron; |
| 62 |
my $adr = $kp->{streetnumber} || ''; |
68 |
my $adr = $kp->{streetnumber} || ''; |
| 63 |
my $address = $kp->{address} || ''; |
69 |
my $address = $kp->{address} || ''; |
| 64 |
my $dob = $kp->{dateofbirth}; |
70 |
my $dob = $kp->{dateofbirth}; |
| 65 |
$dob and $dob =~ s/-//g; # YYYYMMDD |
71 |
$dob and $dob =~ s/-//g; # YYYYMMDD |
| 66 |
my $dexpiry = $kp->{dateexpiry}; |
72 |
my $dexpiry = $kp->{dateexpiry}; |
| 67 |
$dexpiry and $dexpiry =~ s/-//g; # YYYYMMDD |
73 |
$dexpiry and $dexpiry =~ s/-//g; # YYYYMMDD |
| 68 |
$adr .= ($adr && $address) ? " $address" : $address; |
74 |
$adr .= ( $adr && $address ) ? " $address" : $address; |
| 69 |
my $fines_amount = $flags->{CHARGES}->{amount}; |
75 |
my $fines_amount = $flags->{CHARGES}->{amount}; |
| 70 |
$fines_amount = ($fines_amount and $fines_amount > 0) ? $fines_amount : 0; |
76 |
$fines_amount = ( $fines_amount and $fines_amount > 0 ) ? $fines_amount : 0; |
| 71 |
{ |
77 |
{ |
| 72 |
no warnings; # any of these $kp->{fields} being concat'd could be undef |
78 |
no warnings; # any of these $kp->{fields} being concat'd could be undef |
| 73 |
%ilspatron = ( |
79 |
%ilspatron = ( |
| 74 |
getmemberdetails_object => $kp, |
80 |
getmemberdetails_object => $kp, |
| 75 |
name => $kp->{firstname} . " " . $kp->{surname}, |
81 |
name => $kp->{firstname} . " " . $kp->{surname}, |
| 76 |
id => $kp->{cardnumber}, # to SIP, the id is the BARCODE, not userid |
82 |
id => $kp->{cardnumber}, # to SIP, the id is the BARCODE, not userid |
| 77 |
password => $pw, |
83 |
password => $pw, |
| 78 |
ptype => $kp->{categorycode}, # 'A'dult. Whatever. |
84 |
ptype => $kp->{categorycode}, # 'A'dult. Whatever. |
| 79 |
dateexpiry => $dexpiry, |
85 |
dateexpiry => $dexpiry, |
| 80 |
dateexpiry_iso => $kp->{dateexpiry}, |
86 |
dateexpiry_iso => $kp->{dateexpiry}, |
| 81 |
birthdate => $dob, |
87 |
birthdate => $dob, |
| 82 |
birthdate_iso => $kp->{dateofbirth}, |
88 |
birthdate_iso => $kp->{dateofbirth}, |
| 83 |
branchcode => $kp->{branchcode}, |
89 |
branchcode => $kp->{branchcode}, |
| 84 |
library_name => "", # only populated if needed, cached here |
90 |
library_name => "", # only populated if needed, cached here |
| 85 |
borrowernumber => $kp->{borrowernumber}, |
91 |
borrowernumber => $kp->{borrowernumber}, |
| 86 |
address => $adr, |
92 |
address => $adr, |
| 87 |
home_phone => $kp->{phone}, |
93 |
home_phone => $kp->{phone}, |
| 88 |
email_addr => $kp->{email}, |
94 |
email_addr => $kp->{email}, |
| 89 |
charge_ok => ( !$debarred && !$expired ), |
95 |
charge_ok => ( !$debarred && !$expired ), |
| 90 |
renew_ok => ( !$debarred && !$expired ), |
96 |
renew_ok => ( !$debarred && !$expired ), |
| 91 |
recall_ok => ( !$debarred && !$expired ), |
97 |
recall_ok => ( !$debarred && !$expired ), |
| 92 |
hold_ok => ( !$debarred && !$expired ), |
98 |
hold_ok => ( !$debarred && !$expired ), |
| 93 |
card_lost => ( $kp->{lost} || $kp->{gonenoaddress} || $flags->{LOST} ), |
99 |
card_lost => |
| 94 |
claims_returned => 0, |
100 |
( $kp->{lost} || $kp->{gonenoaddress} || $flags->{LOST} ), |
| 95 |
fines => $fines_amount, # GetMemberAccountRecords($kp->{borrowernumber}) |
101 |
claims_returned => 0, |
| 96 |
fees => 0, # currently not distinct from fines |
102 |
fines => |
| 97 |
recall_overdue => 0, |
103 |
$fines_amount, # GetMemberAccountRecords($kp->{borrowernumber}) |
| 98 |
items_billed => 0, |
104 |
fees => 0, # currently not distinct from fines |
| 99 |
screen_msg => 'Greetings from Koha. ' . $kp->{opacnote}, |
105 |
recall_overdue => 0, |
| 100 |
print_line => '', |
106 |
items_billed => 0, |
| 101 |
items => [], |
107 |
screen_msg => 'Greetings from Koha. ' . $kp->{opacnote}, |
| 102 |
hold_items => $flags->{WAITING}{itemlist}, |
108 |
print_line => '', |
| 103 |
overdue_items => $flags->{ODUES}{itemlist}, |
109 |
items => [], |
| 104 |
fine_items => [], |
110 |
hold_items => $flags->{WAITING}{itemlist}, |
| 105 |
recall_items => [], |
111 |
overdue_items => $flags->{ODUES}{itemlist}, |
| 106 |
unavail_holds => [], |
112 |
fine_items => [], |
| 107 |
inet => ( !$debarred && !$expired ), |
113 |
recall_items => [], |
| 108 |
expired => $expired, |
114 |
unavail_holds => [], |
| 109 |
); |
115 |
inet => ( !$debarred && !$expired ), |
|
|
116 |
expired => $expired, |
| 117 |
); |
| 110 |
} |
118 |
} |
| 111 |
$debug and warn "patron fines: $ilspatron{fines} ... amountoutstanding: $kp->{amountoutstanding} ... CHARGES->amount: $flags->{CHARGES}->{amount}"; |
119 |
$debug |
| 112 |
for (qw(EXPIRED CHARGES CREDITS GNA LOST DBARRED NOTES)) { |
120 |
and warn |
| 113 |
($flags->{$_}) or next; |
121 |
"patron fines: $ilspatron{fines} ... amountoutstanding: $kp->{amountoutstanding} ... CHARGES->amount: $flags->{CHARGES}->{amount}"; |
| 114 |
if ($_ ne 'NOTES' and $flags->{$_}->{message}) { |
122 |
for (qw(EXPIRED CHARGES CREDITS GNA LOST DBARRED NOTES)) { |
| 115 |
$ilspatron{screen_msg} .= " -- " . $flags->{$_}->{message}; # show all but internal NOTES |
123 |
( $flags->{$_} ) or next; |
|
|
124 |
if ( $_ ne 'NOTES' and $flags->{$_}->{message} ) { |
| 125 |
$ilspatron{screen_msg} .= |
| 126 |
" -- " . $flags->{$_}->{message}; # show all but internal NOTES |
| 116 |
} |
127 |
} |
| 117 |
if ($flags->{$_}->{noissues}) { |
128 |
if ( $flags->{$_}->{noissues} ) { |
| 118 |
foreach my $toggle (qw(charge_ok renew_ok recall_ok hold_ok inet)) { |
129 |
foreach my $toggle (qw(charge_ok renew_ok recall_ok hold_ok inet)) { |
| 119 |
$ilspatron{$toggle} = 0; # if we get noissues, disable everything |
130 |
$ilspatron{$toggle} = |
| 120 |
} |
131 |
0; # if we get noissues, disable everything |
| 121 |
} |
132 |
} |
| 122 |
} |
133 |
} |
| 123 |
|
134 |
} |
| 124 |
# FIXME: populate fine_items recall_items |
135 |
|
|
|
136 |
# FIXME: populate fine_items recall_items |
| 125 |
# $ilspatron{hold_items} = (GetReservesFromBorrowernumber($kp->{borrowernumber},'F')); |
137 |
# $ilspatron{hold_items} = (GetReservesFromBorrowernumber($kp->{borrowernumber},'F')); |
| 126 |
$ilspatron{unavail_holds} = [(GetReservesFromBorrowernumber($kp->{borrowernumber}))]; |
138 |
$ilspatron{unavail_holds} = |
| 127 |
$ilspatron{items} = GetPendingIssues($kp->{borrowernumber}); |
139 |
[ ( GetReservesFromBorrowernumber( $kp->{borrowernumber} ) ) ]; |
| 128 |
$self = \%ilspatron; |
140 |
$ilspatron{items} = GetPendingIssues( $kp->{borrowernumber} ); |
| 129 |
$debug and warn Dumper($self); |
141 |
$self = \%ilspatron; |
| 130 |
syslog("LOG_DEBUG", "new ILS::Patron(%s): found patron '%s'", $patron_id,$self->{id}); |
142 |
$debug and warn Dumper($self); |
|
|
143 |
syslog( "LOG_DEBUG", "new ILS::Patron(%s): found patron '%s'", |
| 144 |
$patron_id, $self->{id} ); |
| 131 |
bless $self, $type; |
145 |
bless $self, $type; |
| 132 |
return $self; |
146 |
return $self; |
| 133 |
} |
147 |
} |
| 134 |
|
148 |
|
| 135 |
|
|
|
| 136 |
# 0 means read-only |
149 |
# 0 means read-only |
| 137 |
# 1 means read/write |
150 |
# 1 means read/write |
| 138 |
|
151 |
|
| 139 |
my %fields = ( |
152 |
my %fields = ( |
| 140 |
id => 0, |
153 |
id => 0, |
| 141 |
name => 0, |
154 |
name => 0, |
| 142 |
address => 0, |
155 |
address => 0, |
| 143 |
email_addr => 0, |
156 |
email_addr => 0, |
| 144 |
home_phone => 0, |
157 |
home_phone => 0, |
| 145 |
birthdate => 0, |
158 |
birthdate => 0, |
| 146 |
birthdate_iso => 0, |
159 |
birthdate_iso => 0, |
| 147 |
dateexpiry => 0, |
160 |
dateexpiry => 0, |
| 148 |
dateexpiry_iso => 0, |
161 |
dateexpiry_iso => 0, |
| 149 |
ptype => 0, |
162 |
ptype => 0, |
| 150 |
charge_ok => 0, # for patron_status[0] (inverted) |
163 |
charge_ok => 0, # for patron_status[0] (inverted) |
| 151 |
renew_ok => 0, # for patron_status[1] (inverted) |
164 |
renew_ok => 0, # for patron_status[1] (inverted) |
| 152 |
recall_ok => 0, # for patron_status[2] (inverted) |
165 |
recall_ok => 0, # for patron_status[2] (inverted) |
| 153 |
hold_ok => 0, # for patron_status[3] (inverted) |
166 |
hold_ok => 0, # for patron_status[3] (inverted) |
| 154 |
card_lost => 0, # for patron_status[4] |
167 |
card_lost => 0, # for patron_status[4] |
| 155 |
recall_overdue => 0, |
168 |
recall_overdue => 0, |
| 156 |
currency => 1, |
169 |
currency => 1, |
| 157 |
# fee_limit => 0, |
170 |
|
| 158 |
screen_msg => 1, |
171 |
# fee_limit => 0, |
| 159 |
print_line => 1, |
172 |
screen_msg => 1, |
| 160 |
too_many_charged => 0, # for patron_status[5] |
173 |
print_line => 1, |
| 161 |
too_many_overdue => 0, # for patron_status[6] |
174 |
too_many_charged => 0, # for patron_status[5] |
| 162 |
too_many_renewal => 0, # for patron_status[7] |
175 |
too_many_overdue => 0, # for patron_status[6] |
| 163 |
too_many_claim_return => 0, # for patron_status[8] |
176 |
too_many_renewal => 0, # for patron_status[7] |
| 164 |
too_many_lost => 0, # for patron_status[9] |
177 |
too_many_claim_return => 0, # for patron_status[8] |
| 165 |
# excessive_fines => 0, # for patron_status[10] |
178 |
too_many_lost => 0, # for patron_status[9] |
| 166 |
# excessive_fees => 0, # for patron_status[11] |
179 |
|
| 167 |
recall_overdue => 0, # for patron_status[12] |
180 |
# excessive_fines => 0, # for patron_status[10] |
| 168 |
too_many_billed => 0, # for patron_status[13] |
181 |
# excessive_fees => 0, # for patron_status[11] |
| 169 |
inet => 0, # EnvisionWare extension |
182 |
recall_overdue => 0, # for patron_status[12] |
|
|
183 |
too_many_billed => 0, # for patron_status[13] |
| 184 |
inet => 0, # EnvisionWare extension |
| 170 |
getmemberdetails_object => 0, |
185 |
getmemberdetails_object => 0, |
| 171 |
); |
186 |
); |
| 172 |
|
187 |
|
| 173 |
our $AUTOLOAD; |
188 |
our $AUTOLOAD; |
| 174 |
|
189 |
|
| 175 |
sub DESTROY { |
190 |
sub DESTROY { |
|
|
191 |
|
| 176 |
# be cool. needed for AUTOLOAD(?) |
192 |
# be cool. needed for AUTOLOAD(?) |
| 177 |
} |
193 |
} |
| 178 |
|
194 |
|
| 179 |
sub AUTOLOAD { |
195 |
sub AUTOLOAD { |
| 180 |
my $self = shift; |
196 |
my $self = shift; |
| 181 |
my $class = ref($self) or croak "$self is not an object"; |
197 |
my $class = ref($self) or croak "$self is not an object"; |
| 182 |
my $name = $AUTOLOAD; |
198 |
my $name = $AUTOLOAD; |
| 183 |
|
199 |
|
| 184 |
$name =~ s/.*://; |
200 |
$name =~ s/.*://; |
| 185 |
|
201 |
|
| 186 |
unless (exists $fields{$name}) { |
202 |
unless ( exists $fields{$name} ) { |
| 187 |
croak "Cannot access '$name' field of class '$class'"; |
203 |
croak "Cannot access '$name' field of class '$class'"; |
| 188 |
} |
204 |
} |
| 189 |
|
205 |
|
| 190 |
if (@_) { |
206 |
if (@_) { |
| 191 |
$fields{$name} or croak "Field '$name' of class '$class' is READ ONLY."; |
207 |
$fields{$name} or croak "Field '$name' of class '$class' is READ ONLY."; |
| 192 |
return $self->{$name} = shift; |
208 |
return $self->{$name} = shift; |
| 193 |
} else { |
209 |
} |
| 194 |
return $self->{$name}; |
210 |
else { |
| 195 |
} |
211 |
return $self->{$name}; |
|
|
212 |
} |
| 196 |
} |
213 |
} |
| 197 |
|
214 |
|
| 198 |
sub check_password { |
215 |
sub check_password { |
| 199 |
my ($self, $pwd) = @_; |
216 |
my ( $self, $pwd ) = @_; |
| 200 |
my $md5pwd = $self->{password}; |
217 |
my $md5pwd = $self->{password}; |
| 201 |
# warn sprintf "check_password for %s: '%s' vs. '%s'",($self->{name}||''),($self->{password}||''),($pwd||''); |
218 |
|
| 202 |
(defined $pwd ) or return 0; # you gotta give me something (at least ''), or no deal |
219 |
# warn sprintf "check_password for %s: '%s' vs. '%s'",($self->{name}||''),($self->{password}||''),($pwd||''); |
| 203 |
(defined $md5pwd) or return($pwd eq ''); # if the record has a NULL password, accept '' as match |
220 |
( defined $pwd ) |
| 204 |
return (md5_base64($pwd) eq $md5pwd); |
221 |
or return 0; # you gotta give me something (at least ''), or no deal |
|
|
222 |
( defined $md5pwd ) |
| 223 |
or return ( $pwd eq '' ) |
| 224 |
; # if the record has a NULL password, accept '' as match |
| 225 |
return ( md5_base64($pwd) eq $md5pwd ); |
| 205 |
} |
226 |
} |
| 206 |
|
227 |
|
| 207 |
# A few special cases, not in AUTOLOADed %fields |
228 |
# A few special cases, not in AUTOLOADed %fields |
|
Lines 217-223
sub fines_amount {
Link Here
|
| 217 |
|
238 |
|
| 218 |
sub language { |
239 |
sub language { |
| 219 |
my $self = shift; |
240 |
my $self = shift; |
| 220 |
return $self->{language} || '000'; # Unspecified |
241 |
return $self->{language} || '000'; # Unspecified |
| 221 |
} |
242 |
} |
| 222 |
|
243 |
|
| 223 |
sub expired { |
244 |
sub expired { |
|
Lines 228-248
sub expired {
Link Here
|
| 228 |
# |
249 |
# |
| 229 |
# remove the hold on item item_id from my hold queue. |
250 |
# remove the hold on item item_id from my hold queue. |
| 230 |
# return true if I was holding the item, false otherwise. |
251 |
# return true if I was holding the item, false otherwise. |
| 231 |
# |
252 |
# |
| 232 |
sub drop_hold { |
253 |
sub drop_hold { |
| 233 |
my ($self, $item_id) = @_; |
254 |
my ( $self, $item_id ) = @_; |
| 234 |
$item_id or return undef; |
255 |
$item_id or return undef; |
| 235 |
my $result = 0; |
256 |
my $result = 0; |
| 236 |
foreach (qw(hold_items unavail_holds)) { |
257 |
foreach (qw(hold_items unavail_holds)) { |
| 237 |
$self->{$_} or next; |
258 |
$self->{$_} or next; |
| 238 |
for (my $i = 0; $i < scalar @{$self->{$_}}; $i++) { |
259 |
for ( my $i = 0 ; $i < scalar @{ $self->{$_} } ; $i++ ) { |
| 239 |
my $held_item = $self->{$_}[$i]->{item_id} or next; |
260 |
my $held_item = $self->{$_}[$i]->{item_id} or next; |
| 240 |
if ($held_item eq $item_id) { |
261 |
if ( $held_item eq $item_id ) { |
| 241 |
splice @{$self->{$_}}, $i, 1; |
262 |
splice @{ $self->{$_} }, $i, 1; |
| 242 |
$result++; |
263 |
$result++; |
| 243 |
} |
264 |
} |
| 244 |
} |
265 |
} |
| 245 |
} |
266 |
} |
| 246 |
return $result; |
267 |
return $result; |
| 247 |
} |
268 |
} |
| 248 |
|
269 |
|
|
Lines 252-264
sub drop_hold {
Link Here
|
| 252 |
sub x_items { |
273 |
sub x_items { |
| 253 |
my $self = shift or return; |
274 |
my $self = shift or return; |
| 254 |
my $array_var = shift or return; |
275 |
my $array_var = shift or return; |
| 255 |
my ($start, $end) = @_; |
276 |
my ( $start, $end ) = @_; |
| 256 |
$self->{$array_var} or return []; |
277 |
$self->{$array_var} or return []; |
| 257 |
$start = 1 unless defined($start); |
278 |
$start = 1 unless defined($start); |
| 258 |
$end = scalar @{$self->{$array_var}} unless defined($end); |
279 |
$end = scalar @{ $self->{$array_var} } unless defined($end); |
| 259 |
# syslog("LOG_DEBUG", "$array_var: start = %d, end = %d; items(%s)", $start, $end, join(', ', @{$self->{items}})); |
280 |
|
|
|
281 |
# syslog("LOG_DEBUG", "$array_var: start = %d, end = %d; items(%s)", $start, $end, join(', ', @{$self->{items}})); |
| 260 |
|
282 |
|
| 261 |
return [@{$self->{$array_var}}[$start-1 .. $end-1]]; |
283 |
return [ @{ $self->{$array_var} }[ $start - 1 .. $end - 1 ] ]; |
| 262 |
} |
284 |
} |
| 263 |
|
285 |
|
| 264 |
# |
286 |
# |
|
Lines 266-314
sub x_items {
Link Here
|
| 266 |
# |
288 |
# |
| 267 |
sub hold_items { |
289 |
sub hold_items { |
| 268 |
my $self = shift or return; |
290 |
my $self = shift or return; |
| 269 |
return $self->x_items('hold_items', @_); |
291 |
return $self->x_items( 'hold_items', @_ ); |
| 270 |
} |
292 |
} |
| 271 |
|
293 |
|
| 272 |
sub overdue_items { |
294 |
sub overdue_items { |
| 273 |
my $self = shift or return; |
295 |
my $self = shift or return; |
| 274 |
return $self->x_items('overdue_items', @_); |
296 |
return $self->x_items( 'overdue_items', @_ ); |
| 275 |
} |
297 |
} |
|
|
298 |
|
| 276 |
sub charged_items { |
299 |
sub charged_items { |
| 277 |
my $self = shift or return; |
300 |
my $self = shift or return; |
| 278 |
return $self->x_items('items', @_); |
301 |
return $self->x_items( 'items', @_ ); |
| 279 |
} |
302 |
} |
|
|
303 |
|
| 280 |
sub fine_items { |
304 |
sub fine_items { |
| 281 |
my $self = shift or return; |
305 |
my $self = shift or return; |
| 282 |
return $self->x_items('fine_items', @_); |
306 |
return $self->x_items( 'fine_items', @_ ); |
| 283 |
} |
307 |
} |
|
|
308 |
|
| 284 |
sub recall_items { |
309 |
sub recall_items { |
| 285 |
my $self = shift or return; |
310 |
my $self = shift or return; |
| 286 |
return $self->x_items('recall_items', @_); |
311 |
return $self->x_items( 'recall_items', @_ ); |
| 287 |
} |
312 |
} |
|
|
313 |
|
| 288 |
sub unavail_holds { |
314 |
sub unavail_holds { |
| 289 |
my $self = shift or return; |
315 |
my $self = shift or return; |
| 290 |
return $self->x_items('unavail_holds', @_); |
316 |
return $self->x_items( 'unavail_holds', @_ ); |
| 291 |
} |
317 |
} |
| 292 |
|
318 |
|
| 293 |
sub block { |
319 |
sub block { |
| 294 |
my ($self, $card_retained, $blocked_card_msg) = @_; |
320 |
my ( $self, $card_retained, $blocked_card_msg ) = @_; |
| 295 |
foreach my $field ('charge_ok', 'renew_ok', 'recall_ok', 'hold_ok', 'inet') { |
321 |
foreach |
| 296 |
$self->{$field} = 0; |
322 |
my $field ( 'charge_ok', 'renew_ok', 'recall_ok', 'hold_ok', 'inet' ) |
|
|
323 |
{ |
| 324 |
$self->{$field} = 0; |
| 297 |
} |
325 |
} |
| 298 |
$self->{screen_msg} = "Block feature not implemented"; # $blocked_card_msg || "Card Blocked. Please contact library staff"; |
326 |
$self->{screen_msg} = "Block feature not implemented" |
| 299 |
# TODO: not really affecting patron record |
327 |
; # $blocked_card_msg || "Card Blocked. Please contact library staff"; |
|
|
328 |
# TODO: not really affecting patron record |
| 300 |
return $self; |
329 |
return $self; |
| 301 |
} |
330 |
} |
| 302 |
|
331 |
|
| 303 |
sub enable { |
332 |
sub enable { |
| 304 |
my $self = shift; |
333 |
my $self = shift; |
| 305 |
foreach my $field ('charge_ok', 'renew_ok', 'recall_ok', 'hold_ok', 'inet') { |
334 |
foreach |
| 306 |
$self->{$field} = 1; |
335 |
my $field ( 'charge_ok', 'renew_ok', 'recall_ok', 'hold_ok', 'inet' ) |
|
|
336 |
{ |
| 337 |
$self->{$field} = 1; |
| 307 |
} |
338 |
} |
| 308 |
syslog("LOG_DEBUG", "Patron(%s)->enable: charge: %s, renew:%s, recall:%s, hold:%s", |
339 |
syslog( |
| 309 |
$self->{id}, $self->{charge_ok}, $self->{renew_ok}, |
340 |
"LOG_DEBUG", |
| 310 |
$self->{recall_ok}, $self->{hold_ok}); |
341 |
"Patron(%s)->enable: charge: %s, renew:%s, recall:%s, hold:%s", |
| 311 |
$self->{screen_msg} = "Enable feature not implemented."; # "All privileges restored."; # TODO: not really affecting patron record |
342 |
$self->{id}, |
|
|
343 |
$self->{charge_ok}, |
| 344 |
$self->{renew_ok}, |
| 345 |
$self->{recall_ok}, |
| 346 |
$self->{hold_ok} |
| 347 |
); |
| 348 |
$self->{screen_msg} = "Enable feature not implemented." |
| 349 |
; # "All privileges restored."; # TODO: not really affecting patron record |
| 312 |
return $self; |
350 |
return $self; |
| 313 |
} |
351 |
} |
| 314 |
|
352 |
|
|
Lines 318-343
sub inet_privileges {
Link Here
|
| 318 |
} |
356 |
} |
| 319 |
|
357 |
|
| 320 |
sub fee_limit { |
358 |
sub fee_limit { |
|
|
359 |
|
| 321 |
# my $self = shift; |
360 |
# my $self = shift; |
| 322 |
return C4::Context->preference("noissuescharge") || 5; |
361 |
return C4::Context->preference("noissuescharge") || 5; |
| 323 |
} |
362 |
} |
| 324 |
|
363 |
|
| 325 |
sub excessive_fees { |
364 |
sub excessive_fees { |
| 326 |
my $self = shift or return; |
365 |
my $self = shift or return; |
| 327 |
return ($self->fee_amount and $self->fee_amount > $self->fee_limit); |
366 |
return ( $self->fee_amount and $self->fee_amount > $self->fee_limit ); |
| 328 |
} |
367 |
} |
|
|
368 |
|
| 329 |
sub excessive_fines { |
369 |
sub excessive_fines { |
| 330 |
my $self = shift or return; |
370 |
my $self = shift or return; |
| 331 |
return $self->excessive_fees; # excessive_fines is the same thing as excessive_fees for Koha |
371 |
return |
|
|
372 |
$self->excessive_fees |
| 373 |
; # excessive_fines is the same thing as excessive_fees for Koha |
| 332 |
} |
374 |
} |
| 333 |
|
375 |
|
| 334 |
sub library_name { |
376 |
sub library_name { |
| 335 |
my $self = shift; |
377 |
my $self = shift; |
| 336 |
unless ($self->{library_name}) { |
378 |
unless ( $self->{library_name} ) { |
| 337 |
$self->{library_name} = GetBranchName($self->{branchcode}); |
379 |
$self->{library_name} = GetBranchName( $self->{branchcode} ); |
| 338 |
} |
380 |
} |
| 339 |
return $self->{library_name}; |
381 |
return $self->{library_name}; |
| 340 |
} |
382 |
} |
|
|
383 |
|
| 341 |
# |
384 |
# |
| 342 |
# Messages |
385 |
# Messages |
| 343 |
# |
386 |
# |