my ($class, $patron_id) = @_;
my $type = ref($class) || $class;
my $self;
- $kp = GetMember($patron_id,'cardnumber');
+ $kp = GetMember(cardnumber=>$patron_id);
$debug and warn "new Patron (GetMember): " . Dumper($kp);
unless (defined $kp) {
syslog("LOG_DEBUG", "new ILS::Patron(%s): no such patron", $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});
$debug and warn sprintf("Debarred = %s : ", ($debarred||'undef')) . Dumper(%{$kp->{flags}});
+ my ($day, $month, $year) = (localtime)[3,4,5];
+ my $today = sprintf '%04d-%02d-%02d', $year+1900, $month+1, $day;
+ my $expired = ($today gt $kp->{dateexpiry}) ? 1 : 0;
+ if ($expired) {
+ if ($kp->{opacnote} ) {
+ $kp->{opacnote} .= q{ };
+ }
+ $kp->{opacnote} .= 'PATRON EXPIRED';
+ }
my %ilspatron;
my $adr = $kp->{streetnumber} || '';
my $address = $kp->{address} || '';
my $dob = $kp->{dateofbirth};
$dob and $dob =~ s/-//g; # YYYYMMDD
+ my $dexpiry = $kp->{dateexpiry};
+ $dexpiry and $dexpiry =~ s/-//g; # YYYYMMDD
$adr .= ($adr && $address) ? " $address" : $address;
my $fines_amount = $flags->{CHARGES}->{amount};
$fines_amount = ($fines_amount and $fines_amount > 0) ? $fines_amount : 0;
id => $kp->{cardnumber}, # to SIP, the id is the BARCODE, not userid
password => $pw,
ptype => $kp->{categorycode}, # 'A'dult. Whatever.
+ dateexpiry => $dexpiry,
+ dateexpiry_iso => $kp->{dateexpiry},
birthdate => $dob,
birthdate_iso => $kp->{dateofbirth},
branchcode => $kp->{branchcode},
address => $adr,
home_phone => $kp->{phone},
email_addr => $kp->{email},
- charge_ok => ( !$debarred ),
- renew_ok => ( !$debarred ),
- recall_ok => ( !$debarred ),
- hold_ok => ( !$debarred ),
+ charge_ok => ( !$debarred && !$expired ),
+ renew_ok => ( !$debarred && !$expired ),
+ recall_ok => ( !$debarred && !$expired ),
+ hold_ok => ( !$debarred && !$expired ),
card_lost => ( $kp->{lost} || $kp->{gonenoaddress} || $flags->{LOST} ),
claims_returned => 0,
fines => $fines_amount, # GetMemberAccountRecords($kp->{borrowernumber})
fine_items => [],
recall_items => [],
unavail_holds => [],
- inet => ( !$debarred ),
+ inet => ( !$debarred && !$expired ),
+ expired => $expired,
);
}
- print STDERR "patron fines: $ilspatron{fines} ... amountoutstanding: $kp->{amountoutstanding} ... CHARGES->amount: $flags->{CHARGES}->{amount}\n";
- for (qw(CHARGES CREDITS GNA LOST DBARRED NOTES)) {
+ $debug and warn "patron fines: $ilspatron{fines} ... amountoutstanding: $kp->{amountoutstanding} ... CHARGES->amount: $flags->{CHARGES}->{amount}";
+ for (qw(EXPIRED CHARGES CREDITS GNA LOST DBARRED NOTES)) {
($flags->{$_}) or next;
- $ilspatron{screen_msg} .= ($flags->{$_}->{message} || '') ;
+ if ($_ ne 'NOTES' and $flags->{$_}->{message}) {
+ $ilspatron{screen_msg} .= " -- " . $flags->{$_}->{message}; # show all but internal NOTES
+ }
if ($flags->{$_}->{noissues}) {
foreach my $toggle (qw(charge_ok renew_ok recall_ok hold_ok inet)) {
$ilspatron{$toggle} = 0; # if we get noissues, disable everything
home_phone => 0,
birthdate => 0,
birthdate_iso => 0,
+ dateexpiry => 0,
+ dateexpiry_iso => 0,
ptype => 0,
charge_ok => 0, # for patron_status[0] (inverted)
renew_ok => 0, # for patron_status[1] (inverted)
return $self->{language} || '000'; # Unspecified
}
-#
-# List of outstanding holds placed
-#
-sub hold_items {
- my ($self, $start, $end) = @_;
- $self->{hold_items} or return [];
- $start = 1 unless defined($start);
- $end = scalar @{$self->{hold_items}} unless defined($end);
- return [@{$self->{hold_items}}[$start-1 .. $end-1]]; # SIP "start item" and "end item" values are 1-indexed, not 0 like perl arrays
+sub expired {
+ my $self = shift;
+ return $self->{expired};
}
#
return $result;
}
-sub overdue_items {
- my ($self, $start, $end) = @_;
- $self->{overdue_items} or return [];
- $start = 1 if !defined($start);
- $end = scalar @{$self->{overdue_items}} if !defined($end);
- return [@{$self->{overdue_items}}[$start-1 .. $end-1]];
+# Accessor method for array_ref values, designed to get the "start" and "end" values
+# from the SIP request. Note those incoming values are 1-indexed, not 0-indexed.
+#
+sub x_items {
+ my $self = shift or return;
+ my $array_var = shift or return;
+ my ($start, $end) = @_;
+ $self->{$array_var} or return [];
+ $start = 1 unless defined($start);
+ $end = scalar @{$self->{$array_var}} unless defined($end);
+ # syslog("LOG_DEBUG", "$array_var: start = %d, end = %d; items(%s)", $start, $end, join(', ', @{$self->{items}}));
+
+ return [@{$self->{$array_var}}[$start-1 .. $end-1]];
}
-sub charged_items {
- my ($self, $start, $end) = shift;
- $self->{items} or return [];
- $start = 1 if !defined($start);
- $end = scalar @{$self->{items}} if !defined($end);
- syslog("LOG_DEBUG", "charged_items: start = %d, end = %d; items(%s)",
- $start, $end, join(', ', @{$self->{items}}));
- return [@{$self->{items}}[$start-1 .. $end-1]];
+#
+# List of outstanding holds placed
+#
+sub hold_items {
+ my $self = shift or return;
+ return $self->x_items('hold_items', @_);
}
+sub overdue_items {
+ my $self = shift or return;
+ return $self->x_items('overdue_items', @_);
+}
+sub charged_items {
+ my $self = shift or return;
+ return $self->x_items('items', @_);
+}
sub fine_items {
- my ($self, $start, $end) = @_;
- $self->{fine_items} or return [];
- $start = 1 if !defined($start);
- $end = scalar @{$self->{fine_items}} if !defined($end);
- return [@{$self->{fine_items}}[$start-1 .. $end-1]];
+ my $self = shift or return;
+ return $self->x_items('fine_items', @_);
}
-
sub recall_items {
- my ($self, $start, $end) = @_;
- $self->{recall_items} or return [];
- $start = 1 if !defined($start);
- $end = scalar @{$self->{recall_items}} if !defined($end);
- return [@{$self->{recall_items}}[$start-1 .. $end-1]];
+ my $self = shift or return;
+ return $self->x_items('recall_items', @_);
}
-
sub unavail_holds {
- my ($self, $start, $end) = @_;
- $self->{unavail_holds} or return [];
- $start = 1 if !defined($start);
- $end = scalar @{$self->{unavail_holds}} if !defined($end);
- return [@{$self->{unavail_holds}}[$start-1 .. $end-1]];
+ my $self = shift or return;
+ return $self->x_items('unavail_holds', @_);
}
sub block {
foreach my $field ('charge_ok', 'renew_ok', 'recall_ok', 'hold_ok', 'inet') {
$self->{$field} = 0;
}
- $self->{screen_msg} = "Feature not implemented"; # $blocked_card_msg || "Card Blocked. Please contact library staff";
+ $self->{screen_msg} = "Block feature not implemented"; # $blocked_card_msg || "Card Blocked. Please contact library staff";
# TODO: not really affecting patron record
return $self;
}
syslog("LOG_DEBUG", "Patron(%s)->enable: charge: %s, renew:%s, recall:%s, hold:%s",
$self->{id}, $self->{charge_ok}, $self->{renew_ok},
$self->{recall_ok}, $self->{hold_ok});
- $self->{screen_msg} = "This feature not implemented."; # "All privileges restored."; # TODO: not really affecting patron record
+ $self->{screen_msg} = "Enable feature not implemented."; # "All privileges restored."; # TODO: not really affecting patron record
return $self;
}
}
sub excessive_fines {
my $self = shift or return;
- return $self->excessive_fees; # same thing for Koha
+ return $self->excessive_fees; # excessive_fines is the same thing as excessive_fees for Koha
}
sub library_name {
1;
__END__
-=head2 EXAMPLES
+=head1 EXAMPLES
-our %patron_example = (
+ our %patron_example = (
djfiander => {
name => "David J. Fiander",
id => 'djfiander',
},
);
-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}
+ From borrowers table:
++---------------------+--------------+------+-----+---------+----------------+
+| Field | Type | Null | Key | Default | Extra |
++---------------------+--------------+------+-----+---------+----------------+
+| borrowernumber | int(11) | NO | PRI | NULL | auto_increment |
+| cardnumber | varchar(16) | YES | UNI | NULL | |
+| surname | mediumtext | NO | | NULL | |
+| firstname | text | YES | | NULL | |
+| title | mediumtext | YES | | NULL | |
+| othernames | mediumtext | YES | | NULL | |
+| initials | text | YES | | NULL | |
+| streetnumber | varchar(10) | YES | | NULL | |
+| streettype | varchar(50) | YES | | NULL | |
+| address | mediumtext | NO | | NULL | |
+| address2 | text | YES | | NULL | |
+| city | mediumtext | NO | | NULL | |
+| state | mediumtext | YES | | NULL | |
+| zipcode | varchar(25) | YES | | NULL | |
+| country | text | YES | | NULL | |
+| email | mediumtext | YES | | NULL | |
+| phone | text | YES | | NULL | |
+| mobile | varchar(50) | YES | | NULL | |
+| fax | mediumtext | YES | | NULL | |
+| emailpro | text | YES | | NULL | |
+| phonepro | text | YES | | NULL | |
+| B_streetnumber | varchar(10) | YES | | NULL | |
+| B_streettype | varchar(50) | YES | | NULL | |
+| B_address | varchar(100) | YES | | NULL | |
+| B_address2 | text | YES | | NULL | |
+| B_city | mediumtext | YES | | NULL | |
+| B_state | mediumtext | YES | | NULL | |
+| B_zipcode | varchar(25) | YES | | NULL | |
+| B_country | text | YES | | NULL | |
+| B_email | text | YES | | NULL | |
+| B_phone | mediumtext | YES | | NULL | |
+| dateofbirth | date | YES | | NULL | |
+| branchcode | varchar(10) | NO | MUL | | |
+| categorycode | varchar(10) | NO | MUL | | |
+| dateenrolled | date | YES | | NULL | |
+| dateexpiry | date | YES | | NULL | |
+| gonenoaddress | tinyint(1) | YES | | NULL | |
+| lost | tinyint(1) | YES | | NULL | |
+| debarred | tinyint(1) | YES | | NULL | |
+| contactname | mediumtext | YES | | NULL | |
+| contactfirstname | text | YES | | NULL | |
+| contacttitle | text | YES | | NULL | |
+| guarantorid | int(11) | YES | MUL | NULL | |
+| borrowernotes | mediumtext | YES | | NULL | |
+| relationship | varchar(100) | YES | | NULL | |
+| ethnicity | varchar(50) | YES | | NULL | |
+| ethnotes | varchar(255) | YES | | NULL | |
+| sex | varchar(1) | YES | | NULL | |
+| password | varchar(30) | YES | | NULL | |
+| flags | int(11) | YES | | NULL | |
+| userid | varchar(30) | YES | MUL | NULL | |
+| opacnote | mediumtext | YES | | NULL | |
+| contactnote | varchar(255) | YES | | NULL | |
+| sort1 | varchar(80) | YES | | NULL | |
+| sort2 | varchar(80) | YES | | NULL | |
+| altcontactfirstname | varchar(255) | YES | | NULL | |
+| altcontactsurname | varchar(255) | YES | | NULL | |
+| altcontactaddress1 | varchar(255) | YES | | NULL | |
+| altcontactaddress2 | varchar(255) | YES | | NULL | |
+| altcontactaddress3 | varchar(255) | YES | | NULL | |
+| altcontactstate | mediumtext | YES | | NULL | |
+| altcontactzipcode | varchar(50) | YES | | NULL | |
+| altcontactcountry | text | YES | | NULL | |
+| altcontactphone | varchar(50) | YES | | NULL | |
+| smsalertnumber | varchar(50) | YES | | NULL | |
+| privacy | int(11) | NO | | 1 | |
++---------------------+--------------+------+-----+---------+----------------+
+
+
+ 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
+ {GNA} Set if patron gone w/o address
{message} "Borrower has no valid address"
{noissues} Set.
-{LOST} Set if patron's card reported lost
+ {LOST} Set if patron's card reported lost
{message} Message to this effect
{noissues} Set.
-{DBARRED} Set if patron is debarred
+ {DBARRED} Set if patron is debarred
{message} Message to this effect
{noissues} Set.
-{NOTES} Set if patron has notes
+ {NOTES} Set if patron has notes
{message} Notes about patron
-{ODUES} Set if patron has overdue books
+ {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
+ {WAITING} Set if there are items available that the patron reserved
{message} Message to this effect
{itemlist} ref-to-array: list of available items