#!/usr/bin/perl
-# written 8/5/2002 by Finlay
# script to execute issuing of books
# Copyright 2000-2002 Katipo Communications
+# copyright 2010 BibLibre
+# Copyright 2011 PTFS-Europe Ltd.
#
# This file is part of Koha.
#
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use strict;
-# use warnings; # FIXME
+use warnings;
use CGI;
use C4::Output;
-use C4::Print;
use C4::Auth qw/:DEFAULT get_session/;
use C4::Dates qw/format_date/;
use C4::Branch; # GetBranches
use C4::Koha; # GetPrinter
use C4::Circulation;
+use C4::Overdues qw/CheckBorrowerDebarred/;
use C4::Members;
use C4::Biblio;
use C4::Reserves;
use C4::Context;
use CGI::Session;
+use C4::Members::Attributes qw(GetBorrowerAttributes);
+use Koha::DateUtils;
use Date::Calc qw(
Today
Add_Delta_Days
Date_to_Days
);
+use List::MoreUtils qw/uniq/;
#
$template->param(DisplayClearScreenButton => 1);
}
+if (C4::Context->preference("UseTablesortForCirc")) {
+ $template->param(UseTablesortForCirc => 1);
+}
+
my $barcode = $query->param('barcode') || '';
$barcode =~ s/^\s*|\s*$//g; # remove leading/trailing whitespace
}
}
-my ($datedue,$invalidduedate,$globalduedate);
+my ($datedue,$invalidduedate);
-if(C4::Context->preference('globalDueDate') && (C4::Context->preference('globalDueDate') =~ C4::Dates->regexp('syspref'))){
- $globalduedate = C4::Dates->new(C4::Context->preference('globalDueDate'));
-}
my $duedatespec_allow = C4::Context->preference('SpecifyDueDate');
if($duedatespec_allow){
if ($duedatespec) {
if ($duedatespec =~ C4::Dates->regexp('syspref')) {
- my $tempdate = C4::Dates->new($duedatespec);
- if ($tempdate and $tempdate->output('iso') gt C4::Dates->new()->output('iso')) {
- # i.e., it has to be later than today/now
- $datedue = $tempdate;
- } else {
- $invalidduedate = 1;
- $template->param(IMPOSSIBLE=>1, INVALID_DATE=>$duedatespec);
- }
+ $datedue = dt_from_string($duedatespec);
+ $datedue->set_hour(23);
+ $datedue->set_minute(59);
} else {
$invalidduedate = 1;
$template->param(IMPOSSIBLE=>1, INVALID_DATE=>$duedatespec);
}
- } else {
- # pass global due date to tmpl if specifyduedate is true
- # and we have no barcode (loading circ page but not checking out)
- if($globalduedate && ! $barcode ){
- $duedatespec = $globalduedate->output();
- $stickyduedate = 1;
- }
}
-} else {
- $datedue = $globalduedate if ($globalduedate);
}
my $todaysdate = C4::Dates->new->output('iso');
}
if ( $print eq 'yes' && $borrowernumber ne '' ) {
- printslip( $borrowernumber );
+ PrintIssueSlip($session->param('branch') || $branch, $borrowernumber);
$query->param( 'borrowernumber', '' );
$borrowernumber = '';
}
my $borrowerslist;
my $message;
if ($findborrower) {
- my ($count, $borrowers) = SearchMember($findborrower, 'cardnumber', 'web');
+ my $borrowers = Search($findborrower, 'cardnumber');
my @borrowers = @$borrowers;
if (C4::Context->preference("AddPatronLists")) {
$template->param(
0 , $borrower->{'enrolmentperiod'});
}
# if the expiry date is before today ie they have expired
- if ( $warning_year*$warning_month*$warning_day==0
+ if ( !$borrower->{'dateexpiry'} || $warning_year*$warning_month*$warning_day==0
|| Date_to_Days($today_year, $today_month, $today_day )
> Date_to_Days($warning_year, $warning_month, $warning_day) )
{
$template->param(
flagged => "1",
noissues => "1",
- expired => format_date($borrower->{dateexpiry}),
+ expired => "1",
renewaldate => format_date("$renew_year-$renew_month-$renew_day")
);
}
issuecount => $issue,
finetotal => $fines
);
+
+ my $debar = CheckBorrowerDebarred($borrowernumber);
+ if ($debar) {
+ $template->param( 'userdebarred' => 1 );
+ $template->param( 'debarredcomment' => $borrower->{debarredcomment} );
+ if ( $debar ne "9999-12-31" ) {
+ $template->param( 'userdebarreddate' => C4::Dates::format_date($debar) );
+ }
+ }
+
}
#
unless($issueconfirmed){
# Get the item title for more information
my $getmessageiteminfo = GetBiblioFromItemNumber(undef,$barcode);
+ $template->{VARS}->{'additional_materials'} = $getmessageiteminfo->{'materials'};
$template->param( itemhomebranch => $getmessageiteminfo->{'homebranch'} );
# pass needsconfirmation to template if issuing is possible and user hasn't yet confirmed.
$template->param(
$needsconfirmation => $$question{$needsconfirmation},
getTitleMessageIteminfo => $getmessageiteminfo->{'title'},
+ getBarcodeMessageIteminfo => $getmessageiteminfo->{'barcode'},
NEEDSCONFIRMATION => 1
);
$confirm_required = 1;
unless($confirm_required) {
AddIssue( $borrower, $barcode, $datedue, $cancelreserve );
$inprocess = 1;
- if($globalduedate && ! $stickyduedate && $duedatespec_allow ){
- $duedatespec = $globalduedate->output();
- $stickyduedate = 1;
- }
}
}
$getreserv{nottransfered} = 0;
$getreserv{reservedate} = format_date( $num_res->{'reservedate'} );
+ $getreserv{reservenumber} = $num_res->{'reservenumber'};
$getreserv{title} = $getiteminfo->{'title'};
$getreserv{itemtype} = $itemtypeinfo->{'description'};
$getreserv{author} = $getiteminfo->{'author'};
my $previssues = '';
my @todaysissues;
my @previousissues;
-## ADDED BY JF: new itemtype issuingrules counter stuff
-my $issued_itemtypes_count;
-my @issued_itemtypes_count_loop;
+my @relissues;
+my @relprevissues;
+my $displayrelissues;
+
my $totalprice = 0;
-if ($borrower) {
-# get each issue of the borrower & separate them in todayissues & previous issues
- my ($issueslist) = GetPendingIssues($borrower->{'borrowernumber'});
+sub build_issue_data {
+ my $issueslist = shift;
+ my $relatives = shift;
+
# split in 2 arrays for today & previous
foreach my $it ( @$issueslist ) {
my $itemtypeinfo = getitemtypeinfo( (C4::Context->preference('item-level_itypes')) ? $it->{'itype'} : $it->{'itemtype'} );
+
# set itemtype per item-level_itype syspref - FIXME this is an ugly hack
$it->{'itemtype'} = ( C4::Context->preference( 'item-level_itypes' ) ) ? $it->{'itype'} : $it->{'itemtype'};
($it->{'charge'}, $it->{'itemtype_charge'}) = GetIssuingCharges(
- $it->{'itemnumber'}, $borrower->{'borrowernumber'}
+ $it->{'itemnumber'}, $it->{'borrowernumber'}
);
$it->{'charge'} = sprintf("%.2f", $it->{'charge'});
my ($can_renew, $can_renew_error) = CanBookBeRenewed(
- $borrower->{'borrowernumber'},$it->{'itemnumber'}
+ $it->{'borrowernumber'},$it->{'itemnumber'}
);
$it->{"renew_error_${can_renew_error}"} = 1 if defined $can_renew_error;
- my ( $restype, $reserves ) = CheckReserves( $it->{'itemnumber'} );
+ my ( $restype, $reserves, undef ) = CheckReserves( $it->{'itemnumber'} );
$it->{'can_renew'} = $can_renew;
$it->{'can_confirm'} = !$can_renew && !$restype;
$it->{'renew_error'} = $restype;
$it->{'checkoutdate'} = C4::Dates->new($it->{'issuedate'},'iso')->output('syspref');
+ $it->{'issuingbranchname'} = GetBranchName($it->{'branchcode'});
$totalprice += $it->{'replacementprice'};
$it->{'itemtype'} = $itemtypeinfo->{'description'};
$it->{'itemtype_image'} = $itemtypeinfo->{'imageurl'};
- $it->{'dd'} = format_date($it->{'date_due'});
+ $it->{'dd'} = output_pref($it->{'date_due'});
$it->{'displaydate'} = format_date($it->{'issuedate'});
- $it->{'od'} = ( $it->{'date_due'} lt $todaysdate ) ? 1 : 0 ;
+ #$it->{'od'} = ( $it->{'date_due'} lt $todaysdate ) ? 1 : 0 ;
+ $it->{'od'} = $it->{'overdue'};
($it->{'author'} eq '') and $it->{'author'} = ' ';
$it->{'renew_failed'} = $renew_failed{$it->{'itemnumber'}};
- # ADDED BY JF: NEW ITEMTYPE COUNT DISPLAY
- $issued_itemtypes_count->{ $it->{'itemtype'} }++;
if ( $todaysdate eq $it->{'issuedate'} or $todaysdate eq $it->{'lastreneweddate'} ) {
- push @todaysissues, $it;
+ (!$relatives) ? push @todaysissues, $it : push @relissues, $it;
} else {
- push @previousissues, $it;
+ (!$relatives) ? push @previousissues, $it : push @relprevissues, $it;
}
}
+}
+
+if ($borrower) {
+
+ # Getting borrower relatives
+ my @relborrowernumbers = GetMemberRelatives($borrower->{'borrowernumber'});
+ #push @borrowernumbers, $borrower->{'borrowernumber'};
+
+ # get each issue of the borrower & separate them in todayissues & previous issues
+ my $issueslist = GetPendingIssues($borrower->{'borrowernumber'});
+ my $relissueslist = [];
+ if ( @relborrowernumbers ) {
+ $relissueslist = GetPendingIssues(@relborrowernumbers);
+ }
+
+ build_issue_data($issueslist, 0);
+ build_issue_data($relissueslist, 1);
+
+ $displayrelissues = scalar($relissueslist);
+
if ( C4::Context->preference( "todaysIssuesDefaultSortOrder" ) eq 'asc' ) {
@todaysissues = sort { $a->{'timestamp'} cmp $b->{'timestamp'} } @todaysissues;
}
else {
@todaysissues = sort { $b->{'timestamp'} cmp $a->{'timestamp'} } @todaysissues;
}
+
if ( C4::Context->preference( "previousIssuesDefaultSortOrder" ) eq 'asc' ){
@previousissues = sort { $a->{'date_due'} cmp $b->{'date_due'} } @previousissues;
}
}
}
-#### ADDED BY JF FOR COUNTS BY ITEMTYPE RULES
-# FIXME: This should utilize all the issuingrules options rather than just the defaults
-# and it should be moved to a module
-my $dbh = C4::Context->dbh;
-
-# how many of each is allowed?
-my $issueqty_sth = $dbh->prepare(
- 'SELECT itemtypes.description AS description,issuingrules.itemtype,maxissueqty ' .
- 'FROM issuingrules LEFT JOIN itemtypes ON (itemtypes.itemtype=issuingrules.itemtype) ' .
- 'WHERE categorycode=?'
-);
-$issueqty_sth->execute(q{*}); # This is a literal asterisk, not a wildcard.
-
-while ( my $data = $issueqty_sth->fetchrow_hashref() ) {
-
- # subtract how many of each this borrower has
- $data->{'count'} = $issued_itemtypes_count->{ $data->{'description'} };
- $data->{'left'} =
- ( $data->{'maxissueqty'} -
- $issued_itemtypes_count->{ $data->{'description'} } );
-
- # can't have a negative number of remaining
- if ( $data->{'left'} < 0 ) { $data->{'left'} = '0' }
- if ( $data->{maxissueqty} <= $data->{count} ) {
- $data->{flag} = 1;
- }
- if ( $data->{maxissueqty} > 0 && $data->{itemtype} !~m/^(\*|CIRC)$/ ) {
- push @issued_itemtypes_count_loop, $data;
- }
-}
-
-#### / JF
my @values;
my %labels;
{
push @values, $_->{'borrowernumber'};
$labels{ $_->{'borrowernumber'} } =
-"$_->{'surname'}, $_->{'firstname'} ... ($_->{'cardnumber'} - $_->{'categorycode'}) ... $_->{'address'} ";
+"$_->{'surname'}, $_->{'firstname'} ... ($_->{'cardnumber'} - $_->{'categorycode'} - $_->{'branchcode'}) ... $_->{'address'} ";
}
$CGIselectborrower = CGI::scrolling_list(
-name => 'borrowernumber',
-id => 'borrowernumber',
-values => \@values,
-labels => \%labels,
- -onclick => "window.location = '/cgi-bin/koha/circ/circulation.pl?borrowernumber=' + this.value;",
+ -ondblclick => 'document.forms[\'mainform\'].submit()',
-size => 7,
-tabindex => '',
-multiple => 0
my (undef, $roadttype_hashref) = &GetRoadTypes();
my $address = $borrower->{'streetnumber'}.' '.$roadttype_hashref->{$borrower->{'streettype'}}.' '.$borrower->{'address'};
+my $fast_cataloging = 0;
+if (defined getframeworkinfo('FA')) {
+ $fast_cataloging = 1
+}
+
+if (C4::Context->preference('ExtendedPatronAttributes')) {
+ my $attributes = GetBorrowerAttributes($borrowernumber);
+ $template->param(
+ ExtendedPatronAttributes => 1,
+ extendedattributes => $attributes
+ );
+}
+
$template->param(
- issued_itemtypes_count_loop => \@issued_itemtypes_count_loop,
lib_messages_loop => $lib_messages_loop,
bor_messages_loop => $bor_messages_loop,
all_messages_del => C4::Context->preference('AllowAllMessageDeletion'),
printername => $printer,
firstname => $borrower->{'firstname'},
surname => $borrower->{'surname'},
+ showname => $borrower->{'showname'},
+ category_type => $borrower->{'category_type'},
dateexpiry => format_date($newexpiry),
expiry => format_date($borrower->{'dateexpiry'}),
categorycode => $borrower->{'categorycode'},
emailpro => $borrower->{'emailpro'},
borrowernotes => $borrower->{'borrowernotes'},
city => $borrower->{'city'},
+ state => $borrower->{'state'},
zipcode => $borrower->{'zipcode'},
country => $borrower->{'country'},
phone => $borrower->{'phone'} || $borrower->{'mobile'},
cardnumber => $borrower->{'cardnumber'},
+ othernames => $borrower->{'othernames'},
amountold => $amountold,
barcode => $barcode,
stickyduedate => $stickyduedate,
totaldue => sprintf('%.2f', $total),
todayissues => \@todaysissues,
previssues => \@previousissues,
+ relissues => \@relissues,
+ relprevissues => \@relprevissues,
+ displayrelissues => $displayrelissues,
inprocess => $inprocess,
memberofinstution => $member_of_institution,
CGIorganisations => $CGIorganisations,
is_child => ($borrower->{'category_type'} eq 'C'),
circview => 1,
soundon => C4::Context->preference("SoundOn"),
+ fast_cataloging => $fast_cataloging,
+ CircAutoPrintQuickSlip => C4::Context->preference("CircAutoPrintQuickSlip"),
+ activeBorrowerRelationship => (C4::Context->preference('borrowerRelationship') ne ''),
);
# save stickyduedate to session
$template->param( picture => 1 ) if $picture;
# get authorised values with type of BOR_NOTES
-my @canned_notes;
-my $sth = $dbh->prepare('SELECT * FROM authorised_values WHERE category = "BOR_NOTES"');
-$sth->execute();
-while ( my $row = $sth->fetchrow_hashref() ) {
- push @canned_notes, $row;
-}
-if ( scalar( @canned_notes ) ) {
- $template->param( canned_bor_notes_loop => \@canned_notes );
-}
+
+my $canned_notes = GetAuthorisedValues("BOR_NOTES");
$template->param(
debt_confirmed => $debt_confirmed,
AllowRenewalLimitOverride => C4::Context->preference("AllowRenewalLimitOverride"),
dateformat => C4::Context->preference("dateformat"),
DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+ canned_bor_notes_loop => $canned_notes,
);
output_html_with_http_headers $query, $cookie, $template->output;