X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FMembers.pm;h=7ee9eb3bbe0adc5d07cbe8f984e90a16c96cdcf1;hb=ebe04d8446b446913f66eaff687f513198b16d19;hp=226308fbaa39eb83fd50ce1833f5c807fa44e4c2;hpb=472d77353e1997844f50475bef5b7b5027c9f203;p=koha.git diff --git a/C4/Members.pm b/C4/Members.pm index 226308fbaa..7ee9eb3bbe 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -27,6 +27,7 @@ use C4::Log; # logaction use C4::Overdues; use C4::Reserves; use C4::Accounts; +use C4::Biblio; our ($VERSION,@ISA,@EXPORT,@EXPORT_OK,$debug); @@ -127,6 +128,8 @@ This module contains routines for adding, modifying and deleting members/patrons ($count, $borrowers) = &SearchMember($searchstring, $type,$category_type,$filter,$showallbranches); +=back + Looks up patrons (borrowers) by name. BUGFIX 499: C<$type> is now used to determine type of search. @@ -246,7 +249,7 @@ AND attribute like ? =head2 GetMemberDetails -($borrower, $flags) = &GetMemberDetails($borrowernumber, $cardnumber); +($borrower) = &GetMemberDetails($borrowernumber, $cardnumber); Looks up a patron and returns information about him or her. If C<$borrowernumber> is true (nonzero), C<&GetMemberDetails> looks @@ -338,6 +341,12 @@ fields from the reserves table of the Koha database. =back +C<$borrower-E{authflags}> is a hash giving more detailed information +about the top-level permissions flags set for the borrower. For example, +if a user has the "editcatalogue" permission, +C<$borrower-E{authflags}-E{editcatalogue}> will exist and have +the value "1". + =cut sub GetMemberDetails { @@ -346,11 +355,11 @@ sub GetMemberDetails { my $query; my $sth; if ($borrowernumber) { - $sth = $dbh->prepare("select borrowers.*,category_type from borrowers left join categories on borrowers.categorycode=categories.categorycode where borrowernumber=?"); + $sth = $dbh->prepare("select borrowers.*,category_type,categories.description from borrowers left join categories on borrowers.categorycode=categories.categorycode where borrowernumber=?"); $sth->execute($borrowernumber); } elsif ($cardnumber) { - $sth = $dbh->prepare("select borrowers.*,category_type from borrowers left join categories on borrowers.categorycode=categories.categorycode where cardnumber=?"); + $sth = $dbh->prepare("select borrowers.*,category_type,categories.description from borrowers left join categories on borrowers.categorycode=categories.categorycode where cardnumber=?"); $sth->execute($cardnumber); } else { @@ -493,7 +502,7 @@ sub patronflags { } -=item GetMember +=head2 GetMember $borrower = &GetMember($information, $type); @@ -518,7 +527,7 @@ SELECT borrowers.*, categories.category_type, categories.description FROM borrowers LEFT JOIN categories on borrowers.categorycode=categories.categorycode "; - if ($type eq 'cardnumber' || $type eq 'firstname'|| $type eq 'userid'|| $type eq 'borrowernumber'){ + if (defined($type) and ( $type eq 'cardnumber' || $type eq 'firstname'|| $type eq 'userid'|| $type eq 'borrowernumber' ) ){ $information = uc $information; $sth = $dbh->prepare("$select WHERE $type=?"); } else { @@ -526,20 +535,18 @@ LEFT JOIN categories on borrowers.categorycode=categories.categorycode } $sth->execute($information); my $data = $sth->fetchrow_hashref; - $sth->finish; ($data) and return ($data); - if ($type eq 'cardnumber' || $type eq 'firstname') { # otherwise, try with firstname + if (defined($type) and ($type eq 'cardnumber' || $type eq 'firstname')) { # otherwise, try with firstname $sth = $dbh->prepare("$select WHERE firstname like ?"); $sth->execute($information); $data = $sth->fetchrow_hashref; - $sth->finish; ($data) and return ($data); } return undef; } -=item GetMemberIssuesAndFines +=head2 GetMemberIssuesAndFines ($overdue_count, $issue_count, $total_fines) = &GetMemberIssuesAndFines($borrowernumber); @@ -582,17 +589,27 @@ sub GetMemberIssuesAndFines { return ($overdue_count, $issue_count, $total_fines); } +sub columns(;$) { + return @{C4::Context->dbh->selectcol_arrayref("SHOW columns from borrowers")}; +} + =head2 -=item ModMember +=head2 ModMember + +=over 4 - &ModMember($borrowernumber); +my $success = ModMember(borrowernumber => $borrowernumber, [ field => value ]... ); Modify borrower's data. All date fields should ALREADY be in ISO format. +return : +true on success, or false on failure + +=back + =cut -#' sub ModMember { my (%data) = @_; my $dbh = C4::Context->dbh; @@ -601,57 +618,69 @@ sub ModMember { if (my $tempdate = $data{$_}) { # assignment, not comparison ($tempdate =~ /$iso_re/) and next; # Congatulations, you sent a valid ISO date. warn "ModMember given $_ not in ISO format ($tempdate)"; - if (my $tempdate2 = format_date_in_iso($tempdate)) { # assignment, not comparison - $data{$_} = $tempdate2; - } else { - warn "ModMember cannot convert '$tempdate' (from syspref)"; + my $tempdate2 = format_date_in_iso($tempdate); + if (!$tempdate2 or $tempdate2 eq '0000-00-00') { + warn "ModMember cannot convert '$tempdate' (from syspref to ISO)"; + next; } + $data{$_} = $tempdate2; } } if (!$data{'dateofbirth'}){ - undef $data{'dateofbirth'}; - } - my $qborrower=$dbh->prepare("SHOW columns from borrowers"); - $qborrower->execute; - my %hashborrowerfields; - while (my ($field)=$qborrower->fetchrow){ - $hashborrowerfields{$field}=1; - } + delete $data{'dateofbirth'}; + } + my @columns = &columns; + my %hashborrowerfields = (map {$_=>1} @columns); my $query = "UPDATE borrowers SET \n"; my $sth; my @parameters; # test to know if you must update or not the borrower password - if ( $data{'password'} eq '****' ) { - delete $data{'password'}; - } else { - $data{'password'} = md5_base64( $data{'password'} ) if ($data{'password'} ne ""); - delete $data{'password'} if ($data{password} eq ""); + if (exists $data{password}) { + if ($data{password} eq '****' or $data{password} eq '') { + delete $data{password}; + } else { + $data{password} = md5_base64($data{password}); + } } - foreach (keys %data) - { push @parameters,"$_ = ".$dbh->quote($data{$_}) if ($_ ne 'borrowernumber' and $_ ne 'flags' and $hashborrowerfields{$_}); } - $query .= join (',',@parameters) . "\n WHERE borrowernumber=? \n"; + my @badkeys; + foreach (keys %data) { + next if ($_ eq 'borrowernumber' or $_ eq 'flags'); + if ($hashborrowerfields{$_}){ + $query .= " $_=?, "; + push @parameters,$data{$_}; + } else { + push @badkeys, $_; + delete $data{$_}; + } + } + (@badkeys) and warn scalar(@badkeys) . " Illegal key(s) passed to ModMember: " . join(',',@badkeys); + $query =~ s/, $//; + $query .= " WHERE borrowernumber=?"; + push @parameters, $data{'borrowernumber'}; $debug and print STDERR "$query (executed w/ arg: $data{'borrowernumber'})"; $sth = $dbh->prepare($query); - $sth->execute($data{'borrowernumber'}); + my $execute_success = $sth->execute(@parameters); $sth->finish; # ok if its an adult (type) it may have borrowers that depend on it as a guarantor # so when we update information for an adult we should check for guarantees and update the relevant part # of their records, ie addresses and phone numbers my $borrowercategory= GetBorrowercategory( $data{'category_type'} ); - if ( $borrowercategory->{'category_type'} eq ('A' || 'S') ) { + if ( exists $borrowercategory->{'category_type'} && $borrowercategory->{'category_type'} eq ('A' || 'S') ) { # is adult check guarantees; UpdateGuarantees(%data); } logaction("MEMBERS", "MODIFY", $data{'borrowernumber'}, "$query (executed w/ arg: $data{'borrowernumber'})") if C4::Context->preference("BorrowersLog"); + + return $execute_success; } =head2 -=item AddMember +=head2 AddMember $borrowernumber = &AddMember(%borrower); @@ -746,7 +775,7 @@ sub AddMember { $sth = $dbh->prepare("SELECT enrolmentfee FROM categories WHERE categorycode=?"); $sth->execute($data{'categorycode'}); my ($enrolmentfee) = $sth->fetchrow; - if ($enrolmentfee) { + if ($enrolmentfee && $enrolmentfee > 0) { # insert fee in patron debts manualinvoice($data{'borrowernumber'}, '', '', 'A', $enrolmentfee); } @@ -800,7 +829,7 @@ sub changepassword { -=item fixup_cardnumber +=head2 fixup_cardnumber Warning: The caller is responsible for locking the members table in write mode, to avoid database corruption. @@ -967,7 +996,7 @@ sub GetPendingIssues { my $dbh = C4::Context->dbh; my $sth = $dbh->prepare( - "SELECT * FROM issues + "SELECT *,issues.timestamp as timestamp FROM issues LEFT JOIN items ON issues.itemnumber=items.itemnumber LEFT JOIN biblio ON items.biblionumber=biblio.biblionumber LEFT JOIN biblioitems ON items.biblioitemnumber=biblioitems.biblioitemnumber @@ -1018,14 +1047,14 @@ sub GetAllIssues { my $dbh = C4::Context->dbh; my $count = 0; my $query = - "SELECT *,items.timestamp AS itemstimestamp + "SELECT *,issues.renewals AS renewals,items.renewals AS totalrenewals,items.timestamp AS itemstimestamp FROM issues LEFT JOIN items on items.itemnumber=issues.itemnumber LEFT JOIN biblio ON items.biblionumber=biblio.biblionumber LEFT JOIN biblioitems ON items.biblioitemnumber=biblioitems.biblioitemnumber WHERE borrowernumber=? UNION ALL - SELECT *,items.timestamp AS itemstimestamp + SELECT *,old_issues.renewals AS renewals,items.renewals AS totalrenewals,items.timestamp AS itemstimestamp FROM old_issues LEFT JOIN items on items.itemnumber=old_issues.itemnumber LEFT JOIN biblio ON items.biblionumber=biblio.biblionumber @@ -1115,6 +1144,8 @@ sub GetMemberAccountRecords { $sth->execute( @bind ); my $total = 0; while ( my $data = $sth->fetchrow_hashref ) { + my $biblio = GetBiblioFromItemNumber($data->{itemnumber}) if $data->{itemnumber}; + $data->{biblionumber} = $biblio->{biblionumber}; $acctlines[$numlines] = $data; $numlines++; $total += $data->{'amountoutstanding'}; @@ -1316,13 +1347,14 @@ to category descriptions. #' sub GetborCatFromCatType { my ( $category_type, $action ) = @_; + # FIXME - This API seems both limited and dangerous. my $dbh = C4::Context->dbh; my $request = qq| SELECT categorycode,description FROM categories $action ORDER BY categorycode|; my $sth = $dbh->prepare($request); - if ($action) { + if ($action) { $sth->execute($category_type); } else { @@ -1757,7 +1789,7 @@ sub GetPatronImage { my ($cardnumber) = @_; warn "Cardnumber passed to GetPatronImage is $cardnumber" if $debug; my $dbh = C4::Context->dbh; - my $query = "SELECT mimetype, imagefile FROM patronimage WHERE cardnumber = ?;"; + my $query = 'SELECT mimetype, imagefile FROM patronimage WHERE cardnumber = ?'; my $sth = $dbh->prepare($query); $sth->execute($cardnumber); my $imagedata = $sth->fetchrow_hashref; @@ -2003,14 +2035,40 @@ sub GetBorrowersNamesAndLatestIssue { my $results = $sth->fetchall_arrayref({}); return $results; } + +=head2 DebarMember + +=over 4 + +my $success = DebarMember( $borrowernumber ); + +marks a Member as debarred, and therefore unable to checkout any more +items. + +return : +true on success, false on failure + +=back + +=cut + +sub DebarMember { + my $borrowernumber = shift; + + return unless defined $borrowernumber; + return unless $borrowernumber =~ /^\d+$/; + + return ModMember( borrowernumber => $borrowernumber, + debarred => 1 ); + +} + END { } # module clean-up code here (global destructor) 1; __END__ -=back - =head1 AUTHOR Koha Team