Bugfix Circulation, Expand ILS::Patron mapping.

ILS::Patron is where most of the intelligence for SIP's representation
is lodged.  Currently there is difficulty with C4::Members functions.
GetMemberDetails is required for the needed flags, but it returns
empty structure on bad barcodes, where it should be undef.

Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
Joe Atzberger (siptest 2008-06-24 17:35:12 -05:00 committed by Joshua Ferraro
parent 91b47af583
commit 3e7013d174
3 changed files with 146 additions and 141 deletions

View file

@ -850,9 +850,8 @@ sub AddIssue {
my $barcodecheck=CheckValidBarcode($barcode); my $barcodecheck=CheckValidBarcode($barcode);
if ($borrower and $barcode and $barcodecheck ne '0'){ if ($borrower and $barcode and $barcodecheck ne '0'){
# find which item we issue # find which item we issue
my $item = GetItem('', $barcode); my $item = GetItem('', $barcode) or return undef; # if we don't get an Item, abort.
my $datedue; my $datedue;
my $branch; my $branch;
# Get which branchcode we need # Get which branchcode we need
if (C4::Context->preference('CircControl') eq 'PickupLibrary'){ if (C4::Context->preference('CircControl') eq 'PickupLibrary'){

View file

@ -25,137 +25,13 @@ use Digest::MD5 qw(md5_base64);
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
BEGIN { BEGIN {
$VERSION = 2.00; $VERSION = 2.01;
@ISA = qw(Exporter); @ISA = qw(Exporter);
@EXPORT_OK = qw(invalid_patron); @EXPORT_OK = qw(invalid_patron);
} }
our $kp; # koha patron our $kp; # koha patron
=doc
our %patron_example = (
djfiander => {
name => "David J. Fiander",
id => 'djfiander',
password => '6789',
ptype => 'A', # 'A'dult. Whatever.
birthdate => '19640925',
address => '2 Meadowvale Dr. St Thomas, ON',
home_phone => '(519) 555 1234',
email_addr => 'djfiander@hotmail.com',
charge_ok => 1,
renew_ok => 1,
recall_ok => 0,
hold_ok => 1,
card_lost => 0,
claims_returned => 0,
fines => 100,
fees => 0,
recall_overdue => 0,
items_billed => 0,
screen_msg => '',
print_line => '',
items => [],
hold_items => [],
overdue_items => [],
fine_items => ['Computer Time'],
recall_items => [],
unavail_holds => [],
inet => 1,
},
);
From borrowers table:
+---------------------+--------------+------+-----+
| Field | Type | Null | Key |
+---------------------+--------------+------+-----+
| borrowernumber | int(11) | NO | PRI |
| cardnumber | varchar(16) | YES | UNI |
| surname | mediumtext | NO | |
| firstname | text | YES | |
| title | mediumtext | YES | |
| othernames | mediumtext | YES | |
| initials | text | YES | |
| streetnumber | varchar(10) | YES | |
| streettype | varchar(50) | YES | |
| address | mediumtext | NO | |
| address2 | text | YES | |
| city | mediumtext | NO | |
| zipcode | varchar(25) | YES | |
| email | mediumtext | YES | |
| phone | text | YES | |
| mobile | varchar(50) | YES | |
| fax | mediumtext | YES | |
| emailpro | text | YES | |
| phonepro | text | YES | |
| B_streetnumber | varchar(10) | YES | |
| B_streettype | varchar(50) | YES | |
| B_address | varchar(100) | YES | |
| B_city | mediumtext | YES | |
| B_zipcode | varchar(25) | YES | |
| B_email | text | YES | |
| B_phone | mediumtext | YES | |
| dateofbirth | date | YES | |
| branchcode | varchar(10) | NO | MUL |
| categorycode | varchar(10) | NO | MUL |
| dateenrolled | date | YES | |
| dateexpiry | date | YES | |
| gonenoaddress | tinyint(1) | YES | |
| lost | tinyint(1) | YES | |
| debarred | tinyint(1) | YES | |
| contactname | mediumtext | YES | |
| contactfirstname | text | YES | |
| contacttitle | text | YES | |
| guarantorid | int(11) | YES | |
| borrowernotes | mediumtext | YES | |
| relationship | varchar(100) | YES | |
| ethnicity | varchar(50) | YES | |
| ethnotes | varchar(255) | YES | |
| sex | varchar(1) | YES | |
| password | varchar(30) | YES | |
| flags | int(11) | YES | |
| userid | varchar(30) | YES | MUL |
| opacnote | mediumtext | YES | |
| contactnote | varchar(255) | YES | |
| sort1 | varchar(80) | YES | |
| sort2 | varchar(80) | YES | |
| altcontactfirstname | varchar(255) | YES | |
| altcontactsurname | varchar(255) | YES | |
| altcontactaddress1 | varchar(255) | YES | |
| altcontactaddress2 | varchar(255) | YES | |
| altcontactaddress3 | varchar(255) | YES | |
| altcontactzipcode | varchar(50) | YES | |
| altcontactphone | varchar(50) | YES | |
+---------------------+--------------+------+-----+
From C4::Members
$flags->{KEY}
{CHARGES}
{message} Message showing patron's credit or debt
{noissues} Set if patron owes >$5.00
{GNA} Set if patron gone w/o address
{message} "Borrower has no valid address"
{noissues} Set.
{LOST} Set if patron's card reported lost
{message} Message to this effect
{noissues} Set.
{DBARRED} Set if patron is debarred
{message} Message to this effect
{noissues} Set.
{NOTES} Set if patron has notes
{message} Notes about patron
{ODUES} Set if patron has overdue books
{message} "Yes"
{itemlist} ref-to-array: list of overdue books
{itemlisttext} Text list of overdue items
{WAITING} Set if there are items available that the patron reserved
{message} Message to this effect
{itemlist} ref-to-array: list of available items
=cut
sub new { sub new {
my ($class, $patron_id) = @_; my ($class, $patron_id) = @_;
my $type = ref($class) || $class; my $type = ref($class) || $class;
@ -166,10 +42,11 @@ sub new {
syslog("LOG_DEBUG", "new ILS::Patron(%s): no such patron", $patron_id); syslog("LOG_DEBUG", "new ILS::Patron(%s): no such patron", $patron_id);
return undef; return undef;
} }
$kp = GetMemberDetails(undef,$patron_id);
$debug and warn "new Patron: " . Dumper($kp);
my $pw = $kp->{password}; ## FIXME - md5hash -- deal with . my $pw = $kp->{password}; ## FIXME - md5hash -- deal with .
my $dob= $kp->{dateofbirth}; my $dob= $kp->{dateofbirth};
my $fines_out = GetMemberAccountRecords($kp->{borrowernumber}); my $fines_out = GetMemberAccountRecords($kp->{borrowernumber});
my ($num_cur_issues,$cur_issues) = GetPendingIssues($kp->{borrowernumber});
my $flags = $kp->{flags}; # or warn "Warning: No flags from patron object for '$patron_id'"; my $flags = $kp->{flags}; # or warn "Warning: No flags from patron object for '$patron_id'";
my $debarred = $kp->{debarred}; ### 1 if ($kp->{flags}->{DBARRED}->{noissues}); my $debarred = $kp->{debarred}; ### 1 if ($kp->{flags}->{DBARRED}->{noissues});
$debug and warn "Debarred: $debarred = " . Dumper(%{$kp->{flags}}); $debug and warn "Debarred: $debarred = " . Dumper(%{$kp->{flags}});
@ -182,7 +59,7 @@ sub new {
$dob =~ s/\-//g; $dob =~ s/\-//g;
%ilspatron = ( %ilspatron = (
name => $kp->{firstname} . " " . $kp->{surname}, name => $kp->{firstname} . " " . $kp->{surname},
id => $kp->{cardnumber}, id => $kp->{cardnumber}, # to SIP, the id is the BARCODE, not userid
password => $pw, password => $pw,
ptype => $kp->{categorycode}, # 'A'dult. Whatever. ptype => $kp->{categorycode}, # 'A'dult. Whatever.
birthdate => $kp->{dateofbirth}, ##$dob, birthdate => $kp->{dateofbirth}, ##$dob,
@ -192,12 +69,12 @@ sub new {
email_addr => $kp->{email}, email_addr => $kp->{email},
charge_ok => (!$debarred), ## (C4::Context->preference('FinesMode') eq 'charge') || 0, charge_ok => (!$debarred), ## (C4::Context->preference('FinesMode') eq 'charge') || 0,
renew_ok => (!$debarred), renew_ok => (!$debarred),
recall_ok => 0, recall_ok => (!$debarred),
hold_ok => 0, hold_ok => (!$debarred),
card_lost => ($kp->{lost} || $kp->{gonenoaddress} || $flags->{LOST}) , card_lost => ($kp->{lost} || $kp->{gonenoaddress} || $flags->{LOST}) ,
claims_returned => 0, claims_returned => 0,
fines => $fines_out, fines => $fines_out,
fees => 0, fees => 0, # currently not distinct from fines
recall_overdue => 0, recall_overdue => 0,
items_billed => 0, items_billed => 0,
screen_msg => 'Greetings from Koha. ' . $kp->{opacnote}, screen_msg => 'Greetings from Koha. ' . $kp->{opacnote},
@ -211,6 +88,14 @@ sub new {
inet => 1, inet => 1,
); );
} }
for (qw(CHARGES CREDITS GNA LOST DBARRED NOTES)) {
($flags->{$_}) or next;
$ilspatron{screen_msg} .= ($flags->{$_}->{message} || '') ;
if ($flags->{$_}->{noissues}){
$ilspatron{qw(charge_ok renew_ok recall_ok hold_ok)} = (0,0,0,0);
}
}
# FIXME: populate items fine_items recall_items # FIXME: populate items fine_items recall_items
# $ilspatron{hold_items} = (GetReservesFromBorrowernumber($kp->{borrowernumber},'F')); # $ilspatron{hold_items} = (GetReservesFromBorrowernumber($kp->{borrowernumber},'F'));
$ilspatron{unavail_holds} = [(GetReservesFromBorrowernumber($kp->{borrowernumber}))]; $ilspatron{unavail_holds} = [(GetReservesFromBorrowernumber($kp->{borrowernumber}))];
@ -281,9 +166,11 @@ sub recall_overdue {
} }
sub check_password { sub check_password {
my ($self, $pwd) = @_; my ($self, $pwd) = @_;
my $md5pwd=$self->{password}; ### FIXME - we're allowing access if user has no password. my $md5pwd = $self->{password};
# warn sprintf "check_password for %s: '%s' vs. '%s'",($self->{name}||''),($self->{password}||''),($pwd||''); # warn sprintf "check_password for %s: '%s' vs. '%s'",($self->{name}||''),($self->{password}||''),($pwd||'');
return (!$self->{password} || md5_base64($pwd) eq $md5pwd ); (defined $pwd ) or return 0; # you gotta give me something (at least ''), or no deal
(defined $md5pwd) or return($pwd eq ''); # if the record has a NULL password, accept '' as match
return (md5_base64($pwd) eq $md5pwd);
} }
sub currency { sub currency {
my $self = shift; my $self = shift;
@ -449,3 +336,127 @@ sub charge_denied {
1; 1;
__END__ __END__
=doc
our %patron_example = (
djfiander => {
name => "David J. Fiander",
id => 'djfiander',
password => '6789',
ptype => 'A', # 'A'dult. Whatever.
birthdate => '19640925',
address => '2 Meadowvale Dr. St Thomas, ON',
home_phone => '(519) 555 1234',
email_addr => 'djfiander@hotmail.com',
charge_ok => 1,
renew_ok => 1,
recall_ok => 0,
hold_ok => 1,
card_lost => 0,
claims_returned => 0,
fines => 100,
fees => 0,
recall_overdue => 0,
items_billed => 0,
screen_msg => '',
print_line => '',
items => [],
hold_items => [],
overdue_items => [],
fine_items => ['Computer Time'],
recall_items => [],
unavail_holds => [],
inet => 1,
},
);
From borrowers table:
+---------------------+--------------+------+-----+
| Field | Type | Null | Key |
+---------------------+--------------+------+-----+
| borrowernumber | int(11) | NO | PRI |
| cardnumber | varchar(16) | YES | UNI |
| surname | mediumtext | NO | |
| firstname | text | YES | |
| title | mediumtext | YES | |
| othernames | mediumtext | YES | |
| initials | text | YES | |
| streetnumber | varchar(10) | YES | |
| streettype | varchar(50) | YES | |
| address | mediumtext | NO | |
| address2 | text | YES | |
| city | mediumtext | NO | |
| zipcode | varchar(25) | YES | |
| email | mediumtext | YES | |
| phone | text | YES | |
| mobile | varchar(50) | YES | |
| fax | mediumtext | YES | |
| emailpro | text | YES | |
| phonepro | text | YES | |
| B_streetnumber | varchar(10) | YES | |
| B_streettype | varchar(50) | YES | |
| B_address | varchar(100) | YES | |
| B_city | mediumtext | YES | |
| B_zipcode | varchar(25) | YES | |
| B_email | text | YES | |
| B_phone | mediumtext | YES | |
| dateofbirth | date | YES | |
| branchcode | varchar(10) | NO | MUL |
| categorycode | varchar(10) | NO | MUL |
| dateenrolled | date | YES | |
| dateexpiry | date | YES | |
| gonenoaddress | tinyint(1) | YES | |
| lost | tinyint(1) | YES | |
| debarred | tinyint(1) | YES | |
| contactname | mediumtext | YES | |
| contactfirstname | text | YES | |
| contacttitle | text | YES | |
| guarantorid | int(11) | YES | |
| borrowernotes | mediumtext | YES | |
| relationship | varchar(100) | YES | |
| ethnicity | varchar(50) | YES | |
| ethnotes | varchar(255) | YES | |
| sex | varchar(1) | YES | |
| password | varchar(30) | YES | |
| flags | int(11) | YES | |
| userid | varchar(30) | YES | MUL |
| opacnote | mediumtext | YES | |
| contactnote | varchar(255) | YES | |
| sort1 | varchar(80) | YES | |
| sort2 | varchar(80) | YES | |
| altcontactfirstname | varchar(255) | YES | |
| altcontactsurname | varchar(255) | YES | |
| altcontactaddress1 | varchar(255) | YES | |
| altcontactaddress2 | varchar(255) | YES | |
| altcontactaddress3 | varchar(255) | YES | |
| altcontactzipcode | varchar(50) | YES | |
| altcontactphone | varchar(50) | YES | |
+---------------------+--------------+------+-----+
From C4::Members
$flags->{KEY}
{CHARGES}
{message} Message showing patron's credit or debt
{noissues} Set if patron owes >$5.00
{GNA} Set if patron gone w/o address
{message} "Borrower has no valid address"
{noissues} Set.
{LOST} Set if patron's card reported lost
{message} Message to this effect
{noissues} Set.
{DBARRED} Set if patron is debarred
{message} Message to this effect
{noissues} Set.
{NOTES} Set if patron has notes
{message} Notes about patron
{ODUES} Set if patron has overdue books
{message} "Yes"
{itemlist} ref-to-array: list of overdue books
{itemlisttext} Text list of overdue items
{WAITING} Set if there are items available that the patron reserved
{message} Message to this effect
{itemlist} ref-to-array: list of available items
=cut

View file

@ -442,13 +442,8 @@ sub build_patron_status {
$resp .= add_field(FID_PATRON_ID, $patron->id); $resp .= add_field(FID_PATRON_ID, $patron->id);
if ($protocol_version >= 2) { if ($protocol_version >= 2) {
$resp .= add_field(FID_VALID_PATRON, 'Y'); $resp .= add_field(FID_VALID_PATRON, 'Y');
# If the patron password field doesn't exist, then # Patron password is a required field.
# we can't report that the password was valid, now can $resp .= add_field(FID_VALID_PATRON_PWD, sipbool($patron->check_password($patron_pwd)));
# we? But if it does exist, then we know it's valid.
if (defined($patron_pwd)) {
$resp .= add_field(FID_VALID_PATRON_PWD,
sipbool($patron->check_password($patron_pwd)));
}
$resp .= maybe_add(FID_CURRENCY, $patron->currency); $resp .= maybe_add(FID_CURRENCY, $patron->currency);
$resp .= maybe_add(FID_FEE_AMT, $patron->fee_amount); $resp .= maybe_add(FID_FEE_AMT, $patron->fee_amount);
} }