X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FMembers.pm;h=6a30c440f44dace18cfe39b7d1f74d16b9f72cd6;hb=f69ebeef6731c87ec22cea1885bf7e5a9ee91a26;hp=81b014b91e2f401acb52f46ae84e0795139bfe3e;hpb=5d7b5533f1565a55ff269fd82690a71a697901f1;p=koha_fer diff --git a/C4/Members.pm b/C4/Members.pm index 81b014b91e..6a30c440f4 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -66,6 +66,7 @@ BEGIN { &getidcity &GetFirstValidEmailAddress + &GetNoticeEmailAddress &GetAge &GetCities @@ -89,7 +90,7 @@ BEGIN { GetBorrowerCategorycode &GetBorrowercategoryList - &GetBorrowersWhoHaveNotBorrowedSince + &GetBorrowersToExpunge &GetBorrowersWhoHaveNeverBorrowed &GetBorrowersWithIssuesHistoryOlderThan @@ -258,9 +259,7 @@ sub Search { if ( C4::Context->preference("IndependantBranches") ) { # && !$showallbranches){ if ( my $userenv = C4::Context->userenv ) { my $branch = $userenv->{'branch'}; - if ( ($userenv->{flags} % 2 !=1) && - $branch && $branch ne "insecure" ){ - + if ( ($userenv->{flags} % 2 !=1) && $branch ){ if (my $fr = ref $filter) { if ( $fr eq "HASH" ) { $filter->{branchcode} = $branch; @@ -432,21 +431,21 @@ sub patronflags { my %flags; my ( $patroninformation) = @_; my $dbh=C4::Context->dbh; - my ($amount) = GetMemberAccountRecords( $patroninformation->{'borrowernumber'}); - if ( $amount > 0 ) { + my ($balance, $owing) = GetMemberAccountBalance( $patroninformation->{'borrowernumber'}); + if ( $owing > 0 ) { my %flaginfo; my $noissuescharge = C4::Context->preference("noissuescharge") || 5; - $flaginfo{'message'} = sprintf "Patron owes \$%.02f", $amount; - $flaginfo{'amount'} = sprintf "%.02f", $amount; - if ( $amount > $noissuescharge && !C4::Context->preference("AllowFineOverride") ) { + $flaginfo{'message'} = sprintf "Patron owes \$%.02f", $owing; + $flaginfo{'amount'} = sprintf "%.02f", $owing; + if ( $owing > $noissuescharge && !C4::Context->preference("AllowFineOverride") ) { $flaginfo{'noissues'} = 1; } $flags{'CHARGES'} = \%flaginfo; } - elsif ( $amount < 0 ) { + elsif ( $balance < 0 ) { my %flaginfo; - $flaginfo{'message'} = sprintf "Patron has credit of \$%.02f", -$amount; - $flaginfo{'amount'} = sprintf "%.02f", $amount; + $flaginfo{'message'} = sprintf "Patron has credit of \$%.02f", -$balance; + $flaginfo{'amount'} = sprintf "%.02f", $balance; $flags{'CREDITS'} = \%flaginfo; } if ( $patroninformation->{'gonenoaddress'} @@ -791,12 +790,23 @@ sub AddMember { return $data{'borrowernumber'}; } +=head2 Check_Userid + + my $uniqueness = Check_Userid($userid,$borrowernumber); + + $borrowernumber is optional (i.e. it can contain a blank value). If $userid is passed with a blank $borrowernumber variable, the database will be checked for all instances of that userid (i.e. userid=? AND borrowernumber != ''). + + If $borrowernumber is provided, the database will be checked for every instance of that userid coupled with a different borrower(number) than the one provided. + + return : + 0 for not unique (i.e. this $userid already exists) + 1 for unique (i.e. this $userid does not exist, or this $userid/$borrowernumber combination already exists) + +=cut sub Check_Userid { my ($uid,$member) = @_; my $dbh = C4::Context->dbh; - # Make sure the userid chosen is unique and not theirs if non-empty. If it is not, - # Then we need to tell the user and have them create a new one. my $sth = $dbh->prepare( "SELECT * FROM borrowers WHERE userid=? AND borrowernumber != ?"); @@ -809,10 +819,24 @@ sub Check_Userid { } } +=head2 Generate_Userid + + my $newuid = Generate_Userid($borrowernumber, $firstname, $surname); + + Generate a userid using the $surname and the $firstname (if there is a value in $firstname). + + $borrowernumber is optional (i.e. it can contain a blank value). A value is passed when generating a new userid for an existing borrower. When a new userid is created for a new borrower, a blank value is passed to this sub. + + return : + new userid ($firstname.$surname if there is a $firstname, or $surname if there is no value in $firstname) plus offset (0 if the $newuid is unique, or a higher numeric value if Check_Userid finds an existing match for the $newuid in the database). + +=cut + sub Generate_Userid { my ($borrowernumber, $firstname, $surname) = @_; my $newuid; my $offset = 0; + #The script will "do" the following code and increment the $offset until Check_Userid = 1 (i.e. until $newuid comes back as unique) do { $firstname =~ s/[[:digit:][:space:][:blank:][:punct:][:cntrl:]]//g; $surname =~ s/[[:digit:][:space:][:blank:][:punct:][:cntrl:]]//g; @@ -1128,9 +1152,8 @@ total amount outstanding for all of the account lines. =cut -#' sub GetMemberAccountRecords { - my ($borrowernumber,$date) = @_; + my ($borrowernumber) = @_; my $dbh = C4::Context->dbh; my @acctlines; my $numlines = 0; @@ -1138,14 +1161,10 @@ sub GetMemberAccountRecords { SELECT * FROM accountlines WHERE borrowernumber=?); - my @bind = ($borrowernumber); - if ($date && $date ne ''){ - $strsth.=" AND date < ? "; - push(@bind,$date); - } $strsth.=" ORDER BY date desc,timestamp DESC"; my $sth= $dbh->prepare( $strsth ); - $sth->execute( @bind ); + $sth->execute( $borrowernumber ); + my $total = 0; while ( my $data = $sth->fetchrow_hashref ) { if ( $data->{itemnumber} ) { @@ -1161,6 +1180,42 @@ sub GetMemberAccountRecords { return ( $total, \@acctlines,$numlines); } +=head2 GetMemberAccountBalance + + ($total_balance, $non_issue_balance, $other_charges) = &GetMemberAccountBalance($borrowernumber); + +Calculates amount immediately owing by the patron - non-issue charges. +Based on GetMemberAccountRecords. +Charges exempt from non-issue are: +* Res (reserves) +* Rent (rental) if RentalsInNoissuesCharge syspref is set to false +* Manual invoices if ManInvInNoissuesCharge syspref is set to false + +=cut + +sub GetMemberAccountBalance { + my ($borrowernumber) = @_; + + my $ACCOUNT_TYPE_LENGTH = 5; # this is plain ridiculous... + + my @not_fines = ('Res'); + push @not_fines, 'Rent' unless C4::Context->preference('RentalsInNoissuesCharge'); + unless ( C4::Context->preference('ManInvInNoissuesCharge') ) { + my $dbh = C4::Context->dbh; + my $man_inv_types = $dbh->selectcol_arrayref(qq{SELECT authorised_value FROM authorised_values WHERE category = 'MANUAL_INV'}); + push @not_fines, map substr($_, 0, $ACCOUNT_TYPE_LENGTH), @$man_inv_types; + } + my %not_fine = map {$_ => 1} @not_fines; + + my ($total, $acctlines) = GetMemberAccountRecords($borrowernumber); + my $other_charges = 0; + foreach (@$acctlines) { + $other_charges += $_->{amountoutstanding} if $not_fine{ substr($_->{accounttype}, 0, $ACCOUNT_TYPE_LENGTH) }; + } + + return ( $total, $total - $other_charges, $other_charges); +} + =head2 GetBorNotifyAcctRecord ($total, $acctlines, $count) = &GetBorNotifyAcctRecord($params,$notifyid); @@ -1328,6 +1383,35 @@ sub GetFirstValidEmailAddress { } } +=head2 GetNoticeEmailAddress + + $email = GetNoticeEmailAddress($borrowernumber); + +Return the email address of borrower used for notices, given the borrowernumber. +Returns the empty string if no email address. + +=cut + +sub GetNoticeEmailAddress { + my $borrowernumber = shift; + + my $which_address = C4::Context->preference("AutoEmailPrimaryAddress"); + # if syspref is set to 'first valid' (value == OFF), look up email address + if ( $which_address eq 'OFF' ) { + return GetFirstValidEmailAddress($borrowernumber); + } + # specified email address field + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare( qq{ + SELECT $which_address AS primaryemail + FROM borrowers + WHERE borrowernumber=? + } ); + $sth->execute($borrowernumber); + my $data = $sth->fetchrow_hashref; + return $data->{'primaryemail'} || ''; +} + =head2 GetExpiryDate $expirydate = GetExpiryDate($categorycode, $dateenrolled); @@ -1491,7 +1575,7 @@ sub GetBorrowercategoryList { ? 0 : C4::Context->userenv ? C4::Context->userenv->{"branch"} : ""; my $dbh = C4::Context->dbh; - my $query = "SELECT * FROM categories"; + my $query = "SELECT categories.* FROM categories"; $query .= qq{ LEFT JOIN categories_branches ON categories.categorycode = categories_branches.categorycode WHERE branchcode = ? OR branchcode IS NULL GROUP BY description @@ -1938,52 +2022,65 @@ WHERE roadtypeid=?|; return ($roadtype); } -=head2 GetBorrowersWhoHaveNotBorrowedSince +=head2 GetBorrowersToExpunge - &GetBorrowersWhoHaveNotBorrowedSince($date) + $borrowers = &GetBorrowersToExpunge( + not_borrowered_since => $not_borrowered_since, + expired_before => $expired_before, + category_code => $category_code, + branchcode => $branchcode + ); -this function get all borrowers who haven't borrowed since the date given on input arg. + This function get all borrowers based on the given criteria. =cut -sub GetBorrowersWhoHaveNotBorrowedSince { - my $filterdate = shift||POSIX::strftime("%Y-%m-%d",localtime()); - my $filterexpiry = shift; - my $filterbranch = shift || +sub GetBorrowersToExpunge { + my $params = shift; + + my $filterdate = $params->{'not_borrowered_since'}; + my $filterexpiry = $params->{'expired_before'}; + my $filtercategory = $params->{'category_code'}; + my $filterbranch = $params->{'branchcode'} || ((C4::Context->preference('IndependantBranches') && C4::Context->userenv && C4::Context->userenv->{flags} % 2 !=1 && C4::Context->userenv->{branch}) ? C4::Context->userenv->{branch} : ""); + my $dbh = C4::Context->dbh; my $query = " SELECT borrowers.borrowernumber, - max(old_issues.timestamp) as latestissue, - max(issues.timestamp) as currentissue + MAX(old_issues.timestamp) AS latestissue, + MAX(issues.timestamp) AS currentissue FROM borrowers JOIN categories USING (categorycode) LEFT JOIN old_issues USING (borrowernumber) LEFT JOIN issues USING (borrowernumber) WHERE category_type <> 'S' - AND borrowernumber NOT IN (SELECT guarantorid FROM borrowers WHERE guarantorid IS NOT NULL AND guarantorid <> 0) + AND borrowernumber NOT IN (SELECT guarantorid FROM borrowers WHERE guarantorid IS NOT NULL AND guarantorid <> 0) "; my @query_params; - if ($filterbranch && $filterbranch ne ""){ - $query.=" AND borrowers.branchcode= ?"; - push @query_params,$filterbranch; + if ( $filterbranch && $filterbranch ne "" ) { + $query.= " AND borrowers.branchcode = ? "; + push( @query_params, $filterbranch ); } - if($filterexpiry){ + if ( $filterexpiry ) { $query .= " AND dateexpiry < ? "; - push @query_params,$filterdate; + push( @query_params, $filterexpiry ); } - $query.=" GROUP BY borrowers.borrowernumber"; - if ($filterdate){ - $query.=" HAVING (latestissue < ? OR latestissue IS NULL) - AND currentissue IS NULL"; + if ( $filtercategory ) { + $query .= " AND categorycode = ? "; + push( @query_params, $filtercategory ); + } + $query.=" GROUP BY borrowers.borrowernumber HAVING currentissue IS NULL "; + if ( $filterdate ) { + $query.=" AND ( latestissue < ? OR latestissue IS NULL ) "; push @query_params,$filterdate; } warn $query if $debug; + my $sth = $dbh->prepare($query); if (scalar(@query_params)>0){ $sth->execute(@query_params); @@ -2312,14 +2409,14 @@ sub IssueSlip { my $issueslist = GetPendingIssues($borrowernumber); foreach my $it (@$issueslist){ - if ((substr $it->{'issuedate'}, 0, 10) eq $now) { + if ((substr $it->{'issuedate'}, 0, 10) eq $now || (substr $it->{'lastreneweddate'}, 0, 10) eq $now) { $it->{'now'} = 1; } elsif ((substr $it->{'date_due'}, 0, 10) le $now) { $it->{'overdue'} = 1; } - - $it->{'date_due'}=format_date($it->{'date_due'}); + my $dt = dt_from_string( $it->{'date_due'} ); + $it->{'date_due'} = output_pref( $dt );; } my @issues = sort { $b->{'timestamp'} <=> $a->{'timestamp'} } @$issueslist;