use String::Random qw( random_string );
use Scalar::Util qw( looks_like_number );
use Date::Calc qw/Today check_date Date_to_Days/;
+use List::MoreUtils qw( uniq );
use C4::Log; # logaction
use C4::Overdues;
use C4::Reserves;
&GetPendingIssues
&GetAllIssues
- &GetFirstValidEmailAddress
- &GetNoticeEmailAddress
-
- &GetMemberAccountRecords
-
&GetBorrowersToExpunge
&IssueSlip
#Check data
push @EXPORT, qw(
- &checkuniquemember
&checkuserpassword
&Check_Userid
&Generate_Userid
my %flags;
my ( $patroninformation) = @_;
my $dbh=C4::Context->dbh;
- my ($balance, $owing) = GetMemberAccountBalance( $patroninformation->{'borrowernumber'});
+ my $patron = Koha::Patrons->find( $patroninformation->{borrowernumber} );
+ my $account = $patron->account;
+ my $owing = $account->non_issues_charges;
if ( $owing > 0 ) {
my %flaginfo;
my $noissuescharge = C4::Context->preference("noissuescharge") || 5;
}
$flags{'CHARGES'} = \%flaginfo;
}
- elsif ( $balance < 0 ) {
+ elsif ( ( my $balance = $account->balance ) < 0 ) {
my %flaginfo;
$flaginfo{'message'} = sprintf 'Patron has credit of %.02f', -$balance;
$flaginfo{'amount'} = sprintf "%.02f", $balance;
my @guarantees = $p->guarantees();
my $guarantees_non_issues_charges;
foreach my $g ( @guarantees ) {
- my ( $b, $n, $o ) = C4::Members::GetMemberAccountBalance( $g->id );
- $guarantees_non_issues_charges += $n;
+ $guarantees_non_issues_charges += $g->account->non_issues_charges;
}
if ( $guarantees_non_issues_charges > $no_issues_charge_guarantees ) {
$flags{'ODUES'} = \%flaginfo;
}
- my $patron = Koha::Patrons->find( $patroninformation->{borrowernumber} );
my $waiting_holds = $patron->holds->search({ found => 'W' });
my $nowaiting = $waiting_holds->count;
if ( $nowaiting > 0 ) {
my $dbh = C4::Context->dbh;
my $schema = Koha::Database->new()->schema;
+ my $category = Koha::Patron::Categories->find( $data{categorycode} );
+ unless ($category) {
+ Koha::Exceptions::BadParameter->throw(
+ error => 'Invalid parameter passed',
+ parameter => 'categorycode'
+ );
+ }
+
# trim whitespace from data which has some non-whitespace in it.
foreach my $field_name (keys(%data)) {
if ( defined $data{$field_name} && $data{$field_name} =~ /\S/ ) {
if ( $data{'userid'} eq '' || !Check_Userid( $data{'userid'} ) );
# add expiration date if it isn't already there
- $data{dateexpiry} ||= Koha::Patron::Categories->find( $data{categorycode} )->get_expiry_date;
+ $data{dateexpiry} ||= $category->get_expiry_date;
# add enrollment date if it isn't already there
unless ( $data{'dateenrolled'} ) {
}
}
- my $patron_category = $schema->resultset('Category')->find( $data{'categorycode'} );
$data{'privacy'} =
- $patron_category->default_privacy() eq 'default' ? 1
- : $patron_category->default_privacy() eq 'never' ? 2
- : $patron_category->default_privacy() eq 'forever' ? 0
- : undef;
+ $category->default_privacy() eq 'default' ? 1
+ : $category->default_privacy() eq 'never' ? 2
+ : $category->default_privacy() eq 'forever' ? 0
+ : undef;
$data{'privacy_guarantor_checkouts'} = 0 unless defined( $data{'privacy_guarantor_checkouts'} );
return $sth->fetchall_arrayref( {} );
}
-
-=head2 GetMemberAccountRecords
-
- ($total, $acctlines, $count) = &GetMemberAccountRecords($borrowernumber);
-
-Looks up accounting data for the patron with the given borrowernumber.
-
-C<&GetMemberAccountRecords> returns a three-element array. C<$acctlines> is a
-reference-to-array, where each element is a reference-to-hash; the
-keys are the fields of the C<accountlines> table in the Koha database.
-C<$count> is the number of elements in C<$acctlines>. C<$total> is the
-total amount outstanding for all of the account lines.
-
-=cut
-
-sub GetMemberAccountRecords {
- my ($borrowernumber) = @_;
- my $dbh = C4::Context->dbh;
- my @acctlines;
- my $numlines = 0;
- my $strsth = qq(
- SELECT *
- FROM accountlines
- WHERE borrowernumber=?);
- $strsth.=" ORDER BY accountlines_id desc";
- my $sth= $dbh->prepare( $strsth );
- $sth->execute( $borrowernumber );
-
- my $total = 0;
- while ( my $data = $sth->fetchrow_hashref ) {
- if ( $data->{itemnumber} ) {
- my $item = Koha::Items->find( $data->{itemnumber} );
- my $biblio = $item->biblio;
- $data->{biblionumber} = $biblio->biblionumber;
- $data->{title} = $biblio->title;
- }
- $acctlines[$numlines] = $data;
- $numlines++;
- $total += sprintf "%.0f", 1000*$data->{amountoutstanding}; # convert float to integer to avoid round-off errors
- }
- $total /= 1000;
- 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;
- push @not_fines, 'Res' unless C4::Context->preference('HoldsInNoissuesCharge');
- 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);
-}
-
sub checkcardnumber {
my ( $cardnumber, $borrowernumber ) = @_;
return ( $min, $max );
}
-=head2 GetFirstValidEmailAddress
-
- $email = GetFirstValidEmailAddress($borrowernumber);
-
-Return the first valid email address for a borrower, given the borrowernumber. For now, the order
-is defined as email, emailpro, B_email. Returns the empty string if the borrower has no email
-addresses.
-
-=cut
-
-sub GetFirstValidEmailAddress {
- my $borrowernumber = shift;
-
- my $borrower = Koha::Patrons->find( $borrowernumber );
-
- return $borrower->first_valid_email_address();
-}
-
-=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 GetBorrowersToExpunge
$borrowers = &GetBorrowersToExpunge(
my $dbh = C4::Context->dbh;
my $query = q|
- SELECT borrowers.borrowernumber,
- MAX(old_issues.timestamp) AS latestissue,
- MAX(issues.timestamp) AS currentissue
- FROM borrowers
- JOIN categories USING (categorycode)
- LEFT JOIN (
- SELECT guarantorid
- FROM borrowers
- WHERE guarantorid IS NOT NULL
- AND guarantorid <> 0
- ) as tmp ON borrowers.borrowernumber=tmp.guarantorid
- LEFT JOIN old_issues USING (borrowernumber)
- LEFT JOIN issues USING (borrowernumber)|;
+ SELECT *
+ FROM (
+ SELECT borrowers.borrowernumber,
+ MAX(old_issues.timestamp) AS latestissue,
+ MAX(issues.timestamp) AS currentissue
+ FROM borrowers
+ JOIN categories USING (categorycode)
+ LEFT JOIN (
+ SELECT guarantorid
+ FROM borrowers
+ WHERE guarantorid IS NOT NULL
+ AND guarantorid <> 0
+ ) as tmp ON borrowers.borrowernumber=tmp.guarantorid
+ LEFT JOIN old_issues USING (borrowernumber)
+ LEFT JOIN issues USING (borrowernumber)|;
if ( $filterpatronlist ){
$query .= q| LEFT JOIN patron_list_patrons USING (borrowernumber)|;
}
$query .= q| WHERE category_type <> 'S'
AND tmp.guarantorid IS NULL
- |;
+ |;
my @query_params;
if ( $filterbranch && $filterbranch ne "" ) {
$query.= " AND borrowers.branchcode = ? ";
$query.=" AND patron_list_id = ? ";
push( @query_params, $filterpatronlist );
}
- $query.=" GROUP BY borrowers.borrowernumber HAVING currentissue IS NULL ";
+ $query .= " GROUP BY borrowers.borrowernumber";
+ $query .= q|
+ ) xxx WHERE 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);