# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
use strict;
+
#use warnings; FIXME - Bug 2505
use C4::Context;
use C4::Stats;
Add_Delta_DHMS
Date_to_Days
Day_of_Week
- Add_Delta_Days
-);
+ Add_Delta_Days
+ );
use POSIX qw(strftime);
-use C4::Branch; # GetBranches
-use C4::Log; # logaction
+use C4::Branch; # GetBranches
+use C4::Log; # logaction
use Data::Dumper;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
BEGIN {
- require Exporter;
- $VERSION = 3.02; # for version checking
- @ISA = qw(Exporter);
-
- # FIXME subs that should probably be elsewhere
- push @EXPORT, qw(
- &FixOverduesOnReturn
- &barcodedecode
- );
-
- # subs to deal with issuing a book
- push @EXPORT, qw(
- &CanBookBeIssued
- &CanBookBeRenewed
- &AddIssue
- &AddRenewal
- &GetRenewCount
- &GetItemIssue
- &GetItemIssues
- &GetBorrowerIssues
- &GetIssuingCharges
- &GetIssuingRule
- &GetBranchBorrowerCircRule
- &GetBranchItemRule
- &GetBiblioIssues
- &GetOpenIssue
- &AnonymiseIssueHistory
- );
-
- # subs to deal with returns
- push @EXPORT, qw(
- &AddReturn
- &MarkIssueReturned
- );
-
- # subs to deal with transfers
- push @EXPORT, qw(
- &transferbook
- &GetTransfers
- &GetTransfersFromTo
- &updateWrongTransfer
- &DeleteTransfer
- &IsBranchTransferAllowed
- &CreateBranchTransferLimit
- &DeleteBranchTransferLimits
- );
+ require Exporter;
+ $VERSION = 3.02; # for version checking
+ @ISA = qw(Exporter);
+
+ # FIXME subs that should probably be elsewhere
+ push @EXPORT, qw(
+ &FixOverduesOnReturn
+ &barcodedecode
+ );
+
+ # subs to deal with issuing a book
+ push @EXPORT, qw(
+ &CanBookBeIssued
+ &CanBookBeRenewed
+ &AddIssue
+ &AddRenewal
+ &GetRenewCount
+ &GetItemIssue
+ &GetItemIssues
+ &GetBorrowerIssues
+ &GetIssuingCharges
+ &GetIssuingRule
+ &GetBranchBorrowerCircRule
+ &GetBranchItemRule
+ &GetBiblioIssues
+ &GetOpenIssue
+ &AnonymiseIssueHistory
+ );
+
+ # subs to deal with returns
+ push @EXPORT, qw(
+ &AddReturn
+ &MarkIssueReturned
+ );
+
+ # subs to deal with transfers
+ push @EXPORT, qw(
+ &transferbook
+ &GetTransfers
+ &GetTransfersFromTo
+ &updateWrongTransfer
+ &DeleteTransfer
+ &IsBranchTransferAllowed
+ &CreateBranchTransferLimit
+ &DeleteBranchTransferLimits
+ );
}
=head1 NAME
my ($barcode, $filter) = @_;
my $branch = C4::Branch::mybranch();
$filter = C4::Context->preference('itemBarcodeInputFilter') unless $filter;
- $filter or return $barcode; # ensure filter is defined, else return untouched barcode
- if ($filter eq 'whitespace') {
- $barcode =~ s/\s//g;
- } elsif ($filter eq 'cuecat') {
- chomp($barcode);
- my @fields = split( /\./, $barcode );
- my @results = map( decode($_), @fields[ 1 .. $#fields ] );
- ($#results == 2) and return $results[2];
- } elsif ($filter eq 'T-prefix') {
- if ($barcode =~ /^[Tt](\d)/) {
- (defined($1) and $1 eq '0') and return $barcode;
- $barcode = substr($barcode, 2) + 0; # FIXME: probably should be substr($barcode, 1)
- }
+ $filter or return $barcode; # ensure filter is defined, else return untouched barcode
+ if ($filter eq 'whitespace') {
+ $barcode =~ s/\s//g;
+ } elsif ($filter eq 'cuecat') {
+ chomp($barcode);
+ my @fields = split(/\./, $barcode);
+ my @results = map(decode($_), @fields[1 .. $#fields]);
+ ($#results == 2) and return $results[2];
+ } elsif ($filter eq 'T-prefix') {
+ if ($barcode =~ /^[Tt](\d)/) {
+ (defined($1) and $1 eq '0') and return $barcode;
+ $barcode = substr($barcode, 2) + 0; # FIXME: probably should be substr($barcode, 1)
+ }
return sprintf("T%07d", $barcode);
+
# FIXME: $barcode could be "T1", causing warning: substr outside of string
# Why drop the nonzero digit after the T?
# Why pass non-digits (or empty string) to "T%07d"?
- } elsif ($filter eq 'libsuite8') {
- unless($barcode =~ m/^($branch)-/i){ #if barcode starts with branch code its in Koha style. Skip it.
- if($barcode =~ m/^(\d)/i){ #Some barcodes even start with 0's & numbers and are assumed to have b as the item type in the libsuite8 software
- $barcode =~ s/^[0]*(\d+)$/$branch-b-$1/i;
- }else{
- $barcode =~ s/^(\D+)[0]*(\d+)$/$branch-$1-$2/i;
- }
- }
- }
- return $barcode; # return barcode, modified or not
+ } elsif ($filter eq 'libsuite8') {
+ unless ($barcode =~ m/^($branch)-/i) { #if barcode starts with branch code its in Koha style. Skip it.
+ if ($barcode =~ m/^(\d)/i) { #Some barcodes even start with 0's & numbers and are assumed to have b as the item type in the libsuite8 software
+ $barcode =~ s/^[0]*(\d+)$/$branch-b-$1/i;
+ } else {
+ $barcode =~ s/^(\D+)[0]*(\d+)$/$branch-$1-$2/i;
+ }
+ }
+ }
+ return $barcode; # return barcode, modified or not
}
=head2 decode
sub decode {
my ($encoded) = @_;
- my $seq =
- 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
- my @s = map { index( $seq, $_ ); } split( //, $encoded );
- my $l = ( $#s + 1 ) % 4;
+ my $seq = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
+ my @s = map { index($seq, $_); } split(//, $encoded);
+ my $l = ($#s + 1) % 4;
if ($l) {
- if ( $l == 1 ) {
+ if ($l == 1) {
+
# warn "Error: Cuecat decode parsing failed!";
return;
}
$#s += $l;
}
my $r = '';
- while ( $#s >= 0 ) {
- my $n = ( ( $s[0] << 6 | $s[1] ) << 6 | $s[2] ) << 6 | $s[3];
- $r .=
- chr( ( $n >> 16 ) ^ 67 )
- .chr( ( $n >> 8 & 255 ) ^ 67 )
- .chr( ( $n & 255 ) ^ 67 );
- @s = @s[ 4 .. $#s ];
- }
- $r = substr( $r, 0, length($r) - $l );
+ while ($#s >= 0) {
+ my $n = (($s[0] << 6 | $s[1]) << 6 | $s[2]) << 6 | $s[3];
+ $r .= chr(($n >> 16) ^ 67) . chr(($n >> 8 & 255) ^ 67) . chr(($n & 255) ^ 67);
+ @s = @s[4 .. $#s];
+ }
+ $r = substr($r, 0, length($r) - $l);
return $r;
}
=cut
sub transferbook {
- my ( $tbr, $barcode, $ignoreRs ) = @_;
+ my ($tbr, $barcode, $ignoreRs) = @_;
my $messages;
- my $dotransfer = 1;
- my $branches = GetBranches();
- my $itemnumber = GetItemnumberFromBarcode( $barcode );
+ my $dotransfer = 1;
+ my $branches = GetBranches();
+ my $itemnumber = GetItemnumberFromBarcode($barcode);
my $issue = GetItemIssue($itemnumber);
- my $biblio = GetBiblioFromItemNumber($itemnumber);
+ my $biblio = GetBiblioFromItemNumber($itemnumber);
# bad barcode..
- if ( not $itemnumber ) {
+ if (not $itemnumber) {
$messages->{'BadBarcode'} = $barcode;
$dotransfer = 0;
}
my $fbr = $biblio->{'holdingbranch'};
# if using Branch Transfer Limits
- if ( C4::Context->preference("UseBranchTransferLimits") == 1 ) {
- if ( C4::Context->preference("item-level_itypes") && C4::Context->preference("BranchTransferLimitsType") eq 'itemtype' ) {
- if ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{'itype'} ) ) {
+ if (C4::Context->preference("UseBranchTransferLimits") == 1) {
+ if (C4::Context->preference("item-level_itypes") && C4::Context->preference("BranchTransferLimitsType") eq 'itemtype') {
+ if (!IsBranchTransferAllowed($tbr, $fbr, $biblio->{'itype'})) {
$messages->{'NotAllowed'} = $tbr . "::" . $biblio->{'itype'};
$dotransfer = 0;
}
- } elsif ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{ C4::Context->preference("BranchTransferLimitsType") } ) ) {
- $messages->{'NotAllowed'} = $tbr . "::" . $biblio->{ C4::Context->preference("BranchTransferLimitsType") };
+ } elsif (!IsBranchTransferAllowed($tbr, $fbr, $biblio->{C4::Context->preference("BranchTransferLimitsType")})) {
+ $messages->{'NotAllowed'} = $tbr . "::" . $biblio->{C4::Context->preference("BranchTransferLimitsType")};
$dotransfer = 0;
- }
+ }
}
# if is permanent...
- if ( $hbr && $branches->{$hbr}->{'PE'} ) {
+ if ($hbr && $branches->{$hbr}->{'PE'}) {
$messages->{'IsPermanent'} = $hbr;
$dotransfer = 0;
}
# can't transfer book if is already there....
- if ( $fbr eq $tbr ) {
+ if ($fbr eq $tbr) {
$messages->{'DestinationEqualsHolding'} = 1;
$dotransfer = 0;
}
# check if it is still issued to someone, return it...
if ($issue->{borrowernumber}) {
- AddReturn( $barcode, $fbr );
+ AddReturn($barcode, $fbr);
$messages->{'WasReturned'} = $issue->{borrowernumber};
}
# find reserves.....
# That'll save a database query.
- my ( $resfound, $resrec ) =
- CheckReserves( $itemnumber );
- if ( $resfound and not $ignoreRs ) {
+ my ($resfound, $resrec) = CheckReserves($itemnumber);
+ if ($resfound and not $ignoreRs) {
$resrec->{'ResFound'} = $resfound;
# $messages->{'ResFound'} = $resrec;
#actually do the transfer....
if ($dotransfer) {
- ModItemTransfer( $itemnumber, $fbr, $tbr );
+ ModItemTransfer($itemnumber, $fbr, $tbr);
# don't need to update MARC anymore, we do it in batch now
$messages->{'WasTransfered'} = 1;
}
- ModDateLastSeen( $itemnumber );
- return ( $dotransfer, $messages, $biblio );
+ ModDateLastSeen($itemnumber);
+ return ($dotransfer, $messages, $biblio);
}
-
sub TooMany {
- my $borrower = shift;
+ my $borrower = shift;
my $biblionumber = shift;
- my $item = shift;
- my $cat_borrower = $borrower->{'categorycode'};
- my $dbh = C4::Context->dbh;
- my $branch;
- # Get which branchcode we need
- $branch = _GetCircControlBranch($item,$borrower);
- my $type = (C4::Context->preference('item-level_itypes'))
- ? $item->{'itype'} # item-level
- : $item->{'itemtype'}; # biblio-level
-
+ my $item = shift;
+ my $cat_borrower = $borrower->{'categorycode'};
+ my $dbh = C4::Context->dbh;
+ my $branch;
+
+ # Get which branchcode we need
+ $branch = _GetCircControlBranch($item, $borrower);
+ my $type = (C4::Context->preference('item-level_itypes'))
+ ? $item->{'itype'} # item-level
+ : $item->{'itemtype'}; # biblio-level
+
# given branch, patron category, and item type, determine
# applicable issuing rule
my $issuing_rule = GetIssuingRule($cat_borrower, $type, $branch);
my $rule_itemtype = $issuing_rule->{itemtype};
if ($rule_itemtype eq "*") {
+
# matching rule has the default item type, so count only
# those existing loans that don't fall under a more
# specific rule
AND (categorycode = ? OR categorycode = ?)
AND itemtype <> '*'
) ";
- } else {
+ } else {
$count_query .= " JOIN biblioitems USING (biblionumber)
WHERE biblioitems.itemtype NOT IN (
SELECT itemtype FROM issuingrules
push @bind_params, $issuing_rule->{categorycode};
push @bind_params, $cat_borrower;
} else {
+
# rule has specific item type, so count loans of that
# specific item type
if (C4::Context->preference('item-level_itypes')) {
$count_query .= " WHERE items.itype = ? ";
- } else {
+ } else {
$count_query .= " JOIN biblioitems USING (biblionumber)
WHERE biblioitems.itemtype= ? ";
}
$count_query .= " AND issues.branchcode = ? ";
push @bind_params, $branch;
} elsif (C4::Context->preference('CircControl') eq 'PatronLibrary') {
- ; # if branch is the patron's home branch, then count all loans by patron
+ ; # if branch is the patron's home branch, then count all loans by patron
} else {
$count_query .= " AND items.homebranch = ? ";
push @bind_params, $branch;
# Now count total loans against the limit for the branch
my $branch_borrower_circ_rule = GetBranchBorrowerCircRule($branch, $cat_borrower);
if (defined($branch_borrower_circ_rule->{maxissueqty})) {
- my @bind_params = ();
+ my @bind_params = ();
my $branch_count_query = "SELECT COUNT(*) FROM issues
JOIN items USING (itemnumber)
WHERE borrowernumber = ? ";
$branch_count_query .= " AND issues.branchcode = ? ";
push @bind_params, $branch;
} elsif (C4::Context->preference('CircControl') eq 'PatronLibrary') {
- ; # if branch is the patron's home branch, then count all loans by patron
+ ; # if branch is the patron's home branch, then count all loans by patron
} else {
$branch_count_query .= " AND items.homebranch = ? ";
push @bind_params, $branch;
#'
sub itemissues {
- my ( $bibitem, $biblio ) = @_;
+ my ($bibitem, $biblio) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare("Select * from items where items.biblioitemnumber = ?")
+ my $sth = $dbh->prepare("Select * from items where items.biblioitemnumber = ?")
|| die $dbh->errstr;
my $i = 0;
my @results;
$sth->execute($bibitem) || die $sth->errstr;
- while ( my $data = $sth->fetchrow_hashref ) {
+ while (my $data = $sth->fetchrow_hashref) {
# Find out who currently has this item.
# FIXME - Wouldn't it be better to do this as a left join of
LEFT JOIN borrowers ON issues.borrowernumber = borrowers.borrowernumber
WHERE itemnumber = ?
"
- );
+ );
- $sth2->execute( $data->{'itemnumber'} );
- if ( my $data2 = $sth2->fetchrow_hashref ) {
+ $sth2->execute($data->{'itemnumber'});
+ if (my $data2 = $sth2->fetchrow_hashref) {
$data->{'date_due'} = $data2->{'date_due'};
$data->{'card'} = $data2->{'cardnumber'};
$data->{'borrower'} = $data2->{'borrowernumber'};
- }
- else {
+ } else {
$data->{'date_due'} = ($data->{'wthdrawn'} eq '1') ? 'Cancelled' : 'Available';
}
-
# Find the last 3 people who borrowed this item.
$sth2 = $dbh->prepare(
"SELECT * FROM old_issues
LEFT JOIN borrowers ON issues.borrowernumber = borrowers.borrowernumber
WHERE itemnumber = ?
ORDER BY returndate DESC,timestamp DESC"
- );
+ );
- $sth2->execute( $data->{'itemnumber'} );
- for ( my $i2 = 0 ; $i2 < 2 ; $i2++ )
- { # FIXME : error if there is less than 3 pple borrowing this item
- if ( my $data2 = $sth2->fetchrow_hashref ) {
+ $sth2->execute($data->{'itemnumber'});
+ for (my $i2 = 0 ; $i2 < 2 ; $i2++) { # FIXME : error if there is less than 3 pple borrowing this item
+ if (my $data2 = $sth2->fetchrow_hashref) {
$data->{"timestamp$i2"} = $data2->{'timestamp'};
$data->{"card$i2"} = $data2->{'cardnumber'};
$data->{"borrower$i2"} = $data2->{'borrowernumber'};
- } # if
+ } # if
} # for
$results[$i] = $data;
=cut
sub CanBookBeIssued {
- my ( $borrower, $barcode, $duedate, $inprocess ) = @_;
+ my ($borrower, $barcode, $duedate, $inprocess) = @_;
my %needsconfirmation; # filled with problems that needs confirmations
my %issuingimpossible; # filled with problems that causes the issue to be IMPOSSIBLE
- my $item = GetItem(GetItemnumberFromBarcode( $barcode ));
- my $issue = GetItemIssue($item->{itemnumber});
- my $biblioitem = GetBiblioItemData($item->{biblioitemnumber});
- $item->{'itemtype'}=$item->{'itype'};
- my $dbh = C4::Context->dbh;
+ my $item = GetItem(GetItemnumberFromBarcode($barcode));
+ my $issue = GetItemIssue($item->{itemnumber});
+ my $biblioitem = GetBiblioItemData($item->{biblioitemnumber});
+ $item->{'itemtype'} = $item->{'itype'};
+ my $dbh = C4::Context->dbh;
# MANDATORY CHECKS - unless item exists, nothing else matters
- unless ( $item->{barcode} ) {
+ unless ($item->{barcode}) {
$issuingimpossible{UNKNOWN_BARCODE} = 1;
}
- return ( \%issuingimpossible, \%needsconfirmation ) if %issuingimpossible;
+ return (\%issuingimpossible, \%needsconfirmation) if %issuingimpossible;
#
# DUE DATE is OK ? -- should already have checked.
#
- unless ( $duedate ) {
- my $issuedate = strftime( "%Y-%m-%d", localtime );
+ unless ($duedate) {
+ my $issuedate = strftime("%Y-%m-%d", localtime);
- my $branch = _GetCircControlBranch($item,$borrower);
- my $itype = ( C4::Context->preference('item-level_itypes') ) ? $item->{'itype'} : $biblioitem->{'itemtype'};
- $duedate = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower );
+ my $branch = _GetCircControlBranch($item, $borrower);
+ my $itype = (C4::Context->preference('item-level_itypes')) ? $item->{'itype'} : $biblioitem->{'itemtype'};
+ $duedate = CalcDateDue(C4::Dates->new($issuedate, 'iso'), $itype, $branch, $borrower);
# Offline circ calls AddIssue directly, doesn't run through here
# So issuingimpossible should be ok.
#
# BORROWER STATUS
#
- if ( $borrower->{'category_type'} eq 'X' && ( $item->{barcode} )) {
- # stats only borrower -- add entry to statistics table, and return issuingimpossible{STATS} = 1 .
- &UpdateStats(C4::Context->userenv->{'branch'},'localuse','','',$item->{'itemnumber'},$item->{'itemtype'},$borrower->{'borrowernumber'});
- ModDateLastSeen( $item->{'itemnumber'} );
- return( { STATS => 1 }, {});
+ if ($borrower->{'category_type'} eq 'X' && ($item->{barcode})) {
+
+ # stats only borrower -- add entry to statistics table, and return issuingimpossible{STATS} = 1 .
+ &UpdateStats(C4::Context->userenv->{'branch'}, 'localuse', '', '', $item->{'itemnumber'}, $item->{'itemtype'}, $borrower->{'borrowernumber'});
+ ModDateLastSeen($item->{'itemnumber'});
+ return ({STATS => 1}, {});
}
- if ( $borrower->{flags}->{GNA} ) {
+ if ($borrower->{flags}->{GNA}) {
$issuingimpossible{GNA} = 1;
}
- if ( $borrower->{flags}->{'LOST'} ) {
+ if ($borrower->{flags}->{'LOST'}) {
$issuingimpossible{CARD_LOST} = 1;
}
- if ( $borrower->{flags}->{'DBARRED'} ) {
+ if ($borrower->{flags}->{'DBARRED'}) {
$issuingimpossible{DEBARRED} = 1;
}
- if ( $borrower->{'dateexpiry'} eq '0000-00-00') {
+ if ($borrower->{'dateexpiry'} eq '0000-00-00') {
$issuingimpossible{EXPIRED} = 1;
} else {
- my @expirydate= split /-/,$borrower->{'dateexpiry'};
- if($expirydate[0]==0 || $expirydate[1]==0|| $expirydate[2]==0 ||
- Date_to_Days(Today) > Date_to_Days( @expirydate )) {
- $issuingimpossible{EXPIRED} = 1;
+ my @expirydate = split /-/, $borrower->{'dateexpiry'};
+ if ( $expirydate[0] == 0
+ || $expirydate[1] == 0
+ || $expirydate[2] == 0
+ || Date_to_Days(Today) > Date_to_Days(@expirydate)) {
+ $issuingimpossible{EXPIRED} = 1;
}
}
+
#
# BORROWER STATUS
#
# DEBTS
- my ($amount) =
- C4::Members::GetMemberAccountRecords( $borrower->{'borrowernumber'}, '' && $duedate->output('iso') );
- my $amountlimit = C4::Context->preference("noissuescharge");
- my $allowfineoverride = C4::Context->preference("AllowFineOverride");
+ my ($amount) = C4::Members::GetMemberAccountRecords($borrower->{'borrowernumber'}, '' && $duedate->output('iso'));
+ my $amountlimit = C4::Context->preference("noissuescharge");
+ my $allowfineoverride = C4::Context->preference("AllowFineOverride");
my $allfinesneedoverride = C4::Context->preference("AllFinesNeedOverride");
- if ( C4::Context->preference("IssuingInProcess") ) {
- if ( $amount > $amountlimit && !$inprocess && !$allowfineoverride) {
- $issuingimpossible{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $amount > $amountlimit && !$inprocess && $allowfineoverride) {
- $needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $allfinesneedoverride && $amount > 0 && $amount <= $amountlimit && !$inprocess ) {
- $needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
+ if (C4::Context->preference("IssuingInProcess")) {
+ if ($amount > $amountlimit && !$inprocess && !$allowfineoverride) {
+ $issuingimpossible{DEBT} = sprintf("%.2f", $amount);
+ } elsif ($amount > $amountlimit && !$inprocess && $allowfineoverride) {
+ $needsconfirmation{DEBT} = sprintf("%.2f", $amount);
+ } elsif ($allfinesneedoverride && $amount > 0 && $amount <= $amountlimit && !$inprocess) {
+ $needsconfirmation{DEBT} = sprintf("%.2f", $amount);
}
- }
- else {
- if ( $amount > $amountlimit && $allowfineoverride ) {
- $needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $amount > $amountlimit && !$allowfineoverride) {
- $issuingimpossible{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $amount > 0 && $allfinesneedoverride ) {
- $needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
+ } else {
+ if ($amount > $amountlimit && $allowfineoverride) {
+ $needsconfirmation{DEBT} = sprintf("%.2f", $amount);
+ } elsif ($amount > $amountlimit && !$allowfineoverride) {
+ $issuingimpossible{DEBT} = sprintf("%.2f", $amount);
+ } elsif ($amount > 0 && $allfinesneedoverride) {
+ $needsconfirmation{DEBT} = sprintf("%.2f", $amount);
}
}
my ($blocktype, $count) = C4::Members::IsMemberBlocked($borrower->{'borrowernumber'});
if ($blocktype == -1) {
## patron has outstanding overdue loans
- if ( C4::Context->preference("OverduesBlockCirc") eq 'block'){
- $issuingimpossible{USERBLOCKEDOVERDUE} = $count;
- }
- elsif ( C4::Context->preference("OverduesBlockCirc") eq 'confirmation'){
- $needsconfirmation{USERBLOCKEDOVERDUE} = $count;
- }
- } elsif($blocktype == 1) {
+ if (C4::Context->preference("OverduesBlockCirc") eq 'block') {
+ $issuingimpossible{USERBLOCKEDOVERDUE} = $count;
+ } elsif (C4::Context->preference("OverduesBlockCirc") eq 'confirmation') {
+ $needsconfirmation{USERBLOCKEDOVERDUE} = $count;
+ }
+ } elsif ($blocktype == 1) {
+
# patron has accrued fine days
$issuingimpossible{USERBLOCKEDREMAINING} = $count;
}
-#
+ #
# JB34 CHECKS IF BORROWERS DONT HAVE ISSUE TOO MANY BOOKS
#
- my ($current_loan_count, $max_loans_allowed) = TooMany( $borrower, $item->{biblionumber}, $item );
+ my ($current_loan_count, $max_loans_allowed) = TooMany($borrower, $item->{biblionumber}, $item);
+
# if TooMany max_loans_allowed returns 0 the user doesn't have permission to check out this book
if ($max_loans_allowed eq 0) {
$needsconfirmation{PATRON_CANT} = 1;
} else {
- if($max_loans_allowed){
- $needsconfirmation{TOO_MANY} = 1;
+ if ($max_loans_allowed) {
+ $needsconfirmation{TOO_MANY} = 1;
$needsconfirmation{current_loan_count} = $current_loan_count;
- $needsconfirmation{max_loans_allowed} = $max_loans_allowed;
+ $needsconfirmation{max_loans_allowed} = $max_loans_allowed;
}
}
# ITEM CHECKING
#
if ( $item->{'notforloan'}
- && $item->{'notforloan'} > 0 )
- {
- if(!C4::Context->preference("AllowNotForLoanOverride")){
+ && $item->{'notforloan'} > 0) {
+ if (!C4::Context->preference("AllowNotForLoanOverride")) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
- }else{
+ } else {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
- }
- elsif ( !$item->{'notforloan'} ){
+ } elsif (!$item->{'notforloan'}) {
+
# we have to check itemtypes.notforloan also
- if (C4::Context->preference('item-level_itypes')){
+ if (C4::Context->preference('item-level_itypes')) {
+
# this should probably be a subroutine
my $sth = $dbh->prepare("SELECT notforloan FROM itemtypes WHERE itemtype = ?");
$sth->execute($item->{'itemtype'});
- my $notforloan=$sth->fetchrow_hashref();
+ my $notforloan = $sth->fetchrow_hashref();
$sth->finish();
if ($notforloan->{'notforloan'}) {
if (!C4::Context->preference("AllowNotForLoanOverride")) {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
}
- }
- elsif ($biblioitem->{'notforloan'} == 1){
+ } elsif ($biblioitem->{'notforloan'} == 1) {
if (!C4::Context->preference("AllowNotForLoanOverride")) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
} else {
}
}
}
- if ( $item->{'wthdrawn'} && $item->{'wthdrawn'} > 0 )
- {
+ if ($item->{'wthdrawn'} && $item->{'wthdrawn'} > 0) {
$issuingimpossible{WTHDRAWN} = 1;
}
if ( $item->{'restricted'}
- && $item->{'restricted'} == 1 )
- {
+ && $item->{'restricted'} == 1) {
$issuingimpossible{RESTRICTED} = 1;
}
- if ( C4::Context->preference("IndependantBranches") ) {
+ if (C4::Context->preference("IndependantBranches")) {
my $userenv = C4::Context->userenv;
- if ( ($userenv) && ( $userenv->{flags} % 2 != 1 ) ) {
+ if (($userenv) && ($userenv->{flags} % 2 != 1)) {
$issuingimpossible{ITEMNOTSAMEBRANCH} = 1
- if ( $item->{C4::Context->preference("HomeOrHoldingBranch")} ne $userenv->{branch} );
- $needsconfirmation{BORRNOTSAMEBRANCH} = GetBranchName( $borrower->{'branchcode'} )
- if ( $borrower->{'branchcode'} ne $userenv->{branch} );
+ if ($item->{C4::Context->preference("HomeOrHoldingBranch")} ne $userenv->{branch});
+ $needsconfirmation{BORRNOTSAMEBRANCH} = GetBranchName($borrower->{'branchcode'})
+ if ($borrower->{'branchcode'} ne $userenv->{branch});
}
}
#
# CHECK IF BOOK ALREADY ISSUED TO THIS BORROWER
#
- if ( $issue->{borrowernumber} && $issue->{borrowernumber} eq $borrower->{'borrowernumber'} )
- {
+ if ($issue->{borrowernumber} && $issue->{borrowernumber} eq $borrower->{'borrowernumber'}) {
# Already issued to current borrower. Ask whether the loan should
# be renewed.
- my ($CanBookBeRenewed,$renewerror) = CanBookBeRenewed(
- $borrower->{'borrowernumber'},
- $item->{'itemnumber'}
- );
- if ( $CanBookBeRenewed == 0 ) { # no more renewals allowed
+ my ($CanBookBeRenewed, $renewerror) = CanBookBeRenewed($borrower->{'borrowernumber'}, $item->{'itemnumber'});
+ if ($CanBookBeRenewed == 0) { # no more renewals allowed
$issuingimpossible{NO_MORE_RENEWALS} = 1;
- }
- else {
+ } else {
$needsconfirmation{RENEW_ISSUE} = 1;
}
- }
- elsif ($issue->{borrowernumber}) {
+ } elsif ($issue->{borrowernumber}) {
# issued to someone else
- my $currborinfo = C4::Members::GetMemberDetails( $issue->{borrowernumber} );
+ my $currborinfo = C4::Members::GetMemberDetails($issue->{borrowernumber});
-# warn "=>.$currborinfo->{'firstname'} $currborinfo->{'surname'} ($currborinfo->{'cardnumber'})";
- $needsconfirmation{ISSUED_TO_ANOTHER} = 1;
- $needsconfirmation{issued_firstname} = $currborinfo->{'firstname'};
- $needsconfirmation{issued_surname} = $currborinfo->{'surname'};
- $needsconfirmation{issued_cardnumber} = $currborinfo->{'cardnumber'};
+ # warn "=>.$currborinfo->{'firstname'} $currborinfo->{'surname'} ($currborinfo->{'cardnumber'})";
+ $needsconfirmation{ISSUED_TO_ANOTHER} = 1;
+ $needsconfirmation{issued_firstname} = $currborinfo->{'firstname'};
+ $needsconfirmation{issued_surname} = $currborinfo->{'surname'};
+ $needsconfirmation{issued_cardnumber} = $currborinfo->{'cardnumber'};
$needsconfirmation{issued_borrowernumber} = $currborinfo->{'borrowernumber'};
}
# See if the item is on reserve.
- my ( $restype, $res ) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
+ my ($restype, $res) = C4::Reserves::CheckReserves($item->{'itemnumber'});
if ($restype) {
- my $resbor = $res->{'borrowernumber'};
- my ( $resborrower ) = C4::Members::GetMemberDetails( $resbor, 0 );
- my $branches = GetBranches();
- my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'};
- if ( $resbor ne $borrower->{'borrowernumber'} && $restype eq "Waiting" )
- {
+ my $resbor = $res->{'borrowernumber'};
+ my ($resborrower) = C4::Members::GetMemberDetails($resbor, 0);
+ my $branches = GetBranches();
+ my $branchname = $branches->{$res->{'branchcode'}}->{'branchname'};
+ if ($resbor ne $borrower->{'borrowernumber'} && $restype eq "Waiting") {
+
# The item is on reserve and waiting, but has been
# reserved by some other patron.
- $needsconfirmation{RESERVE_WAITING} = 1;
- $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
- $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
- $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
+ $needsconfirmation{RESERVE_WAITING} = 1;
+ $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
+ $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
+ $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
$needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'};
- $needsconfirmation{'resbranchname'} = $branchname;
- $needsconfirmation{'reswaitingdate'} = format_date($res->{'waitingdate'});
- }
- elsif ( $restype eq "Reserved" ) {
+ $needsconfirmation{'resbranchname'} = $branchname;
+ $needsconfirmation{'reswaitingdate'} = format_date($res->{'waitingdate'});
+ } elsif ($restype eq "Reserved") {
+
# The item is on reserve for someone else.
- $needsconfirmation{RESERVED} = 1;
- $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
- $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
- $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
+ $needsconfirmation{RESERVED} = 1;
+ $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
+ $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
+ $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
$needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'};
- $needsconfirmation{'resbranchname'} = $branchname;
- $needsconfirmation{'resreservedate'} = format_date($res->{'reservedate'});
+ $needsconfirmation{'resbranchname'} = $branchname;
+ $needsconfirmation{'resreservedate'} = format_date($res->{'reservedate'});
}
}
- return ( \%issuingimpossible, \%needsconfirmation );
+ return (\%issuingimpossible, \%needsconfirmation);
}
=head2 AddIssue
=cut
sub AddIssue {
- my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode) = @_;
- my $dbh = C4::Context->dbh;
- my $barcodecheck=CheckValidBarcode($barcode);
+ my ($borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode) = @_;
+ my $dbh = C4::Context->dbh;
+ my $barcodecheck = CheckValidBarcode($barcode);
+
# $issuedate defaults to today.
- if ( ! defined $issuedate ) {
- $issuedate = strftime( "%Y-%m-%d", localtime );
+ if (!defined $issuedate) {
+ $issuedate = strftime("%Y-%m-%d", localtime);
+
# TODO: for hourly circ, this will need to be a C4::Dates object
# and all calls to AddIssue including issuedate will need to pass a Dates object.
}
- if ($borrower and $barcode and $barcodecheck ne '0'){
- # find which item we issue
- my $item = GetItem('', $barcode) or return undef; # if we don't get an Item, abort.
- my $branch = _GetCircControlBranch($item,$borrower);
-
- # get actual issuing if there is one
- my $actualissue = GetItemIssue( $item->{itemnumber});
-
- # get biblioinformation for this item
- my $biblio = GetBiblioFromItemNumber($item->{itemnumber});
-
- #
- # check if we just renew the issue.
- #
- if ($actualissue->{borrowernumber} eq $borrower->{'borrowernumber'}) {
- $datedue = AddRenewal(
- $borrower->{'borrowernumber'},
- $item->{'itemnumber'},
- $branch,
- $datedue,
- $issuedate, # here interpreted as the renewal date
- );
- }
- else {
- # it's NOT a renewal
- if ( $actualissue->{borrowernumber}) {
- # This book is currently on loan, but not to the person
- # who wants to borrow it now. mark it returned before issuing to the new borrower
- AddReturn(
- $item->{'barcode'},
- C4::Context->userenv->{'branch'}
- );
- }
-
- # See if the item is on reserve.
- my ( $restype, $res ) =
- C4::Reserves::CheckReserves( $item->{'itemnumber'} );
- if ($restype) {
- my $resbor = $res->{'borrowernumber'};
- if ( $resbor eq $borrower->{'borrowernumber'} ) {
- # The item is reserved by the current patron
- ModReserveFill($res);
- }
- elsif ( $restype eq "Waiting" ) {
- # warn "Waiting";
- # The item is on reserve and waiting, but has been
- # reserved by some other patron.
- }
- elsif ( $restype eq "Reserved" ) {
- # warn "Reserved";
- # The item is reserved by someone else.
- if ($cancelreserve) { # cancel reserves on this item
- CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
- }
- }
- if ($cancelreserve) {
- CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
- }
- else {
- # set waiting reserve to first in reserve queue as book isn't waiting now
- ModReserve(1,
- $res->{'biblionumber'},
- $res->{'borrowernumber'},
- $res->{'branchcode'}
- );
- }
- }
-
- # Starting process for transfer job (checking transfert and validate it if we have one)
+ if ($borrower and $barcode and $barcodecheck ne '0') {
+
+ # find which item we issue
+ my $item = GetItem('', $barcode) or return undef; # if we don't get an Item, abort.
+ my $branch = _GetCircControlBranch($item, $borrower);
+
+ # get actual issuing if there is one
+ my $actualissue = GetItemIssue($item->{itemnumber});
+
+ # get biblioinformation for this item
+ my $biblio = GetBiblioFromItemNumber($item->{itemnumber});
+
+ #
+ # check if we just renew the issue.
+ #
+ if ($actualissue->{borrowernumber} eq $borrower->{'borrowernumber'}) {
+ $datedue = AddRenewal($borrower->{'borrowernumber'},
+ $item->{'itemnumber'},
+ $branch,
+ $datedue,
+ $issuedate, # here interpreted as the renewal date
+ );
+ } else {
+
+ # it's NOT a renewal
+ if ($actualissue->{borrowernumber}) {
+
+ # This book is currently on loan, but not to the person
+ # who wants to borrow it now. mark it returned before issuing to the new borrower
+ AddReturn($item->{'barcode'}, C4::Context->userenv->{'branch'});
+ }
+
+ # See if the item is on reserve.
+ my ($restype, $res) = C4::Reserves::CheckReserves($item->{'itemnumber'});
+ if ($restype) {
+ my $resbor = $res->{'borrowernumber'};
+ if ($resbor eq $borrower->{'borrowernumber'}) {
+
+ # The item is reserved by the current patron
+ ModReserveFill($res);
+ } elsif ($restype eq "Waiting") {
+
+ # warn "Waiting";
+ # The item is on reserve and waiting, but has been
+ # reserved by some other patron.
+ } elsif ($restype eq "Reserved") {
+
+ # warn "Reserved";
+ # The item is reserved by someone else.
+ if ($cancelreserve) { # cancel reserves on this item
+ CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
+ }
+ }
+ if ($cancelreserve) {
+ CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
+ } else {
+
+ # set waiting reserve to first in reserve queue as book isn't waiting now
+ ModReserve(1, $res->{'biblionumber'}, $res->{'borrowernumber'}, $res->{'branchcode'});
+ }
+ }
+
+ # Starting process for transfer job (checking transfert and validate it if we have one)
my ($datesent) = GetTransfers($item->{'itemnumber'});
if ($datesent) {
- # updating line of branchtranfert to finish it, and changing the to branch value, implement a comment for visibility of this case (maybe for stats ....)
- my $sth =
- $dbh->prepare(
+
+ # updating line of branchtranfert to finish it, and changing the to branch value, implement a comment for visibility of this case (maybe for stats ....)
+ my $sth = $dbh->prepare(
"UPDATE branchtransfers
SET datearrived = now(),
tobranch = ?,
comments = 'Forced branchtransfer'
WHERE itemnumber= ? AND datearrived IS NULL"
- );
- $sth->execute(C4::Context->userenv->{'branch'},$item->{'itemnumber'});
+ );
+ $sth->execute(C4::Context->userenv->{'branch'}, $item->{'itemnumber'});
}
- # Record in the database the fact that the book was issued.
- my $sth =
- $dbh->prepare(
+ # Record in the database the fact that the book was issued.
+ my $sth = $dbh->prepare(
"INSERT INTO issues
(borrowernumber, itemnumber,issuedate, date_due, branchcode)
VALUES (?,?,?,?,?)"
- );
- unless ($datedue) {
- my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'};
- $datedue = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower );
+ );
+ unless ($datedue) {
+ my $itype = (C4::Context->preference('item-level_itypes')) ? $biblio->{'itype'} : $biblio->{'itemtype'};
+ $datedue = CalcDateDue(C4::Dates->new($issuedate, 'iso'), $itype, $branch, $borrower);
- }
- $sth->execute(
- $borrower->{'borrowernumber'}, # borrowernumber
- $item->{'itemnumber'}, # itemnumber
- $issuedate, # issuedate
- $datedue->output('iso'), # date_due
- C4::Context->userenv->{'branch'} # branchcode
- );
- $sth->finish;
- if ( C4::Context->preference('ReturnToShelvingCart') ) { ## ReturnToShelvingCart is on, anything issued should be taken off the cart.
- CartToShelf( $item->{'itemnumber'} );
- }
- $item->{'issues'}++;
- ModItem({ issues => $item->{'issues'},
- holdingbranch => C4::Context->userenv->{'branch'},
- itemlost => 0,
- datelastborrowed => C4::Dates->new()->output('iso'),
- onloan => $datedue->output('iso'),
- }, $item->{'biblionumber'}, $item->{'itemnumber'});
- ModDateLastSeen( $item->{'itemnumber'} );
-
- # If it costs to borrow this book, charge it to the patron's account.
- my ( $charge, $itemtype ) = GetIssuingCharges(
- $item->{'itemnumber'},
- $borrower->{'borrowernumber'}
- );
- if ( $charge > 0 ) {
- AddIssuingCharge(
- $item->{'itemnumber'},
- $borrower->{'borrowernumber'}, $charge
- );
- $item->{'charge'} = $charge;
- }
+ }
+ $sth->execute($borrower->{'borrowernumber'}, # borrowernumber
+ $item->{'itemnumber'}, # itemnumber
+ $issuedate, # issuedate
+ $datedue->output('iso'), # date_due
+ C4::Context->userenv->{'branch'} # branchcode
+ );
+ $sth->finish;
+ if (C4::Context->preference('ReturnToShelvingCart')) { ## ReturnToShelvingCart is on, anything issued should be taken off the cart.
+ CartToShelf($item->{'itemnumber'});
+ }
+ $item->{'issues'}++;
+ ModItem(
+ {issues => $item->{'issues'},
+ holdingbranch => C4::Context->userenv->{'branch'},
+ itemlost => 0,
+ datelastborrowed => C4::Dates->new()->output('iso'),
+ onloan => $datedue->output('iso'),
+ },
+ $item->{'biblionumber'},
+ $item->{'itemnumber'}
+ );
+ ModDateLastSeen($item->{'itemnumber'});
+
+ # If it costs to borrow this book, charge it to the patron's account.
+ my ($charge, $itemtype) = GetIssuingCharges($item->{'itemnumber'}, $borrower->{'borrowernumber'});
+ if ($charge > 0) {
+ AddIssuingCharge($item->{'itemnumber'}, $borrower->{'borrowernumber'}, $charge);
+ $item->{'charge'} = $charge;
+ }
- # Record the fact that this book was issued.
- &UpdateStats(
- C4::Context->userenv->{'branch'},
- 'issue', $charge,
- ($sipmode ? "SIP-$sipmode" : ''), $item->{'itemnumber'},
- $item->{'itype'}, $borrower->{'borrowernumber'}
- );
-
- # Send a checkout slip.
- my $circulation_alert = 'C4::ItemCirculationAlertPreference';
- my %conditions = (
- branchcode => $branch,
- categorycode => $borrower->{categorycode},
- item_type => $item->{itype},
- notification => 'CHECKOUT',
- );
- if ($circulation_alert->is_enabled_for(\%conditions)) {
- SendCirculationAlert({
- type => 'CHECKOUT',
- item => $item,
- borrower => $borrower,
- branch => $branch,
- });
+ # Record the fact that this book was issued.
+ &UpdateStats(C4::Context->userenv->{'branch'},
+ 'issue', $charge, ($sipmode ? "SIP-$sipmode" : ''),
+ $item->{'itemnumber'}, $item->{'itype'}, $borrower->{'borrowernumber'});
+
+ # Send a checkout slip.
+ my $circulation_alert = 'C4::ItemCirculationAlertPreference';
+ my %conditions = (branchcode => $branch,
+ categorycode => $borrower->{categorycode},
+ item_type => $item->{itype},
+ notification => 'CHECKOUT',
+ );
+ if ($circulation_alert->is_enabled_for(\%conditions)) {
+ SendCirculationAlert(
+ {type => 'CHECKOUT',
+ item => $item,
+ borrower => $borrower,
+ branch => $branch,
+ }
+ );
+ }
}
- }
- logaction("CIRCULATION", "ISSUE", $borrower->{'borrowernumber'}, $biblio->{'biblionumber'})
- if C4::Context->preference("IssueLog");
- }
- return ($datedue); # not necessarily the same as when it came in!
+ logaction("CIRCULATION", "ISSUE", $borrower->{'borrowernumber'}, $biblio->{'biblionumber'})
+ if C4::Context->preference("IssueLog");
+ }
+ return ($datedue); # not necessarily the same as when it came in!
}
=head2 GetLoanLength
=cut
sub GetLoanLength {
- my ( $borrowertype, $itemtype, $branchcode ) = @_;
+ my ($borrowertype, $itemtype, $branchcode) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare(
-"select issuelength from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null"
- );
-# warn "in get loan lenght $borrowertype $itemtype $branchcode ";
-# try to find issuelength & return the 1st available.
-# check with borrowertype, itemtype and branchcode, then without one of those parameters
- $sth->execute( $borrowertype, $itemtype, $branchcode );
+ my $sth = $dbh->prepare("select issuelength from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null");
+
+ # warn "in get loan lenght $borrowertype $itemtype $branchcode ";
+ # try to find issuelength & return the 1st available.
+ # check with borrowertype, itemtype and branchcode, then without one of those parameters
+ $sth->execute($borrowertype, $itemtype, $branchcode);
my $loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
- $sth->execute( $borrowertype, "*", $branchcode );
+ $sth->execute($borrowertype, "*", $branchcode);
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
- $sth->execute( "*", $itemtype, $branchcode );
+ $sth->execute("*", $itemtype, $branchcode);
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
- $sth->execute( "*", "*", $branchcode );
+ $sth->execute("*", "*", $branchcode);
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
- $sth->execute( $borrowertype, $itemtype, "*" );
+ $sth->execute($borrowertype, $itemtype, "*");
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
- $sth->execute( $borrowertype, "*", "*" );
+ $sth->execute($borrowertype, "*", "*");
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
- $sth->execute( "*", $itemtype, "*" );
+ $sth->execute("*", $itemtype, "*");
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
- $sth->execute( "*", "*", "*" );
+ $sth->execute("*", "*", "*");
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
return 21;
}
-
=head2 GetHardDueDate
my ($hardduedate,$hardduedatecompare) = &GetHardDueDate($borrowertype,$itemtype,branchcode)
=cut
sub GetHardDueDate {
- my ( $borrowertype, $itemtype, $branchcode ) = @_;
+ my ($borrowertype, $itemtype, $branchcode) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare(
-"select hardduedate, hardduedatecompare from issuingrules where categorycode=? and itemtype=? and branchcode=?"
- );
- $sth->execute( $borrowertype, $itemtype, $branchcode );
+ my $sth = $dbh->prepare("select hardduedate, hardduedatecompare from issuingrules where categorycode=? and itemtype=? and branchcode=?");
+ $sth->execute($borrowertype, $itemtype, $branchcode);
my $results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
- $sth->execute( $borrowertype, "*", $branchcode );
+ $sth->execute($borrowertype, "*", $branchcode);
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
- $sth->execute( "*", $itemtype, $branchcode );
+ $sth->execute("*", $itemtype, $branchcode);
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
- $sth->execute( "*", "*", $branchcode );
+ $sth->execute("*", "*", $branchcode);
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
- $sth->execute( $borrowertype, $itemtype, "*" );
+ $sth->execute($borrowertype, $itemtype, "*");
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
- $sth->execute( $borrowertype, "*", "*" );
+ $sth->execute($borrowertype, "*", "*");
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
- $sth->execute( "*", $itemtype, "*" );
+ $sth->execute("*", $itemtype, "*");
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
- $sth->execute( "*", "*", "*" );
+ $sth->execute("*", "*", "*");
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return (C4::Dates->new($results->{hardduedate}, 'iso'), $results->{hardduedatecompare})
if defined($results) && $results->{hardduedate} ne 'NULL';
# if no rule is set => return undefined
=cut
sub GetIssuingRule {
- my ( $borrowertype, $itemtype, $branchcode ) = @_;
+ my ($borrowertype, $itemtype, $branchcode) = @_;
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "select * from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null" );
+ my $sth = $dbh->prepare("select * from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null");
my $irule;
- $sth->execute( $borrowertype, $itemtype, $branchcode );
+ $sth->execute($borrowertype, $itemtype, $branchcode);
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
- $sth->execute( $borrowertype, "*", $branchcode );
+ $sth->execute($borrowertype, "*", $branchcode);
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
- $sth->execute( "*", $itemtype, $branchcode );
+ $sth->execute("*", $itemtype, $branchcode);
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
- $sth->execute( "*", "*", $branchcode );
+ $sth->execute("*", "*", $branchcode);
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
- $sth->execute( $borrowertype, $itemtype, "*" );
+ $sth->execute($borrowertype, $itemtype, "*");
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
- $sth->execute( $borrowertype, "*", "*" );
+ $sth->execute($borrowertype, "*", "*");
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
- $sth->execute( "*", $itemtype, "*" );
+ $sth->execute("*", $itemtype, "*");
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
- $sth->execute( "*", "*", "*" );
+ $sth->execute("*", "*", "*");
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
# if no rule matches,
return undef;
=cut
sub GetBranchBorrowerCircRule {
- my $branchcode = shift;
+ my $branchcode = shift;
my $categorycode = shift;
my $branch_cat_query = "SELECT maxissueqty
if ($result = $sth->fetchrow_hashref()) {
return $result;
}
-
+
# try default branch, default borrower category
my $default_query = "SELECT maxissueqty
FROM default_circ_rules";
if ($result = $sth->fetchrow_hashref()) {
return $result;
}
-
+
# built-in default circulation rule
- return {
- maxissueqty => undef,
- };
+ return {maxissueqty => undef,};
}
=head2 GetBranchItemRule
=cut
sub GetBranchItemRule {
- my ( $branchcode, $itemtype ) = @_;
- my $dbh = C4::Context->dbh();
+ my ($branchcode, $itemtype) = @_;
+ my $dbh = C4::Context->dbh();
my $result = {};
my @attempts = (
['SELECT holdallowed
FROM branch_item_rules
WHERE branchcode = ?
- AND itemtype = ?', $branchcode, $itemtype],
+ AND itemtype = ?', $branchcode, $itemtype
+ ],
['SELECT holdallowed
FROM default_branch_circ_rules
- WHERE branchcode = ?', $branchcode],
+ WHERE branchcode = ?', $branchcode
+ ],
['SELECT holdallowed
FROM default_branch_item_rules
- WHERE itemtype = ?', $itemtype],
+ WHERE itemtype = ?', $itemtype
+ ],
['SELECT holdallowed
- FROM default_circ_rules'],
+ FROM default_circ_rules'
+ ],
);
foreach my $attempt (@attempts) {
# Since branch/category and branch/itemtype use the same per-branch
# defaults tables, we have to check that the key we want is set, not
# just that a row was returned
- return $result if ( defined( $result->{'holdallowed'} = $dbh->selectrow_array( $query, {}, @bind_params ) ) );
+ return $result if (defined($result->{'holdallowed'} = $dbh->selectrow_array($query, {}, @bind_params)));
}
-
+
# built-in default circulation rule
- return {
- holdallowed => 2,
- };
+ return {holdallowed => 2,};
}
=head2 AddReturn
=cut
sub AddReturn {
- my ( $barcode, $branch, $exemptfine, $dropbox ) = @_;
+ my ($barcode, $branch, $exemptfine, $dropbox) = @_;
if ($branch and not GetBranchDetail($branch)) {
warn "AddReturn error: branch '$branch' not found. Reverting to " . C4::Context->userenv->{'branch'};
undef $branch;
}
- $branch = C4::Context->userenv->{'branch'} unless $branch; # we trust userenv to be a safe fallback/default
+ $branch = C4::Context->userenv->{'branch'} unless $branch; # we trust userenv to be a safe fallback/default
my $messages;
my $borrower;
my $biblio;
my $doreturn = 1;
my $validTransfert = 0;
-
+
# get information on item
- my $itemnumber = GetItemnumberFromBarcode( $barcode );
+ my $itemnumber = GetItemnumberFromBarcode($barcode);
unless ($itemnumber) {
- return (0, { BadBarcode => $barcode }); # no barcode means no item or borrower. bail out.
+ return (0, {BadBarcode => $barcode}); # no barcode means no item or borrower. bail out.
}
- my $issue = GetItemIssue($itemnumber);
-# warn Dumper($iteminformation);
+ my $issue = GetItemIssue($itemnumber);
+
+ # warn Dumper($iteminformation);
if ($issue and $issue->{borrowernumber}) {
$borrower = C4::Members::GetMemberDetails($issue->{borrowernumber})
- or die "Data inconsistency: barcode $barcode (itemnumber:$itemnumber) claims to be issued to non-existant borrowernumber '$issue->{borrowernumber}'\n"
- . Dumper($issue) . "\n";
+ or die "Data inconsistency: barcode $barcode (itemnumber:$itemnumber) claims to be issued to non-existant borrowernumber '$issue->{borrowernumber}'\n"
+ . Dumper($issue) . "\n";
} else {
$messages->{'NotIssued'} = $barcode;
+
# even though item is not on loan, it may still be transferred; therefore, get current branch info
$doreturn = 0;
+
# No issue, no borrowernumber. ONLY if $doreturn, *might* you have a $borrower later.
}
my $item = GetItem($itemnumber) or die "GetItem($itemnumber) failed";
- # full item data, but no borrowernumber or checkout info (no issue)
- # we know GetItem should work because GetItemnumberFromBarcode worked
- my $hbr = C4::Context->preference("HomeOrHoldingBranchReturn") || "homebranch";
+
+ # full item data, but no borrowernumber or checkout info (no issue)
+ # we know GetItem should work because GetItemnumberFromBarcode worked
+ my $hbr = C4::Context->preference("HomeOrHoldingBranchReturn") || "homebranch";
$hbr = $item->{$hbr} || '';
- # item must be from items table -- issues table has branchcode and issuingbranch, not homebranch nor holdingbranch
+
+ # item must be from items table -- issues table has branchcode and issuingbranch, not homebranch nor holdingbranch
my $borrowernumber = $borrower->{'borrowernumber'} || undef; # we don't know if we had a borrower or not
# check if the book is in a permanent collection....
# FIXME -- This 'PE' attribute is largely undocumented. afaict, there's no user interface that reflects this functionality.
- if ( $hbr ) {
- my $branches = GetBranches(); # a potentially expensive call for a non-feature.
+ if ($hbr) {
+ my $branches = GetBranches(); # a potentially expensive call for a non-feature.
$branches->{$hbr}->{PE} and $messages->{'IsPermanent'} = $hbr;
}
# if indy branches and returning to different branch, refuse the return
- if ($hbr ne $branch && C4::Context->preference("IndependantBranches")){
- $messages->{'Wrongbranch'} = {
- Wrongbranch => $branch,
- Rightbranch => $hbr,
- };
+ if ($hbr ne $branch && C4::Context->preference("IndependantBranches")) {
+ $messages->{'Wrongbranch'} = {Wrongbranch => $branch,
+ Rightbranch => $hbr,
+ };
$doreturn = 0;
+
# bailing out here - in this case, current desired behavior
# is to act as if no return ever happened at all.
# FIXME - even in an indy branches situation, there should
# still be an option for the library to accept the item
# and transfer it to its owning library.
- return ( $doreturn, $messages, $issue, $borrower );
+ return ($doreturn, $messages, $issue, $borrower);
}
- if ( $item->{'wthdrawn'} ) { # book has been cancelled
+ if ($item->{'wthdrawn'}) { # book has been cancelled
$messages->{'wthdrawn'} = 1;
$doreturn = 0;
}
# case of a return of document (deal with issues and holdingbranch)
if ($doreturn) {
$borrower or warn "AddReturn without current borrower";
- my $circControlBranch;
+ my $circControlBranch;
if ($dropbox) {
+
# define circControlBranch only if dropbox mode is set
# don't allow dropbox mode to create an invalid entry in issues (issuedate > today)
# FIXME: check issuedate > returndate, factoring in holidays
- $circControlBranch = _GetCircControlBranch($item,$borrower) unless ( $item->{'issuedate'} eq C4::Dates->today('iso') );;
+ $circControlBranch = _GetCircControlBranch($item, $borrower) unless ($item->{'issuedate'} eq C4::Dates->today('iso'));
}
if ($borrowernumber) {
$messages->{'WasReturned'} = 1; # FIXME is the "= 1" right? This could be the borrower hash.
}
- ModItem({ onloan => undef }, $issue->{'biblionumber'}, $item->{'itemnumber'});
+ ModItem({onloan => undef}, $issue->{'biblionumber'}, $item->{'itemnumber'});
}
# the holdingbranch is updated if the document is returned to another location.
# this is always done regardless of whether the item was on loan or not
if ($item->{'holdingbranch'} ne $branch) {
UpdateHoldingbranch($branch, $item->{'itemnumber'});
- $item->{'holdingbranch'} = $branch; # update item data holdingbranch too
+ $item->{'holdingbranch'} = $branch; # update item data holdingbranch too
}
- ModDateLastSeen( $item->{'itemnumber'} );
+ ModDateLastSeen($item->{'itemnumber'});
# check if we have a transfer for this document
- my ($datesent,$frombranch,$tobranch) = GetTransfers( $item->{'itemnumber'} );
+ my ($datesent, $frombranch, $tobranch) = GetTransfers($item->{'itemnumber'});
# if we have a transfer to do, we update the line of transfers with the datearrived
if ($datesent) {
- if ( $tobranch eq $branch ) {
- my $sth = C4::Context->dbh->prepare(
- "UPDATE branchtransfers SET datearrived = now() WHERE itemnumber= ? AND datearrived IS NULL"
- );
- $sth->execute( $item->{'itemnumber'} );
+ if ($tobranch eq $branch) {
+ my $sth = C4::Context->dbh->prepare("UPDATE branchtransfers SET datearrived = now() WHERE itemnumber= ? AND datearrived IS NULL");
+ $sth->execute($item->{'itemnumber'});
+
# if we have a reservation with valid transfer, we can set it's status to 'W'
C4::Reserves::ModReserveStatus($item->{'itemnumber'}, 'W');
} else {
# fix up the overdues in accounts...
if ($borrowernumber) {
my $fix = _FixOverduesOnReturn($borrowernumber, $item->{itemnumber}, $exemptfine, $dropbox);
- defined($fix) or warn "_FixOverduesOnReturn($borrowernumber, $item->{itemnumber}...) failed!"; # zero is OK, check defined
+ defined($fix) or warn "_FixOverduesOnReturn($borrowernumber, $item->{itemnumber}...) failed!"; # zero is OK, check defined
}
# find reserves.....
# if we don't have a reserve with the status W, we launch the Checkreserves routine
- my ($resfound, $resrec) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
+ my ($resfound, $resrec) = C4::Reserves::CheckReserves($item->{'itemnumber'});
if ($resfound) {
- $resrec->{'ResFound'} = $resfound;
+ $resrec->{'ResFound'} = $resfound;
$messages->{'ResFound'} = $resrec;
}
# update stats?
# Record the fact that this book was returned.
- UpdateStats(
- $branch, 'return', '0', '',
- $item->{'itemnumber'},
- $biblio->{'itemtype'},
- $borrowernumber
- );
+ UpdateStats($branch, 'return', '0', '', $item->{'itemnumber'}, $biblio->{'itemtype'}, $borrowernumber);
# Send a check-in slip. # NOTE: borrower may be undef. probably shouldn't try to send messages then.
my $circulation_alert = 'C4::ItemCirculationAlertPreference';
- my %conditions = (
- branchcode => $branch,
- categorycode => $borrower->{categorycode},
- item_type => $item->{itype},
- notification => 'CHECKIN',
- );
+ my %conditions = (branchcode => $branch,
+ categorycode => $borrower->{categorycode},
+ item_type => $item->{itype},
+ notification => 'CHECKIN',
+ );
if ($doreturn && $circulation_alert->is_enabled_for(\%conditions)) {
- SendCirculationAlert({
- type => 'CHECKIN',
- item => $item,
- borrower => $borrower,
- branch => $branch,
- });
- }
-
+ SendCirculationAlert(
+ {type => 'CHECKIN',
+ item => $item,
+ borrower => $borrower,
+ branch => $branch,
+ }
+ );
+ }
+
logaction("CIRCULATION", "RETURN", $borrowernumber, $item->{'biblionumber'})
- if C4::Context->preference("ReturnLog");
-
+ if C4::Context->preference("ReturnLog");
+
# FIXME: make this comment intelligible.
#adding message if holdingbranch is non equal a userenv branch to return the document to homebranch
#we check, if we don't have reserv or transfert for this document, if not, return it to homebranch .
- if (($doreturn or $messages->{'NotIssued'}) and !$resfound and ($branch ne $hbr) and not $messages->{'WrongTransfer'}){
- if ( C4::Context->preference("AutomaticItemReturn" ) or
- (C4::Context->preference("UseBranchTransferLimits") and
- ! IsBranchTransferAllowed($branch, $hbr, $item->{C4::Context->preference("BranchTransferLimitsType")} )
- )) {
- $debug and warn sprintf "about to call ModItemTransfer(%s, %s, %s)", $item->{'itemnumber'},$branch, $hbr;
+ if (($doreturn or $messages->{'NotIssued'}) and !$resfound and ($branch ne $hbr) and not $messages->{'WrongTransfer'}) {
+ if (C4::Context->preference("AutomaticItemReturn")
+ or (C4::Context->preference("UseBranchTransferLimits")
+ and !IsBranchTransferAllowed($branch, $hbr, $item->{C4::Context->preference("BranchTransferLimitsType")}))
+ ) {
+ $debug and warn sprintf "about to call ModItemTransfer(%s, %s, %s)", $item->{'itemnumber'}, $branch, $hbr;
$debug and warn "item: " . Dumper($item);
ModItemTransfer($item->{'itemnumber'}, $branch, $hbr);
$messages->{'WasTransfered'} = 1;
} else {
- $messages->{'NeedsTransfer'} = 1; # TODO: instead of 1, specify branchcode that the transfer SHOULD go to, $item->{homebranch}
+ $messages->{'NeedsTransfer'} = 1; # TODO: instead of 1, specify branchcode that the transfer SHOULD go to, $item->{homebranch}
}
}
- return ( $doreturn, $messages, $issue, $borrower );
+ return ($doreturn, $messages, $issue, $borrower);
}
=head2 MarkIssueReturned
=cut
sub MarkIssueReturned {
- my ( $borrowernumber, $itemnumber, $dropbox_branch, $returndate, $privacy ) = @_;
+ my ($borrowernumber, $itemnumber, $dropbox_branch, $returndate, $privacy) = @_;
my $dbh = C4::Context->dbh;
my $query = "UPDATE issues SET returndate=";
my @bind;
if ($dropbox_branch) {
- my $calendar = C4::Calendar->new( branchcode => $dropbox_branch );
- my $dropboxdate = $calendar->addDate( C4::Dates->new(), -1 );
+ my $calendar = C4::Calendar->new(branchcode => $dropbox_branch);
+ my $dropboxdate = $calendar->addDate(C4::Dates->new(), -1);
$query .= " ? ";
push @bind, $dropboxdate->output('iso');
} elsif ($returndate) {
}
$query .= " WHERE borrowernumber = ? AND itemnumber = ?";
push @bind, $borrowernumber, $itemnumber;
+
# FIXME transaction
- my $sth_upd = $dbh->prepare($query);
+ my $sth_upd = $dbh->prepare($query);
$sth_upd->execute(@bind);
- my $sth_copy = $dbh->prepare("INSERT INTO old_issues SELECT * FROM issues
+ my $sth_copy = $dbh->prepare(
+ "INSERT INTO old_issues SELECT * FROM issues
WHERE borrowernumber = ?
- AND itemnumber = ?");
+ AND itemnumber = ?"
+ );
$sth_copy->execute($borrowernumber, $itemnumber);
+
# anonymise patron checkout immediately if $privacy set to 2 and AnonymousPatron is set to a valid borrowernumber
- if ( $privacy == 2) {
+ if ($privacy == 2) {
+
# The default of 0 does not work due to foreign key constraints
# The anonymisation will fail quietly if AnonymousPatron is not a valid entry
my $anonymouspatron = (C4::Context->preference('AnonymousPatron')) ? C4::Context->preference('AnonymousPatron') : 0;
- my $sth_ano = $dbh->prepare("UPDATE old_issues SET borrowernumber=?
+ my $sth_ano = $dbh->prepare(
+ "UPDATE old_issues SET borrowernumber=?
WHERE borrowernumber = ?
- AND itemnumber = ?");
- $sth_ano->execute($anonymouspatron, $borrowernumber, $itemnumber);
+ AND itemnumber = ?"
+ );
+ $sth_ano->execute($anonymouspatron, $borrowernumber, $itemnumber);
}
- my $sth_del = $dbh->prepare("DELETE FROM issues
+ my $sth_del = $dbh->prepare(
+ "DELETE FROM issues
WHERE borrowernumber = ?
- AND itemnumber = ?");
+ AND itemnumber = ?"
+ );
$sth_del->execute($borrowernumber, $itemnumber);
}
my $dbh = C4::Context->dbh;
# check for overdue fine
- my $sth = $dbh->prepare(
-"SELECT * FROM accountlines WHERE (borrowernumber = ?) AND (itemnumber = ?) AND (accounttype='FU' OR accounttype='O')"
- );
- $sth->execute( $borrowernumber, $item );
+ my $sth = $dbh->prepare("SELECT * FROM accountlines WHERE (borrowernumber = ?) AND (itemnumber = ?) AND (accounttype='FU' OR accounttype='O')");
+ $sth->execute($borrowernumber, $item);
# alter fine to show that the book has been returned
my $data = $sth->fetchrow_hashref;
if ($exemptfine) {
$uquery = "update accountlines set accounttype='FFOR', amountoutstanding=0";
if (C4::Context->preference("FinesLog")) {
- &logaction("FINES", 'MODIFY',$borrowernumber,"Overdue forgiven: item $item");
+ &logaction("FINES", 'MODIFY', $borrowernumber, "Overdue forgiven: item $item");
}
} elsif ($dropbox && $data->{lastincrement}) {
- my $outstanding = $data->{amountoutstanding} - $data->{lastincrement} ;
- my $amt = $data->{amount} - $data->{lastincrement} ;
+ my $outstanding = $data->{amountoutstanding} - $data->{lastincrement};
+ my $amt = $data->{amount} - $data->{lastincrement};
if (C4::Context->preference("FinesLog")) {
- &logaction("FINES", 'MODIFY',$borrowernumber,"Dropbox adjustment $amt, item $item");
+ &logaction("FINES", 'MODIFY', $borrowernumber, "Dropbox adjustment $amt, item $item");
}
- $uquery = "update accountlines set accounttype='F' ";
- if($outstanding >= 0 && $amt >=0) {
+ $uquery = "update accountlines set accounttype='F' ";
+ if ($outstanding >= 0 && $amt >= 0) {
$uquery .= ", amount = ? , amountoutstanding=? ";
- unshift @bind, ($amt, $outstanding) ;
+ unshift @bind, ($amt, $outstanding);
}
} else {
$uquery = "update accountlines set accounttype='F' ";
=cut
sub _FixAccountForLostAndReturned {
- my $itemnumber = shift or return;
+ my $itemnumber = shift or return;
my $borrowernumber = @_ ? shift : undef;
- my $item_id = @_ ? shift : $itemnumber; # Send the barcode if you want that logged in the description
- my $dbh = C4::Context->dbh;
+ my $item_id = @_ ? shift : $itemnumber; # Send the barcode if you want that logged in the description
+ my $dbh = C4::Context->dbh;
+
# check for charge made for lost book
my $sth = $dbh->prepare("SELECT * FROM accountlines WHERE (itemnumber = ?) AND (accounttype='L' OR accounttype='Rep') ORDER BY date DESC");
$sth->execute($itemnumber);
my $data = $sth->fetchrow_hashref;
- $data or return; # bail if there is nothing to do
+ $data or return; # bail if there is nothing to do
# writeoff this amount
my $offset;
my $amount = $data->{'amount'};
my $acctno = $data->{'accountno'};
- my $amountleft; # Starts off undef/zero.
+ my $amountleft; # Starts off undef/zero.
if ($data->{'amountoutstanding'} == $amount) {
$offset = $data->{'amount'};
- $amountleft = 0; # Hey, it's zero here, too.
+ $amountleft = 0; # Hey, it's zero here, too.
} else {
- $offset = $amount - $data->{'amountoutstanding'}; # Um, isn't this the same as ZERO? We just tested those two things are ==
- $amountleft = $data->{'amountoutstanding'} - $amount; # Um, isn't this the same as ZERO? We just tested those two things are ==
+ $offset = $amount - $data->{'amountoutstanding'}; # Um, isn't this the same as ZERO? We just tested those two things are ==
+ $amountleft = $data->{'amountoutstanding'} - $amount; # Um, isn't this the same as ZERO? We just tested those two things are ==
}
- my $usth = $dbh->prepare("UPDATE accountlines SET accounttype = 'LR',amountoutstanding='0'
+ my $usth = $dbh->prepare(
+ "UPDATE accountlines SET accounttype = 'LR',amountoutstanding='0'
WHERE (borrowernumber = ?)
- AND (itemnumber = ?) AND (accountno = ?) ");
- $usth->execute($data->{'borrowernumber'},$itemnumber,$acctno); # We might be adjusting an account for some OTHER borrowernumber now. Not the one we passed in.
- #check if any credit is left if so writeoff other accounts
+ AND (itemnumber = ?) AND (accountno = ?) "
+ );
+ $usth->execute($data->{'borrowernumber'}, $itemnumber, $acctno); # We might be adjusting an account for some OTHER borrowernumber now. Not the one we passed in.
+ #check if any credit is left if so writeoff other accounts
my $nextaccntno = getnextacctno($data->{'borrowernumber'});
$amountleft *= -1 if ($amountleft < 0);
if ($amountleft > 0) {
- my $msth = $dbh->prepare("SELECT * FROM accountlines WHERE (borrowernumber = ?)
- AND (amountoutstanding >0) ORDER BY date"); # might want to order by amountoustanding ASC (pay smallest first)
+ my $msth = $dbh->prepare(
+ "SELECT * FROM accountlines WHERE (borrowernumber = ?)
+ AND (amountoutstanding >0) ORDER BY date"); # might want to order by amountoustanding ASC (pay smallest first)
$msth->execute($data->{'borrowernumber'});
+
# offset transactions
my $newamtos;
my $accdata;
- while (($accdata=$msth->fetchrow_hashref) and ($amountleft>0)){
+ while (($accdata = $msth->fetchrow_hashref) and ($amountleft > 0)) {
if ($accdata->{'amountoutstanding'} < $amountleft) {
$newamtos = 0;
$amountleft -= $accdata->{'amountoutstanding'};
- } else {
- $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
+ } else {
+ $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
$amountleft = 0;
}
my $thisacct = $accdata->{'accountno'};
+
# FIXME: move prepares outside while loop!
- my $usth = $dbh->prepare("UPDATE accountlines SET amountoutstanding= ?
+ my $usth = $dbh->prepare(
+ "UPDATE accountlines SET amountoutstanding= ?
WHERE (borrowernumber = ?)
- AND (accountno=?)");
- $usth->execute($newamtos,$data->{'borrowernumber'},'$thisacct'); # FIXME: '$thisacct' is a string literal!
- $usth = $dbh->prepare("INSERT INTO accountoffsets
+ AND (accountno=?)"
+ );
+ $usth->execute($newamtos, $data->{'borrowernumber'}, '$thisacct'); # FIXME: '$thisacct' is a string literal!
+ $usth = $dbh->prepare(
+ "INSERT INTO accountoffsets
(borrowernumber, accountno, offsetaccount, offsetamount)
VALUES
- (?,?,?,?)");
- $usth->execute($data->{'borrowernumber'},$accdata->{'accountno'},$nextaccntno,$newamtos);
+ (?,?,?,?)"
+ );
+ $usth->execute($data->{'borrowernumber'}, $accdata->{'accountno'}, $nextaccntno, $newamtos);
}
- $msth->finish; # $msth might actually have data left
+ $msth->finish; # $msth might actually have data left
}
$amountleft *= -1 if ($amountleft > 0);
my $desc = "Item Returned " . $item_id;
- $usth = $dbh->prepare("INSERT INTO accountlines
+ $usth = $dbh->prepare(
+ "INSERT INTO accountlines
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
- VALUES (?,?,now(),?,?,'CR',?)");
- $usth->execute($data->{'borrowernumber'},$nextaccntno,0-$amount,$desc,$amountleft);
+ VALUES (?,?,now(),?,?,'CR',?)"
+ );
+ $usth->execute($data->{'borrowernumber'}, $nextaccntno, 0 - $amount, $desc, $amountleft);
if ($borrowernumber) {
+
# FIXME: same as query above. use 1 sth for both
- $usth = $dbh->prepare("INSERT INTO accountoffsets
+ $usth = $dbh->prepare(
+ "INSERT INTO accountoffsets
(borrowernumber, accountno, offsetaccount, offsetamount)
- VALUES (?,?,?,?)");
+ VALUES (?,?,?,?)"
+ );
$usth->execute($borrowernumber, $data->{'accountno'}, $nextaccntno, $offset);
}
- ModItem({ paidfor => '' }, undef, $itemnumber);
+ ModItem({paidfor => ''}, undef, $itemnumber);
return;
}
my $branch;
if ($circcontrol eq 'PickupLibrary') {
- $branch= C4::Context->userenv->{'branch'} if C4::Context->userenv;
+ $branch = C4::Context->userenv->{'branch'} if C4::Context->userenv;
} elsif ($circcontrol eq 'PatronLibrary') {
- $branch=$borrower->{branchcode};
+ $branch = $borrower->{branchcode};
} else {
my $branchfield = C4::Context->preference('HomeOrHoldingBranch') || 'homebranch';
$branch = $item->{$branchfield};
+
# default to item home branch if holdingbranch is used
# and is not defined
if (!defined($branch) && $branchfield eq 'holdingbranch') {
return $branch;
}
-
-
-
-
-
=head2 GetItemIssue
$issue = &GetItemIssue($itemnumber);
"SELECT *
FROM issues
LEFT JOIN items ON issues.itemnumber=items.itemnumber
- WHERE issues.itemnumber=?");
+ WHERE issues.itemnumber=?"
+ );
$sth->execute($itemnumber);
my $data = $sth->fetchrow_hashref;
return unless $data;
=cut
sub GetOpenIssue {
- my ( $itemnumber ) = @_;
+ my ($itemnumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "SELECT * FROM issues WHERE itemnumber = ? AND returndate IS NULL" );
- $sth->execute( $itemnumber );
- my $issue = $sth->fetchrow_hashref();
- return $issue;
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("SELECT * FROM issues WHERE itemnumber = ? AND returndate IS NULL");
+ $sth->execute($itemnumber);
+ my $issue = $sth->fetchrow_hashref();
+ return $issue;
}
=head2 GetItemIssues
=cut
sub GetItemIssues {
- my ( $itemnumber, $history ) = @_;
-
- my $today = C4::Dates->today('iso'); # get today date
- my $sql = "SELECT * FROM issues
+ my ($itemnumber, $history) = @_;
+
+ my $today = C4::Dates->today('iso'); # get today date
+ my $sql = "SELECT * FROM issues
JOIN borrowers USING (borrowernumber)
JOIN items USING (itemnumber)
WHERE issues.itemnumber = ? ";
$sth->execute($biblionumber, $biblionumber);
my @issues;
- while ( my $data = $sth->fetchrow_hashref ) {
+ while (my $data = $sth->fetchrow_hashref) {
push @issues, $data;
}
return \@issues;
AND ( TO_DAYS( NOW() )-TO_DAYS( date_due ) ) < ?
END_SQL
- my @bind_parameters = ( $params->{'days_in_advance'} );
-
- my $sth = $dbh->prepare( $statement );
- $sth->execute( @bind_parameters );
+ my @bind_parameters = ($params->{'days_in_advance'});
+
+ my $sth = $dbh->prepare($statement);
+ $sth->execute(@bind_parameters);
my $upcoming_dues = $sth->fetchall_arrayref({});
$sth->finish;
sub CanBookBeRenewed {
# check renewal status
- my ( $borrowernumber, $itemnumber, $override_limit ) = @_;
+ my ($borrowernumber, $itemnumber, $override_limit) = @_;
my $dbh = C4::Context->dbh;
my $renews = 1;
my $renewokay = 0;
- my $error;
+ my $error;
# Look in the issues table for this item, lent to this borrower,
# and not yet returned.
# Look in the issues table for this item, lent to this borrower,
# and not yet returned.
- my %branch = (
- 'ItemHomeLibrary' => 'items.homebranch',
- 'PickupLibrary' => 'items.holdingbranch',
- 'PatronLibrary' => 'borrowers.branchcode'
- );
+ my %branch = ('ItemHomeLibrary' => 'items.homebranch',
+ 'PickupLibrary' => 'items.holdingbranch',
+ 'PatronLibrary' => 'borrowers.branchcode'
+ );
my $controlbranch = $branch{C4::Context->preference('CircControl')};
- my $itype = C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype';
-
+ my $itype = C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype';
+
my $sthcount = $dbh->prepare("
SELECT
borrowers.categorycode, biblioitems.itemtype, issues.renewals, renewalsallowed, $controlbranch
LIMIT 1;
");
- $sthcount->execute( $borrowernumber, $itemnumber );
- if ( my $data1 = $sthcount->fetchrow_hashref ) {
-
- if ( ( $data1->{renewalsallowed} && $data1->{renewalsallowed} > $data1->{renewals} ) || $override_limit ) {
+ $sthcount->execute($borrowernumber, $itemnumber);
+ if (my $data1 = $sthcount->fetchrow_hashref) {
+
+ if (($data1->{renewalsallowed} && $data1->{renewalsallowed} > $data1->{renewals}) || $override_limit) {
$renewokay = 1;
+ } else {
+ $error = "too_many";
}
- else {
- $error="too_many";
- }
-
- my ( $resfound, $resrec ) = C4::Reserves::CheckReserves($itemnumber);
+
+ my ($resfound, $resrec) = C4::Reserves::CheckReserves($itemnumber);
if ($resfound) {
$renewokay = 0;
- $error="on_reserve"
+ $error = "on_reserve";
}
}
- return ($renewokay,$error);
+ return ($renewokay, $error);
}
=head2 AddRenewal
=cut
sub AddRenewal {
- my $borrowernumber = shift or return undef;
- my $itemnumber = shift or return undef;
- my $branch = shift;
- my $datedue = shift;
+ my $borrowernumber = shift or return undef;
+ my $itemnumber = shift or return undef;
+ my $branch = shift;
+ my $datedue = shift;
my $lastreneweddate = shift || C4::Dates->new()->output('iso');
- my $item = GetItem($itemnumber) or return undef;
+ my $item = GetItem($itemnumber) or return undef;
my $biblio = GetBiblioFromItemNumber($itemnumber) or return undef;
my $dbh = C4::Context->dbh;
+
# Find the issues record for this book
- my $sth =
- $dbh->prepare("SELECT * FROM issues
+ my $sth = $dbh->prepare(
+ "SELECT * FROM issues
WHERE borrowernumber=?
AND itemnumber=?"
- );
- $sth->execute( $borrowernumber, $itemnumber );
+ );
+ $sth->execute($borrowernumber, $itemnumber);
my $issuedata = $sth->fetchrow_hashref;
$sth->finish;
- if($datedue && ! $datedue->output('iso')){
+ if ($datedue && !$datedue->output('iso')) {
warn "Invalid date passed to AddRenewal.";
return undef;
}
+
# If the due date wasn't specified, calculate it by adding the
# book's loan length to today's date or the current due date
# based on the value of the RenewalPeriodBase syspref.
unless ($datedue) {
- my $borrower = C4::Members::GetMemberDetails( $borrowernumber, 0 ) or return undef;
+ my $borrower = C4::Members::GetMemberDetails($borrowernumber, 0) or return undef;
my $itemtype = (C4::Context->preference('item-level_itypes')) ? $biblio->{'itype'} : $biblio->{'itemtype'};
- $datedue = (C4::Context->preference('RenewalPeriodBase') eq 'date_due') ?
- C4::Dates->new($issuedata->{date_due}, 'iso') :
- C4::Dates->new();
- $datedue = CalcDateDue($datedue,$itemtype,$issuedata->{'branchcode'},$borrower);
+ $datedue =
+ (C4::Context->preference('RenewalPeriodBase') eq 'date_due')
+ ? C4::Dates->new($issuedata->{date_due}, 'iso')
+ : C4::Dates->new();
+ $datedue = CalcDateDue($datedue, $itemtype, $issuedata->{'branchcode'}, $borrower);
}
# Update the issues record to have the new due date, and a new count
# of how many times it has been renewed.
my $renews = $issuedata->{'renewals'} + 1;
- $sth = $dbh->prepare("UPDATE issues SET date_due = ?, renewals = ?, lastreneweddate = ?
+ $sth = $dbh->prepare(
+ "UPDATE issues SET date_due = ?, renewals = ?, lastreneweddate = ?
WHERE borrowernumber=?
AND itemnumber=?"
- );
- $sth->execute( $datedue->output('iso'), $renews, $lastreneweddate, $borrowernumber, $itemnumber );
+ );
+ $sth->execute($datedue->output('iso'), $renews, $lastreneweddate, $borrowernumber, $itemnumber);
$sth->finish;
# Update the renewal count on the item, and tell zebra to reindex
$renews = $biblio->{'renewals'} + 1;
- ModItem({ renewals => $renews, onloan => $datedue->output('iso') }, $biblio->{'biblionumber'}, $itemnumber);
+ ModItem({renewals => $renews, onloan => $datedue->output('iso')}, $biblio->{'biblionumber'}, $itemnumber);
# Charge a new rental fee, if applicable?
- my ( $charge, $type ) = GetIssuingCharges( $itemnumber, $borrowernumber );
- if ( $charge > 0 ) {
- my $accountno = getnextacctno( $borrowernumber );
- my $item = GetBiblioFromItemNumber($itemnumber);
+ my ($charge, $type) = GetIssuingCharges($itemnumber, $borrowernumber);
+ if ($charge > 0) {
+ my $accountno = getnextacctno($borrowernumber);
+ my $item = GetBiblioFromItemNumber($itemnumber);
my $manager_id = 0;
- $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
+ $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
$sth = $dbh->prepare(
- "INSERT INTO accountlines
+ "INSERT INTO accountlines
(date, borrowernumber, accountno, amount, manager_id,
description,accounttype, amountoutstanding, itemnumber)
VALUES (now(),?,?,?,?,?,?,?,?)"
- );
- $sth->execute( $borrowernumber, $accountno, $charge, $manager_id,
- "Renewal of Rental Item $item->{'title'} $item->{'barcode'}",
- 'Rent', $charge, $itemnumber );
+ );
+ $sth->execute($borrowernumber, $accountno, $charge, $manager_id, "Renewal of Rental Item $item->{'title'} $item->{'barcode'}", 'Rent', $charge, $itemnumber);
$sth->finish;
}
+
# Log the renewal
- UpdateStats( $branch, 'renew', $charge, '', $itemnumber, $item->{itype}, $borrowernumber);
- return $datedue;
+ UpdateStats($branch, 'renew', $charge, '', $itemnumber, $item->{itype}, $borrowernumber);
+ return $datedue;
}
sub GetRenewCount {
+
# check renewal status
- my ( $bornum, $itemno ) = @_;
+ my ($bornum, $itemno) = @_;
my $dbh = C4::Context->dbh;
my $renewcount = 0;
my $renewsallowed = 0;
my $renewsleft = 0;
my $borrower = C4::Members::GetMemberDetails($bornum);
- my $item = GetItem($itemno);
+ my $item = GetItem($itemno);
# Look in the issues table for this item, lent to this borrower,
# and not yet returned.
"select * from issues
where (borrowernumber = ?)
and (itemnumber = ?)"
- );
- $sth->execute( $bornum, $itemno );
+ );
+ $sth->execute($bornum, $itemno);
my $data = $sth->fetchrow_hashref;
$renewcount = $data->{'renewals'} if $data->{'renewals'};
$sth->finish;
+
# $item and $borrower should be calculated
my $branchcode = _GetCircControlBranch($item, $borrower);
-
+
my $issuingrule = GetIssuingRule($borrower->{categorycode}, $item->{itype}, $branchcode);
-
+
$renewsallowed = $issuingrule->{'renewalsallowed'};
$renewsleft = $renewsallowed - $renewcount;
- if($renewsleft < 0){ $renewsleft = 0; }
- return ( $renewcount, $renewsallowed, $renewsleft );
+ if ($renewsleft < 0) { $renewsleft = 0; }
+ return ($renewcount, $renewsallowed, $renewsleft);
}
=head2 GetIssuingCharges
sub GetIssuingCharges {
# calculate charges due
- my ( $itemnumber, $borrowernumber ) = @_;
+ my ($itemnumber, $borrowernumber) = @_;
my $charge = 0;
my $dbh = C4::Context->dbh;
my $item_type;
# Get the book's item type and rental charge (via its biblioitem).
my $charge_query = 'SELECT itemtypes.itemtype,rentalcharge FROM items
LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber';
- $charge_query .= (C4::Context->preference('item-level_itypes'))
- ? ' LEFT JOIN itemtypes ON items.itype = itemtypes.itemtype'
- : ' LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype';
+ $charge_query .=
+ (C4::Context->preference('item-level_itypes'))
+ ? ' LEFT JOIN itemtypes ON items.itype = itemtypes.itemtype'
+ : ' LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype';
$charge_query .= ' WHERE items.itemnumber =?';
my $sth = $dbh->prepare($charge_query);
$sth->execute($itemnumber);
- if ( my $item_data = $sth->fetchrow_hashref ) {
+ if (my $item_data = $sth->fetchrow_hashref) {
$item_type = $item_data->{itemtype};
$charge = $item_data->{rentalcharge};
- my $branch = C4::Branch::mybranch();
+ my $branch = C4::Branch::mybranch();
my $discount_query = q|SELECT rentaldiscount,
issuingrules.itemtype, issuingrules.branchcode
FROM borrowers
AND (issuingrules.itemtype = ? OR issuingrules.itemtype = '*')
AND (issuingrules.branchcode = ? OR issuingrules.branchcode = '*')|;
my $discount_sth = $dbh->prepare($discount_query);
- $discount_sth->execute( $borrowernumber, $item_type, $branch );
+ $discount_sth->execute($borrowernumber, $item_type, $branch);
my $discount_rules = $discount_sth->fetchall_arrayref({});
+
if (@{$discount_rules}) {
+
# We may have multiple rules so get the most specific
my $discount = _get_discount_from_rule($discount_rules, $branch, $item_type);
- $charge = ( $charge * ( 100 - $discount ) ) / 100;
+ $charge = ($charge * (100 - $discount)) / 100;
}
}
- $sth->finish; # we havent _explicitly_ fetched all rows
- return ( $charge, $item_type );
+ $sth->finish; # we havent _explicitly_ fetched all rows
+ return ($charge, $item_type);
}
# Select most appropriate discount rule from those returned
my ($rules_ref, $branch, $itemtype) = @_;
my $discount;
- if (@{$rules_ref} == 1) { # only 1 applicable rule use it
+ if (@{$rules_ref} == 1) { # only 1 applicable rule use it
$discount = $rules_ref->[0]->{rentaldiscount};
return (defined $discount) ? $discount : 0;
}
+
# could have up to 4 does one match $branch and $itemtype
my @d = grep { $_->{branchcode} eq $branch && $_->{itemtype} eq $itemtype } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
return (defined $discount) ? $discount : 0;
}
+
# do we have item type + all branches
@d = grep { $_->{branchcode} eq q{*} && $_->{itemtype} eq $itemtype } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
return (defined $discount) ? $discount : 0;
}
+
# do we all item types + this branch
@d = grep { $_->{branchcode} eq $branch && $_->{itemtype} eq q{*} } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
return (defined $discount) ? $discount : 0;
}
+
# so all and all (surely we wont get here)
@d = grep { $_->{branchcode} eq q{*} && $_->{itemtype} eq q{*} } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
return (defined $discount) ? $discount : 0;
}
+
# none of the above
return 0;
}
=cut
sub AddIssuingCharge {
- my ( $itemnumber, $borrowernumber, $charge ) = @_;
- my $dbh = C4::Context->dbh;
- my $nextaccntno = getnextacctno( $borrowernumber );
- my $manager_id = 0;
+ my ($itemnumber, $borrowernumber, $charge) = @_;
+ my $dbh = C4::Context->dbh;
+ my $nextaccntno = getnextacctno($borrowernumber);
+ my $manager_id = 0;
$manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
- my $query ="
+ my $query = "
INSERT INTO accountlines
(borrowernumber, itemnumber, accountno,
date, amount, description, accounttype,
VALUES (?, ?, ?,now(), ?, 'Rental', 'Rent',?,?)
";
my $sth = $dbh->prepare($query);
- $sth->execute( $borrowernumber, $itemnumber, $nextaccntno, $charge, $charge, $manager_id );
+ $sth->execute($borrowernumber, $itemnumber, $nextaccntno, $charge, $charge, $manager_id);
$sth->finish;
}
=cut
sub GetTransfersFromTo {
- my ( $frombranch, $tobranch ) = @_;
- return unless ( $frombranch && $tobranch );
+ my ($frombranch, $tobranch) = @_;
+ return unless ($frombranch && $tobranch);
my $dbh = C4::Context->dbh;
my $query = "
SELECT itemnumber,datesent,frombranch
AND datearrived IS NULL
";
my $sth = $dbh->prepare($query);
- $sth->execute( $frombranch, $tobranch );
+ $sth->execute($frombranch, $tobranch);
my @gettransfers;
- while ( my $data = $sth->fetchrow_hashref ) {
+ while (my $data = $sth->fetchrow_hashref) {
push @gettransfers, $data;
}
$sth->finish;
sub DeleteTransfer {
my ($itemnumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare(
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare(
"DELETE FROM branchtransfers
WHERE itemnumber=?
AND datearrived IS NULL "
- );
+ );
$sth->execute($itemnumber);
$sth->finish;
}
my $anonymouspatron = (C4::Context->preference('AnonymousPatron')) ? C4::Context->preference('AnonymousPatron') : 0;
my @bind_params = ($anonymouspatron, $date);
if (defined $borrowernumber) {
- $query .= " AND borrowernumber = ?";
- push @bind_params, $borrowernumber;
+ $query .= " AND borrowernumber = ?";
+ push @bind_params, $borrowernumber;
} else {
- $query .= " AND (SELECT privacy FROM borrowers WHERE borrowers.borrowernumber=old_issues.borrowernumber) <> 0";
+ $query .= " AND (SELECT privacy FROM borrowers WHERE borrowers.borrowernumber=old_issues.borrowernumber) <> 0";
}
my $sth = $dbh->prepare($query);
$sth->execute(@bind_params);
- my $rows_affected = $sth->rows; ### doublecheck row count return function
+ my $rows_affected = $sth->rows; ### doublecheck row count return function
return $rows_affected;
}
sub SendCirculationAlert {
my ($opts) = @_;
- my ($type, $item, $borrower, $branch) =
- ($opts->{type}, $opts->{item}, $opts->{borrower}, $opts->{branch});
- my %message_name = (
- CHECKIN => 'Item_Check_in',
- CHECKOUT => 'Item_Checkout',
- );
- my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences({
- borrowernumber => $borrower->{borrowernumber},
- message_name => $message_name{$type},
- });
+ my ($type, $item, $borrower, $branch) = ($opts->{type}, $opts->{item}, $opts->{borrower}, $opts->{branch});
+ my %message_name = (CHECKIN => 'Item_Check_in',
+ CHECKOUT => 'Item_Checkout',);
+ my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences(
+ {borrowernumber => $borrower->{borrowernumber},
+ message_name => $message_name{$type},
+ }
+ );
my $letter = C4::Letters::getletter('circulation', $type);
C4::Letters::parseletter($letter, 'biblio', $item->{biblionumber});
C4::Letters::parseletter($letter, 'biblioitems', $item->{biblionumber});
C4::Letters::parseletter($letter, 'borrowers', $borrower->{borrowernumber});
C4::Letters::parseletter($letter, 'branches', $branch);
- my @transports = @{ $borrower_preferences->{transports} };
+ my @transports = @{$borrower_preferences->{transports}};
+
# warn "no transports" unless @transports;
for (@transports) {
+
# warn "transport: $_";
my $message = C4::Message->find_last_message($borrower, $type, $_);
if (!$message) {
+
#warn "create new message";
C4::Message->enqueue($letter, $borrower, $_);
} else {
+
#warn "append to old message";
$message->append($letter);
$message->update;
=cut
sub updateWrongTransfer {
- my ( $itemNumber,$waitingAtLibrary,$FromLibrary ) = @_;
- my $dbh = C4::Context->dbh;
-# first step validate the actual line of transfert .
- my $sth =
- $dbh->prepare(
- "update branchtransfers set datearrived = now(),tobranch=?,comments='wrongtransfer' where itemnumber= ? AND datearrived IS NULL"
- );
- $sth->execute($FromLibrary,$itemNumber);
- $sth->finish;
-
-# second step create a new line of branchtransfer to the right location .
- ModItemTransfer($itemNumber, $FromLibrary, $waitingAtLibrary);
-
-#third step changing holdingbranch of item
- UpdateHoldingbranch($FromLibrary,$itemNumber);
+ my ($itemNumber, $waitingAtLibrary, $FromLibrary) = @_;
+ my $dbh = C4::Context->dbh;
+
+ # first step validate the actual line of transfert .
+ my $sth = $dbh->prepare("update branchtransfers set datearrived = now(),tobranch=?,comments='wrongtransfer' where itemnumber= ? AND datearrived IS NULL");
+ $sth->execute($FromLibrary, $itemNumber);
+ $sth->finish;
+
+ # second step create a new line of branchtransfer to the right location .
+ ModItemTransfer($itemNumber, $FromLibrary, $waitingAtLibrary);
+
+ #third step changing holdingbranch of item
+ UpdateHoldingbranch($FromLibrary, $itemNumber);
}
=head2 UpdateHoldingbranch
=cut
sub UpdateHoldingbranch {
- my ( $branch,$itemnumber ) = @_;
- ModItem({ holdingbranch => $branch }, undef, $itemnumber);
+ my ($branch, $itemnumber) = @_;
+ ModItem({holdingbranch => $branch}, undef, $itemnumber);
}
=head2 CalcDateDue
=cut
-sub CalcDateDue {
- my ($startdate,$itemtype,$branch,$borrower) = @_;
- my $datedue;
- my $loanlength = GetLoanLength($borrower->{'categorycode'},$itemtype, $branch);
-
- # if globalDueDate ON the datedue is set to that date
- if ( C4::Context->preference('globalDueDate')
- && ( C4::Context->preference('globalDueDate') =~ C4::Dates->regexp('syspref') ) ) {
- $datedue = C4::Dates->new( C4::Context->preference('globalDueDate') );
- } else {
- # otherwise, calculate the datedue as normal
- if(C4::Context->preference('useDaysMode') eq 'Days') { # ignoring calendar
- my $timedue = time + ($loanlength) * 86400;
- #FIXME - assumes now even though we take a startdate
- my @datearr = localtime($timedue);
- $datedue = C4::Dates->new( sprintf("%04d-%02d-%02d", 1900 + $datearr[5], $datearr[4] + 1, $datearr[3]), 'iso');
- } else {
- my $calendar = C4::Calendar->new( branchcode => $branch );
- $datedue = $calendar->addDate($startdate, $loanlength);
- }
- }
-
- # if Hard Due Dates are used, retreive them and apply as necessary
- my ($hardduedate, $hardduedatecompare) = GetHardDueDate($borrower->{'categorycode'},$itemtype, $branch);
- if ( $hardduedate && $hardduedate->output('iso') && $hardduedate->output('iso') ne '0000-00-00') {
- # if the calculated due date is after the 'before' Hard Due Date (ceiling), override
- if ( $datedue->output( 'iso' ) gt $hardduedate->output( 'iso' ) && $hardduedatecompare == -1) {
- $datedue = $hardduedate;
+sub CalcDateDue {
+ my ($startdate, $itemtype, $branch, $borrower) = @_;
+ my $datedue;
+ my $loanlength = GetLoanLength($borrower->{'categorycode'}, $itemtype, $branch);
+
+ # if globalDueDate ON the datedue is set to that date
+ if (C4::Context->preference('globalDueDate')
+ && (C4::Context->preference('globalDueDate') =~ C4::Dates->regexp('syspref'))) {
+ $datedue = C4::Dates->new(C4::Context->preference('globalDueDate'));
+ } else {
+
+ # otherwise, calculate the datedue as normal
+ if (C4::Context->preference('useDaysMode') eq 'Days') { # ignoring calendar
+ my $timedue = time + ($loanlength) * 86400;
+
+ #FIXME - assumes now even though we take a startdate
+ my @datearr = localtime($timedue);
+ $datedue = C4::Dates->new(sprintf("%04d-%02d-%02d", 1900 + $datearr[5], $datearr[4] + 1, $datearr[3]), 'iso');
+ } else {
+ my $calendar = C4::Calendar->new(branchcode => $branch);
+ $datedue = $calendar->addDate($startdate, $loanlength);
+ }
+ }
+
+ # if Hard Due Dates are used, retreive them and apply as necessary
+ my ($hardduedate, $hardduedatecompare) = GetHardDueDate($borrower->{'categorycode'}, $itemtype, $branch);
+ if ($hardduedate && $hardduedate->output('iso') && $hardduedate->output('iso') ne '0000-00-00') {
+
+ # if the calculated due date is after the 'before' Hard Due Date (ceiling), override
+ if ($datedue->output('iso') gt $hardduedate->output('iso') && $hardduedatecompare == -1) {
+ $datedue = $hardduedate;
+
# if the calculated date is before the 'after' Hard Due Date (floor), override
- } elsif ( $datedue->output( 'iso' ) lt $hardduedate->output( 'iso' ) && $hardduedatecompare == 1) {
- $datedue = $hardduedate;
+ } elsif ($datedue->output('iso') lt $hardduedate->output('iso') && $hardduedatecompare == 1) {
+ $datedue = $hardduedate;
+
# if the hard due date is set to 'exactly', overrride
- } elsif ( $hardduedatecompare == 0) {
- $datedue = $hardduedate;
- }
- # in all other cases, keep the date due as it is
- }
+ } elsif ($hardduedatecompare == 0) {
+ $datedue = $hardduedate;
+ }
- # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate
- if ( C4::Context->preference('ReturnBeforeExpiry') && $datedue->output('iso') gt $borrower->{dateexpiry} ) {
- $datedue = C4::Dates->new( $borrower->{dateexpiry}, 'iso' );
- }
+ # in all other cases, keep the date due as it is
+ }
- return $datedue;
+ # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate
+ if (C4::Context->preference('ReturnBeforeExpiry') && $datedue->output('iso') gt $borrower->{dateexpiry}) {
+ $datedue = C4::Dates->new($borrower->{dateexpiry}, 'iso');
+ }
+
+ return $datedue;
}
=head2 CheckValidDatedue
=cut
sub CheckValidDatedue {
-my ($date_due,$itemnumber,$branchcode)=@_;
-my @datedue=split('-',$date_due->output('iso'));
-my $years=$datedue[0];
-my $month=$datedue[1];
-my $day=$datedue[2];
-# die "Item# $itemnumber ($branchcode) due: " . ${date_due}->output() . "\n(Y,M,D) = ($years,$month,$day)":
-my $dow;
-for (my $i=0;$i<2;$i++){
- $dow=Day_of_Week($years,$month,$day);
- ($dow=0) if ($dow>6);
- my $result=CheckRepeatableHolidays($itemnumber,$dow,$branchcode);
- my $countspecial=CheckSpecialHolidays($years,$month,$day,$itemnumber,$branchcode);
- my $countspecialrepeatable=CheckRepeatableSpecialHolidays($month,$day,$itemnumber,$branchcode);
- if (($result ne '0') or ($countspecial ne '0') or ($countspecialrepeatable ne '0') ){
- $i=0;
- (($years,$month,$day) = Add_Delta_Days($years,$month,$day, 1))if ($i ne '1');
+ my ($date_due, $itemnumber, $branchcode) = @_;
+ my @datedue = split('-', $date_due->output('iso'));
+ my $years = $datedue[0];
+ my $month = $datedue[1];
+ my $day = $datedue[2];
+
+ # die "Item# $itemnumber ($branchcode) due: " . ${date_due}->output() . "\n(Y,M,D) = ($years,$month,$day)":
+ my $dow;
+ for (my $i = 0 ; $i < 2 ; $i++) {
+ $dow = Day_of_Week($years, $month, $day);
+ ($dow = 0) if ($dow > 6);
+ my $result = CheckRepeatableHolidays($itemnumber, $dow, $branchcode);
+ my $countspecial = CheckSpecialHolidays($years, $month, $day, $itemnumber, $branchcode);
+ my $countspecialrepeatable = CheckRepeatableSpecialHolidays($month, $day, $itemnumber, $branchcode);
+ if (($result ne '0') or ($countspecial ne '0') or ($countspecialrepeatable ne '0')) {
+ $i = 0;
+ (($years, $month, $day) = Add_Delta_Days($years, $month, $day, 1)) if ($i ne '1');
}
}
- my $newdatedue=C4::Dates->new(sprintf("%04d-%02d-%02d",$years,$month,$day),'iso');
-return $newdatedue;
+ my $newdatedue = C4::Dates->new(sprintf("%04d-%02d-%02d", $years, $month, $day), 'iso');
+ return $newdatedue;
}
-
=head2 CheckRepeatableHolidays
$countrepeatable = CheckRepeatableHoliday($itemnumber,$week_day,$branchcode);
=cut
-sub CheckRepeatableHolidays{
-my($itemnumber,$week_day,$branchcode)=@_;
-my $dbh = C4::Context->dbh;
-my $query = qq|SELECT count(*)
+sub CheckRepeatableHolidays {
+ my ($itemnumber, $week_day, $branchcode) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM repeatable_holidays
WHERE branchcode=?
AND weekday=?|;
-my $sth = $dbh->prepare($query);
-$sth->execute($branchcode,$week_day);
-my $result=$sth->fetchrow;
-$sth->finish;
-return $result;
+ my $sth = $dbh->prepare($query);
+ $sth->execute($branchcode, $week_day);
+ my $result = $sth->fetchrow;
+ $sth->finish;
+ return $result;
}
-
=head2 CheckSpecialHolidays
$countspecial = CheckSpecialHolidays($years,$month,$day,$itemnumber,$branchcode);
=cut
-sub CheckSpecialHolidays{
-my ($years,$month,$day,$itemnumber,$branchcode) = @_;
-my $dbh = C4::Context->dbh;
-my $query=qq|SELECT count(*)
+sub CheckSpecialHolidays {
+ my ($years, $month, $day, $itemnumber, $branchcode) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM `special_holidays`
WHERE year=?
AND month=?
AND day=?
AND branchcode=?
|;
-my $sth = $dbh->prepare($query);
-$sth->execute($years,$month,$day,$branchcode);
-my $countspecial=$sth->fetchrow ;
-$sth->finish;
-return $countspecial;
+ my $sth = $dbh->prepare($query);
+ $sth->execute($years, $month, $day, $branchcode);
+ my $countspecial = $sth->fetchrow;
+ $sth->finish;
+ return $countspecial;
}
=head2 CheckRepeatableSpecialHolidays
=cut
-sub CheckRepeatableSpecialHolidays{
-my ($month,$day,$itemnumber,$branchcode) = @_;
-my $dbh = C4::Context->dbh;
-my $query=qq|SELECT count(*)
+sub CheckRepeatableSpecialHolidays {
+ my ($month, $day, $itemnumber, $branchcode) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM `repeatable_holidays`
WHERE month=?
AND day=?
AND branchcode=?
|;
-my $sth = $dbh->prepare($query);
-$sth->execute($month,$day,$branchcode);
-my $countspecial=$sth->fetchrow ;
-$sth->finish;
-return $countspecial;
+ my $sth = $dbh->prepare($query);
+ $sth->execute($month, $day, $branchcode);
+ my $countspecial = $sth->fetchrow;
+ $sth->finish;
+ return $countspecial;
}
-
-
-sub CheckValidBarcode{
-my ($barcode) = @_;
-my $dbh = C4::Context->dbh;
-my $query=qq|SELECT count(*)
+sub CheckValidBarcode {
+ my ($barcode) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM items
WHERE barcode=?
|;
-my $sth = $dbh->prepare($query);
-$sth->execute($barcode);
-my $exist=$sth->fetchrow ;
-$sth->finish;
-return $exist;
+ my $sth = $dbh->prepare($query);
+ $sth->execute($barcode);
+ my $exist = $sth->fetchrow;
+ $sth->finish;
+ return $exist;
}
=head2 IsBranchTransferAllowed
=cut
sub IsBranchTransferAllowed {
- my ( $toBranch, $fromBranch, $code ) = @_;
-
- if ( $toBranch eq $fromBranch ) { return 1; } ## Short circuit for speed.
-
- my $limitType = C4::Context->preference("BranchTransferLimitsType");
- my $dbh = C4::Context->dbh;
-
- my $sth = $dbh->prepare("SELECT * FROM branch_transfer_limits WHERE toBranch = ? AND fromBranch = ? AND $limitType = ?");
- $sth->execute( $toBranch, $fromBranch, $code );
- my $limit = $sth->fetchrow_hashref();
-
- ## If a row is found, then that combination is not allowed, if no matching row is found, then the combination *is allowed*
- if ( $limit->{'limitId'} ) {
- return 0;
- } else {
- return 1;
- }
-}
+ my ($toBranch, $fromBranch, $code) = @_;
+
+ if ($toBranch eq $fromBranch) { return 1; } ## Short circuit for speed.
+
+ my $limitType = C4::Context->preference("BranchTransferLimitsType");
+ my $dbh = C4::Context->dbh;
+
+ my $sth = $dbh->prepare("SELECT * FROM branch_transfer_limits WHERE toBranch = ? AND fromBranch = ? AND $limitType = ?");
+ $sth->execute($toBranch, $fromBranch, $code);
+ my $limit = $sth->fetchrow_hashref();
+
+ ## If a row is found, then that combination is not allowed, if no matching row is found, then the combination *is allowed*
+ if ($limit->{'limitId'}) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
=head2 CreateBranchTransferLimit
=cut
sub CreateBranchTransferLimit {
- my ( $toBranch, $fromBranch, $code ) = @_;
-
- my $limitType = C4::Context->preference("BranchTransferLimitsType");
-
- my $dbh = C4::Context->dbh;
-
- my $sth = $dbh->prepare("INSERT INTO branch_transfer_limits ( $limitType, toBranch, fromBranch ) VALUES ( ?, ?, ? )");
- $sth->execute( $code, $toBranch, $fromBranch );
+ my ($toBranch, $fromBranch, $code) = @_;
+
+ my $limitType = C4::Context->preference("BranchTransferLimitsType");
+
+ my $dbh = C4::Context->dbh;
+
+ my $sth = $dbh->prepare("INSERT INTO branch_transfer_limits ( $limitType, toBranch, fromBranch ) VALUES ( ?, ?, ? )");
+ $sth->execute($code, $toBranch, $fromBranch);
}
=head2 DeleteBranchTransferLimits
=cut
sub DeleteBranchTransferLimits {
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("TRUNCATE TABLE branch_transfer_limits");
- $sth->execute();
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("TRUNCATE TABLE branch_transfer_limits");
+ $sth->execute();
}
-
- 1;
+1;
__END__
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
use strict;
+
#use warnings; FIXME - Bug 2505
use C4::Context;
use C4::Stats;
Add_Delta_DHMS
Date_to_Days
Day_of_Week
- Add_Delta_Days
+ Add_Delta_Days
);
use POSIX qw(strftime);
-use C4::Branch; # GetBranches
-use C4::Log; # logaction
+use C4::Branch; # GetBranches
+use C4::Log; # logaction
use Data::Dumper;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
BEGIN {
- require Exporter;
- $VERSION = 3.02; # for version checking
- @ISA = qw(Exporter);
-
- # FIXME subs that should probably be elsewhere
- push @EXPORT, qw(
- &FixOverduesOnReturn
- &barcodedecode
- );
-
- # subs to deal with issuing a book
- push @EXPORT, qw(
- &CanBookBeIssued
- &CanBookBeRenewed
- &AddIssue
- &AddRenewal
- &GetRenewCount
- &GetItemIssue
- &GetItemIssues
- &GetBorrowerIssues
- &GetIssuingCharges
- &GetIssuingRule
- &GetBranchBorrowerCircRule
- &GetBranchItemRule
- &GetBiblioIssues
- &GetOpenIssue
- &AnonymiseIssueHistory
- );
-
- # subs to deal with returns
- push @EXPORT, qw(
- &AddReturn
- &MarkIssueReturned
- );
-
- # subs to deal with transfers
- push @EXPORT, qw(
- &transferbook
- &GetTransfers
- &GetTransfersFromTo
- &updateWrongTransfer
- &DeleteTransfer
- &IsBranchTransferAllowed
- &CreateBranchTransferLimit
- &DeleteBranchTransferLimits
- );
+ require Exporter;
+ $VERSION = 3.02; # for version checking
+ @ISA = qw(Exporter);
+
+ # FIXME subs that should probably be elsewhere
+ push @EXPORT, qw(
+ &FixOverduesOnReturn
+ &barcodedecode
+ );
+
+ # subs to deal with issuing a book
+ push @EXPORT, qw(
+ &CanBookBeIssued
+ &CanBookBeRenewed
+ &AddIssue
+ &AddRenewal
+ &GetRenewCount
+ &GetItemIssue
+ &GetItemIssues
+ &GetBorrowerIssues
+ &GetIssuingCharges
+ &GetIssuingRule
+ &GetBranchBorrowerCircRule
+ &GetBranchItemRule
+ &GetBiblioIssues
+ &GetOpenIssue
+ &AnonymiseIssueHistory
+ );
+
+ # subs to deal with returns
+ push @EXPORT, qw(
+ &AddReturn
+ &MarkIssueReturned
+ );
+
+ # subs to deal with transfers
+ push @EXPORT, qw(
+ &transferbook
+ &GetTransfers
+ &GetTransfersFromTo
+ &updateWrongTransfer
+ &DeleteTransfer
+ &IsBranchTransferAllowed
+ &CreateBranchTransferLimit
+ &DeleteBranchTransferLimits
+ );
}
=head1 NAME
# FIXME -- these plugins should be moved out of Circulation.pm
#
sub barcodedecode {
- my ($barcode, $filter) = @_;
+ my ( $barcode, $filter ) = @_;
my $branch = C4::Branch::mybranch();
$filter = C4::Context->preference('itemBarcodeInputFilter') unless $filter;
- $filter or return $barcode; # ensure filter is defined, else return untouched barcode
- if ($filter eq 'whitespace') {
- $barcode =~ s/\s//g;
- } elsif ($filter eq 'cuecat') {
- chomp($barcode);
- my @fields = split( /\./, $barcode );
- my @results = map( decode($_), @fields[ 1 .. $#fields ] );
- ($#results == 2) and return $results[2];
- } elsif ($filter eq 'T-prefix') {
- if ($barcode =~ /^[Tt](\d)/) {
- (defined($1) and $1 eq '0') and return $barcode;
- $barcode = substr($barcode, 2) + 0; # FIXME: probably should be substr($barcode, 1)
- }
- return sprintf("T%07d", $barcode);
+ $filter or return $barcode; # ensure filter is defined, else return untouched barcode
+ if ( $filter eq 'whitespace' ) {
+ $barcode =~ s/\s//g;
+ } elsif ( $filter eq 'cuecat' ) {
+ chomp($barcode);
+ my @fields = split( /\./, $barcode );
+ my @results = map( decode($_), @fields[ 1 .. $#fields ] );
+ ( $#results == 2 ) and return $results[2];
+ } elsif ( $filter eq 'T-prefix' ) {
+ if ( $barcode =~ /^[Tt](\d)/ ) {
+ ( defined($1) and $1 eq '0' ) and return $barcode;
+ $barcode = substr( $barcode, 2 ) + 0; # FIXME: probably should be substr($barcode, 1)
+ }
+ return sprintf( "T%07d", $barcode );
+
# FIXME: $barcode could be "T1", causing warning: substr outside of string
# Why drop the nonzero digit after the T?
# Why pass non-digits (or empty string) to "T%07d"?
- } elsif ($filter eq 'libsuite8') {
- unless($barcode =~ m/^($branch)-/i){ #if barcode starts with branch code its in Koha style. Skip it.
- if($barcode =~ m/^(\d)/i){ #Some barcodes even start with 0's & numbers and are assumed to have b as the item type in the libsuite8 software
- $barcode =~ s/^[0]*(\d+)$/$branch-b-$1/i;
- }else{
- $barcode =~ s/^(\D+)[0]*(\d+)$/$branch-$1-$2/i;
- }
- }
- }
- return $barcode; # return barcode, modified or not
+ } elsif ( $filter eq 'libsuite8' ) {
+ unless ( $barcode =~ m/^($branch)-/i ) { #if barcode starts with branch code its in Koha style. Skip it.
+ if ( $barcode =~ m/^(\d)/i ) { #Some barcodes even start with 0's & numbers and are assumed to have b as the item type in the libsuite8 software
+ $barcode =~ s/^[0]*(\d+)$/$branch-b-$1/i;
+ } else {
+ $barcode =~ s/^(\D+)[0]*(\d+)$/$branch-$1-$2/i;
+ }
+ }
+ }
+ return $barcode; # return barcode, modified or not
}
=head2 decode
sub decode {
my ($encoded) = @_;
- my $seq =
- 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
+ my $seq = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
my @s = map { index( $seq, $_ ); } split( //, $encoded );
my $l = ( $#s + 1 ) % 4;
if ($l) {
if ( $l == 1 ) {
+
# warn "Error: Cuecat decode parsing failed!";
return;
}
my $r = '';
while ( $#s >= 0 ) {
my $n = ( ( $s[0] << 6 | $s[1] ) << 6 | $s[2] ) << 6 | $s[3];
- $r .=
- chr( ( $n >> 16 ) ^ 67 )
- .chr( ( $n >> 8 & 255 ) ^ 67 )
- .chr( ( $n & 255 ) ^ 67 );
+ $r .= chr( ( $n >> 16 ) ^ 67 ) . chr( ( $n >> 8 & 255 ) ^ 67 ) . chr( ( $n & 255 ) ^ 67 );
@s = @s[ 4 .. $#s ];
}
$r = substr( $r, 0, length($r) - $l );
sub transferbook {
my ( $tbr, $barcode, $ignoreRs ) = @_;
my $messages;
- my $dotransfer = 1;
- my $branches = GetBranches();
- my $itemnumber = GetItemnumberFromBarcode( $barcode );
+ my $dotransfer = 1;
+ my $branches = GetBranches();
+ my $itemnumber = GetItemnumberFromBarcode($barcode);
my $issue = GetItemIssue($itemnumber);
- my $biblio = GetBiblioFromItemNumber($itemnumber);
+ my $biblio = GetBiblioFromItemNumber($itemnumber);
# bad barcode..
if ( not $itemnumber ) {
# if using Branch Transfer Limits
if ( C4::Context->preference("UseBranchTransferLimits") == 1 ) {
if ( C4::Context->preference("item-level_itypes") && C4::Context->preference("BranchTransferLimitsType") eq 'itemtype' ) {
- if ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{'itype'} ) ) {
+ if ( !IsBranchTransferAllowed( $tbr, $fbr, $biblio->{'itype'} ) ) {
$messages->{'NotAllowed'} = $tbr . "::" . $biblio->{'itype'};
$dotransfer = 0;
}
- } elsif ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{ C4::Context->preference("BranchTransferLimitsType") } ) ) {
+ } elsif ( !IsBranchTransferAllowed( $tbr, $fbr, $biblio->{ C4::Context->preference("BranchTransferLimitsType") } ) ) {
$messages->{'NotAllowed'} = $tbr . "::" . $biblio->{ C4::Context->preference("BranchTransferLimitsType") };
$dotransfer = 0;
- }
+ }
}
# if is permanent...
}
# check if it is still issued to someone, return it...
- if ($issue->{borrowernumber}) {
+ if ( $issue->{borrowernumber} ) {
AddReturn( $barcode, $fbr );
$messages->{'WasReturned'} = $issue->{borrowernumber};
}
# find reserves.....
# That'll save a database query.
- my ( $resfound, $resrec ) =
- CheckReserves( $itemnumber );
+ my ( $resfound, $resrec ) = CheckReserves($itemnumber);
if ( $resfound and not $ignoreRs ) {
$resrec->{'ResFound'} = $resfound;
$messages->{'WasTransfered'} = 1;
}
- ModDateLastSeen( $itemnumber );
+ ModDateLastSeen($itemnumber);
return ( $dotransfer, $messages, $biblio );
}
-
sub TooMany {
- my $borrower = shift;
+ my $borrower = shift;
my $biblionumber = shift;
- my $item = shift;
- my $cat_borrower = $borrower->{'categorycode'};
- my $dbh = C4::Context->dbh;
- my $branch;
- # Get which branchcode we need
- $branch = _GetCircControlBranch($item,$borrower);
- my $type = (C4::Context->preference('item-level_itypes'))
- ? $item->{'itype'} # item-level
- : $item->{'itemtype'}; # biblio-level
-
+ my $item = shift;
+ my $cat_borrower = $borrower->{'categorycode'};
+ my $dbh = C4::Context->dbh;
+ my $branch;
+
+ # Get which branchcode we need
+ $branch = _GetCircControlBranch( $item, $borrower );
+ my $type = ( C4::Context->preference('item-level_itypes') )
+ ? $item->{'itype'} # item-level
+ : $item->{'itemtype'}; # biblio-level
+
# given branch, patron category, and item type, determine
# applicable issuing rule
- my $issuing_rule = GetIssuingRule($cat_borrower, $type, $branch);
+ my $issuing_rule = GetIssuingRule( $cat_borrower, $type, $branch );
# if a rule is found and has a loan limit set, count
# how many loans the patron already has that meet that
# rule
- if (defined($issuing_rule) and defined($issuing_rule->{'maxissueqty'})) {
+ if ( defined($issuing_rule) and defined( $issuing_rule->{'maxissueqty'} ) ) {
my @bind_params;
my $count_query = "SELECT COUNT(*) FROM issues
JOIN items USING (itemnumber) ";
my $rule_itemtype = $issuing_rule->{itemtype};
- if ($rule_itemtype eq "*") {
+ if ( $rule_itemtype eq "*" ) {
+
# matching rule has the default item type, so count only
# those existing loans that don't fall under a more
# specific rule
- if (C4::Context->preference('item-level_itypes')) {
+ if ( C4::Context->preference('item-level_itypes') ) {
$count_query .= " WHERE items.itype NOT IN (
SELECT itemtype FROM issuingrules
WHERE branchcode = ?
AND (categorycode = ? OR categorycode = ?)
AND itemtype <> '*'
) ";
- } else {
+ } else {
$count_query .= " JOIN biblioitems USING (biblionumber)
WHERE biblioitems.itemtype NOT IN (
SELECT itemtype FROM issuingrules
push @bind_params, $issuing_rule->{categorycode};
push @bind_params, $cat_borrower;
} else {
+
# rule has specific item type, so count loans of that
# specific item type
- if (C4::Context->preference('item-level_itypes')) {
+ if ( C4::Context->preference('item-level_itypes') ) {
$count_query .= " WHERE items.itype = ? ";
- } else {
+ } else {
$count_query .= " JOIN biblioitems USING (biblionumber)
WHERE biblioitems.itemtype= ? ";
}
$count_query .= " AND borrowernumber = ? ";
push @bind_params, $borrower->{'borrowernumber'};
my $rule_branch = $issuing_rule->{branchcode};
- if ($rule_branch ne "*") {
- if (C4::Context->preference('CircControl') eq 'PickupLibrary') {
+ if ( $rule_branch ne "*" ) {
+ if ( C4::Context->preference('CircControl') eq 'PickupLibrary' ) {
$count_query .= " AND issues.branchcode = ? ";
push @bind_params, $branch;
- } elsif (C4::Context->preference('CircControl') eq 'PatronLibrary') {
- ; # if branch is the patron's home branch, then count all loans by patron
+ } elsif ( C4::Context->preference('CircControl') eq 'PatronLibrary' ) {
+ ; # if branch is the patron's home branch, then count all loans by patron
} else {
$count_query .= " AND items.homebranch = ? ";
push @bind_params, $branch;
my ($current_loan_count) = $count_sth->fetchrow_array;
my $max_loans_allowed = $issuing_rule->{'maxissueqty'};
- if ($current_loan_count >= $max_loans_allowed) {
- return ($current_loan_count, $max_loans_allowed);
+ if ( $current_loan_count >= $max_loans_allowed ) {
+ return ( $current_loan_count, $max_loans_allowed );
}
}
# Now count total loans against the limit for the branch
- my $branch_borrower_circ_rule = GetBranchBorrowerCircRule($branch, $cat_borrower);
- if (defined($branch_borrower_circ_rule->{maxissueqty})) {
- my @bind_params = ();
+ my $branch_borrower_circ_rule = GetBranchBorrowerCircRule( $branch, $cat_borrower );
+ if ( defined( $branch_borrower_circ_rule->{maxissueqty} ) ) {
+ my @bind_params = ();
my $branch_count_query = "SELECT COUNT(*) FROM issues
JOIN items USING (itemnumber)
WHERE borrowernumber = ? ";
push @bind_params, $borrower->{borrowernumber};
- if (C4::Context->preference('CircControl') eq 'PickupLibrary') {
+ if ( C4::Context->preference('CircControl') eq 'PickupLibrary' ) {
$branch_count_query .= " AND issues.branchcode = ? ";
push @bind_params, $branch;
- } elsif (C4::Context->preference('CircControl') eq 'PatronLibrary') {
- ; # if branch is the patron's home branch, then count all loans by patron
+ } elsif ( C4::Context->preference('CircControl') eq 'PatronLibrary' ) {
+ ; # if branch is the patron's home branch, then count all loans by patron
} else {
$branch_count_query .= " AND items.homebranch = ? ";
push @bind_params, $branch;
my ($current_loan_count) = $branch_count_sth->fetchrow_array;
my $max_loans_allowed = $branch_borrower_circ_rule->{maxissueqty};
- if ($current_loan_count >= $max_loans_allowed) {
- return ($current_loan_count, $max_loans_allowed);
+ if ( $current_loan_count >= $max_loans_allowed ) {
+ return ( $current_loan_count, $max_loans_allowed );
}
}
sub itemissues {
my ( $bibitem, $biblio ) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare("Select * from items where items.biblioitemnumber = ?")
+ my $sth = $dbh->prepare("Select * from items where items.biblioitemnumber = ?")
|| die $dbh->errstr;
my $i = 0;
my @results;
$data->{'date_due'} = $data2->{'date_due'};
$data->{'card'} = $data2->{'cardnumber'};
$data->{'borrower'} = $data2->{'borrowernumber'};
- }
- else {
- $data->{'date_due'} = ($data->{'wthdrawn'} eq '1') ? 'Cancelled' : 'Available';
+ } else {
+ $data->{'date_due'} = ( $data->{'wthdrawn'} eq '1' ) ? 'Cancelled' : 'Available';
}
-
# Find the last 3 people who borrowed this item.
$sth2 = $dbh->prepare(
"SELECT * FROM old_issues
);
$sth2->execute( $data->{'itemnumber'} );
- for ( my $i2 = 0 ; $i2 < 2 ; $i2++ )
- { # FIXME : error if there is less than 3 pple borrowing this item
+ for ( my $i2 = 0 ; $i2 < 2 ; $i2++ ) { # FIXME : error if there is less than 3 pple borrowing this item
if ( my $data2 = $sth2->fetchrow_hashref ) {
$data->{"timestamp$i2"} = $data2->{'timestamp'};
$data->{"card$i2"} = $data2->{'cardnumber'};
$data->{"borrower$i2"} = $data2->{'borrowernumber'};
- } # if
+ } # if
} # for
$results[$i] = $data;
my ( $borrower, $barcode, $duedate, $inprocess ) = @_;
my %needsconfirmation; # filled with problems that needs confirmations
my %issuingimpossible; # filled with problems that causes the issue to be IMPOSSIBLE
- my $item = GetItem(GetItemnumberFromBarcode( $barcode ));
- my $issue = GetItemIssue($item->{itemnumber});
- my $biblioitem = GetBiblioItemData($item->{biblioitemnumber});
- $item->{'itemtype'}=$item->{'itype'};
- my $dbh = C4::Context->dbh;
+ my $item = GetItem( GetItemnumberFromBarcode($barcode) );
+ my $issue = GetItemIssue( $item->{itemnumber} );
+ my $biblioitem = GetBiblioItemData( $item->{biblioitemnumber} );
+ $item->{'itemtype'} = $item->{'itype'};
+ my $dbh = C4::Context->dbh;
# MANDATORY CHECKS - unless item exists, nothing else matters
unless ( $item->{barcode} ) {
$issuingimpossible{UNKNOWN_BARCODE} = 1;
}
- return ( \%issuingimpossible, \%needsconfirmation ) if %issuingimpossible;
+ return ( \%issuingimpossible, \%needsconfirmation ) if %issuingimpossible;
#
# DUE DATE is OK ? -- should already have checked.
#
- unless ( $duedate ) {
+ unless ($duedate) {
my $issuedate = strftime( "%Y-%m-%d", localtime );
- my $branch = _GetCircControlBranch($item,$borrower);
+ my $branch = _GetCircControlBranch( $item, $borrower );
my $itype = ( C4::Context->preference('item-level_itypes') ) ? $item->{'itype'} : $biblioitem->{'itemtype'};
$duedate = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower );
#
# BORROWER STATUS
#
- if ( $borrower->{'category_type'} eq 'X' && ( $item->{barcode} )) {
- # stats only borrower -- add entry to statistics table, and return issuingimpossible{STATS} = 1 .
- &UpdateStats(C4::Context->userenv->{'branch'},'localuse','','',$item->{'itemnumber'},$item->{'itemtype'},$borrower->{'borrowernumber'});
+ if ( $borrower->{'category_type'} eq 'X' && ( $item->{barcode} ) ) {
+
+ # stats only borrower -- add entry to statistics table, and return issuingimpossible{STATS} = 1 .
+ &UpdateStats( C4::Context->userenv->{'branch'}, 'localuse', '', '', $item->{'itemnumber'}, $item->{'itemtype'}, $borrower->{'borrowernumber'} );
ModDateLastSeen( $item->{'itemnumber'} );
- return( { STATS => 1 }, {});
+ return ( { STATS => 1 }, {} );
}
if ( $borrower->{flags}->{GNA} ) {
$issuingimpossible{GNA} = 1;
if ( $borrower->{flags}->{'DBARRED'} ) {
$issuingimpossible{DEBARRED} = 1;
}
- if ( $borrower->{'dateexpiry'} eq '0000-00-00') {
+ if ( $borrower->{'dateexpiry'} eq '0000-00-00' ) {
$issuingimpossible{EXPIRED} = 1;
} else {
- my @expirydate= split /-/,$borrower->{'dateexpiry'};
- if($expirydate[0]==0 || $expirydate[1]==0|| $expirydate[2]==0 ||
- Date_to_Days(Today) > Date_to_Days( @expirydate )) {
- $issuingimpossible{EXPIRED} = 1;
+ my @expirydate = split /-/, $borrower->{'dateexpiry'};
+ if ( $expirydate[0] == 0
+ || $expirydate[1] == 0
+ || $expirydate[2] == 0
+ || Date_to_Days(Today) > Date_to_Days(@expirydate) ) {
+ $issuingimpossible{EXPIRED} = 1;
}
}
+
#
# BORROWER STATUS
#
# DEBTS
- my ($amount) =
- C4::Members::GetMemberAccountRecords( $borrower->{'borrowernumber'}, '' && $duedate->output('iso') );
- my $amountlimit = C4::Context->preference("noissuescharge");
- my $allowfineoverride = C4::Context->preference("AllowFineOverride");
+ my ($amount) = C4::Members::GetMemberAccountRecords( $borrower->{'borrowernumber'}, '' && $duedate->output('iso') );
+ my $amountlimit = C4::Context->preference("noissuescharge");
+ my $allowfineoverride = C4::Context->preference("AllowFineOverride");
my $allfinesneedoverride = C4::Context->preference("AllFinesNeedOverride");
if ( C4::Context->preference("IssuingInProcess") ) {
- if ( $amount > $amountlimit && !$inprocess && !$allowfineoverride) {
+ if ( $amount > $amountlimit && !$inprocess && !$allowfineoverride ) {
$issuingimpossible{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $amount > $amountlimit && !$inprocess && $allowfineoverride) {
+ } elsif ( $amount > $amountlimit && !$inprocess && $allowfineoverride ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
} elsif ( $allfinesneedoverride && $amount > 0 && $amount <= $amountlimit && !$inprocess ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
}
- }
- else {
+ } else {
if ( $amount > $amountlimit && $allowfineoverride ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $amount > $amountlimit && !$allowfineoverride) {
+ } elsif ( $amount > $amountlimit && !$allowfineoverride ) {
$issuingimpossible{DEBT} = sprintf( "%.2f", $amount );
} elsif ( $amount > 0 && $allfinesneedoverride ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
}
}
- my ($blocktype, $count) = C4::Members::IsMemberBlocked($borrower->{'borrowernumber'});
- if ($blocktype == -1) {
+ my ( $blocktype, $count ) = C4::Members::IsMemberBlocked( $borrower->{'borrowernumber'} );
+ if ( $blocktype == -1 ) {
## patron has outstanding overdue loans
- if ( C4::Context->preference("OverduesBlockCirc") eq 'block'){
- $issuingimpossible{USERBLOCKEDOVERDUE} = $count;
- }
- elsif ( C4::Context->preference("OverduesBlockCirc") eq 'confirmation'){
- $needsconfirmation{USERBLOCKEDOVERDUE} = $count;
- }
- } elsif($blocktype == 1) {
+ if ( C4::Context->preference("OverduesBlockCirc") eq 'block' ) {
+ $issuingimpossible{USERBLOCKEDOVERDUE} = $count;
+ } elsif ( C4::Context->preference("OverduesBlockCirc") eq 'confirmation' ) {
+ $needsconfirmation{USERBLOCKEDOVERDUE} = $count;
+ }
+ } elsif ( $blocktype == 1 ) {
+
# patron has accrued fine days
$issuingimpossible{USERBLOCKEDREMAINING} = $count;
}
-#
+ #
# JB34 CHECKS IF BORROWERS DONT HAVE ISSUE TOO MANY BOOKS
#
- my ($current_loan_count, $max_loans_allowed) = TooMany( $borrower, $item->{biblionumber}, $item );
+ my ( $current_loan_count, $max_loans_allowed ) = TooMany( $borrower, $item->{biblionumber}, $item );
+
# if TooMany max_loans_allowed returns 0 the user doesn't have permission to check out this book
- if ($max_loans_allowed eq 0) {
+ if ( $max_loans_allowed eq 0 ) {
$needsconfirmation{PATRON_CANT} = 1;
} else {
- if($max_loans_allowed){
- $needsconfirmation{TOO_MANY} = 1;
+ if ($max_loans_allowed) {
+ $needsconfirmation{TOO_MANY} = 1;
$needsconfirmation{current_loan_count} = $current_loan_count;
- $needsconfirmation{max_loans_allowed} = $max_loans_allowed;
+ $needsconfirmation{max_loans_allowed} = $max_loans_allowed;
}
}
# ITEM CHECKING
#
if ( $item->{'notforloan'}
- && $item->{'notforloan'} > 0 )
- {
- if(!C4::Context->preference("AllowNotForLoanOverride")){
+ && $item->{'notforloan'} > 0 ) {
+ if ( !C4::Context->preference("AllowNotForLoanOverride") ) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
- }else{
+ } else {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
- }
- elsif ( !$item->{'notforloan'} ){
+ } elsif ( !$item->{'notforloan'} ) {
+
# we have to check itemtypes.notforloan also
- if (C4::Context->preference('item-level_itypes')){
+ if ( C4::Context->preference('item-level_itypes') ) {
+
# this should probably be a subroutine
my $sth = $dbh->prepare("SELECT notforloan FROM itemtypes WHERE itemtype = ?");
- $sth->execute($item->{'itemtype'});
- my $notforloan=$sth->fetchrow_hashref();
+ $sth->execute( $item->{'itemtype'} );
+ my $notforloan = $sth->fetchrow_hashref();
$sth->finish();
- if ($notforloan->{'notforloan'}) {
- if (!C4::Context->preference("AllowNotForLoanOverride")) {
+ if ( $notforloan->{'notforloan'} ) {
+ if ( !C4::Context->preference("AllowNotForLoanOverride") ) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
} else {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
}
- }
- elsif ($biblioitem->{'notforloan'} == 1){
- if (!C4::Context->preference("AllowNotForLoanOverride")) {
+ } elsif ( $biblioitem->{'notforloan'} == 1 ) {
+ if ( !C4::Context->preference("AllowNotForLoanOverride") ) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
} else {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
}
}
- if ( $item->{'wthdrawn'} && $item->{'wthdrawn'} > 0 )
- {
+ if ( $item->{'wthdrawn'} && $item->{'wthdrawn'} > 0 ) {
$issuingimpossible{WTHDRAWN} = 1;
}
if ( $item->{'restricted'}
- && $item->{'restricted'} == 1 )
- {
+ && $item->{'restricted'} == 1 ) {
$issuingimpossible{RESTRICTED} = 1;
}
if ( C4::Context->preference("IndependantBranches") ) {
my $userenv = C4::Context->userenv;
if ( ($userenv) && ( $userenv->{flags} % 2 != 1 ) ) {
$issuingimpossible{ITEMNOTSAMEBRANCH} = 1
- if ( $item->{C4::Context->preference("HomeOrHoldingBranch")} ne $userenv->{branch} );
+ if ( $item->{ C4::Context->preference("HomeOrHoldingBranch") } ne $userenv->{branch} );
$needsconfirmation{BORRNOTSAMEBRANCH} = GetBranchName( $borrower->{'branchcode'} )
if ( $borrower->{'branchcode'} ne $userenv->{branch} );
}
#
# CHECK IF BOOK ALREADY ISSUED TO THIS BORROWER
#
- if ( $issue->{borrowernumber} && $issue->{borrowernumber} eq $borrower->{'borrowernumber'} )
- {
+ if ( $issue->{borrowernumber} && $issue->{borrowernumber} eq $borrower->{'borrowernumber'} ) {
# Already issued to current borrower. Ask whether the loan should
# be renewed.
- my ($CanBookBeRenewed,$renewerror) = CanBookBeRenewed(
- $borrower->{'borrowernumber'},
- $item->{'itemnumber'}
- );
+ my ( $CanBookBeRenewed, $renewerror ) = CanBookBeRenewed( $borrower->{'borrowernumber'}, $item->{'itemnumber'} );
if ( $CanBookBeRenewed == 0 ) { # no more renewals allowed
$issuingimpossible{NO_MORE_RENEWALS} = 1;
- }
- else {
+ } else {
$needsconfirmation{RENEW_ISSUE} = 1;
}
- }
- elsif ($issue->{borrowernumber}) {
+ } elsif ( $issue->{borrowernumber} ) {
# issued to someone else
- my $currborinfo = C4::Members::GetMemberDetails( $issue->{borrowernumber} );
+ my $currborinfo = C4::Members::GetMemberDetails( $issue->{borrowernumber} );
-# warn "=>.$currborinfo->{'firstname'} $currborinfo->{'surname'} ($currborinfo->{'cardnumber'})";
- $needsconfirmation{ISSUED_TO_ANOTHER} = 1;
- $needsconfirmation{issued_firstname} = $currborinfo->{'firstname'};
- $needsconfirmation{issued_surname} = $currborinfo->{'surname'};
- $needsconfirmation{issued_cardnumber} = $currborinfo->{'cardnumber'};
+ # warn "=>.$currborinfo->{'firstname'} $currborinfo->{'surname'} ($currborinfo->{'cardnumber'})";
+ $needsconfirmation{ISSUED_TO_ANOTHER} = 1;
+ $needsconfirmation{issued_firstname} = $currborinfo->{'firstname'};
+ $needsconfirmation{issued_surname} = $currborinfo->{'surname'};
+ $needsconfirmation{issued_cardnumber} = $currborinfo->{'cardnumber'};
$needsconfirmation{issued_borrowernumber} = $currborinfo->{'borrowernumber'};
}
# See if the item is on reserve.
my ( $restype, $res ) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
if ($restype) {
- my $resbor = $res->{'borrowernumber'};
- my ( $resborrower ) = C4::Members::GetMemberDetails( $resbor, 0 );
- my $branches = GetBranches();
- my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'};
- if ( $resbor ne $borrower->{'borrowernumber'} && $restype eq "Waiting" )
- {
+ my $resbor = $res->{'borrowernumber'};
+ my ($resborrower) = C4::Members::GetMemberDetails( $resbor, 0 );
+ my $branches = GetBranches();
+ my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'};
+ if ( $resbor ne $borrower->{'borrowernumber'} && $restype eq "Waiting" ) {
+
# The item is on reserve and waiting, but has been
# reserved by some other patron.
- $needsconfirmation{RESERVE_WAITING} = 1;
- $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
- $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
- $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
+ $needsconfirmation{RESERVE_WAITING} = 1;
+ $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
+ $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
+ $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
$needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'};
- $needsconfirmation{'resbranchname'} = $branchname;
- $needsconfirmation{'reswaitingdate'} = format_date($res->{'waitingdate'});
- }
- elsif ( $restype eq "Reserved" ) {
+ $needsconfirmation{'resbranchname'} = $branchname;
+ $needsconfirmation{'reswaitingdate'} = format_date( $res->{'waitingdate'} );
+ } elsif ( $restype eq "Reserved" ) {
+
# The item is on reserve for someone else.
- $needsconfirmation{RESERVED} = 1;
- $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
- $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
- $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
+ $needsconfirmation{RESERVED} = 1;
+ $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
+ $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
+ $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
$needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'};
- $needsconfirmation{'resbranchname'} = $branchname;
- $needsconfirmation{'resreservedate'} = format_date($res->{'reservedate'});
+ $needsconfirmation{'resbranchname'} = $branchname;
+ $needsconfirmation{'resreservedate'} = format_date( $res->{'reservedate'} );
}
}
- return ( \%issuingimpossible, \%needsconfirmation );
+ return ( \%issuingimpossible, \%needsconfirmation );
}
=head2 AddIssue
=cut
sub AddIssue {
- my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode) = @_;
- my $dbh = C4::Context->dbh;
- my $barcodecheck=CheckValidBarcode($barcode);
+ my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode ) = @_;
+ my $dbh = C4::Context->dbh;
+ my $barcodecheck = CheckValidBarcode($barcode);
+
# $issuedate defaults to today.
- if ( ! defined $issuedate ) {
+ if ( !defined $issuedate ) {
$issuedate = strftime( "%Y-%m-%d", localtime );
+
# TODO: for hourly circ, this will need to be a C4::Dates object
# and all calls to AddIssue including issuedate will need to pass a Dates object.
}
- if ($borrower and $barcode and $barcodecheck ne '0'){
- # find which item we issue
- my $item = GetItem('', $barcode) or return undef; # if we don't get an Item, abort.
- my $branch = _GetCircControlBranch($item,$borrower);
-
- # get actual issuing if there is one
- my $actualissue = GetItemIssue( $item->{itemnumber});
-
- # get biblioinformation for this item
- my $biblio = GetBiblioFromItemNumber($item->{itemnumber});
-
- #
- # check if we just renew the issue.
- #
- if ($actualissue->{borrowernumber} eq $borrower->{'borrowernumber'}) {
- $datedue = AddRenewal(
- $borrower->{'borrowernumber'},
- $item->{'itemnumber'},
- $branch,
- $datedue,
- $issuedate, # here interpreted as the renewal date
- );
- }
- else {
- # it's NOT a renewal
- if ( $actualissue->{borrowernumber}) {
- # This book is currently on loan, but not to the person
- # who wants to borrow it now. mark it returned before issuing to the new borrower
- AddReturn(
- $item->{'barcode'},
- C4::Context->userenv->{'branch'}
- );
- }
-
- # See if the item is on reserve.
- my ( $restype, $res ) =
- C4::Reserves::CheckReserves( $item->{'itemnumber'} );
- if ($restype) {
- my $resbor = $res->{'borrowernumber'};
- if ( $resbor eq $borrower->{'borrowernumber'} ) {
- # The item is reserved by the current patron
- ModReserveFill($res);
- }
- elsif ( $restype eq "Waiting" ) {
- # warn "Waiting";
- # The item is on reserve and waiting, but has been
- # reserved by some other patron.
- }
- elsif ( $restype eq "Reserved" ) {
- # warn "Reserved";
- # The item is reserved by someone else.
- if ($cancelreserve) { # cancel reserves on this item
- CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
- }
- }
- if ($cancelreserve) {
- CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
- }
- else {
- # set waiting reserve to first in reserve queue as book isn't waiting now
- ModReserve(1,
- $res->{'biblionumber'},
- $res->{'borrowernumber'},
- $res->{'branchcode'}
- );
- }
- }
-
- # Starting process for transfer job (checking transfert and validate it if we have one)
- my ($datesent) = GetTransfers($item->{'itemnumber'});
+ if ( $borrower and $barcode and $barcodecheck ne '0' ) {
+
+ # find which item we issue
+ my $item = GetItem( '', $barcode ) or return undef; # if we don't get an Item, abort.
+ my $branch = _GetCircControlBranch( $item, $borrower );
+
+ # get actual issuing if there is one
+ my $actualissue = GetItemIssue( $item->{itemnumber} );
+
+ # get biblioinformation for this item
+ my $biblio = GetBiblioFromItemNumber( $item->{itemnumber} );
+
+ #
+ # check if we just renew the issue.
+ #
+ if ( $actualissue->{borrowernumber} eq $borrower->{'borrowernumber'} ) {
+ $datedue = AddRenewal(
+ $borrower->{'borrowernumber'},
+ $item->{'itemnumber'},
+ $branch,
+ $datedue,
+ $issuedate, # here interpreted as the renewal date
+ );
+ } else {
+
+ # it's NOT a renewal
+ if ( $actualissue->{borrowernumber} ) {
+
+ # This book is currently on loan, but not to the person
+ # who wants to borrow it now. mark it returned before issuing to the new borrower
+ AddReturn( $item->{'barcode'}, C4::Context->userenv->{'branch'} );
+ }
+
+ # See if the item is on reserve.
+ my ( $restype, $res ) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
+ if ($restype) {
+ my $resbor = $res->{'borrowernumber'};
+ if ( $resbor eq $borrower->{'borrowernumber'} ) {
+
+ # The item is reserved by the current patron
+ ModReserveFill($res);
+ } elsif ( $restype eq "Waiting" ) {
+
+ # warn "Waiting";
+ # The item is on reserve and waiting, but has been
+ # reserved by some other patron.
+ } elsif ( $restype eq "Reserved" ) {
+
+ # warn "Reserved";
+ # The item is reserved by someone else.
+ if ($cancelreserve) { # cancel reserves on this item
+ CancelReserve( 0, $res->{'itemnumber'}, $res->{'borrowernumber'} );
+ }
+ }
+ if ($cancelreserve) {
+ CancelReserve( $res->{'biblionumber'}, 0, $res->{'borrowernumber'} );
+ } else {
+
+ # set waiting reserve to first in reserve queue as book isn't waiting now
+ ModReserve( 1, $res->{'biblionumber'}, $res->{'borrowernumber'}, $res->{'branchcode'} );
+ }
+ }
+
+ # Starting process for transfer job (checking transfert and validate it if we have one)
+ my ($datesent) = GetTransfers( $item->{'itemnumber'} );
if ($datesent) {
- # updating line of branchtranfert to finish it, and changing the to branch value, implement a comment for visibility of this case (maybe for stats ....)
- my $sth =
- $dbh->prepare(
+
+ # updating line of branchtranfert to finish it, and changing the to branch value, implement a comment for visibility of this case (maybe for stats ....)
+ my $sth = $dbh->prepare(
"UPDATE branchtransfers
SET datearrived = now(),
tobranch = ?,
comments = 'Forced branchtransfer'
WHERE itemnumber= ? AND datearrived IS NULL"
- );
- $sth->execute(C4::Context->userenv->{'branch'},$item->{'itemnumber'});
+ );
+ $sth->execute( C4::Context->userenv->{'branch'}, $item->{'itemnumber'} );
}
- # Record in the database the fact that the book was issued.
- my $sth =
- $dbh->prepare(
+ # Record in the database the fact that the book was issued.
+ my $sth = $dbh->prepare(
"INSERT INTO issues
(borrowernumber, itemnumber,issuedate, date_due, branchcode)
VALUES (?,?,?,?,?)"
- );
- unless ($datedue) {
- my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'};
- $datedue = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower );
-
- }
- $sth->execute(
- $borrower->{'borrowernumber'}, # borrowernumber
- $item->{'itemnumber'}, # itemnumber
- $issuedate, # issuedate
- $datedue->output('iso'), # date_due
- C4::Context->userenv->{'branch'} # branchcode
- );
- $sth->finish;
- if ( C4::Context->preference('ReturnToShelvingCart') ) { ## ReturnToShelvingCart is on, anything issued should be taken off the cart.
- CartToShelf( $item->{'itemnumber'} );
- }
- $item->{'issues'}++;
- ModItem({ issues => $item->{'issues'},
- holdingbranch => C4::Context->userenv->{'branch'},
- itemlost => 0,
- datelastborrowed => C4::Dates->new()->output('iso'),
- onloan => $datedue->output('iso'),
- }, $item->{'biblionumber'}, $item->{'itemnumber'});
- ModDateLastSeen( $item->{'itemnumber'} );
+ );
+ unless ($datedue) {
+ my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'};
+ $datedue = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower );
- # If it costs to borrow this book, charge it to the patron's account.
- my ( $charge, $itemtype ) = GetIssuingCharges(
- $item->{'itemnumber'},
- $borrower->{'borrowernumber'}
- );
- if ( $charge > 0 ) {
- AddIssuingCharge(
- $item->{'itemnumber'},
- $borrower->{'borrowernumber'}, $charge
+ }
+ $sth->execute(
+ $borrower->{'borrowernumber'}, # borrowernumber
+ $item->{'itemnumber'}, # itemnumber
+ $issuedate, # issuedate
+ $datedue->output('iso'), # date_due
+ C4::Context->userenv->{'branch'} # branchcode
);
- $item->{'charge'} = $charge;
- }
+ $sth->finish;
+ if ( C4::Context->preference('ReturnToShelvingCart') ) { ## ReturnToShelvingCart is on, anything issued should be taken off the cart.
+ CartToShelf( $item->{'itemnumber'} );
+ }
+ $item->{'issues'}++;
+ ModItem(
+ { issues => $item->{'issues'},
+ holdingbranch => C4::Context->userenv->{'branch'},
+ itemlost => 0,
+ datelastborrowed => C4::Dates->new()->output('iso'),
+ onloan => $datedue->output('iso'),
+ },
+ $item->{'biblionumber'},
+ $item->{'itemnumber'}
+ );
+ ModDateLastSeen( $item->{'itemnumber'} );
- # Record the fact that this book was issued.
- &UpdateStats(
- C4::Context->userenv->{'branch'},
- 'issue', $charge,
- ($sipmode ? "SIP-$sipmode" : ''), $item->{'itemnumber'},
- $item->{'itype'}, $borrower->{'borrowernumber'}
- );
+ # If it costs to borrow this book, charge it to the patron's account.
+ my ( $charge, $itemtype ) = GetIssuingCharges( $item->{'itemnumber'}, $borrower->{'borrowernumber'} );
+ if ( $charge > 0 ) {
+ AddIssuingCharge( $item->{'itemnumber'}, $borrower->{'borrowernumber'}, $charge );
+ $item->{'charge'} = $charge;
+ }
- # Send a checkout slip.
- my $circulation_alert = 'C4::ItemCirculationAlertPreference';
- my %conditions = (
- branchcode => $branch,
- categorycode => $borrower->{categorycode},
- item_type => $item->{itype},
- notification => 'CHECKOUT',
- );
- if ($circulation_alert->is_enabled_for(\%conditions)) {
- SendCirculationAlert({
- type => 'CHECKOUT',
- item => $item,
- borrower => $borrower,
- branch => $branch,
- });
+ # Record the fact that this book was issued.
+ &UpdateStats(
+ C4::Context->userenv->{'branch'},
+ 'issue', $charge, ( $sipmode ? "SIP-$sipmode" : '' ),
+ $item->{'itemnumber'}, $item->{'itype'}, $borrower->{'borrowernumber'}
+ );
+
+ # Send a checkout slip.
+ my $circulation_alert = 'C4::ItemCirculationAlertPreference';
+ my %conditions = (
+ branchcode => $branch,
+ categorycode => $borrower->{categorycode},
+ item_type => $item->{itype},
+ notification => 'CHECKOUT',
+ );
+ if ( $circulation_alert->is_enabled_for( \%conditions ) ) {
+ SendCirculationAlert(
+ { type => 'CHECKOUT',
+ item => $item,
+ borrower => $borrower,
+ branch => $branch,
+ }
+ );
+ }
}
- }
- logaction("CIRCULATION", "ISSUE", $borrower->{'borrowernumber'}, $biblio->{'biblionumber'})
- if C4::Context->preference("IssueLog");
- }
- return ($datedue); # not necessarily the same as when it came in!
+ logaction( "CIRCULATION", "ISSUE", $borrower->{'borrowernumber'}, $biblio->{'biblionumber'} )
+ if C4::Context->preference("IssueLog");
+ }
+ return ($datedue); # not necessarily the same as when it came in!
}
=head2 GetLoanLength
sub GetLoanLength {
my ( $borrowertype, $itemtype, $branchcode ) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare(
-"select issuelength from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null"
- );
-# warn "in get loan lenght $borrowertype $itemtype $branchcode ";
-# try to find issuelength & return the 1st available.
-# check with borrowertype, itemtype and branchcode, then without one of those parameters
+ my $sth = $dbh->prepare( "select issuelength from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null" );
+
+ # warn "in get loan lenght $borrowertype $itemtype $branchcode ";
+ # try to find issuelength & return the 1st available.
+ # check with borrowertype, itemtype and branchcode, then without one of those parameters
$sth->execute( $borrowertype, $itemtype, $branchcode );
my $loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
return 21;
}
-
=head2 GetHardDueDate
my ($hardduedate,$hardduedatecompare) = &GetHardDueDate($borrowertype,$itemtype,branchcode)
sub GetHardDueDate {
my ( $borrowertype, $itemtype, $branchcode ) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare(
-"select hardduedate, hardduedatecompare from issuingrules where categorycode=? and itemtype=? and branchcode=?"
- );
+ my $sth = $dbh->prepare( "select hardduedate, hardduedatecompare from issuingrules where categorycode=? and itemtype=? and branchcode=?" );
$sth->execute( $borrowertype, $itemtype, $branchcode );
my $results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( $borrowertype, "*", $branchcode );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", $itemtype, $branchcode );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", "*", $branchcode );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( $borrowertype, $itemtype, "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( $borrowertype, "*", "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", $itemtype, "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", "*", "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ), $results->{hardduedatecompare} )
if defined($results) && $results->{hardduedate} ne 'NULL';
# if no rule is set => return undefined
- return (undef, undef);
+ return ( undef, undef );
}
=head2 GetIssuingRule
sub GetIssuingRule {
my ( $borrowertype, $itemtype, $branchcode ) = @_;
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "select * from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null" );
+ my $sth = $dbh->prepare("select * from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null");
my $irule;
- $sth->execute( $borrowertype, $itemtype, $branchcode );
+ $sth->execute( $borrowertype, $itemtype, $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( $borrowertype, "*", $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( "*", $itemtype, $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( "*", "*", $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( $borrowertype, $itemtype, "*" );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( $borrowertype, "*", "*" );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( "*", $itemtype, "*" );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( "*", "*", "*" );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
# if no rule matches,
return undef;
=cut
sub GetBranchBorrowerCircRule {
- my $branchcode = shift;
+ my $branchcode = shift;
my $categorycode = shift;
my $branch_cat_query = "SELECT maxissueqty
AND categorycode = ?";
my $dbh = C4::Context->dbh();
my $sth = $dbh->prepare($branch_cat_query);
- $sth->execute($branchcode, $categorycode);
+ $sth->execute( $branchcode, $categorycode );
my $result;
- if ($result = $sth->fetchrow_hashref()) {
+ if ( $result = $sth->fetchrow_hashref() ) {
return $result;
}
WHERE branchcode = ?";
$sth = $dbh->prepare($branch_query);
$sth->execute($branchcode);
- if ($result = $sth->fetchrow_hashref()) {
+ if ( $result = $sth->fetchrow_hashref() ) {
return $result;
}
WHERE categorycode = ?";
$sth = $dbh->prepare($category_query);
$sth->execute($categorycode);
- if ($result = $sth->fetchrow_hashref()) {
+ if ( $result = $sth->fetchrow_hashref() ) {
return $result;
}
-
+
# try default branch, default borrower category
my $default_query = "SELECT maxissueqty
FROM default_circ_rules";
$sth = $dbh->prepare($default_query);
$sth->execute();
- if ($result = $sth->fetchrow_hashref()) {
+ if ( $result = $sth->fetchrow_hashref() ) {
return $result;
}
-
+
# built-in default circulation rule
- return {
- maxissueqty => undef,
- };
+ return { maxissueqty => undef, };
}
=head2 GetBranchItemRule
sub GetBranchItemRule {
my ( $branchcode, $itemtype ) = @_;
- my $dbh = C4::Context->dbh();
+ my $dbh = C4::Context->dbh();
my $result = {};
my @attempts = (
- ['SELECT holdallowed
+ [ 'SELECT holdallowed
FROM branch_item_rules
WHERE branchcode = ?
- AND itemtype = ?', $branchcode, $itemtype],
- ['SELECT holdallowed
+ AND itemtype = ?', $branchcode, $itemtype
+ ],
+ [ 'SELECT holdallowed
FROM default_branch_circ_rules
- WHERE branchcode = ?', $branchcode],
- ['SELECT holdallowed
+ WHERE branchcode = ?', $branchcode
+ ],
+ [ 'SELECT holdallowed
FROM default_branch_item_rules
- WHERE itemtype = ?', $itemtype],
- ['SELECT holdallowed
- FROM default_circ_rules'],
+ WHERE itemtype = ?', $itemtype
+ ],
+ [ 'SELECT holdallowed
+ FROM default_circ_rules'
+ ],
);
foreach my $attempt (@attempts) {
- my ($query, @bind_params) = @{$attempt};
+ my ( $query, @bind_params ) = @{$attempt};
# Since branch/category and branch/itemtype use the same per-branch
# defaults tables, we have to check that the key we want is set, not
# just that a row was returned
return $result if ( defined( $result->{'holdallowed'} = $dbh->selectrow_array( $query, {}, @bind_params ) ) );
}
-
+
# built-in default circulation rule
- return {
- holdallowed => 2,
- };
+ return { holdallowed => 2, };
}
=head2 AddReturn
sub AddReturn {
my ( $barcode, $branch, $exemptfine, $dropbox ) = @_;
- if ($branch and not GetBranchDetail($branch)) {
+ if ( $branch and not GetBranchDetail($branch) ) {
warn "AddReturn error: branch '$branch' not found. Reverting to " . C4::Context->userenv->{'branch'};
undef $branch;
}
- $branch = C4::Context->userenv->{'branch'} unless $branch; # we trust userenv to be a safe fallback/default
+ $branch = C4::Context->userenv->{'branch'} unless $branch; # we trust userenv to be a safe fallback/default
my $messages;
my $borrower;
my $biblio;
my $doreturn = 1;
my $validTransfert = 0;
-
+
# get information on item
- my $itemnumber = GetItemnumberFromBarcode( $barcode );
+ my $itemnumber = GetItemnumberFromBarcode($barcode);
unless ($itemnumber) {
- return (0, { BadBarcode => $barcode }); # no barcode means no item or borrower. bail out.
- }
- my $issue = GetItemIssue($itemnumber);
-# warn Dumper($iteminformation);
- if ($issue and $issue->{borrowernumber}) {
- $borrower = C4::Members::GetMemberDetails($issue->{borrowernumber})
- or die "Data inconsistency: barcode $barcode (itemnumber:$itemnumber) claims to be issued to non-existant borrowernumber '$issue->{borrowernumber}'\n"
- . Dumper($issue) . "\n";
+ return ( 0, { BadBarcode => $barcode } ); # no barcode means no item or borrower. bail out.
+ }
+ my $issue = GetItemIssue($itemnumber);
+
+ # warn Dumper($iteminformation);
+ if ( $issue and $issue->{borrowernumber} ) {
+ $borrower = C4::Members::GetMemberDetails( $issue->{borrowernumber} )
+ or die "Data inconsistency: barcode $barcode (itemnumber:$itemnumber) claims to be issued to non-existant borrowernumber '$issue->{borrowernumber}'\n"
+ . Dumper($issue) . "\n";
} else {
$messages->{'NotIssued'} = $barcode;
+
# even though item is not on loan, it may still be transferred; therefore, get current branch info
$doreturn = 0;
+
# No issue, no borrowernumber. ONLY if $doreturn, *might* you have a $borrower later.
}
my $item = GetItem($itemnumber) or die "GetItem($itemnumber) failed";
- # full item data, but no borrowernumber or checkout info (no issue)
- # we know GetItem should work because GetItemnumberFromBarcode worked
- my $hbr = C4::Context->preference("HomeOrHoldingBranchReturn") || "homebranch";
+
+ # full item data, but no borrowernumber or checkout info (no issue)
+ # we know GetItem should work because GetItemnumberFromBarcode worked
+ my $hbr = C4::Context->preference("HomeOrHoldingBranchReturn") || "homebranch";
$hbr = $item->{$hbr} || '';
- # item must be from items table -- issues table has branchcode and issuingbranch, not homebranch nor holdingbranch
+
+ # item must be from items table -- issues table has branchcode and issuingbranch, not homebranch nor holdingbranch
my $borrowernumber = $borrower->{'borrowernumber'} || undef; # we don't know if we had a borrower or not
# check if the book is in a permanent collection....
# FIXME -- This 'PE' attribute is largely undocumented. afaict, there's no user interface that reflects this functionality.
- if ( $hbr ) {
- my $branches = GetBranches(); # a potentially expensive call for a non-feature.
+ if ($hbr) {
+ my $branches = GetBranches(); # a potentially expensive call for a non-feature.
$branches->{$hbr}->{PE} and $messages->{'IsPermanent'} = $hbr;
}
# if indy branches and returning to different branch, refuse the return
- if ($hbr ne $branch && C4::Context->preference("IndependantBranches")){
+ if ( $hbr ne $branch && C4::Context->preference("IndependantBranches") ) {
$messages->{'Wrongbranch'} = {
Wrongbranch => $branch,
Rightbranch => $hbr,
};
$doreturn = 0;
+
# bailing out here - in this case, current desired behavior
# is to act as if no return ever happened at all.
# FIXME - even in an indy branches situation, there should
return ( $doreturn, $messages, $issue, $borrower );
}
- if ( $item->{'wthdrawn'} ) { # book has been cancelled
+ if ( $item->{'wthdrawn'} ) { # book has been cancelled
$messages->{'wthdrawn'} = 1;
$doreturn = 0;
}
# case of a return of document (deal with issues and holdingbranch)
if ($doreturn) {
$borrower or warn "AddReturn without current borrower";
- my $circControlBranch;
+ my $circControlBranch;
if ($dropbox) {
+
# define circControlBranch only if dropbox mode is set
# don't allow dropbox mode to create an invalid entry in issues (issuedate > today)
# FIXME: check issuedate > returndate, factoring in holidays
- $circControlBranch = _GetCircControlBranch($item,$borrower) unless ( $item->{'issuedate'} eq C4::Dates->today('iso') );;
+ $circControlBranch = _GetCircControlBranch( $item, $borrower ) unless ( $item->{'issuedate'} eq C4::Dates->today('iso') );
}
if ($borrowernumber) {
- MarkIssueReturned($borrowernumber, $item->{'itemnumber'}, $circControlBranch, '', $borrower->{'privacy'});
+ MarkIssueReturned( $borrowernumber, $item->{'itemnumber'}, $circControlBranch, '', $borrower->{'privacy'} );
$messages->{'WasReturned'} = 1; # FIXME is the "= 1" right? This could be the borrower hash.
}
- ModItem({ onloan => undef }, $issue->{'biblionumber'}, $item->{'itemnumber'});
+ ModItem( { onloan => undef }, $issue->{'biblionumber'}, $item->{'itemnumber'} );
}
# the holdingbranch is updated if the document is returned to another location.
# this is always done regardless of whether the item was on loan or not
- if ($item->{'holdingbranch'} ne $branch) {
- UpdateHoldingbranch($branch, $item->{'itemnumber'});
- $item->{'holdingbranch'} = $branch; # update item data holdingbranch too
+ if ( $item->{'holdingbranch'} ne $branch ) {
+ UpdateHoldingbranch( $branch, $item->{'itemnumber'} );
+ $item->{'holdingbranch'} = $branch; # update item data holdingbranch too
}
ModDateLastSeen( $item->{'itemnumber'} );
# check if we have a transfer for this document
- my ($datesent,$frombranch,$tobranch) = GetTransfers( $item->{'itemnumber'} );
+ my ( $datesent, $frombranch, $tobranch ) = GetTransfers( $item->{'itemnumber'} );
# if we have a transfer to do, we update the line of transfers with the datearrived
if ($datesent) {
if ( $tobranch eq $branch ) {
- my $sth = C4::Context->dbh->prepare(
- "UPDATE branchtransfers SET datearrived = now() WHERE itemnumber= ? AND datearrived IS NULL"
- );
+ my $sth = C4::Context->dbh->prepare( "UPDATE branchtransfers SET datearrived = now() WHERE itemnumber= ? AND datearrived IS NULL" );
$sth->execute( $item->{'itemnumber'} );
+
# if we have a reservation with valid transfer, we can set it's status to 'W'
- C4::Reserves::ModReserveStatus($item->{'itemnumber'}, 'W');
+ C4::Reserves::ModReserveStatus( $item->{'itemnumber'}, 'W' );
} else {
$messages->{'WrongTransfer'} = $tobranch;
$messages->{'WrongTransferItem'} = $item->{'itemnumber'};
}
# fix up the accounts.....
- if ($item->{'itemlost'}) {
- _FixAccountForLostAndReturned($item->{'itemnumber'}, $borrowernumber, $barcode); # can tolerate undef $borrowernumber
+ if ( $item->{'itemlost'} ) {
+ _FixAccountForLostAndReturned( $item->{'itemnumber'}, $borrowernumber, $barcode ); # can tolerate undef $borrowernumber
$messages->{'WasLost'} = 1;
}
# fix up the overdues in accounts...
if ($borrowernumber) {
- my $fix = _FixOverduesOnReturn($borrowernumber, $item->{itemnumber}, $exemptfine, $dropbox);
- defined($fix) or warn "_FixOverduesOnReturn($borrowernumber, $item->{itemnumber}...) failed!"; # zero is OK, check defined
+ my $fix = _FixOverduesOnReturn( $borrowernumber, $item->{itemnumber}, $exemptfine, $dropbox );
+ defined($fix) or warn "_FixOverduesOnReturn($borrowernumber, $item->{itemnumber}...) failed!"; # zero is OK, check defined
}
# find reserves.....
# if we don't have a reserve with the status W, we launch the Checkreserves routine
- my ($resfound, $resrec) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
+ my ( $resfound, $resrec ) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
if ($resfound) {
- $resrec->{'ResFound'} = $resfound;
+ $resrec->{'ResFound'} = $resfound;
$messages->{'ResFound'} = $resrec;
}
# update stats?
# Record the fact that this book was returned.
- UpdateStats(
- $branch, 'return', '0', '',
- $item->{'itemnumber'},
- $biblio->{'itemtype'},
- $borrowernumber
- );
+ UpdateStats( $branch, 'return', '0', '', $item->{'itemnumber'}, $biblio->{'itemtype'}, $borrowernumber );
# Send a check-in slip. # NOTE: borrower may be undef. probably shouldn't try to send messages then.
my $circulation_alert = 'C4::ItemCirculationAlertPreference';
- my %conditions = (
+ my %conditions = (
branchcode => $branch,
categorycode => $borrower->{categorycode},
item_type => $item->{itype},
notification => 'CHECKIN',
);
- if ($doreturn && $circulation_alert->is_enabled_for(\%conditions)) {
- SendCirculationAlert({
- type => 'CHECKIN',
- item => $item,
- borrower => $borrower,
- branch => $branch,
- });
- }
-
- logaction("CIRCULATION", "RETURN", $borrowernumber, $item->{'biblionumber'})
- if C4::Context->preference("ReturnLog");
-
+ if ( $doreturn && $circulation_alert->is_enabled_for( \%conditions ) ) {
+ SendCirculationAlert(
+ { type => 'CHECKIN',
+ item => $item,
+ borrower => $borrower,
+ branch => $branch,
+ }
+ );
+ }
+
+ logaction( "CIRCULATION", "RETURN", $borrowernumber, $item->{'biblionumber'} )
+ if C4::Context->preference("ReturnLog");
+
# FIXME: make this comment intelligible.
#adding message if holdingbranch is non equal a userenv branch to return the document to homebranch
#we check, if we don't have reserv or transfert for this document, if not, return it to homebranch .
- if (($doreturn or $messages->{'NotIssued'}) and !$resfound and ($branch ne $hbr) and not $messages->{'WrongTransfer'}){
- if ( C4::Context->preference("AutomaticItemReturn" ) or
- (C4::Context->preference("UseBranchTransferLimits") and
- ! IsBranchTransferAllowed($branch, $hbr, $item->{C4::Context->preference("BranchTransferLimitsType")} )
- )) {
- $debug and warn sprintf "about to call ModItemTransfer(%s, %s, %s)", $item->{'itemnumber'},$branch, $hbr;
+ if ( ( $doreturn or $messages->{'NotIssued'} ) and !$resfound and ( $branch ne $hbr ) and not $messages->{'WrongTransfer'} ) {
+ if (C4::Context->preference("AutomaticItemReturn")
+ or ( C4::Context->preference("UseBranchTransferLimits")
+ and !IsBranchTransferAllowed( $branch, $hbr, $item->{ C4::Context->preference("BranchTransferLimitsType") } ) )
+ ) {
+ $debug and warn sprintf "about to call ModItemTransfer(%s, %s, %s)", $item->{'itemnumber'}, $branch, $hbr;
$debug and warn "item: " . Dumper($item);
- ModItemTransfer($item->{'itemnumber'}, $branch, $hbr);
+ ModItemTransfer( $item->{'itemnumber'}, $branch, $hbr );
$messages->{'WasTransfered'} = 1;
} else {
- $messages->{'NeedsTransfer'} = 1; # TODO: instead of 1, specify branchcode that the transfer SHOULD go to, $item->{homebranch}
+ $messages->{'NeedsTransfer'} = 1; # TODO: instead of 1, specify branchcode that the transfer SHOULD go to, $item->{homebranch}
}
}
return ( $doreturn, $messages, $issue, $borrower );
}
$query .= " WHERE borrowernumber = ? AND itemnumber = ?";
push @bind, $borrowernumber, $itemnumber;
+
# FIXME transaction
- my $sth_upd = $dbh->prepare($query);
+ my $sth_upd = $dbh->prepare($query);
$sth_upd->execute(@bind);
- my $sth_copy = $dbh->prepare("INSERT INTO old_issues SELECT * FROM issues
+ my $sth_copy = $dbh->prepare(
+ "INSERT INTO old_issues SELECT * FROM issues
WHERE borrowernumber = ?
- AND itemnumber = ?");
- $sth_copy->execute($borrowernumber, $itemnumber);
+ AND itemnumber = ?"
+ );
+ $sth_copy->execute( $borrowernumber, $itemnumber );
+
# anonymise patron checkout immediately if $privacy set to 2 and AnonymousPatron is set to a valid borrowernumber
- if ( $privacy == 2) {
+ if ( $privacy == 2 ) {
+
# The default of 0 does not work due to foreign key constraints
# The anonymisation will fail quietly if AnonymousPatron is not a valid entry
- my $anonymouspatron = (C4::Context->preference('AnonymousPatron')) ? C4::Context->preference('AnonymousPatron') : 0;
- my $sth_ano = $dbh->prepare("UPDATE old_issues SET borrowernumber=?
+ my $anonymouspatron = ( C4::Context->preference('AnonymousPatron') ) ? C4::Context->preference('AnonymousPatron') : 0;
+ my $sth_ano = $dbh->prepare(
+ "UPDATE old_issues SET borrowernumber=?
WHERE borrowernumber = ?
- AND itemnumber = ?");
- $sth_ano->execute($anonymouspatron, $borrowernumber, $itemnumber);
+ AND itemnumber = ?"
+ );
+ $sth_ano->execute( $anonymouspatron, $borrowernumber, $itemnumber );
}
- my $sth_del = $dbh->prepare("DELETE FROM issues
+ my $sth_del = $dbh->prepare(
+ "DELETE FROM issues
WHERE borrowernumber = ?
- AND itemnumber = ?");
- $sth_del->execute($borrowernumber, $itemnumber);
+ AND itemnumber = ?"
+ );
+ $sth_del->execute( $borrowernumber, $itemnumber );
}
=head2 _FixOverduesOnReturn
=cut
sub _FixOverduesOnReturn {
- my ($borrowernumber, $item);
- unless ($borrowernumber = shift) {
+ my ( $borrowernumber, $item );
+ unless ( $borrowernumber = shift ) {
warn "_FixOverduesOnReturn() not supplied valid borrowernumber";
return;
}
- unless ($item = shift) {
+ unless ( $item = shift ) {
warn "_FixOverduesOnReturn() not supplied valid itemnumber";
return;
}
- my ($exemptfine, $dropbox) = @_;
+ my ( $exemptfine, $dropbox ) = @_;
my $dbh = C4::Context->dbh;
# check for overdue fine
- my $sth = $dbh->prepare(
-"SELECT * FROM accountlines WHERE (borrowernumber = ?) AND (itemnumber = ?) AND (accounttype='FU' OR accounttype='O')"
- );
+ my $sth = $dbh->prepare( "SELECT * FROM accountlines WHERE (borrowernumber = ?) AND (itemnumber = ?) AND (accounttype='FU' OR accounttype='O')" );
$sth->execute( $borrowernumber, $item );
# alter fine to show that the book has been returned
return 0 unless $data; # no warning, there's just nothing to fix
my $uquery;
- my @bind = ($borrowernumber, $item, $data->{'accountno'});
+ my @bind = ( $borrowernumber, $item, $data->{'accountno'} );
if ($exemptfine) {
$uquery = "update accountlines set accounttype='FFOR', amountoutstanding=0";
- if (C4::Context->preference("FinesLog")) {
- &logaction("FINES", 'MODIFY',$borrowernumber,"Overdue forgiven: item $item");
+ if ( C4::Context->preference("FinesLog") ) {
+ &logaction( "FINES", 'MODIFY', $borrowernumber, "Overdue forgiven: item $item" );
}
- } elsif ($dropbox && $data->{lastincrement}) {
- my $outstanding = $data->{amountoutstanding} - $data->{lastincrement} ;
- my $amt = $data->{amount} - $data->{lastincrement} ;
- if (C4::Context->preference("FinesLog")) {
- &logaction("FINES", 'MODIFY',$borrowernumber,"Dropbox adjustment $amt, item $item");
+ } elsif ( $dropbox && $data->{lastincrement} ) {
+ my $outstanding = $data->{amountoutstanding} - $data->{lastincrement};
+ my $amt = $data->{amount} - $data->{lastincrement};
+ if ( C4::Context->preference("FinesLog") ) {
+ &logaction( "FINES", 'MODIFY', $borrowernumber, "Dropbox adjustment $amt, item $item" );
}
- $uquery = "update accountlines set accounttype='F' ";
- if($outstanding >= 0 && $amt >=0) {
+ $uquery = "update accountlines set accounttype='F' ";
+ if ( $outstanding >= 0 && $amt >= 0 ) {
$uquery .= ", amount = ? , amountoutstanding=? ";
- unshift @bind, ($amt, $outstanding) ;
+ unshift @bind, ( $amt, $outstanding );
}
} else {
$uquery = "update accountlines set accounttype='F' ";
=cut
sub _FixAccountForLostAndReturned {
- my $itemnumber = shift or return;
+ my $itemnumber = shift or return;
my $borrowernumber = @_ ? shift : undef;
- my $item_id = @_ ? shift : $itemnumber; # Send the barcode if you want that logged in the description
- my $dbh = C4::Context->dbh;
+ my $item_id = @_ ? shift : $itemnumber; # Send the barcode if you want that logged in the description
+ my $dbh = C4::Context->dbh;
+
# check for charge made for lost book
my $sth = $dbh->prepare("SELECT * FROM accountlines WHERE (itemnumber = ?) AND (accounttype='L' OR accounttype='Rep') ORDER BY date DESC");
$sth->execute($itemnumber);
my $data = $sth->fetchrow_hashref;
- $data or return; # bail if there is nothing to do
+ $data or return; # bail if there is nothing to do
# writeoff this amount
my $offset;
my $amount = $data->{'amount'};
my $acctno = $data->{'accountno'};
- my $amountleft; # Starts off undef/zero.
- if ($data->{'amountoutstanding'} == $amount) {
+ my $amountleft; # Starts off undef/zero.
+ if ( $data->{'amountoutstanding'} == $amount ) {
$offset = $data->{'amount'};
- $amountleft = 0; # Hey, it's zero here, too.
+ $amountleft = 0; # Hey, it's zero here, too.
} else {
- $offset = $amount - $data->{'amountoutstanding'}; # Um, isn't this the same as ZERO? We just tested those two things are ==
- $amountleft = $data->{'amountoutstanding'} - $amount; # Um, isn't this the same as ZERO? We just tested those two things are ==
+ $offset = $amount - $data->{'amountoutstanding'}; # Um, isn't this the same as ZERO? We just tested those two things are ==
+ $amountleft = $data->{'amountoutstanding'} - $amount; # Um, isn't this the same as ZERO? We just tested those two things are ==
}
- my $usth = $dbh->prepare("UPDATE accountlines SET accounttype = 'LR',amountoutstanding='0'
+ my $usth = $dbh->prepare(
+ "UPDATE accountlines SET accounttype = 'LR',amountoutstanding='0'
WHERE (borrowernumber = ?)
- AND (itemnumber = ?) AND (accountno = ?) ");
- $usth->execute($data->{'borrowernumber'},$itemnumber,$acctno); # We might be adjusting an account for some OTHER borrowernumber now. Not the one we passed in.
- #check if any credit is left if so writeoff other accounts
- my $nextaccntno = getnextacctno($data->{'borrowernumber'});
- $amountleft *= -1 if ($amountleft < 0);
- if ($amountleft > 0) {
- my $msth = $dbh->prepare("SELECT * FROM accountlines WHERE (borrowernumber = ?)
- AND (amountoutstanding >0) ORDER BY date"); # might want to order by amountoustanding ASC (pay smallest first)
- $msth->execute($data->{'borrowernumber'});
+ AND (itemnumber = ?) AND (accountno = ?) "
+ );
+ $usth->execute( $data->{'borrowernumber'}, $itemnumber, $acctno ); # We might be adjusting an account for some OTHER borrowernumber now. Not the one we passed in.
+ #check if any credit is left if so writeoff other accounts
+ my $nextaccntno = getnextacctno( $data->{'borrowernumber'} );
+ $amountleft *= -1 if ( $amountleft < 0 );
+ if ( $amountleft > 0 ) {
+ my $msth = $dbh->prepare(
+ "SELECT * FROM accountlines WHERE (borrowernumber = ?)
+ AND (amountoutstanding >0) ORDER BY date"
+ ); # might want to order by amountoustanding ASC (pay smallest first)
+ $msth->execute( $data->{'borrowernumber'} );
+
# offset transactions
my $newamtos;
my $accdata;
- while (($accdata=$msth->fetchrow_hashref) and ($amountleft>0)){
- if ($accdata->{'amountoutstanding'} < $amountleft) {
+ while ( ( $accdata = $msth->fetchrow_hashref ) and ( $amountleft > 0 ) ) {
+ if ( $accdata->{'amountoutstanding'} < $amountleft ) {
$newamtos = 0;
$amountleft -= $accdata->{'amountoutstanding'};
- } else {
- $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
+ } else {
+ $newamtos = $accdata->{'amountoutstanding'} - $amountleft;
$amountleft = 0;
}
my $thisacct = $accdata->{'accountno'};
+
# FIXME: move prepares outside while loop!
- my $usth = $dbh->prepare("UPDATE accountlines SET amountoutstanding= ?
+ my $usth = $dbh->prepare(
+ "UPDATE accountlines SET amountoutstanding= ?
WHERE (borrowernumber = ?)
- AND (accountno=?)");
- $usth->execute($newamtos,$data->{'borrowernumber'},'$thisacct'); # FIXME: '$thisacct' is a string literal!
- $usth = $dbh->prepare("INSERT INTO accountoffsets
+ AND (accountno=?)"
+ );
+ $usth->execute( $newamtos, $data->{'borrowernumber'}, '$thisacct' ); # FIXME: '$thisacct' is a string literal!
+ $usth = $dbh->prepare(
+ "INSERT INTO accountoffsets
(borrowernumber, accountno, offsetaccount, offsetamount)
VALUES
- (?,?,?,?)");
- $usth->execute($data->{'borrowernumber'},$accdata->{'accountno'},$nextaccntno,$newamtos);
+ (?,?,?,?)"
+ );
+ $usth->execute( $data->{'borrowernumber'}, $accdata->{'accountno'}, $nextaccntno, $newamtos );
}
- $msth->finish; # $msth might actually have data left
+ $msth->finish; # $msth might actually have data left
}
- $amountleft *= -1 if ($amountleft > 0);
+ $amountleft *= -1 if ( $amountleft > 0 );
my $desc = "Item Returned " . $item_id;
- $usth = $dbh->prepare("INSERT INTO accountlines
+ $usth = $dbh->prepare(
+ "INSERT INTO accountlines
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
- VALUES (?,?,now(),?,?,'CR',?)");
- $usth->execute($data->{'borrowernumber'},$nextaccntno,0-$amount,$desc,$amountleft);
+ VALUES (?,?,now(),?,?,'CR',?)"
+ );
+ $usth->execute( $data->{'borrowernumber'}, $nextaccntno, 0 - $amount, $desc, $amountleft );
if ($borrowernumber) {
+
# FIXME: same as query above. use 1 sth for both
- $usth = $dbh->prepare("INSERT INTO accountoffsets
+ $usth = $dbh->prepare(
+ "INSERT INTO accountoffsets
(borrowernumber, accountno, offsetaccount, offsetamount)
- VALUES (?,?,?,?)");
- $usth->execute($borrowernumber, $data->{'accountno'}, $nextaccntno, $offset);
+ VALUES (?,?,?,?)"
+ );
+ $usth->execute( $borrowernumber, $data->{'accountno'}, $nextaccntno, $offset );
}
- ModItem({ paidfor => '' }, undef, $itemnumber);
+ ModItem( { paidfor => '' }, undef, $itemnumber );
return;
}
=cut
sub _GetCircControlBranch {
- my ($item, $borrower) = @_;
+ my ( $item, $borrower ) = @_;
my $circcontrol = C4::Context->preference('CircControl');
my $branch;
- if ($circcontrol eq 'PickupLibrary') {
- $branch= C4::Context->userenv->{'branch'} if C4::Context->userenv;
- } elsif ($circcontrol eq 'PatronLibrary') {
- $branch=$borrower->{branchcode};
+ if ( $circcontrol eq 'PickupLibrary' ) {
+ $branch = C4::Context->userenv->{'branch'} if C4::Context->userenv;
+ } elsif ( $circcontrol eq 'PatronLibrary' ) {
+ $branch = $borrower->{branchcode};
} else {
my $branchfield = C4::Context->preference('HomeOrHoldingBranch') || 'homebranch';
$branch = $item->{$branchfield};
+
# default to item home branch if holdingbranch is used
# and is not defined
- if (!defined($branch) && $branchfield eq 'holdingbranch') {
+ if ( !defined($branch) && $branchfield eq 'holdingbranch' ) {
$branch = $item->{homebranch};
}
}
return $branch;
}
-
-
-
-
-
=head2 GetItemIssue
$issue = &GetItemIssue($itemnumber);
"SELECT *
FROM issues
LEFT JOIN items ON issues.itemnumber=items.itemnumber
- WHERE issues.itemnumber=?");
+ WHERE issues.itemnumber=?"
+ );
$sth->execute($itemnumber);
my $data = $sth->fetchrow_hashref;
return unless $data;
- $data->{'overdue'} = ($data->{'date_due'} lt C4::Dates->today('iso')) ? 1 : 0;
+ $data->{'overdue'} = ( $data->{'date_due'} lt C4::Dates->today('iso') ) ? 1 : 0;
return ($data);
}
=cut
sub GetOpenIssue {
- my ( $itemnumber ) = @_;
+ my ($itemnumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "SELECT * FROM issues WHERE itemnumber = ? AND returndate IS NULL" );
- $sth->execute( $itemnumber );
- my $issue = $sth->fetchrow_hashref();
- return $issue;
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("SELECT * FROM issues WHERE itemnumber = ? AND returndate IS NULL");
+ $sth->execute($itemnumber);
+ my $issue = $sth->fetchrow_hashref();
+ return $issue;
}
=head2 GetItemIssues
sub GetItemIssues {
my ( $itemnumber, $history ) = @_;
-
- my $today = C4::Dates->today('iso'); # get today date
- my $sql = "SELECT * FROM issues
+
+ my $today = C4::Dates->today('iso'); # get today date
+ my $sql = "SELECT * FROM issues
JOIN borrowers USING (borrowernumber)
JOIN items USING (itemnumber)
WHERE issues.itemnumber = ? ";
$sql .= "ORDER BY date_due DESC";
my $sth = C4::Context->dbh->prepare($sql);
if ($history) {
- $sth->execute($itemnumber, $itemnumber);
+ $sth->execute( $itemnumber, $itemnumber );
} else {
$sth->execute($itemnumber);
}
- my $results = $sth->fetchall_arrayref({});
+ my $results = $sth->fetchall_arrayref( {} );
foreach (@$results) {
- $_->{'overdue'} = ($_->{'date_due'} lt $today) ? 1 : 0;
+ $_->{'overdue'} = ( $_->{'date_due'} lt $today ) ? 1 : 0;
}
return $results;
}
ORDER BY timestamp
";
my $sth = $dbh->prepare($query);
- $sth->execute($biblionumber, $biblionumber);
+ $sth->execute( $biblionumber, $biblionumber );
my @issues;
while ( my $data = $sth->fetchrow_hashref ) {
END_SQL
my @bind_parameters = ( $params->{'days_in_advance'} );
-
- my $sth = $dbh->prepare( $statement );
- $sth->execute( @bind_parameters );
- my $upcoming_dues = $sth->fetchall_arrayref({});
+
+ my $sth = $dbh->prepare($statement);
+ $sth->execute(@bind_parameters);
+ my $upcoming_dues = $sth->fetchall_arrayref( {} );
$sth->finish;
return $upcoming_dues;
my $dbh = C4::Context->dbh;
my $renews = 1;
my $renewokay = 0;
- my $error;
+ my $error;
# Look in the issues table for this item, lent to this borrower,
# and not yet returned.
# Look in the issues table for this item, lent to this borrower,
# and not yet returned.
my %branch = (
- 'ItemHomeLibrary' => 'items.homebranch',
- 'PickupLibrary' => 'items.holdingbranch',
- 'PatronLibrary' => 'borrowers.branchcode'
- );
- my $controlbranch = $branch{C4::Context->preference('CircControl')};
- my $itype = C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype';
-
- my $sthcount = $dbh->prepare("
+ 'ItemHomeLibrary' => 'items.homebranch',
+ 'PickupLibrary' => 'items.holdingbranch',
+ 'PatronLibrary' => 'borrowers.branchcode'
+ );
+ my $controlbranch = $branch{ C4::Context->preference('CircControl') };
+ my $itype = C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype';
+
+ my $sthcount = $dbh->prepare( "
SELECT
borrowers.categorycode, biblioitems.itemtype, issues.renewals, renewalsallowed, $controlbranch
FROM issuingrules,
issuingrules.itemtype desc,
issuingrules.branchcode desc
LIMIT 1;
- ");
+ " );
$sthcount->execute( $borrowernumber, $itemnumber );
if ( my $data1 = $sthcount->fetchrow_hashref ) {
-
+
if ( ( $data1->{renewalsallowed} && $data1->{renewalsallowed} > $data1->{renewals} ) || $override_limit ) {
$renewokay = 1;
+ } else {
+ $error = "too_many";
}
- else {
- $error="too_many";
- }
-
+
my ( $resfound, $resrec ) = C4::Reserves::CheckReserves($itemnumber);
if ($resfound) {
$renewokay = 0;
- $error="on_reserve"
+ $error = "on_reserve";
}
}
- return ($renewokay,$error);
+ return ( $renewokay, $error );
}
=head2 AddRenewal
=cut
sub AddRenewal {
- my $borrowernumber = shift or return undef;
- my $itemnumber = shift or return undef;
- my $branch = shift;
- my $datedue = shift;
+ my $borrowernumber = shift or return undef;
+ my $itemnumber = shift or return undef;
+ my $branch = shift;
+ my $datedue = shift;
my $lastreneweddate = shift || C4::Dates->new()->output('iso');
- my $item = GetItem($itemnumber) or return undef;
+ my $item = GetItem($itemnumber) or return undef;
my $biblio = GetBiblioFromItemNumber($itemnumber) or return undef;
my $dbh = C4::Context->dbh;
+
# Find the issues record for this book
- my $sth =
- $dbh->prepare("SELECT * FROM issues
+ my $sth = $dbh->prepare(
+ "SELECT * FROM issues
WHERE borrowernumber=?
AND itemnumber=?"
- );
+ );
$sth->execute( $borrowernumber, $itemnumber );
my $issuedata = $sth->fetchrow_hashref;
$sth->finish;
- if($datedue && ! $datedue->output('iso')){
+ if ( $datedue && !$datedue->output('iso') ) {
warn "Invalid date passed to AddRenewal.";
return undef;
}
+
# If the due date wasn't specified, calculate it by adding the
# book's loan length to today's date or the current due date
# based on the value of the RenewalPeriodBase syspref.
unless ($datedue) {
my $borrower = C4::Members::GetMemberDetails( $borrowernumber, 0 ) or return undef;
- my $itemtype = (C4::Context->preference('item-level_itypes')) ? $biblio->{'itype'} : $biblio->{'itemtype'};
+ my $itemtype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'};
- $datedue = (C4::Context->preference('RenewalPeriodBase') eq 'date_due') ?
- C4::Dates->new($issuedata->{date_due}, 'iso') :
- C4::Dates->new();
- $datedue = CalcDateDue($datedue,$itemtype,$issuedata->{'branchcode'},$borrower);
+ $datedue =
+ ( C4::Context->preference('RenewalPeriodBase') eq 'date_due' )
+ ? C4::Dates->new( $issuedata->{date_due}, 'iso' )
+ : C4::Dates->new();
+ $datedue = CalcDateDue( $datedue, $itemtype, $issuedata->{'branchcode'}, $borrower );
}
# Update the issues record to have the new due date, and a new count
# of how many times it has been renewed.
my $renews = $issuedata->{'renewals'} + 1;
- $sth = $dbh->prepare("UPDATE issues SET date_due = ?, renewals = ?, lastreneweddate = ?
+ $sth = $dbh->prepare(
+ "UPDATE issues SET date_due = ?, renewals = ?, lastreneweddate = ?
WHERE borrowernumber=?
AND itemnumber=?"
);
# Update the renewal count on the item, and tell zebra to reindex
$renews = $biblio->{'renewals'} + 1;
- ModItem({ renewals => $renews, onloan => $datedue->output('iso') }, $biblio->{'biblionumber'}, $itemnumber);
+ ModItem( { renewals => $renews, onloan => $datedue->output('iso') }, $biblio->{'biblionumber'}, $itemnumber );
# Charge a new rental fee, if applicable?
my ( $charge, $type ) = GetIssuingCharges( $itemnumber, $borrowernumber );
if ( $charge > 0 ) {
- my $accountno = getnextacctno( $borrowernumber );
- my $item = GetBiblioFromItemNumber($itemnumber);
+ my $accountno = getnextacctno($borrowernumber);
+ my $item = GetBiblioFromItemNumber($itemnumber);
my $manager_id = 0;
- $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
+ $manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
$sth = $dbh->prepare(
- "INSERT INTO accountlines
+ "INSERT INTO accountlines
(date, borrowernumber, accountno, amount, manager_id,
description,accounttype, amountoutstanding, itemnumber)
VALUES (now(),?,?,?,?,?,?,?,?)"
);
- $sth->execute( $borrowernumber, $accountno, $charge, $manager_id,
- "Renewal of Rental Item $item->{'title'} $item->{'barcode'}",
- 'Rent', $charge, $itemnumber );
+ $sth->execute( $borrowernumber, $accountno, $charge, $manager_id, "Renewal of Rental Item $item->{'title'} $item->{'barcode'}", 'Rent', $charge, $itemnumber );
$sth->finish;
}
+
# Log the renewal
- UpdateStats( $branch, 'renew', $charge, '', $itemnumber, $item->{itype}, $borrowernumber);
- return $datedue;
+ UpdateStats( $branch, 'renew', $charge, '', $itemnumber, $item->{itype}, $borrowernumber );
+ return $datedue;
}
sub GetRenewCount {
+
# check renewal status
my ( $bornum, $itemno ) = @_;
my $dbh = C4::Context->dbh;
my $renewsleft = 0;
my $borrower = C4::Members::GetMemberDetails($bornum);
- my $item = GetItem($itemno);
+ my $item = GetItem($itemno);
# Look in the issues table for this item, lent to this borrower,
# and not yet returned.
my $data = $sth->fetchrow_hashref;
$renewcount = $data->{'renewals'} if $data->{'renewals'};
$sth->finish;
+
# $item and $borrower should be calculated
- my $branchcode = _GetCircControlBranch($item, $borrower);
-
- my $issuingrule = GetIssuingRule($borrower->{categorycode}, $item->{itype}, $branchcode);
-
+ my $branchcode = _GetCircControlBranch( $item, $borrower );
+
+ my $issuingrule = GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode );
+
$renewsallowed = $issuingrule->{'renewalsallowed'};
$renewsleft = $renewsallowed - $renewcount;
- if($renewsleft < 0){ $renewsleft = 0; }
+ if ( $renewsleft < 0 ) { $renewsleft = 0; }
return ( $renewcount, $renewsallowed, $renewsleft );
}
# Get the book's item type and rental charge (via its biblioitem).
my $charge_query = 'SELECT itemtypes.itemtype,rentalcharge FROM items
LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber';
- $charge_query .= (C4::Context->preference('item-level_itypes'))
- ? ' LEFT JOIN itemtypes ON items.itype = itemtypes.itemtype'
- : ' LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype';
+ $charge_query .=
+ ( C4::Context->preference('item-level_itypes') )
+ ? ' LEFT JOIN itemtypes ON items.itype = itemtypes.itemtype'
+ : ' LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype';
$charge_query .= ' WHERE items.itemnumber =?';
if ( my $item_data = $sth->fetchrow_hashref ) {
$item_type = $item_data->{itemtype};
$charge = $item_data->{rentalcharge};
- my $branch = C4::Branch::mybranch();
+ my $branch = C4::Branch::mybranch();
my $discount_query = q|SELECT rentaldiscount,
issuingrules.itemtype, issuingrules.branchcode
FROM borrowers
AND (issuingrules.branchcode = ? OR issuingrules.branchcode = '*')|;
my $discount_sth = $dbh->prepare($discount_query);
$discount_sth->execute( $borrowernumber, $item_type, $branch );
- my $discount_rules = $discount_sth->fetchall_arrayref({});
- if (@{$discount_rules}) {
+ my $discount_rules = $discount_sth->fetchall_arrayref( {} );
+
+ if ( @{$discount_rules} ) {
+
# We may have multiple rules so get the most specific
- my $discount = _get_discount_from_rule($discount_rules, $branch, $item_type);
+ my $discount = _get_discount_from_rule( $discount_rules, $branch, $item_type );
$charge = ( $charge * ( 100 - $discount ) ) / 100;
}
}
- $sth->finish; # we havent _explicitly_ fetched all rows
+ $sth->finish; # we havent _explicitly_ fetched all rows
return ( $charge, $item_type );
}
# Select most appropriate discount rule from those returned
sub _get_discount_from_rule {
- my ($rules_ref, $branch, $itemtype) = @_;
+ my ( $rules_ref, $branch, $itemtype ) = @_;
my $discount;
- if (@{$rules_ref} == 1) { # only 1 applicable rule use it
+ if ( @{$rules_ref} == 1 ) { # only 1 applicable rule use it
$discount = $rules_ref->[0]->{rentaldiscount};
- return (defined $discount) ? $discount : 0;
+ return ( defined $discount ) ? $discount : 0;
}
+
# could have up to 4 does one match $branch and $itemtype
my @d = grep { $_->{branchcode} eq $branch && $_->{itemtype} eq $itemtype } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
- return (defined $discount) ? $discount : 0;
+ return ( defined $discount ) ? $discount : 0;
}
+
# do we have item type + all branches
@d = grep { $_->{branchcode} eq q{*} && $_->{itemtype} eq $itemtype } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
- return (defined $discount) ? $discount : 0;
+ return ( defined $discount ) ? $discount : 0;
}
+
# do we all item types + this branch
@d = grep { $_->{branchcode} eq $branch && $_->{itemtype} eq q{*} } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
- return (defined $discount) ? $discount : 0;
+ return ( defined $discount ) ? $discount : 0;
}
+
# so all and all (surely we wont get here)
@d = grep { $_->{branchcode} eq q{*} && $_->{itemtype} eq q{*} } @{$rules_ref};
if (@d) {
$discount = $d[0]->{rentaldiscount};
- return (defined $discount) ? $discount : 0;
+ return ( defined $discount ) ? $discount : 0;
}
+
# none of the above
return 0;
}
sub AddIssuingCharge {
my ( $itemnumber, $borrowernumber, $charge ) = @_;
- my $dbh = C4::Context->dbh;
- my $nextaccntno = getnextacctno( $borrowernumber );
- my $manager_id = 0;
+ my $dbh = C4::Context->dbh;
+ my $nextaccntno = getnextacctno($borrowernumber);
+ my $manager_id = 0;
$manager_id = C4::Context->userenv->{'number'} if C4::Context->userenv;
- my $query ="
+ my $query = "
INSERT INTO accountlines
(borrowernumber, itemnumber, accountno,
date, amount, description, accounttype,
# The default of 0 does not work due to foreign key constraints
# The anonymisation will fail quietly if AnonymousPatron is not a valid entry
- my $anonymouspatron = (C4::Context->preference('AnonymousPatron')) ? C4::Context->preference('AnonymousPatron') : 0;
- my @bind_params = ($anonymouspatron, $date);
- if (defined $borrowernumber) {
- $query .= " AND borrowernumber = ?";
- push @bind_params, $borrowernumber;
+ my $anonymouspatron = ( C4::Context->preference('AnonymousPatron') ) ? C4::Context->preference('AnonymousPatron') : 0;
+ my @bind_params = ( $anonymouspatron, $date );
+ if ( defined $borrowernumber ) {
+ $query .= " AND borrowernumber = ?";
+ push @bind_params, $borrowernumber;
} else {
- $query .= " AND (SELECT privacy FROM borrowers WHERE borrowers.borrowernumber=old_issues.borrowernumber) <> 0";
+ $query .= " AND (SELECT privacy FROM borrowers WHERE borrowers.borrowernumber=old_issues.borrowernumber) <> 0";
}
my $sth = $dbh->prepare($query);
$sth->execute(@bind_params);
- my $rows_affected = $sth->rows; ### doublecheck row count return function
+ my $rows_affected = $sth->rows; ### doublecheck row count return function
return $rows_affected;
}
sub SendCirculationAlert {
my ($opts) = @_;
- my ($type, $item, $borrower, $branch) =
- ($opts->{type}, $opts->{item}, $opts->{borrower}, $opts->{branch});
+ my ( $type, $item, $borrower, $branch ) = ( $opts->{type}, $opts->{item}, $opts->{borrower}, $opts->{branch} );
my %message_name = (
CHECKIN => 'Item_Check_in',
CHECKOUT => 'Item_Checkout',
);
- my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences({
- borrowernumber => $borrower->{borrowernumber},
- message_name => $message_name{$type},
- });
- my $letter = C4::Letters::getletter('circulation', $type);
- C4::Letters::parseletter($letter, 'biblio', $item->{biblionumber});
- C4::Letters::parseletter($letter, 'biblioitems', $item->{biblionumber});
- C4::Letters::parseletter($letter, 'borrowers', $borrower->{borrowernumber});
- C4::Letters::parseletter($letter, 'branches', $branch);
+ my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences(
+ { borrowernumber => $borrower->{borrowernumber},
+ message_name => $message_name{$type},
+ }
+ );
+ my $letter = C4::Letters::getletter( 'circulation', $type );
+ C4::Letters::parseletter( $letter, 'biblio', $item->{biblionumber} );
+ C4::Letters::parseletter( $letter, 'biblioitems', $item->{biblionumber} );
+ C4::Letters::parseletter( $letter, 'borrowers', $borrower->{borrowernumber} );
+ C4::Letters::parseletter( $letter, 'branches', $branch );
my @transports = @{ $borrower_preferences->{transports} };
+
# warn "no transports" unless @transports;
for (@transports) {
+
# warn "transport: $_";
- my $message = C4::Message->find_last_message($borrower, $type, $_);
- if (!$message) {
+ my $message = C4::Message->find_last_message( $borrower, $type, $_ );
+ if ( !$message ) {
+
#warn "create new message";
- C4::Message->enqueue($letter, $borrower, $_);
+ C4::Message->enqueue( $letter, $borrower, $_ );
} else {
+
#warn "append to old message";
$message->append($letter);
$message->update;
=cut
sub updateWrongTransfer {
- my ( $itemNumber,$waitingAtLibrary,$FromLibrary ) = @_;
- my $dbh = C4::Context->dbh;
-# first step validate the actual line of transfert .
- my $sth =
- $dbh->prepare(
- "update branchtransfers set datearrived = now(),tobranch=?,comments='wrongtransfer' where itemnumber= ? AND datearrived IS NULL"
- );
- $sth->execute($FromLibrary,$itemNumber);
- $sth->finish;
-
-# second step create a new line of branchtransfer to the right location .
- ModItemTransfer($itemNumber, $FromLibrary, $waitingAtLibrary);
-
-#third step changing holdingbranch of item
- UpdateHoldingbranch($FromLibrary,$itemNumber);
+ my ( $itemNumber, $waitingAtLibrary, $FromLibrary ) = @_;
+ my $dbh = C4::Context->dbh;
+
+ # first step validate the actual line of transfert .
+ my $sth = $dbh->prepare( "update branchtransfers set datearrived = now(),tobranch=?,comments='wrongtransfer' where itemnumber= ? AND datearrived IS NULL" );
+ $sth->execute( $FromLibrary, $itemNumber );
+ $sth->finish;
+
+ # second step create a new line of branchtransfer to the right location .
+ ModItemTransfer( $itemNumber, $FromLibrary, $waitingAtLibrary );
+
+ #third step changing holdingbranch of item
+ UpdateHoldingbranch( $FromLibrary, $itemNumber );
}
=head2 UpdateHoldingbranch
=cut
sub UpdateHoldingbranch {
- my ( $branch,$itemnumber ) = @_;
- ModItem({ holdingbranch => $branch }, undef, $itemnumber);
+ my ( $branch, $itemnumber ) = @_;
+ ModItem( { holdingbranch => $branch }, undef, $itemnumber );
}
=head2 CalcDateDue
=cut
-sub CalcDateDue {
- my ($startdate,$itemtype,$branch,$borrower) = @_;
- my $datedue;
- my $loanlength = GetLoanLength($borrower->{'categorycode'},$itemtype, $branch);
-
- # if globalDueDate ON the datedue is set to that date
- if ( C4::Context->preference('globalDueDate')
- && ( C4::Context->preference('globalDueDate') =~ C4::Dates->regexp('syspref') ) ) {
- $datedue = C4::Dates->new( C4::Context->preference('globalDueDate') );
- } else {
- # otherwise, calculate the datedue as normal
- if(C4::Context->preference('useDaysMode') eq 'Days') { # ignoring calendar
- my $timedue = time + ($loanlength) * 86400;
- #FIXME - assumes now even though we take a startdate
- my @datearr = localtime($timedue);
- $datedue = C4::Dates->new( sprintf("%04d-%02d-%02d", 1900 + $datearr[5], $datearr[4] + 1, $datearr[3]), 'iso');
- } else {
- my $calendar = C4::Calendar->new( branchcode => $branch );
- $datedue = $calendar->addDate($startdate, $loanlength);
- }
- }
-
- # if Hard Due Dates are used, retreive them and apply as necessary
- my ($hardduedate, $hardduedatecompare) = GetHardDueDate($borrower->{'categorycode'},$itemtype, $branch);
- if ( $hardduedate && $hardduedate->output('iso') && $hardduedate->output('iso') ne '0000-00-00') {
- # if the calculated due date is after the 'before' Hard Due Date (ceiling), override
- if ( $datedue->output( 'iso' ) gt $hardduedate->output( 'iso' ) && $hardduedatecompare == -1) {
- $datedue = $hardduedate;
+sub CalcDateDue {
+ my ( $startdate, $itemtype, $branch, $borrower ) = @_;
+ my $datedue;
+ my $loanlength = GetLoanLength( $borrower->{'categorycode'}, $itemtype, $branch );
+
+ # if globalDueDate ON the datedue is set to that date
+ if ( C4::Context->preference('globalDueDate')
+ && ( C4::Context->preference('globalDueDate') =~ C4::Dates->regexp('syspref') ) ) {
+ $datedue = C4::Dates->new( C4::Context->preference('globalDueDate') );
+ } else {
+
+ # otherwise, calculate the datedue as normal
+ if ( C4::Context->preference('useDaysMode') eq 'Days' ) { # ignoring calendar
+ my $timedue = time + ($loanlength) * 86400;
+
+ #FIXME - assumes now even though we take a startdate
+ my @datearr = localtime($timedue);
+ $datedue = C4::Dates->new( sprintf( "%04d-%02d-%02d", 1900 + $datearr[5], $datearr[4] + 1, $datearr[3] ), 'iso' );
+ } else {
+ my $calendar = C4::Calendar->new( branchcode => $branch );
+ $datedue = $calendar->addDate( $startdate, $loanlength );
+ }
+ }
+
+ # if Hard Due Dates are used, retreive them and apply as necessary
+ my ( $hardduedate, $hardduedatecompare ) = GetHardDueDate( $borrower->{'categorycode'}, $itemtype, $branch );
+ if ( $hardduedate && $hardduedate->output('iso') && $hardduedate->output('iso') ne '0000-00-00' ) {
+
+ # if the calculated due date is after the 'before' Hard Due Date (ceiling), override
+ if ( $datedue->output('iso') gt $hardduedate->output('iso') && $hardduedatecompare == -1 ) {
+ $datedue = $hardduedate;
+
# if the calculated date is before the 'after' Hard Due Date (floor), override
- } elsif ( $datedue->output( 'iso' ) lt $hardduedate->output( 'iso' ) && $hardduedatecompare == 1) {
- $datedue = $hardduedate;
+ } elsif ( $datedue->output('iso') lt $hardduedate->output('iso') && $hardduedatecompare == 1 ) {
+ $datedue = $hardduedate;
+
# if the hard due date is set to 'exactly', overrride
- } elsif ( $hardduedatecompare == 0) {
- $datedue = $hardduedate;
- }
- # in all other cases, keep the date due as it is
- }
+ } elsif ( $hardduedatecompare == 0 ) {
+ $datedue = $hardduedate;
+ }
- # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate
- if ( C4::Context->preference('ReturnBeforeExpiry') && $datedue->output('iso') gt $borrower->{dateexpiry} ) {
- $datedue = C4::Dates->new( $borrower->{dateexpiry}, 'iso' );
- }
+ # in all other cases, keep the date due as it is
+ }
- return $datedue;
+ # if ReturnBeforeExpiry ON the datedue can't be after borrower expirydate
+ if ( C4::Context->preference('ReturnBeforeExpiry') && $datedue->output('iso') gt $borrower->{dateexpiry} ) {
+ $datedue = C4::Dates->new( $borrower->{dateexpiry}, 'iso' );
+ }
+
+ return $datedue;
}
=head2 CheckValidDatedue
=cut
sub CheckValidDatedue {
-my ($date_due,$itemnumber,$branchcode)=@_;
-my @datedue=split('-',$date_due->output('iso'));
-my $years=$datedue[0];
-my $month=$datedue[1];
-my $day=$datedue[2];
-# die "Item# $itemnumber ($branchcode) due: " . ${date_due}->output() . "\n(Y,M,D) = ($years,$month,$day)":
-my $dow;
-for (my $i=0;$i<2;$i++){
- $dow=Day_of_Week($years,$month,$day);
- ($dow=0) if ($dow>6);
- my $result=CheckRepeatableHolidays($itemnumber,$dow,$branchcode);
- my $countspecial=CheckSpecialHolidays($years,$month,$day,$itemnumber,$branchcode);
- my $countspecialrepeatable=CheckRepeatableSpecialHolidays($month,$day,$itemnumber,$branchcode);
- if (($result ne '0') or ($countspecial ne '0') or ($countspecialrepeatable ne '0') ){
- $i=0;
- (($years,$month,$day) = Add_Delta_Days($years,$month,$day, 1))if ($i ne '1');
+ my ( $date_due, $itemnumber, $branchcode ) = @_;
+ my @datedue = split( '-', $date_due->output('iso') );
+ my $years = $datedue[0];
+ my $month = $datedue[1];
+ my $day = $datedue[2];
+
+ # die "Item# $itemnumber ($branchcode) due: " . ${date_due}->output() . "\n(Y,M,D) = ($years,$month,$day)":
+ my $dow;
+ for ( my $i = 0 ; $i < 2 ; $i++ ) {
+ $dow = Day_of_Week( $years, $month, $day );
+ ( $dow = 0 ) if ( $dow > 6 );
+ my $result = CheckRepeatableHolidays( $itemnumber, $dow, $branchcode );
+ my $countspecial = CheckSpecialHolidays( $years, $month, $day, $itemnumber, $branchcode );
+ my $countspecialrepeatable = CheckRepeatableSpecialHolidays( $month, $day, $itemnumber, $branchcode );
+ if ( ( $result ne '0' ) or ( $countspecial ne '0' ) or ( $countspecialrepeatable ne '0' ) ) {
+ $i = 0;
+ ( ( $years, $month, $day ) = Add_Delta_Days( $years, $month, $day, 1 ) ) if ( $i ne '1' );
}
}
- my $newdatedue=C4::Dates->new(sprintf("%04d-%02d-%02d",$years,$month,$day),'iso');
-return $newdatedue;
+ my $newdatedue = C4::Dates->new( sprintf( "%04d-%02d-%02d", $years, $month, $day ), 'iso' );
+ return $newdatedue;
}
-
=head2 CheckRepeatableHolidays
$countrepeatable = CheckRepeatableHoliday($itemnumber,$week_day,$branchcode);
=cut
-sub CheckRepeatableHolidays{
-my($itemnumber,$week_day,$branchcode)=@_;
-my $dbh = C4::Context->dbh;
-my $query = qq|SELECT count(*)
+sub CheckRepeatableHolidays {
+ my ( $itemnumber, $week_day, $branchcode ) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM repeatable_holidays
WHERE branchcode=?
AND weekday=?|;
-my $sth = $dbh->prepare($query);
-$sth->execute($branchcode,$week_day);
-my $result=$sth->fetchrow;
-$sth->finish;
-return $result;
+ my $sth = $dbh->prepare($query);
+ $sth->execute( $branchcode, $week_day );
+ my $result = $sth->fetchrow;
+ $sth->finish;
+ return $result;
}
-
=head2 CheckSpecialHolidays
$countspecial = CheckSpecialHolidays($years,$month,$day,$itemnumber,$branchcode);
=cut
-sub CheckSpecialHolidays{
-my ($years,$month,$day,$itemnumber,$branchcode) = @_;
-my $dbh = C4::Context->dbh;
-my $query=qq|SELECT count(*)
+sub CheckSpecialHolidays {
+ my ( $years, $month, $day, $itemnumber, $branchcode ) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM `special_holidays`
WHERE year=?
AND month=?
AND day=?
AND branchcode=?
|;
-my $sth = $dbh->prepare($query);
-$sth->execute($years,$month,$day,$branchcode);
-my $countspecial=$sth->fetchrow ;
-$sth->finish;
-return $countspecial;
+ my $sth = $dbh->prepare($query);
+ $sth->execute( $years, $month, $day, $branchcode );
+ my $countspecial = $sth->fetchrow;
+ $sth->finish;
+ return $countspecial;
}
=head2 CheckRepeatableSpecialHolidays
=cut
-sub CheckRepeatableSpecialHolidays{
-my ($month,$day,$itemnumber,$branchcode) = @_;
-my $dbh = C4::Context->dbh;
-my $query=qq|SELECT count(*)
+sub CheckRepeatableSpecialHolidays {
+ my ( $month, $day, $itemnumber, $branchcode ) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM `repeatable_holidays`
WHERE month=?
AND day=?
AND branchcode=?
|;
-my $sth = $dbh->prepare($query);
-$sth->execute($month,$day,$branchcode);
-my $countspecial=$sth->fetchrow ;
-$sth->finish;
-return $countspecial;
+ my $sth = $dbh->prepare($query);
+ $sth->execute( $month, $day, $branchcode );
+ my $countspecial = $sth->fetchrow;
+ $sth->finish;
+ return $countspecial;
}
-
-
-sub CheckValidBarcode{
-my ($barcode) = @_;
-my $dbh = C4::Context->dbh;
-my $query=qq|SELECT count(*)
+sub CheckValidBarcode {
+ my ($barcode) = @_;
+ my $dbh = C4::Context->dbh;
+ my $query = qq|SELECT count(*)
FROM items
WHERE barcode=?
|;
-my $sth = $dbh->prepare($query);
-$sth->execute($barcode);
-my $exist=$sth->fetchrow ;
-$sth->finish;
-return $exist;
+ my $sth = $dbh->prepare($query);
+ $sth->execute($barcode);
+ my $exist = $sth->fetchrow;
+ $sth->finish;
+ return $exist;
}
=head2 IsBranchTransferAllowed
=cut
sub IsBranchTransferAllowed {
- my ( $toBranch, $fromBranch, $code ) = @_;
-
- if ( $toBranch eq $fromBranch ) { return 1; } ## Short circuit for speed.
-
- my $limitType = C4::Context->preference("BranchTransferLimitsType");
- my $dbh = C4::Context->dbh;
-
- my $sth = $dbh->prepare("SELECT * FROM branch_transfer_limits WHERE toBranch = ? AND fromBranch = ? AND $limitType = ?");
- $sth->execute( $toBranch, $fromBranch, $code );
- my $limit = $sth->fetchrow_hashref();
-
- ## If a row is found, then that combination is not allowed, if no matching row is found, then the combination *is allowed*
- if ( $limit->{'limitId'} ) {
- return 0;
- } else {
- return 1;
- }
-}
+ my ( $toBranch, $fromBranch, $code ) = @_;
+
+ if ( $toBranch eq $fromBranch ) { return 1; } ## Short circuit for speed.
+
+ my $limitType = C4::Context->preference("BranchTransferLimitsType");
+ my $dbh = C4::Context->dbh;
+
+ my $sth = $dbh->prepare("SELECT * FROM branch_transfer_limits WHERE toBranch = ? AND fromBranch = ? AND $limitType = ?");
+ $sth->execute( $toBranch, $fromBranch, $code );
+ my $limit = $sth->fetchrow_hashref();
+
+ ## If a row is found, then that combination is not allowed, if no matching row is found, then the combination *is allowed*
+ if ( $limit->{'limitId'} ) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
=head2 CreateBranchTransferLimit
=cut
sub CreateBranchTransferLimit {
- my ( $toBranch, $fromBranch, $code ) = @_;
-
- my $limitType = C4::Context->preference("BranchTransferLimitsType");
-
- my $dbh = C4::Context->dbh;
-
- my $sth = $dbh->prepare("INSERT INTO branch_transfer_limits ( $limitType, toBranch, fromBranch ) VALUES ( ?, ?, ? )");
- $sth->execute( $code, $toBranch, $fromBranch );
+ my ( $toBranch, $fromBranch, $code ) = @_;
+
+ my $limitType = C4::Context->preference("BranchTransferLimitsType");
+
+ my $dbh = C4::Context->dbh;
+
+ my $sth = $dbh->prepare("INSERT INTO branch_transfer_limits ( $limitType, toBranch, fromBranch ) VALUES ( ?, ?, ? )");
+ $sth->execute( $code, $toBranch, $fromBranch );
}
=head2 DeleteBranchTransferLimits
=cut
sub DeleteBranchTransferLimits {
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("TRUNCATE TABLE branch_transfer_limits");
- $sth->execute();
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("TRUNCATE TABLE branch_transfer_limits");
+ $sth->execute();
}
-
- 1;
+1;
__END__
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
use strict;
+
#use warnings; FIXME - Bug 2505
use C4::Context;
use C4::Stats;
use C4::Message;
use C4::Debug;
use Date::Calc qw(
- Today
- Today_and_Now
- Add_Delta_YM
- Add_Delta_DHMS
- Date_to_Days
- Day_of_Week
- Add_Delta_Days
+ Today
+ Today_and_Now
+ Add_Delta_YM
+ Add_Delta_DHMS
+ Date_to_Days
+ Day_of_Week
+ Add_Delta_Days
);
use POSIX qw(strftime);
-use C4::Branch; # GetBranches
-use C4::Log; # logaction
+use C4::Branch; # GetBranches
+use C4::Log; # logaction
use Data::Dumper;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
BEGIN {
- require Exporter;
- $VERSION = 3.02; # for version checking
- @ISA = qw(Exporter);
-
- # FIXME subs that should probably be elsewhere
- push @EXPORT, qw(
- &FixOverduesOnReturn
- &barcodedecode
- );
-
- # subs to deal with issuing a book
- push @EXPORT, qw(
- &CanBookBeIssued
- &CanBookBeRenewed
- &AddIssue
- &AddRenewal
- &GetRenewCount
- &GetItemIssue
- &GetItemIssues
- &GetBorrowerIssues
- &GetIssuingCharges
- &GetIssuingRule
+ require Exporter;
+ $VERSION = 3.02; # for version checking
+ @ISA = qw(Exporter);
+
+ # FIXME subs that should probably be elsewhere
+ push @EXPORT, qw(
+ &FixOverduesOnReturn
+ &barcodedecode
+ );
+
+ # subs to deal with issuing a book
+ push @EXPORT, qw(
+ &CanBookBeIssued
+ &CanBookBeRenewed
+ &AddIssue
+ &AddRenewal
+ &GetRenewCount
+ &GetItemIssue
+ &GetItemIssues
+ &GetBorrowerIssues
+ &GetIssuingCharges
+ &GetIssuingRule
&GetBranchBorrowerCircRule
&GetBranchItemRule
- &GetBiblioIssues
- &GetOpenIssue
- &AnonymiseIssueHistory
- );
-
- # subs to deal with returns
- push @EXPORT, qw(
- &AddReturn
+ &GetBiblioIssues
+ &GetOpenIssue
+ &AnonymiseIssueHistory
+ );
+
+ # subs to deal with returns
+ push @EXPORT, qw(
+ &AddReturn
&MarkIssueReturned
- );
-
- # subs to deal with transfers
- push @EXPORT, qw(
- &transferbook
- &GetTransfers
- &GetTransfersFromTo
- &updateWrongTransfer
- &DeleteTransfer
- &IsBranchTransferAllowed
- &CreateBranchTransferLimit
- &DeleteBranchTransferLimits
- );
+ );
+
+ # subs to deal with transfers
+ push @EXPORT, qw(
+ &transferbook
+ &GetTransfers
+ &GetTransfersFromTo
+ &updateWrongTransfer
+ &DeleteTransfer
+ &IsBranchTransferAllowed
+ &CreateBranchTransferLimit
+ &DeleteBranchTransferLimits
+ );
}
=head1 NAME
# FIXME -- these plugins should be moved out of Circulation.pm
#
sub barcodedecode {
- my ($barcode, $filter) = @_;
+ my ( $barcode, $filter ) = @_;
my $branch = C4::Branch::mybranch();
- $filter = C4::Context->preference('itemBarcodeInputFilter') unless $filter;
- $filter or return $barcode; # ensure filter is defined, else return untouched barcode
- if ($filter eq 'whitespace') {
- $barcode =~ s/\s//g;
- } elsif ($filter eq 'cuecat') {
- chomp($barcode);
- my @fields = split( /\./, $barcode );
- my @results = map( decode($_), @fields[ 1 .. $#fields ] );
- ($#results == 2) and return $results[2];
- } elsif ($filter eq 'T-prefix') {
- if ($barcode =~ /^[Tt](\d)/) {
- (defined($1) and $1 eq '0') and return $barcode;
- $barcode = substr($barcode, 2) + 0; # FIXME: probably should be substr($barcode, 1)
- }
- return sprintf("T%07d", $barcode);
- # FIXME: $barcode could be "T1", causing warning: substr outside of string
- # Why drop the nonzero digit after the T?
- # Why pass non-digits (or empty string) to "T%07d"?
- } elsif ($filter eq 'libsuite8') {
- unless($barcode =~ m/^($branch)-/i){ #if barcode starts with branch code its in Koha style. Skip it.
- if($barcode =~ m/^(\d)/i){ #Some barcodes even start with 0's & numbers and are assumed to have b as the item type in the libsuite8 software
- $barcode =~ s/^[0]*(\d+)$/$branch-b-$1/i;
- }else{
- $barcode =~ s/^(\D+)[0]*(\d+)$/$branch-$1-$2/i;
- }
- }
- }
+ $filter = C4::Context->preference('itemBarcodeInputFilter')
+ unless $filter;
+ $filter
+ or return
+ $barcode; # ensure filter is defined, else return untouched barcode
+ if ( $filter eq 'whitespace' ) {
+ $barcode =~ s/\s//g;
+ } elsif ( $filter eq 'cuecat' ) {
+ chomp($barcode);
+ my @fields = split( /\./, $barcode );
+ my @results = map( decode($_), @fields[ 1 .. $#fields ] );
+ ( $#results == 2 ) and return $results[2];
+ } elsif ( $filter eq 'T-prefix' ) {
+ if ( $barcode =~ /^[Tt](\d)/ ) {
+ ( defined($1) and $1 eq '0' ) and return $barcode;
+ $barcode = substr( $barcode, 2 )
+ + 0; # FIXME: probably should be substr($barcode, 1)
+ }
+ return sprintf( "T%07d", $barcode );
+
+ # FIXME: $barcode could be "T1", causing warning: substr outside of string
+ # Why drop the nonzero digit after the T?
+ # Why pass non-digits (or empty string) to "T%07d"?
+ } elsif ( $filter eq 'libsuite8' ) {
+ unless ( $barcode =~ m/^($branch)-/i )
+ { #if barcode starts with branch code its in Koha style. Skip it.
+ if ( $barcode =~ m/^(\d)/i )
+ { #Some barcodes even start with 0's & numbers and are assumed to have b as the item type in the libsuite8 software
+ $barcode =~ s/^[0]*(\d+)$/$branch-b-$1/i;
+ } else {
+ $barcode =~ s/^(\D+)[0]*(\d+)$/$branch-$1-$2/i;
+ }
+ }
+ }
return $barcode; # return barcode, modified or not
}
sub decode {
my ($encoded) = @_;
my $seq =
- 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
+ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
my @s = map { index( $seq, $_ ); } split( //, $encoded );
my $l = ( $#s + 1 ) % 4;
if ($l) {
if ( $l == 1 ) {
+
# warn "Error: Cuecat decode parsing failed!";
return;
}
while ( $#s >= 0 ) {
my $n = ( ( $s[0] << 6 | $s[1] ) << 6 | $s[2] ) << 6 | $s[3];
$r .=
- chr( ( $n >> 16 ) ^ 67 )
- .chr( ( $n >> 8 & 255 ) ^ 67 )
- .chr( ( $n & 255 ) ^ 67 );
+ chr( ( $n >> 16 ) ^ 67 )
+ . chr( ( $n >> 8 & 255 ) ^ 67 )
+ . chr( ( $n & 255 ) ^ 67 );
@s = @s[ 4 .. $#s ];
}
$r = substr( $r, 0, length($r) - $l );
sub transferbook {
my ( $tbr, $barcode, $ignoreRs ) = @_;
my $messages;
- my $dotransfer = 1;
- my $branches = GetBranches();
- my $itemnumber = GetItemnumberFromBarcode( $barcode );
+ my $dotransfer = 1;
+ my $branches = GetBranches();
+ my $itemnumber = GetItemnumberFromBarcode($barcode);
my $issue = GetItemIssue($itemnumber);
- my $biblio = GetBiblioFromItemNumber($itemnumber);
+ my $biblio = GetBiblioFromItemNumber($itemnumber);
# bad barcode..
if ( not $itemnumber ) {
# if using Branch Transfer Limits
if ( C4::Context->preference("UseBranchTransferLimits") == 1 ) {
- if ( C4::Context->preference("item-level_itypes") && C4::Context->preference("BranchTransferLimitsType") eq 'itemtype' ) {
- if ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{'itype'} ) ) {
+ if ( C4::Context->preference("item-level_itypes")
+ && C4::Context->preference("BranchTransferLimitsType") eq
+ 'itemtype' ) {
+ if ( !IsBranchTransferAllowed( $tbr, $fbr, $biblio->{'itype'} ) )
+ {
$messages->{'NotAllowed'} = $tbr . "::" . $biblio->{'itype'};
$dotransfer = 0;
}
- } elsif ( ! IsBranchTransferAllowed( $tbr, $fbr, $biblio->{ C4::Context->preference("BranchTransferLimitsType") } ) ) {
- $messages->{'NotAllowed'} = $tbr . "::" . $biblio->{ C4::Context->preference("BranchTransferLimitsType") };
+ } elsif (
+ !IsBranchTransferAllowed(
+ $tbr,
+ $fbr,
+ $biblio->{ C4::Context->preference("BranchTransferLimitsType")
+ }
+ )
+ ) {
+ $messages->{'NotAllowed'} =
+ $tbr . "::"
+ . $biblio->{ C4::Context->preference(
+ "BranchTransferLimitsType") };
$dotransfer = 0;
- }
+ }
}
# if is permanent...
}
# check if it is still issued to someone, return it...
- if ($issue->{borrowernumber}) {
+ if ( $issue->{borrowernumber} ) {
AddReturn( $barcode, $fbr );
$messages->{'WasReturned'} = $issue->{borrowernumber};
}
# find reserves.....
# That'll save a database query.
- my ( $resfound, $resrec ) =
- CheckReserves( $itemnumber );
+ my ( $resfound, $resrec ) = CheckReserves($itemnumber);
if ( $resfound and not $ignoreRs ) {
$resrec->{'ResFound'} = $resfound;
$messages->{'WasTransfered'} = 1;
}
- ModDateLastSeen( $itemnumber );
+ ModDateLastSeen($itemnumber);
return ( $dotransfer, $messages, $biblio );
}
-
sub TooMany {
- my $borrower = shift;
+ my $borrower = shift;
my $biblionumber = shift;
- my $item = shift;
- my $cat_borrower = $borrower->{'categorycode'};
- my $dbh = C4::Context->dbh;
- my $branch;
- # Get which branchcode we need
- $branch = _GetCircControlBranch($item,$borrower);
- my $type = (C4::Context->preference('item-level_itypes'))
- ? $item->{'itype'} # item-level
- : $item->{'itemtype'}; # biblio-level
-
+ my $item = shift;
+ my $cat_borrower = $borrower->{'categorycode'};
+ my $dbh = C4::Context->dbh;
+ my $branch;
+
+ # Get which branchcode we need
+ $branch = _GetCircControlBranch( $item, $borrower );
+ my $type = ( C4::Context->preference('item-level_itypes') )
+ ? $item->{'itype'} # item-level
+ : $item->{'itemtype'}; # biblio-level
+
# given branch, patron category, and item type, determine
# applicable issuing rule
- my $issuing_rule = GetIssuingRule($cat_borrower, $type, $branch);
+ my $issuing_rule = GetIssuingRule( $cat_borrower, $type, $branch );
# if a rule is found and has a loan limit set, count
# how many loans the patron already has that meet that
# rule
- if (defined($issuing_rule) and defined($issuing_rule->{'maxissueqty'})) {
+ if ( defined($issuing_rule)
+ and defined( $issuing_rule->{'maxissueqty'} ) ) {
my @bind_params;
my $count_query = "SELECT COUNT(*) FROM issues
JOIN items USING (itemnumber) ";
my $rule_itemtype = $issuing_rule->{itemtype};
- if ($rule_itemtype eq "*") {
+ if ( $rule_itemtype eq "*" ) {
+
# matching rule has the default item type, so count only
# those existing loans that don't fall under a more
# specific rule
- if (C4::Context->preference('item-level_itypes')) {
+ if ( C4::Context->preference('item-level_itypes') ) {
$count_query .= " WHERE items.itype NOT IN (
SELECT itemtype FROM issuingrules
WHERE branchcode = ?
AND (categorycode = ? OR categorycode = ?)
AND itemtype <> '*'
) ";
- } else {
+ } else {
$count_query .= " JOIN biblioitems USING (biblionumber)
WHERE biblioitems.itemtype NOT IN (
SELECT itemtype FROM issuingrules
push @bind_params, $issuing_rule->{categorycode};
push @bind_params, $cat_borrower;
} else {
+
# rule has specific item type, so count loans of that
# specific item type
- if (C4::Context->preference('item-level_itypes')) {
+ if ( C4::Context->preference('item-level_itypes') ) {
$count_query .= " WHERE items.itype = ? ";
- } else {
+ } else {
$count_query .= " JOIN biblioitems USING (biblionumber)
WHERE biblioitems.itemtype= ? ";
}
$count_query .= " AND borrowernumber = ? ";
push @bind_params, $borrower->{'borrowernumber'};
my $rule_branch = $issuing_rule->{branchcode};
- if ($rule_branch ne "*") {
- if (C4::Context->preference('CircControl') eq 'PickupLibrary') {
+ if ( $rule_branch ne "*" ) {
+ if ( C4::Context->preference('CircControl') eq 'PickupLibrary' ) {
$count_query .= " AND issues.branchcode = ? ";
push @bind_params, $branch;
- } elsif (C4::Context->preference('CircControl') eq 'PatronLibrary') {
+ } elsif (
+ C4::Context->preference('CircControl') eq 'PatronLibrary' ) {
; # if branch is the patron's home branch, then count all loans by patron
} else {
$count_query .= " AND items.homebranch = ? ";
my ($current_loan_count) = $count_sth->fetchrow_array;
my $max_loans_allowed = $issuing_rule->{'maxissueqty'};
- if ($current_loan_count >= $max_loans_allowed) {
- return ($current_loan_count, $max_loans_allowed);
+ if ( $current_loan_count >= $max_loans_allowed ) {
+ return ( $current_loan_count, $max_loans_allowed );
}
}
# Now count total loans against the limit for the branch
- my $branch_borrower_circ_rule = GetBranchBorrowerCircRule($branch, $cat_borrower);
- if (defined($branch_borrower_circ_rule->{maxissueqty})) {
- my @bind_params = ();
+ my $branch_borrower_circ_rule =
+ GetBranchBorrowerCircRule( $branch, $cat_borrower );
+ if ( defined( $branch_borrower_circ_rule->{maxissueqty} ) ) {
+ my @bind_params = ();
my $branch_count_query = "SELECT COUNT(*) FROM issues
JOIN items USING (itemnumber)
WHERE borrowernumber = ? ";
push @bind_params, $borrower->{borrowernumber};
- if (C4::Context->preference('CircControl') eq 'PickupLibrary') {
+ if ( C4::Context->preference('CircControl') eq 'PickupLibrary' ) {
$branch_count_query .= " AND issues.branchcode = ? ";
push @bind_params, $branch;
- } elsif (C4::Context->preference('CircControl') eq 'PatronLibrary') {
+ } elsif ( C4::Context->preference('CircControl') eq 'PatronLibrary' )
+ {
; # if branch is the patron's home branch, then count all loans by patron
} else {
$branch_count_query .= " AND items.homebranch = ? ";
my ($current_loan_count) = $branch_count_sth->fetchrow_array;
my $max_loans_allowed = $branch_borrower_circ_rule->{maxissueqty};
- if ($current_loan_count >= $max_loans_allowed) {
- return ($current_loan_count, $max_loans_allowed);
+ if ( $current_loan_count >= $max_loans_allowed ) {
+ return ( $current_loan_count, $max_loans_allowed );
}
}
my ( $bibitem, $biblio ) = @_;
my $dbh = C4::Context->dbh;
my $sth =
- $dbh->prepare("Select * from items where items.biblioitemnumber = ?")
- || die $dbh->errstr;
+ $dbh->prepare("Select * from items where items.biblioitemnumber = ?")
+ || die $dbh->errstr;
my $i = 0;
my @results;
$data->{'date_due'} = $data2->{'date_due'};
$data->{'card'} = $data2->{'cardnumber'};
$data->{'borrower'} = $data2->{'borrowernumber'};
- }
- else {
- $data->{'date_due'} = ($data->{'wthdrawn'} eq '1') ? 'Cancelled' : 'Available';
+ } else {
+ $data->{'date_due'} =
+ ( $data->{'wthdrawn'} eq '1' ) ? 'Cancelled' : 'Available';
}
-
# Find the last 3 people who borrowed this item.
$sth2 = $dbh->prepare(
"SELECT * FROM old_issues
);
$sth2->execute( $data->{'itemnumber'} );
- for ( my $i2 = 0 ; $i2 < 2 ; $i2++ )
+ for ( my $i2 = 0; $i2 < 2; $i2++ )
{ # FIXME : error if there is less than 3 pple borrowing this item
if ( my $data2 = $sth2->fetchrow_hashref ) {
$data->{"timestamp$i2"} = $data2->{'timestamp'};
sub CanBookBeIssued {
my ( $borrower, $barcode, $duedate, $inprocess ) = @_;
my %needsconfirmation; # filled with problems that needs confirmations
- my %issuingimpossible; # filled with problems that causes the issue to be IMPOSSIBLE
- my $item = GetItem(GetItemnumberFromBarcode( $barcode ));
- my $issue = GetItemIssue($item->{itemnumber});
- my $biblioitem = GetBiblioItemData($item->{biblioitemnumber});
- $item->{'itemtype'}=$item->{'itype'};
- my $dbh = C4::Context->dbh;
+ my %issuingimpossible
+ ; # filled with problems that causes the issue to be IMPOSSIBLE
+ my $item = GetItem( GetItemnumberFromBarcode($barcode) );
+ my $issue = GetItemIssue( $item->{itemnumber} );
+ my $biblioitem = GetBiblioItemData( $item->{biblioitemnumber} );
+ $item->{'itemtype'} = $item->{'itype'};
+ my $dbh = C4::Context->dbh;
# MANDATORY CHECKS - unless item exists, nothing else matters
unless ( $item->{barcode} ) {
$issuingimpossible{UNKNOWN_BARCODE} = 1;
}
- return ( \%issuingimpossible, \%needsconfirmation ) if %issuingimpossible;
+ return ( \%issuingimpossible, \%needsconfirmation ) if %issuingimpossible;
#
# DUE DATE is OK ? -- should already have checked.
#
- unless ( $duedate ) {
+ unless ($duedate) {
my $issuedate = strftime( "%Y-%m-%d", localtime );
- my $branch = _GetCircControlBranch($item,$borrower);
- my $itype = ( C4::Context->preference('item-level_itypes') ) ? $item->{'itype'} : $biblioitem->{'itemtype'};
- $duedate = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower );
+ my $branch = _GetCircControlBranch( $item, $borrower );
+ my $itype =
+ ( C4::Context->preference('item-level_itypes') )
+ ? $item->{'itype'}
+ : $biblioitem->{'itemtype'};
+ $duedate = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ),
+ $itype, $branch, $borrower );
# Offline circ calls AddIssue directly, doesn't run through here
# So issuingimpossible should be ok.
}
if ($duedate) {
$needsconfirmation{INVALID_DATE} = $duedate->output('syspref')
- unless $duedate->output('iso') ge C4::Dates->today('iso');
+ unless $duedate->output('iso') ge C4::Dates->today('iso');
} else {
$issuingimpossible{INVALID_DATE} = $duedate->output('syspref');
}
#
# BORROWER STATUS
#
- if ( $borrower->{'category_type'} eq 'X' && ( $item->{barcode} )) {
- # stats only borrower -- add entry to statistics table, and return issuingimpossible{STATS} = 1 .
- &UpdateStats(C4::Context->userenv->{'branch'},'localuse','','',$item->{'itemnumber'},$item->{'itemtype'},$borrower->{'borrowernumber'});
+ if ( $borrower->{'category_type'} eq 'X' && ( $item->{barcode} ) ) {
+
+# stats only borrower -- add entry to statistics table, and return issuingimpossible{STATS} = 1 .
+ &UpdateStats(
+ C4::Context->userenv->{'branch'}, 'localuse',
+ '', '',
+ $item->{'itemnumber'}, $item->{'itemtype'},
+ $borrower->{'borrowernumber'}
+ );
ModDateLastSeen( $item->{'itemnumber'} );
- return( { STATS => 1 }, {});
+ return ( { STATS => 1 }, {} );
}
if ( $borrower->{flags}->{GNA} ) {
$issuingimpossible{GNA} = 1;
if ( $borrower->{flags}->{'DBARRED'} ) {
$issuingimpossible{DEBARRED} = 1;
}
- if ( $borrower->{'dateexpiry'} eq '0000-00-00') {
+ if ( $borrower->{'dateexpiry'} eq '0000-00-00' ) {
$issuingimpossible{EXPIRED} = 1;
} else {
- my @expirydate= split /-/,$borrower->{'dateexpiry'};
- if($expirydate[0]==0 || $expirydate[1]==0|| $expirydate[2]==0 ||
- Date_to_Days(Today) > Date_to_Days( @expirydate )) {
- $issuingimpossible{EXPIRED} = 1;
+ my @expirydate = split /-/, $borrower->{'dateexpiry'};
+ if ( $expirydate[0] == 0
+ || $expirydate[1] == 0
+ || $expirydate[2] == 0
+ || Date_to_Days(Today) > Date_to_Days(@expirydate) ) {
+ $issuingimpossible{EXPIRED} = 1;
}
}
+
#
# BORROWER STATUS
#
# DEBTS
my ($amount) =
- C4::Members::GetMemberAccountRecords( $borrower->{'borrowernumber'}, '' && $duedate->output('iso') );
- my $amountlimit = C4::Context->preference("noissuescharge");
+ C4::Members::GetMemberAccountRecords( $borrower->{'borrowernumber'},
+ '' && $duedate->output('iso') );
+ my $amountlimit = C4::Context->preference("noissuescharge");
my $allowfineoverride = C4::Context->preference("AllowFineOverride");
- my $allfinesneedoverride = C4::Context->preference("AllFinesNeedOverride");
+ my $allfinesneedoverride =
+ C4::Context->preference("AllFinesNeedOverride");
if ( C4::Context->preference("IssuingInProcess") ) {
- if ( $amount > $amountlimit && !$inprocess && !$allowfineoverride) {
+ if ( $amount > $amountlimit && !$inprocess && !$allowfineoverride ) {
$issuingimpossible{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $amount > $amountlimit && !$inprocess && $allowfineoverride) {
+ } elsif ( $amount > $amountlimit
+ && !$inprocess
+ && $allowfineoverride ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $allfinesneedoverride && $amount > 0 && $amount <= $amountlimit && !$inprocess ) {
+ } elsif ( $allfinesneedoverride
+ && $amount > 0
+ && $amount <= $amountlimit
+ && !$inprocess ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
}
- }
- else {
+ } else {
if ( $amount > $amountlimit && $allowfineoverride ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
- } elsif ( $amount > $amountlimit && !$allowfineoverride) {
+ } elsif ( $amount > $amountlimit && !$allowfineoverride ) {
$issuingimpossible{DEBT} = sprintf( "%.2f", $amount );
} elsif ( $amount > 0 && $allfinesneedoverride ) {
$needsconfirmation{DEBT} = sprintf( "%.2f", $amount );
}
}
- my ($blocktype, $count) = C4::Members::IsMemberBlocked($borrower->{'borrowernumber'});
- if ($blocktype == -1) {
+ my ( $blocktype, $count ) =
+ C4::Members::IsMemberBlocked( $borrower->{'borrowernumber'} );
+ if ( $blocktype == -1 ) {
## patron has outstanding overdue loans
- if ( C4::Context->preference("OverduesBlockCirc") eq 'block'){
- $issuingimpossible{USERBLOCKEDOVERDUE} = $count;
- }
- elsif ( C4::Context->preference("OverduesBlockCirc") eq 'confirmation'){
- $needsconfirmation{USERBLOCKEDOVERDUE} = $count;
- }
- } elsif($blocktype == 1) {
+ if ( C4::Context->preference("OverduesBlockCirc") eq 'block' ) {
+ $issuingimpossible{USERBLOCKEDOVERDUE} = $count;
+ } elsif (
+ C4::Context->preference("OverduesBlockCirc") eq 'confirmation' ) {
+ $needsconfirmation{USERBLOCKEDOVERDUE} = $count;
+ }
+ } elsif ( $blocktype == 1 ) {
+
# patron has accrued fine days
$issuingimpossible{USERBLOCKEDREMAINING} = $count;
}
-#
+ #
# JB34 CHECKS IF BORROWERS DONT HAVE ISSUE TOO MANY BOOKS
#
- my ($current_loan_count, $max_loans_allowed) = TooMany( $borrower, $item->{biblionumber}, $item );
- # if TooMany max_loans_allowed returns 0 the user doesn't have permission to check out this book
- if ($max_loans_allowed eq 0) {
+ my ( $current_loan_count, $max_loans_allowed ) =
+ TooMany( $borrower, $item->{biblionumber}, $item );
+
+# if TooMany max_loans_allowed returns 0 the user doesn't have permission to check out this book
+ if ( $max_loans_allowed eq 0 ) {
$needsconfirmation{PATRON_CANT} = 1;
} else {
- if($max_loans_allowed){
- $needsconfirmation{TOO_MANY} = 1;
+ if ($max_loans_allowed) {
+ $needsconfirmation{TOO_MANY} = 1;
$needsconfirmation{current_loan_count} = $current_loan_count;
- $needsconfirmation{max_loans_allowed} = $max_loans_allowed;
+ $needsconfirmation{max_loans_allowed} = $max_loans_allowed;
}
}
# ITEM CHECKING
#
if ( $item->{'notforloan'}
- && $item->{'notforloan'} > 0 )
- {
- if(!C4::Context->preference("AllowNotForLoanOverride")){
+ && $item->{'notforloan'} > 0 ) {
+ if ( !C4::Context->preference("AllowNotForLoanOverride") ) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
- }else{
+ } else {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
- }
- elsif ( !$item->{'notforloan'} ){
+ } elsif ( !$item->{'notforloan'} ) {
+
# we have to check itemtypes.notforloan also
- if (C4::Context->preference('item-level_itypes')){
+ if ( C4::Context->preference('item-level_itypes') ) {
+
# this should probably be a subroutine
- my $sth = $dbh->prepare("SELECT notforloan FROM itemtypes WHERE itemtype = ?");
- $sth->execute($item->{'itemtype'});
- my $notforloan=$sth->fetchrow_hashref();
+ my $sth = $dbh->prepare(
+ "SELECT notforloan FROM itemtypes WHERE itemtype = ?");
+ $sth->execute( $item->{'itemtype'} );
+ my $notforloan = $sth->fetchrow_hashref();
$sth->finish();
- if ($notforloan->{'notforloan'}) {
- if (!C4::Context->preference("AllowNotForLoanOverride")) {
+ if ( $notforloan->{'notforloan'} ) {
+ if ( !C4::Context->preference("AllowNotForLoanOverride") ) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
} else {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
}
- }
- elsif ($biblioitem->{'notforloan'} == 1){
- if (!C4::Context->preference("AllowNotForLoanOverride")) {
+ } elsif ( $biblioitem->{'notforloan'} == 1 ) {
+ if ( !C4::Context->preference("AllowNotForLoanOverride") ) {
$issuingimpossible{NOT_FOR_LOAN} = 1;
} else {
$needsconfirmation{NOT_FOR_LOAN_FORCING} = 1;
}
}
}
- if ( $item->{'wthdrawn'} && $item->{'wthdrawn'} > 0 )
- {
+ if ( $item->{'wthdrawn'} && $item->{'wthdrawn'} > 0 ) {
$issuingimpossible{WTHDRAWN} = 1;
}
if ( $item->{'restricted'}
- && $item->{'restricted'} == 1 )
- {
+ && $item->{'restricted'} == 1 ) {
$issuingimpossible{RESTRICTED} = 1;
}
if ( C4::Context->preference("IndependantBranches") ) {
my $userenv = C4::Context->userenv;
if ( ($userenv) && ( $userenv->{flags} % 2 != 1 ) ) {
$issuingimpossible{ITEMNOTSAMEBRANCH} = 1
- if ( $item->{C4::Context->preference("HomeOrHoldingBranch")} ne $userenv->{branch} );
- $needsconfirmation{BORRNOTSAMEBRANCH} = GetBranchName( $borrower->{'branchcode'} )
- if ( $borrower->{'branchcode'} ne $userenv->{branch} );
+ if (
+ $item->{ C4::Context->preference("HomeOrHoldingBranch") } ne
+ $userenv->{branch} );
+ $needsconfirmation{BORRNOTSAMEBRANCH} =
+ GetBranchName( $borrower->{'branchcode'} )
+ if ( $borrower->{'branchcode'} ne $userenv->{branch} );
}
}
#
# CHECK IF BOOK ALREADY ISSUED TO THIS BORROWER
#
- if ( $issue->{borrowernumber} && $issue->{borrowernumber} eq $borrower->{'borrowernumber'} )
- {
+ if ( $issue->{borrowernumber}
+ && $issue->{borrowernumber} eq $borrower->{'borrowernumber'} ) {
# Already issued to current borrower. Ask whether the loan should
# be renewed.
- my ($CanBookBeRenewed,$renewerror) = CanBookBeRenewed(
- $borrower->{'borrowernumber'},
- $item->{'itemnumber'}
- );
+ my ( $CanBookBeRenewed, $renewerror ) =
+ CanBookBeRenewed( $borrower->{'borrowernumber'},
+ $item->{'itemnumber'} );
if ( $CanBookBeRenewed == 0 ) { # no more renewals allowed
$issuingimpossible{NO_MORE_RENEWALS} = 1;
- }
- else {
+ } else {
$needsconfirmation{RENEW_ISSUE} = 1;
}
- }
- elsif ($issue->{borrowernumber}) {
+ } elsif ( $issue->{borrowernumber} ) {
# issued to someone else
- my $currborinfo = C4::Members::GetMemberDetails( $issue->{borrowernumber} );
+ my $currborinfo =
+ C4::Members::GetMemberDetails( $issue->{borrowernumber} );
# warn "=>.$currborinfo->{'firstname'} $currborinfo->{'surname'} ($currborinfo->{'cardnumber'})";
$needsconfirmation{ISSUED_TO_ANOTHER} = 1;
- $needsconfirmation{issued_firstname} = $currborinfo->{'firstname'};
- $needsconfirmation{issued_surname} = $currborinfo->{'surname'};
+ $needsconfirmation{issued_firstname} = $currborinfo->{'firstname'};
+ $needsconfirmation{issued_surname} = $currborinfo->{'surname'};
$needsconfirmation{issued_cardnumber} = $currborinfo->{'cardnumber'};
- $needsconfirmation{issued_borrowernumber} = $currborinfo->{'borrowernumber'};
+ $needsconfirmation{issued_borrowernumber} =
+ $currborinfo->{'borrowernumber'};
}
# See if the item is on reserve.
- my ( $restype, $res ) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
+ my ( $restype, $res ) =
+ C4::Reserves::CheckReserves( $item->{'itemnumber'} );
if ($restype) {
- my $resbor = $res->{'borrowernumber'};
- my ( $resborrower ) = C4::Members::GetMemberDetails( $resbor, 0 );
- my $branches = GetBranches();
- my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'};
- if ( $resbor ne $borrower->{'borrowernumber'} && $restype eq "Waiting" )
- {
+ my $resbor = $res->{'borrowernumber'};
+ my ($resborrower) = C4::Members::GetMemberDetails( $resbor, 0 );
+ my $branches = GetBranches();
+ my $branchname = $branches->{ $res->{'branchcode'} }->{'branchname'};
+ if ( $resbor ne $borrower->{'borrowernumber'}
+ && $restype eq "Waiting" ) {
+
# The item is on reserve and waiting, but has been
# reserved by some other patron.
$needsconfirmation{RESERVE_WAITING} = 1;
- $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
- $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
- $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
- $needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'};
+ $needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
+ $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
+ $needsconfirmation{'rescardnumber'} =
+ $resborrower->{'cardnumber'};
+ $needsconfirmation{'resborrowernumber'} =
+ $resborrower->{'borrowernumber'};
$needsconfirmation{'resbranchname'} = $branchname;
- $needsconfirmation{'reswaitingdate'} = format_date($res->{'waitingdate'});
- }
- elsif ( $restype eq "Reserved" ) {
+ $needsconfirmation{'reswaitingdate'} =
+ format_date( $res->{'waitingdate'} );
+ } elsif ( $restype eq "Reserved" ) {
+
# The item is on reserve for someone else.
- $needsconfirmation{RESERVED} = 1;
+ $needsconfirmation{RESERVED} = 1;
$needsconfirmation{'resfirstname'} = $resborrower->{'firstname'};
- $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
- $needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'};
- $needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'};
+ $needsconfirmation{'ressurname'} = $resborrower->{'surname'};
+ $needsconfirmation{'rescardnumber'} =
+ $resborrower->{'cardnumber'};
+ $needsconfirmation{'resborrowernumber'} =
+ $resborrower->{'borrowernumber'};
$needsconfirmation{'resbranchname'} = $branchname;
- $needsconfirmation{'resreservedate'} = format_date($res->{'reservedate'});
+ $needsconfirmation{'resreservedate'} =
+ format_date( $res->{'reservedate'} );
}
}
- return ( \%issuingimpossible, \%needsconfirmation );
+ return ( \%issuingimpossible, \%needsconfirmation );
}
=head2 AddIssue
=cut
sub AddIssue {
- my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode) = @_;
- my $dbh = C4::Context->dbh;
- my $barcodecheck=CheckValidBarcode($barcode);
+ my ( $borrower, $barcode, $datedue, $cancelreserve, $issuedate, $sipmode )
+ = @_;
+ my $dbh = C4::Context->dbh;
+ my $barcodecheck = CheckValidBarcode($barcode);
+
# $issuedate defaults to today.
- if ( ! defined $issuedate ) {
+ if ( !defined $issuedate ) {
$issuedate = strftime( "%Y-%m-%d", localtime );
- # TODO: for hourly circ, this will need to be a C4::Dates object
- # and all calls to AddIssue including issuedate will need to pass a Dates object.
- }
- if ($borrower and $barcode and $barcodecheck ne '0'){
- # find which item we issue
- my $item = GetItem('', $barcode) or return undef; # if we don't get an Item, abort.
- my $branch = _GetCircControlBranch($item,$borrower);
-
- # get actual issuing if there is one
- my $actualissue = GetItemIssue( $item->{itemnumber});
-
- # get biblioinformation for this item
- my $biblio = GetBiblioFromItemNumber($item->{itemnumber});
-
- #
- # check if we just renew the issue.
- #
- if ($actualissue->{borrowernumber} eq $borrower->{'borrowernumber'}) {
- $datedue = AddRenewal(
- $borrower->{'borrowernumber'},
- $item->{'itemnumber'},
- $branch,
- $datedue,
- $issuedate, # here interpreted as the renewal date
- );
- }
- else {
- # it's NOT a renewal
- if ( $actualissue->{borrowernumber}) {
- # This book is currently on loan, but not to the person
- # who wants to borrow it now. mark it returned before issuing to the new borrower
- AddReturn(
- $item->{'barcode'},
- C4::Context->userenv->{'branch'}
- );
- }
-
- # See if the item is on reserve.
- my ( $restype, $res ) =
- C4::Reserves::CheckReserves( $item->{'itemnumber'} );
- if ($restype) {
- my $resbor = $res->{'borrowernumber'};
- if ( $resbor eq $borrower->{'borrowernumber'} ) {
- # The item is reserved by the current patron
- ModReserveFill($res);
- }
- elsif ( $restype eq "Waiting" ) {
- # warn "Waiting";
- # The item is on reserve and waiting, but has been
- # reserved by some other patron.
- }
- elsif ( $restype eq "Reserved" ) {
- # warn "Reserved";
- # The item is reserved by someone else.
- if ($cancelreserve) { # cancel reserves on this item
- CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
- }
- }
- if ($cancelreserve) {
- CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
- }
- else {
- # set waiting reserve to first in reserve queue as book isn't waiting now
- ModReserve(1,
- $res->{'biblionumber'},
- $res->{'borrowernumber'},
- $res->{'branchcode'}
- );
- }
- }
-
- # Starting process for transfer job (checking transfert and validate it if we have one)
- my ($datesent) = GetTransfers($item->{'itemnumber'});
+
+# TODO: for hourly circ, this will need to be a C4::Dates object
+# and all calls to AddIssue including issuedate will need to pass a Dates object.
+ }
+ if ( $borrower and $barcode and $barcodecheck ne '0' ) {
+
+ # find which item we issue
+ my $item = GetItem( '', $barcode )
+ or return undef; # if we don't get an Item, abort.
+ my $branch = _GetCircControlBranch( $item, $borrower );
+
+ # get actual issuing if there is one
+ my $actualissue = GetItemIssue( $item->{itemnumber} );
+
+ # get biblioinformation for this item
+ my $biblio = GetBiblioFromItemNumber( $item->{itemnumber} );
+
+ #
+ # check if we just renew the issue.
+ #
+ if ( $actualissue->{borrowernumber} eq $borrower->{'borrowernumber'} )
+ {
+ $datedue = AddRenewal(
+ $borrower->{'borrowernumber'},
+ $item->{'itemnumber'},
+ $branch,
+ $datedue,
+ $issuedate, # here interpreted as the renewal date
+ );
+ } else {
+
+ # it's NOT a renewal
+ if ( $actualissue->{borrowernumber} ) {
+
+# This book is currently on loan, but not to the person
+# who wants to borrow it now. mark it returned before issuing to the new borrower
+ AddReturn( $item->{'barcode'},
+ C4::Context->userenv->{'branch'} );
+ }
+
+ # See if the item is on reserve.
+ my ( $restype, $res ) =
+ C4::Reserves::CheckReserves( $item->{'itemnumber'} );
+ if ($restype) {
+ my $resbor = $res->{'borrowernumber'};
+ if ( $resbor eq $borrower->{'borrowernumber'} ) {
+
+ # The item is reserved by the current patron
+ ModReserveFill($res);
+ } elsif ( $restype eq "Waiting" ) {
+
+ # warn "Waiting";
+ # The item is on reserve and waiting, but has been
+ # reserved by some other patron.
+ } elsif ( $restype eq "Reserved" ) {
+
+ # warn "Reserved";
+ # The item is reserved by someone else.
+ if ($cancelreserve) { # cancel reserves on this item
+ CancelReserve( 0, $res->{'itemnumber'},
+ $res->{'borrowernumber'} );
+ }
+ }
+ if ($cancelreserve) {
+ CancelReserve( $res->{'biblionumber'},
+ 0, $res->{'borrowernumber'} );
+ } else {
+
+ # set waiting reserve to first in reserve queue as book isn't waiting now
+ ModReserve(
+ 1,
+ $res->{'biblionumber'},
+ $res->{'borrowernumber'},
+ $res->{'branchcode'}
+ );
+ }
+ }
+
+# Starting process for transfer job (checking transfert and validate it if we have one)
+ my ($datesent) = GetTransfers( $item->{'itemnumber'} );
if ($datesent) {
- # updating line of branchtranfert to finish it, and changing the to branch value, implement a comment for visibility of this case (maybe for stats ....)
- my $sth =
- $dbh->prepare(
+
+# updating line of branchtranfert to finish it, and changing the to branch value, implement a comment for visibility of this case (maybe for stats ....)
+ my $sth = $dbh->prepare(
"UPDATE branchtransfers
SET datearrived = now(),
tobranch = ?,
comments = 'Forced branchtransfer'
WHERE itemnumber= ? AND datearrived IS NULL"
- );
- $sth->execute(C4::Context->userenv->{'branch'},$item->{'itemnumber'});
+ );
+ $sth->execute( C4::Context->userenv->{'branch'},
+ $item->{'itemnumber'} );
}
- # Record in the database the fact that the book was issued.
- my $sth =
- $dbh->prepare(
+ # Record in the database the fact that the book was issued.
+ my $sth = $dbh->prepare(
"INSERT INTO issues
(borrowernumber, itemnumber,issuedate, date_due, branchcode)
VALUES (?,?,?,?,?)"
- );
- unless ($datedue) {
- my $itype = ( C4::Context->preference('item-level_itypes') ) ? $biblio->{'itype'} : $biblio->{'itemtype'};
- $datedue = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ), $itype, $branch, $borrower );
+ );
+ unless ($datedue) {
+ my $itype =
+ ( C4::Context->preference('item-level_itypes') )
+ ? $biblio->{'itype'}
+ : $biblio->{'itemtype'};
+ $datedue = CalcDateDue( C4::Dates->new( $issuedate, 'iso' ),
+ $itype, $branch, $borrower );
- }
- $sth->execute(
- $borrower->{'borrowernumber'}, # borrowernumber
- $item->{'itemnumber'}, # itemnumber
- $issuedate, # issuedate
- $datedue->output('iso'), # date_due
- C4::Context->userenv->{'branch'} # branchcode
- );
- $sth->finish;
- if ( C4::Context->preference('ReturnToShelvingCart') ) { ## ReturnToShelvingCart is on, anything issued should be taken off the cart.
- CartToShelf( $item->{'itemnumber'} );
- }
- $item->{'issues'}++;
- ModItem({ issues => $item->{'issues'},
- holdingbranch => C4::Context->userenv->{'branch'},
- itemlost => 0,
- datelastborrowed => C4::Dates->new()->output('iso'),
- onloan => $datedue->output('iso'),
- }, $item->{'biblionumber'}, $item->{'itemnumber'});
- ModDateLastSeen( $item->{'itemnumber'} );
+ }
+ $sth->execute(
+ $borrower->{'borrowernumber'}, # borrowernumber
+ $item->{'itemnumber'}, # itemnumber
+ $issuedate, # issuedate
+ $datedue->output('iso'), # date_due
+ C4::Context->userenv->{'branch'} # branchcode
+ );
+ $sth->finish;
+ if ( C4::Context->preference('ReturnToShelvingCart') )
+ { ## ReturnToShelvingCart is on, anything issued should be taken off the cart.
+ CartToShelf( $item->{'itemnumber'} );
+ }
+ $item->{'issues'}++;
+ ModItem(
+ { issues => $item->{'issues'},
+ holdingbranch => C4::Context->userenv->{'branch'},
+ itemlost => 0,
+ datelastborrowed => C4::Dates->new()->output('iso'),
+ onloan => $datedue->output('iso'),
+ },
+ $item->{'biblionumber'},
+ $item->{'itemnumber'}
+ );
+ ModDateLastSeen( $item->{'itemnumber'} );
+
+ # If it costs to borrow this book, charge it to the patron's account.
+ my ( $charge, $itemtype ) =
+ GetIssuingCharges( $item->{'itemnumber'},
+ $borrower->{'borrowernumber'} );
+ if ( $charge > 0 ) {
+ AddIssuingCharge( $item->{'itemnumber'},
+ $borrower->{'borrowernumber'}, $charge );
+ $item->{'charge'} = $charge;
+ }
- # If it costs to borrow this book, charge it to the patron's account.
- my ( $charge, $itemtype ) = GetIssuingCharges(
- $item->{'itemnumber'},
- $borrower->{'borrowernumber'}
- );
- if ( $charge > 0 ) {
- AddIssuingCharge(
+ # Record the fact that this book was issued.
+ &UpdateStats(
+ C4::Context->userenv->{'branch'},
+ 'issue',
+ $charge,
+ ( $sipmode ? "SIP-$sipmode" : '' ),
$item->{'itemnumber'},
- $borrower->{'borrowernumber'}, $charge
+ $item->{'itype'},
+ $borrower->{'borrowernumber'}
);
- $item->{'charge'} = $charge;
- }
- # Record the fact that this book was issued.
- &UpdateStats(
- C4::Context->userenv->{'branch'},
- 'issue', $charge,
- ($sipmode ? "SIP-$sipmode" : ''), $item->{'itemnumber'},
- $item->{'itype'}, $borrower->{'borrowernumber'}
- );
-
- # Send a checkout slip.
- my $circulation_alert = 'C4::ItemCirculationAlertPreference';
- my %conditions = (
- branchcode => $branch,
- categorycode => $borrower->{categorycode},
- item_type => $item->{itype},
- notification => 'CHECKOUT',
- );
- if ($circulation_alert->is_enabled_for(\%conditions)) {
- SendCirculationAlert({
- type => 'CHECKOUT',
- item => $item,
- borrower => $borrower,
- branch => $branch,
- });
+ # Send a checkout slip.
+ my $circulation_alert = 'C4::ItemCirculationAlertPreference';
+ my %conditions = (
+ branchcode => $branch,
+ categorycode => $borrower->{categorycode},
+ item_type => $item->{itype},
+ notification => 'CHECKOUT',
+ );
+ if ( $circulation_alert->is_enabled_for( \%conditions ) ) {
+ SendCirculationAlert(
+ { type => 'CHECKOUT',
+ item => $item,
+ borrower => $borrower,
+ branch => $branch,
+ }
+ );
+ }
}
- }
- logaction("CIRCULATION", "ISSUE", $borrower->{'borrowernumber'}, $biblio->{'biblionumber'})
- if C4::Context->preference("IssueLog");
- }
- return ($datedue); # not necessarily the same as when it came in!
+ logaction(
+ "CIRCULATION", "ISSUE",
+ $borrower->{'borrowernumber'},
+ $biblio->{'biblionumber'}
+ ) if C4::Context->preference("IssueLog");
+ }
+ return ($datedue); # not necessarily the same as when it came in!
}
=head2 GetLoanLength
sub GetLoanLength {
my ( $borrowertype, $itemtype, $branchcode ) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare(
-"select issuelength from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null"
- );
+ my $sth = $dbh->prepare(
+ "select issuelength from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null"
+ );
+
# warn "in get loan lenght $borrowertype $itemtype $branchcode ";
# try to find issuelength & return the 1st available.
# check with borrowertype, itemtype and branchcode, then without one of those parameters
$sth->execute( $borrowertype, $itemtype, $branchcode );
my $loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
$sth->execute( $borrowertype, "*", $branchcode );
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
$sth->execute( "*", $itemtype, $branchcode );
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
$sth->execute( "*", "*", $branchcode );
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
$sth->execute( $borrowertype, $itemtype, "*" );
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
$sth->execute( $borrowertype, "*", "*" );
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
$sth->execute( "*", $itemtype, "*" );
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
$sth->execute( "*", "*", "*" );
$loanlength = $sth->fetchrow_hashref;
return $loanlength->{issuelength}
- if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
+ if defined($loanlength) && $loanlength->{issuelength} ne 'NULL';
# if no rule is set => 21 days (hardcoded)
return 21;
}
-
=head2 GetHardDueDate
my ($hardduedate,$hardduedatecompare) = &GetHardDueDate($borrowertype,$itemtype,branchcode)
sub GetHardDueDate {
my ( $borrowertype, $itemtype, $branchcode ) = @_;
my $dbh = C4::Context->dbh;
- my $sth =
- $dbh->prepare(
-"select hardduedate, hardduedatecompare from issuingrules where categorycode=? and itemtype=? and branchcode=?"
- );
+ my $sth = $dbh->prepare(
+ "select hardduedate, hardduedatecompare from issuingrules where categorycode=? and itemtype=? and branchcode=?"
+ );
$sth->execute( $borrowertype, $itemtype, $branchcode );
my $results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( $borrowertype, "*", $branchcode );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", $itemtype, $branchcode );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", "*", $branchcode );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( $borrowertype, $itemtype, "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( $borrowertype, "*", "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", $itemtype, "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
$sth->execute( "*", "*", "*" );
$results = $sth->fetchrow_hashref;
- return (C4::Dates->new($results->{hardduedate}, 'iso'),$results->{hardduedatecompare})
- if defined($results) && $results->{hardduedate} ne 'NULL';
+ return ( C4::Dates->new( $results->{hardduedate}, 'iso' ),
+ $results->{hardduedatecompare} )
+ if defined($results) && $results->{hardduedate} ne 'NULL';
# if no rule is set => return undefined
- return (undef, undef);
+ return ( undef, undef );
}
=head2 GetIssuingRule
sub GetIssuingRule {
my ( $borrowertype, $itemtype, $branchcode ) = @_;
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "select * from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null" );
+ my $sth = $dbh->prepare(
+ "select * from issuingrules where categorycode=? and itemtype=? and branchcode=? and issuelength is not null"
+ );
my $irule;
- $sth->execute( $borrowertype, $itemtype, $branchcode );
+ $sth->execute( $borrowertype, $itemtype, $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( $borrowertype, "*", $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( "*", $itemtype, $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( "*", "*", $branchcode );
$irule = $sth->fetchrow_hashref;
- return $irule if defined($irule) ;
+ return $irule if defined($irule);
$sth->execute( $borrowertype, $itemtype, "*" );
$irule = $sth->fetchrow_hashref;
- &nbs